Showing posts with label Redhat. Show all posts
Showing posts with label Redhat. Show all posts

Sunday, February 28, 2016

Instalasi ownCloud di Linux CentOS 6.5

Saat ini cloud begitu populer dan menyimpan segala sesuatu melalui cloud adalah hal yang sangat biasa, contohnya menyimpan data di dropbox dan sebagainya. Begitu populernya penyimpanan di cloud sehingga muncul sebuah software OwnCloud yang merupakan aplikasi cloud storage over networkdengan menggunakan ownCloud user bisa berbagi data melalui network yang dapat diakses melalui web browser.

Saya sendiri sempet merekomendasikan salah satu customer freelance untuk menggunakan ownCloud ini untuk sharing data, itung-itung iseng mau coba diterapin di dunia nyata gimana sih hasilnya dan ternyata lumayan OK kok karena user itu lebih bersahabat dengan web-browser.

Aplikasi ini berbasis PHP dan sebuah database (SQLite, MySQL, MariaDB, Oracle atau PostgreSQL) sehingga kita bisa menggunakan ownCloud di berbagai platform yang memenuhi kriteria ini.

Dalam lab kali ini kita menggunakan Operating System CentOS 6.5, webserver yang digunakan adalah Apache dan database yang digunakan adalah MySQL.

Notes 
  • Pada lab kali ini, Selinux dalam keadaan disabled.
  • Pada lab kali ini, IPTables dalam keadaan disabled.

Install Database & Package Dependecies
[root@owncloud ~]# yum install httpd php php-mysql sqlite php-dom php-mbstring php-gd php-pdo php-json php-xml php-zip php-gd curl php-curl mysql-server -y

Notes
  • Karena ownCloud version yang saya gunakan memerlukan versi php 5.4.0 dan version php yang diinstall diatas adalah version 5.3.3 maka saya update seluruh packagesnya, langkah-langkahnya adalah sebagai berikut.
Install SCL Repo lalu install dependencies lainnya.
[root@owncloud ~]# yum install centos-release-SCL
[root@owncloud ~]# yum install php54 php54-php php54-php-gd php54-php-mbstring php54-php-mysqlnd


Lakukan backup untuk konfigurasi php53, karna kita sudah menginstall php54 seharusnya pada direktori /etc/httpd/conf.d/ terdapat file konfigurasi php54 yaitu, php54-php.conf

[root@owncloud ~]# mv /etc/httpd/conf.d/php.conf /etc/httpd/conf.d/php53.off

Restart Apache Services
[root@owncloud ~]# /etc/init.d/httpd restart

Download & Setup
[root@owncloud ~]# wget http://download.owncloud.org/community/daily/owncloud-daily-master.tar.bz2
[root@owncloud ~]# tar -jxvf owncloud-daily-master.tar.bz2
[root@owncloud ~]# mv owncloud /var/www/html/
[root@owncloud ~]# chown -R apache.apache /var/www/html/owncloud/

[root@owncloud ~]# chmod 777 /var/www/html/owncloud/config/

Edit /etc/httpd/conf/httpd.conf, lalu ganti parameter Allowoverride None menjadi Allowoverride All.

[root@owncloud ~]# vi /etc/httpd/conf/httpd.conf
....
AllowOverride All
....

Setelah selesai start database & web service dan jangan lupa buat persistent on boot.
[root@owncloud ~]# chkconfig mysqld on
[root@owncloud ~]# chkconfig httpd on
[root@owncloud ~]# /etc/init.d/httpd start
[root@owncloud ~]# /etc/init.d/mysqld start

Setting root password mysql.
[root@owncloud ~]# /usr/bin/mysqladmin -u root password 'centos'
[root@owncloud ~]# /usr/bin/mysqladmin -u root -h owncloud.arifzulfikarp.net password 'centos'

Buat database untuk owncloud.
[root@owncloud ~]# mysql -uroot -p
Enter password: <masukin password sesuai yang dikonfigurasi diatas yaitu, centos>

mysql> create database owncloud;
mysql> GRANT ALL ON owncloud.* to 'owncloud'@'localhost' IDENTIFIED BY 'centos';
mysql> flush privileges;
mysql> exit;


Lakukan ownCloud Install Melalui Web Browser
Setelah melakukan langkah-langkah diatas saatnya melakukan provisioning melalui web browsernya.

Sekarang kita dapat mengakses ownCloud 
http://ipaddress/owncloud 
atau 
http://domainname/owncloud 

Apabila berhasil akan muncul tampilan seperti dibawah ini.



Untuk konfigurasi awal ini kita harus mendefinisikan database yang akan digunakan oleh ownCloud dan username beserta password yang akan digunakan oleh admin user di kemudian hari.

Klik storage & database yang ada di kotak merah dari gambar atas, lalu isi parameternya menyesuaikan dengan konfigurasi yang telah kita lakukan. 

Pada lab kita kali ini parameter yang kita gunakan adalah.

Setting admin account sebagai berikut,
Admin User : admin
Password : centos@123

Setting data folder sebagai berikut,
Data Folder /var/www/html/owncloud/data (atau biarkan saja default seperti itu).

Setting database sebagai berikut, pilih MySQL/MariaDB.
Database User : owncloud
Database Password : centos
Database Name : owncloud
Database Host : localhost

Gambar lengkapnya seperti dibawah ini.


Setelah selesai klik Finish setup.

Apabila setup awal telah selesai dan berhasil maka kita akan di redirect ke dashboard ownCloud.


Saat ini ownCloud sudah siap digunakan, tinggal kita otak-atik aja karna penggunaan relatif mudah.

Semoga bermanfaat.

Wednesday, February 24, 2016

CentOS Cluster High Availability Management Menggunakan Luci dan Ricci

Kali ini saya mau membuat catatan bagaimana caranya membangun CentOS High Availability Cluster menggunakan Ricci dan Luci. Dalam simulasinya kali ini topologi yang digunakan kira-kira seperti dibawah ini.


NOTES
Bedasarkan Topologi diatas, kondisi semua node yaitu.
  • Selinux, dalam keadaan disabled.
  • Iptables, dalam keadaan off. Untuk matiinnya /etc/init.d/iptables stop.
  • NetworkManager services dalam keadaan off. Untuk matiinnya /etc/init.d/NetworkManager stop.
  • Menggunakan DNS Server, kalo gak ada DNS Server bisa gunakan /etc/hosts dan definisikan semua IP Address dan Hostname seluruh node cluster. Konfigurasi /etc/hosts di masing-masing node pada topologi yang saya buat diatas adalah seperti dibawah ini, contoh dibawah diambil dari node-1.
    [root@node-1 ~]# cat /etc/hosts
    192.168.227.10 node-1 node-1.arifzulfikarp.net
    192.168.227.20 node-2 node-2.arifzulfikarp.net
    192.168.227.30 node-3 node-3.arifzulfikarp.net

Mengenal Komponen-Komponen Cluster
  • Ricci adalah cluster management daemon dan daemon inilah yang bertugas untuk memanage resource dalam cluster kita nanti. Default port yang digunakan oleh ricci adalah 11111.
  • Luci adalah cluster management tools yang sangat friendly. Sebenernya ketika implementasi cluster ini kita bisa saja menggunakan command line namun dengan menggunakan luci hampir sebagian banyak fiturnya dapat di manage menggunakan web, bahkan packages yang akan diinstall di node-node yang ada dalam cluster pun dapat di manage oleh luci. 
Sebenarnya ada begitu banyak resource dan services yang dapat dikelola oleh linux cluster seperti mysql, filesystem, postgresql, tomcat, script, dsb. Namun kali ini saya mau mencontohkan membuat cluster web services dan service resource yang akan dimanage di dalam service groups adalah apache.

Apabila kita sudah membuat environment seperti topologi diatas, maka selanjutnya adalah tahap instalasi package dan konfigurasi semua node tersebut.


INSTALL PACKAGE & KONFIGURASI NODE-1

Install Luci & Ricci
[root@node-1 ~]# yum install ricci -y
[root@node-1 ~]# yum install luci -y

Setting Password Ricci
Password ricci di set karena digunakan oleh luci nanti untuk berkomunikasi antara node.
[root@node-1 ~]# passwd ricci
Lalu masukan password yang kamu inginkan.

Jalankan Service Luci & Ricci dan Buat Persistent On Boot
[root@node-1 ~]# chkconfig ricci on
[root@node-1 ~]# chkconfig luci on
[root@node-1 ~]# /etc/init.d/ricci start
[root@node-1 ~]# /etc/init.d/luci start

Setelah menjalankan service luci, akan ada notifikasi melalui prompt yang memberitahukan bahwa untuk mengakses Luci melalui web seperti ini.

Point your web browser to https://node-1.arifzulfikarp.net:8084 (or equivalent) to access luci. 

Nah apabila kamu akses dari PC yang tidak terintegrasi dalam DNS domainnya, sebagai alternatif kita bisa juga akses luci melalui IP Addressnya seperti https://192.168.227.10:8084. Tampilan Luci Web Management ketika kita akses ialah seperti dibawah ini.


Sebagai catatan, untuk akses username dan password digunakan adalah.
username : root 
password : <password root node yang kita setting>

Apabila sudah diakses luci web managementnya, kita skip dulu dan lanjut untuk install ricci di node lain.


INSTALL PACKAGE & KONFIGURASI NODE-2

Install Ricci
[root@node-2 ~]# yum install ricci -y

Setting Password Ricci
Password ricci di set karena digunakan oleh Luci nanti untuk berkomunikasi antara node.
[root@node-2 ~]# passwd ricci
Lalu masukan password yang kamu inginkan.

Jalankan Service Ricci dan Buat Persistent On Boot
[root@node-2 ~]# chkconfig ricci on
[root@node-2 ~]# /etc/init.d/ricci start


INSTALL PACKAGE & KONFIGURASI NODE-3

Install Ricci
[root@node-3 ~]# yum install ricci -y

Setting Password Ricci
Password ricci di set karena digunakan oleh Luci nanti untuk berkomunikasi antara node.
[root@node-3 ~]# passwd ricci
Lalu masukan password yang kamu inginkan.

Jalankan Service Ricci dan Buat Persistent On Boot
[root@node-3 ~]# chkconfig ricci on
[root@node-3 ~]# /etc/init.d/ricci start

Apabila sudah semua install package dan setting password ricci diatas saatnya kita masuk ke Luci Web Management dan mulai buat clusternya.

NOTES
  • Agar managemennya mudah pastikan password ricci di setiap node sama, hal ini bertujuan akan lebih mudah managemen dan troubleshotnya dikemudian hari.


KONFIGURASI CLUSTER MELALUI LUCI WEB-MANAGEMENT
Karna kita install Luci di Node-1, akses Luci melalui browser ke arah IP Address node-1.Akses https://192.168.227.10:8084 melalui web browser.


Lalu akses menggunakan username root dan password root di node-1 yang kita setting.
username : root 
password : <password root node yang kita setting di node-1>


BUAT CLUSTER & MASUKAN NODE-NODE YANG KITA INGINKAN
Setelah berhasil login maka langkah selanjutnya adalah membuat cluster. Langkah-langkahnya ialah seperti dibawah ini.

Pilih Tab Manage Clusters - Create


Setelah itu isi form create new cluster tersebut dengan menyesuaikan parameter saya konfigurasikan dibawah ini.


Notes
  • Cluster Name : Isi sesuai dengan yang kita inginkan.
  • Node Name : Isi sesuai dengan hostname node-node yang ingin kita daftarkan ke dalam cluster, karena luci ini ada di node-1 maka pastikan node-1 dapat resolve semua node name yang kita daftarkan diatas. Untuk memastikannya bisa menggunakan ping node-2, node-3 dari node-1.
  • Pilih Download Packages, dengan memilih parameter ini maka Luci akan yang akan mengatur packages-packages installer yang dibutuhkan untuk membuat cluster pada node-node yang kita daftarkan tersebut. Agar proses tidak gagal, maka pastikan juga node-node tersebut sudah terkoneksi dengan repository pendukungnya.
  • Checklist Reboot Nodes Before Joining Cluster, Luci akan melakukan reboot setelah package diinstall dan sebelum di insert kedalam cluster.
  • Ricci Port, adalah port yang digunakan oleh ricci untuk saling berkomunikasi antara node-node yang membentuk cluster. 
Setelah selesai semua maka pilih Create Cluster, tunggu beberapa saat sampai proses selesai karena lumayan lama. 

Setelah selesai maka harusnya node-node yang kita daftarkan tadi sudah ada dalam cluster, seperti dibawah ini.



BUAT FAILOVER DOMAINS
Pada tahap ini kita harus mendefinisikan node-node yang masuk kedalam Failover Domains di dalam cluster kita. Node-node yang kita daftarkan disini akan berbagi resource untuk menghandle services yang kita definisikan di services group pada tahap selanjutnya apabila terjadi problem seperti hardware failure, service stuck/hang, dsb.

Pilih Tab Manage Clusters lalu pilih hacluster, selanjutnya pilih Failover Domains - Add


Setelah itu isi form Add Failover Domain to Cluster dengan menyesuaikan parameter yang saya konfigurasikan seperti dibawah ini. 


Untuk option lainnya seperti prioritized, restricted, no failback bisa menyesuaikan dengan kebutuhan kita di lapangan.

Apabila tampilan seperti dibawah ini maka proses membuat failover domain telah berhasil.



DEFINISIKAN RESOURCE YANG AKAN DIMANAGE CLUSTER
Pada lab kita kali ini karena kita membuat cluster untuk webservices maka penerapannya mengikuti topologi yang saya buat diatas. 

Ada 2 resource yang harus kita definisikan, yaitu.
  • Virtual IP Address
  •  Apache

1) Buat Resource - Virtual IP Address
Pilih Tab Manage Clusters lalu pilih hacluster, selanjutnya pilih Resources - Add


Akan muncul banyak option, pilih IP Address dan isi form sesuai dengan yang topologi diatas, kita ingin membuat virtual IP Address dalam cluster dengan IP 192.168.227.100.


Setelah selesai submit.


2) Buat Resource - Apache
Pilih Tab Manage Clusters lalu pilih hacluster, selanjutnya pilih Resources - Add



Akan muncul banyak option, pilih Apache dan isi form konfigurasi sesuai dengan yang saya isi dibawah ini.



Setelah selesai submit.

Setelah selesai proses membuat kedua resource diatas, maka akan ada 2 resource yang akan menjadi global resource yang akan kita gunakan di services group seperti dibawah ini.


Notes
  • Parameter Name, adalah nama yang akan muncul dan kita gunakan di service groups pada tahap selanjutnya.
  • Parameter Server Root, adalah root direktori Apache. Apabila webservice yang kita gunakan adalah webserver lain seperti EngineX  maka kita bisa sesuaikan root direktoriknya.
  • Parameter Config file, adalah lokasi konfigurasi file untuk Apache. Apabila lokasi konfigurasi file yang kita gunakan terletak di direktori lainnya maka kita bisa sesuaikan dengan kebutuhan.

BUAT SERVICE GROUPS UNTUK WEB SERVICES DARI KUMPULAN RESOURCE YANG TELAH DIDEFINISIKAN
Pada tahap ini kita akan membuat resource web services tersebut berjalan dalam satu kesatuan, node-node di dalam cluster lain akan saling backup apabila node utama bermasalah. Dibawah ini langkah-langkah konfigurasinya.

Pilih Tab Manage Clusters lalu pilih hacluster, selanjutnya pilih Service Groups - Add


Lalu isi form Add Service Group to Cluster dan sesuaikan dengan parameter yang saya isi (kotak merah) seperti dibawah ini.


Apabila parameter yang dikotak merah sudah sesuai, klik Add Resource (kotak biru) lalu pilih IP Address 192.168.227.100 dari tab global resources yang telah kita konfigurasi di tahap sebelumnya. Seperti contoh dibawah ini.


Nah setelah langkah diatas selesai selanjutnya akan muncul tampilan dibawah ini. Pilih Add Child Resources

Lalu kita pilih dari tab global resource yaitu apache_webservices sesuai dengan name resource apache yang kita konfigurasi di tahap sebelumnya.


Setelah selesai akan muncul tampilan seperti dibawah ini, pilih Submit.


Jika sudah benar maka di list service groups akan ada tampilan seperti dibawah ini.


Dari informasi diatas maka seharusnya services groups webservices sudah berjalan didalam cluster dan dari informasi status terlihat informasi "Running on node-1". Hal ini sudah sesuai dengan konfigurasi karena kita menggunakan option Prioritized dan priority 1 pada node-1.


OK sekarang seluruh tahap konfigurasi telah selesai, maka kita masuk ke tahap selanjutnya yaitu testing.


TESTING CLUSTER

1) TESTING MELALUI VIRTUAL IP ADDRESS
Sesuai dengan topologi diatas dan konfigurasi yang telah kita lakukan, kita membuat resource virtual ip address 192.168.227.100 maka untuk testingnya apakah website bisa diakses atau tidak coba akses dari PC Anda melalui browser http://192.168.227.100. 


Apabila tampilan seperti diatas berarti webservices yang ada di node-node dalam cluster sudah bisa diakses melalui ip virtual yang telah kita buat.


2) TESTING FAILOVER
Untuk melakukan testing failover ini caranya mudah, seperti informasi yang kita dapatkan dari services groups ketika resource ini berjalan pada node-1


Untuk memastikan apakah failover berjalan coba shutdown node-1 dan lihat apakah service berjalan di node lain atau tidak.



Lalu akses lagi virtual IP address melalui browser http://192.168.227.100.


Apabila kita berhasil mengakses webserver seperti diatas berarti cluster berjalan dengan baik dan dalam hal ini ada node lain yang menggantikan tugas node-1 yang mati.

Untuk memastikan node mana yang menghandel resource tsb gunakan command clustat di node lain seperti node-2 atau node-3.


Dari hasil output diatas pada node-2 terlihat saat ini ketika node-1 mati maka node-2 yang mengantikan tugasnya menjalankan resource webservices. Hasil output ini juga menunjukan bahwa hasil output sudah sesuai dengan konfigurasi (node-2 sbg priority).



NOTES
Pada Implementasi Clustering HA di Linux terdapat beberapa command untuk pengecekan, command ini berguna untuk melakukan checklist pengecekan dan troubleshot. 
  • clustat
  • corosync-objctl | grep members
  • cman_tool nodes
  • cman_tool status
  • ccs_config_validate
  • cman_tool version -r
  • clusvcadm -r <namaservicegroups> -m <nodetujuan>
  • clusvcadm -s <namaservicegroups>
Dan masih banyak lagi apabila ingin mengetahui lebih banyak option command lengkap clusvcadm bisa gunakan man clusvcadm.


Sekian dulu catatan saya mengenai Centos High Availability dan semoga bermanfaat buat temen-temen yang baca.

Monday, February 22, 2016

Konfigurasi HAProxy Untuk Load Balancing MySQL Database

Pada artikel sebelumnya saya menulis tentang bagaimana menjadikan HAProxy sebagai load balancer web services. Kali ini saya akan membuat catatan dan percobaan bagaimana membuat HAProxy menjadi load balancer untuk database MySQL.


Pada sistem yang sudah besar dan aktivitas query ke database sudah sangat tinggi maka menggunakan load balancer bisa menjadi sebuah solusi agar load kerja database tidak terlalu tinggi dan performance dapat tetap stabil.

Sebagai catatan apabila Anda ingin menggunakan load balancer ke arah database maka sudah menjadi common practice di database yang kita miliki harus melakukan Replication Mode dan mode replication yang paling umum digunakan adalah Master-Master replication.

PREREQUISITES
Pada percobaan kali ini kita akan menggunakan 3 buah server yang bisa kita buat dari virtual machine dan 3 buah VM yang saya gunakan adalah sebagai berikut ini.

VM1 - Load Balancer HAProxy
Hostname  : haproxy
IP Address : 192.168.227.10
Operating System : Centos 6.5

VM2 - MySQL Node1
Hostname  : mysql1
IP Address : 192.168.227.20
Operating System : Centos 6.5

VM2 - MySQL Node2
Hostname  : mysql2
IP Address : 192.168.227.30
Operating System : Centos 6.5

Notes :
  • Semua VM diatas kondisi iptablesnya dalam keadaan off.
  • Selinux dalam keadaan disabled.


KONFIGURASI

1) Konfigurasi Node1 MySQL (192.168.227.20)

Konfigurasi /etc/hosts
[root@mysql1 ~]# vi /etc/hosts
## Lalu tambahkan line dibawah ini ##
192.168.227.10 haproxy
192.168.227.20 mysql1
192.168.227.30 mysql2

Install MySQL dan Setting Password
[root@mysql1 ~]# yum install mysql-server -y
[root@mysql1 ~]# mysqladmin -u root password 'centos'
[root@mysql1 ~]# mysqladmin -u root -h mysql1 password 'centos'

Tambahkan Identity Server-id MySQL
[root@mysql1 ~]# vi /etc/my.cnf
## Lalu tambahkan line dibawah ini pada bagian tag [mysqld] ##
server-id=1

Lalu Jalankan 2 Buah Command SQL Dibawah
[root@mysql1 ~]# mysql -u root -p -e "INSERT INTO mysql.user (Host,User) values ('192.168.227.10','haproxy_check'); FLUSH PRIVILEGES;"
[root@mysql1 ~]# mysql -u root -p -e "GRANT ALL PRIVILEGES ON *.* TO 'haproxy_root'@'192.168.227.10' IDENTIFIED BY 'centos' WITH GRANT OPTION; FLUSH PRIVILEGES"


2) Konfigurasi Node2 MySQL (192.168.227.30)

Konfigurasi /etc/hosts
[root@mysql2 ~]# vi /etc/hosts
## Lalu tambahkan line dibawah ini ##
192.168.227.10 haproxy
192.168.227.20 mysql1
192.168.227.30 mysql2

Install MySQL dan Setting Password
[root@mysql2 ~]# yum install mysql-server -y
[root@mysql2 ~]# mysqladmin -u root password 'centos'
[root@mysql2 ~]# mysqladmin -u root -h mysql2 password 'centos'

Tambahkan Identity Server-id MySQL
[root@mysql2 ~]# vi /etc/my.cnf
## Lalu tambahkan line dibawah ini pada bagian tag [mysqld] ##
server-id=2

Lalu Jalankan 2 Buah Command SQL Dibawah
[root@mysql2 ~]# mysql -u root -p -e "INSERT INTO mysql.user (Host,User) values ('192.168.227.10','haproxy_check'); FLUSH PRIVILEGES;"
[root@mysql2 ~]# mysql -u root -p -e "GRANT ALL PRIVILEGES ON *.* TO 'haproxy_root'@'192.168.227.10' IDENTIFIED BY 'centos' WITH GRANT OPTION; FLUSH PRIVILEGES"

NOTES :
Pada konfigurasi kedua server diatas Anda mengeksekusi 2 Command SQL yang sama, fungsi dan kegunaannya adalah sebagai berikut ini.

Command SQL Pertama 
Parameter 'haproxy_check' dapat diganti sesuai keinginan Anda. Parameter ini digunakan oleh haproxy sebagai user untuk melakukan checking status server atau istilah saya mengirim heartbeat ke masing2 node di belakangnya (mysql1 & mysql2). 

Command SQL Kedua 
Parameter haproxy_root dan centos dapat diganti sesuai keinginan Anda. Parameter ini digunakan oleh HAProxy untuk mengakses MySQL Cluster. Oleh karena itu kita harus membuat MySQL user dan memberikan privilege root.


3) Konfigurasi Load Balancer HAProxy (192.168.227.10)

Konfigurasi /etc/hosts
[root@mysql1 ~]# vi /etc/hosts
## Lalu tambahkan line dibawah ini ##
192.168.227.10 haproxy
192.168.227.20 mysql1
192.168.227.30 mysql2

Install MySQL-Client dan Install HAProxy
[root@haproxy ~]# yum install mysql -y
[root@haproxy ~]# yum install haproxy -y
[root@haproxy ~]# chkconfig haproxy on

Konfigurasi HAProxy
Pertama, backup original konfigurasinya.
[root@haproxy ~]# mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.orig

Kedua, buat konfigurasi baru dengan mengikuti line konfigurasi dibawah ini.
[root@haproxy ~]# vi /etc/haproxy/haproxy.cfg
## Lalu tambahkan line dibawah ini ##
global
    log 127.0.0.1 local0 notice
    user haproxy
    group haproxy

defaults
    log global
    retries 2
    timeout connect 3000
    timeout server 5000
    timeout client 5000

listen mysql-cluster
    bind 127.0.0.1:3306
    mode tcp
    option mysql-check user haproxy_check
    balance roundrobin
    server mysql1 192.168.227.20:3306 check
    server mysql2 192.168.227.30:3306 check

Setelah selesai lalu save & quit.

Start Service HAProxy dan Testing Query
[root@haproxy ~]# /etc/init.d/haproxy start


[root@haproxy ~]# mysql -h 127.0.0.1 -u haproxy_root -p -e "SHOW DATABASES"
Enter password: 

Apabila output seperti dibawah ini berarti sudah OK.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| test               |
+--------------------+


TESTING LOAD BALANCING & FAILOVER

1) Testing Load Balancing
Gunakan command dibawah ini untuk memastikan load balancer berjalan dengan baik, lakukan 4x test dan perhatikan outputnya.
[root@haproxy ~]# mysql -h 127.0.0.1 -u haproxy_root -pcentos -e "show variables like 'server_id'"

Apabila dari 4x testing tersebut outputnya seperti gambar dibawah ini, berarti load balancer sudah berjalan dengan baik dengan mode round robin seperti yang dikonfigurasikan.

[root@haproxy ~]# mysql -h 127.0.0.1 -u haproxy_root -pcentos -e "show variables like 'server_id'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+
[root@haproxy ~]# mysql -h 127.0.0.1 -u haproxy_root -pcentos -e "show variables like 'server_id'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 2     |
+---------------+-------+
[root@haproxy ~]# mysql -h 127.0.0.1 -u haproxy_root -pcentos -e "show variables like 'server_id'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+
[root@haproxy ~]# mysql -h 127.0.0.1 -u haproxy_root -pcentos -e "show variables like 'server_id'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 2     |
+---------------+-------+


2) Testing Failover
Untuk testing failover coba matikan service mysqld di salah satu node database (mysql1 atau mysql2), kemudian gunakan lagi command dibawah ini untuk testing query dari HAProxy.
[root@haproxy ~]# mysql -h 127.0.0.1 -u haproxy_root -pcentos -e "show variables like 'server_id'"

Dibawah ini saya mencoba mematikan service mysqld di node2 mysql2.





Lalu testing query lagi dari HAProxy, coba lakukan 4x query maka seharusnya yang keluar hanya server_id dengan value 1.

[root@haproxy ~]# mysql -h 127.0.0.1 -u haproxy_root -pcentos -e "show variables like 'server_id'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+
[root@haproxy ~]# mysql -h 127.0.0.1 -u haproxy_root -pcentos -e "show variables like 'server_id'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+
[root@haproxy ~]# mysql -h 127.0.0.1 -u haproxy_root -pcentos -e "show variables like 'server_id'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+
[root@haproxy ~]# mysql -h 127.0.0.1 -u haproxy_root -pcentos -e "show variables like 'server_id'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+


OPTIMIZING FAILOVER INTERVAL
Dari contoh diatas sebenernya ketika salah satu MySQL node mati maka HAProxy membutuhkan waktu sekian detik untuk menghapus node tersebut dari clusternya.

Untuk mengubah interval failover ini, kita hanya perlu mengubah konfigurasi di server HAProxy konfigurasi (/etc/haproxy/haproxy.cfg) dengan mengubah bagian.

Parameter Awal,
server mysql1 192.168.227.20:3306 check
server mysql2 192.168.227.30:3306 check

Diubah Menjadi,
server mysql1 192.168.227.20:3306 check fastinter 1000
server mysql2 192.168.227.30:3306 check fastinter 1000

Dari konfigurasi diatas maka parameter interval checking ketika server melakukan transisi UP ke DOWN diubah menjadi 1000ms atau 1 seconds.

Jangan Lupa Restart HAProxy Service Lalu Testing Kembali!


OK sekian dulu tulisan tentang HAProxy kali ini semoga bermanfaat...

Wednesday, February 17, 2016

Memahami Stack Size Limit di Linux

Saya menulis artikel ini karna kebeneran saya sempet menghandel aplikasi yang memaksa saya menggunakan teknik ini agar salah satu aplikasi modul yang digunakan tsb tidak over limit ketika menggunakan resource dari server yang tersedia.

Sebenernya kalo dibahas lebih detail akan ada banyak case yang bisa diselesaikan dengan teknik ini sebab ini merupakan salah satu teknik tuning di level OS, tapi saya akan mempersempit penulisan dan sample casenya agar tidak melebar. Saya tulis hal ini disini sebagai catatan biar gak lupa aja.

Apabila ada temen-temen yang lebih memahami teknik ini dan apa yang saya tulis disini mungkin bisa dikoreksi catatan saya ini. 

Apa Itu Stack Size? 
Mari kita bahas apa itu stack size dalam sebuah program. Pada OS linux terdapat command ulimit yang berfungsi untuk melakukan limit resource yang dapat digunakan oleh program di OS linux.

Dibawah ini merupakan berbagai options yang dapat dibatasi oleh ulimit, yaitu :

-a     All current limits are reported
-c     The maximum size of core files created
-d     The maximum size of a process's data segment
-e     The maximum scheduling priority ("nice")
-f     The  maximum  size  of files written by the shell and its children
-i     The maximum number of pending signals
-l     The maximum size that may be locked into memory
-m     The maximum resident set size (has no effect on Linux)
-n     The maximum number of open file descriptors (most systems do not allow this value to be set)
-p     The pipe size in 512-byte blocks (this may not be set)
-q     The maximum number of bytes in POSIX message queues
-r     The maximum real-time scheduling priority
-s     The maximum stack size
-t     The maximum amount of cpu time in seconds
-u     The  maximum  number  of  processes available to a single user
-v     The maximum amount of virtual  memory available to the shell

Untuk melakukan listing ulimit yang saat ini digunakan gunakan command # ulimit -a.

[root@localhost ~]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 7746
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 7746
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

Dari hasil output diatas, default stack size di OS linux saya yaitu 10240 kbytes, atau sekitar 10MB.


Lalu Bagaimana Stack Size Dapat Berdampak Pada Program yang Kita Jalankan?
Sepanjang pengalaman saya dengan kondisi default diatas yaitu stack size 10240KB atau 10MB, maka apabila ada sebuah program yang local variable size-nya lebih dari 10MB hampir dipastikan program tersebut tidak akan dapat berjalan di OS tsb.

Sebagai contoh dibawah ini ada sebuah program sederhana menggunakan bahasa C yang mereserved resource sekitar 32MB (8000000 * 4 bytes = 32000000).

[root@localhost ~]# vi test_stacksize.c
### Lalu taruh code ini di file tersebut  ###

#include <stdio.h>

int testingstack()
{
  int arifzp[8000000];

  printf("Hello Arif Zulfikar");
}

int main()
{
  testingstack();
  return 0;
}

### Apabila sudah selesai quit dan save ###


Lalu build & compile code diatas menggunakan command dibawah ini.

[root@localhost ~]# cc -o test_stacksize test_stacksize.c
[root@localhost ~]# chmod 750 test_stacksize

Lalu execute file tersebut maka outputnya adalah segmentation fault (core dumped), seperti dibawah ini.

[root@localhost ~]# ./test_stacksize 
Segmentation fault (core dumped)

Mengapa hal tersebut bisa terjadi? Hal ini disebabkan kapasitas stack size yang dialokasikan oleh OS Linux yang digunakan saat ini adalah 10240KB atau sekitar 10MB sedangkan di dalam code tersebut local variable size yang digunakan adalah 32MB (8000000 * 4 bytes = 32000000).


Lalu Bagaimana Cara Mengatasinya?
Dalam beberapa kondisi memang sebagai system engineer kita harus mampu melakukan konfigurasi yang menyesuaikan dengan kebutuhan customer dan developer kita.

Dalam kasus ini linux dapat mengubah kapasitas limit stack size yang dapat digunakan oleh OS.

Untuk mengecek stack size yang digunakan saat ini gunakan command ulimit -s. Kapasitas saat ini adalah 10MB.
[root@localhost ~]# ulimit -s
10240 

Sedangkan yang dibutuhkan adalah 32MB, untuk mengubah kapasitasnya gunakan command ulimit -s 'size'. Contoh kita akan mengubah kapasitasnya menjadi 33MB sehingga program yang tadi dibuat dapat dijalankan

[root@localhost ~]# ulimit -s 33792
[root@localhost ~]# ulimit -s
33792

Lalu jalankan lagi program tadi, dengan kondisi saat ini seharusnya program tersebut dapat berjalan.
[root@localhost ~]# ./test_stacksize 
Hello Arif Zulfikar

Dengan teknik seperti ini maka ada berbagai macam keuntungan salah satunya tidak harus mengubah source code dan mengcompile ulang sehingga mengganggu jalannya aplikasi yang sedang digunakan.

Semoga bermanfaat.

Tuesday, January 19, 2016

Basic Profiling & Performance Analysis Tools di Linux dan Cara Menggunakannya

Profiling Tools adalah sebuah tools yang biasanya digunakan untuk mendapatkan informasi terkait performace pada sebuah perangkat yang kita gunakan. Ketika implementasi dalam sebuah project, aktifitas profiling menjadi begitu penting karna data yang didapatkan dari aktifitas tersebut dapat digunakan untuk bahan pengambilan keputusan apakah hardware tsb gagal atau tidak, apakah akan terjadi ekspansi atau tidak dan lain sebagainya.

Ada beberapa macam basic profiling tools di linux dan yang kali ini akan saya bahas yaitu adalah basic tools yang paling sering digunakan oleh sysadmin, antara lain adalah sebagai berikut.
  • top
  • free
  • vmstat
  • iostat
  • sar

1) TOP COMMAND
Command ini adalah salah satu command yang paling sering digunakan untuk mendapatkan informasi load server yang kita miliki. Selain caranya yang sederhana, informasi yang kita dapatkan juga bisa dibilang termasuk lengkap. Dibawah ini contoh-contoh penggunaan command top.

Display Basic Info



Dengan menggunakan command # top seperti gambar diatas, maka akan muncul informasi seperti task, memory, cpu, swap, zombie process, dsb.















Display Specific User
Gunakan top dengan option -u dan akan menampilkan specific user detail.










Highlight Running Process
Gunakan 'z' option setelah menggunakan command top, maka output yang dihasilkan akan membantu kamu mengindentifikasi process mana yang sedang berjalan.














Display Path Process
Gunakan 'c' option setelah menggunakan command top, maka output yang dihasilkan akan membantu kamu mengindentifikasi path direktori dari setiap process yang berjalan.










Mengganti Delay Interval 'Screen Refresh Interval' di Top
Secara default, ketika menggunakan top screen akan menampilkan kondisi terbaru setiap 3 detik. Namun apabila Anda ingin menggantinya menjadi tiap 1 detik atau sesuai keinginan maka gunakan option 'd' atau 's' untuk mengubahnya.
















Kill Running Process
Untuk menghentikan sebuah process yang sedang berjalan dari top, gunakan option 'k' lalu isi dengan PID yang ingin Anda kill.














Sort By CPU Utilisation
Gunakan tombol shift + P untuk mendisplay process bedasarkan sorting CPU Utilisation.














Sort By Memory Utilisation
Gunakan tombol shift + m untuk mendisplay process bedasarkan sorting Memory Utilisation.















2) FREE COMMAND
Free command memberikan informasi terkait physical memory yang tersedia dan sedang digunakan, termasuk informasi swap memory dengan buffer yang digunakan oleh kernel OS.

Display Basic Info
Display informasi physical memory dan swap memory yang digunakan oleh OS dalam satuan KB.






Display Dalam Satuan Bytes
Gunakan option '-b' untuk menampilkan dalam satuan bytes.





Display Dalam Satuan Kilobytes
Gunakan option '-k' untuk menampilkan dalam satuan kilobytes.





Display Dalam Satuan Megabytes
Gunakan option '-m' untuk menampilkan dalam satuan megabytes.





Display Dalam Satuan Gigabytes
Gunakan option '-g' untuk menampilkan dalam satuan gigabytes.





Display Low & High Memory Statistic
Gunakan option '-l' untuk menampilkan low & high memory statistic.







3) VMSTAT COMMAND
Salah satu tools yang paling powerful digunakan ketika troubleshoot dan juga profiling adalah vmstat. Command vmstat, iostat, dan sar masuk kedalam package sysstat dan untuk menginstall package tersebut bisa gunakan yum seperti gambar di bawah ini.




Ketika menggunakan command vmstat, kita dapat menggunakan 2 argument. Pertama adalah delay, kedua adalah counter. Delay adalah value dari detik antara output informasi yang ditampilkan, sedangkan Counter adalah berapa kali Anda ingin menampilkan informasi dengan vmstat ini.

Sebagai catatan, vmstat akan menampilkan informasi dalam satuan bytes secara default. Apabila menggunakan option '-S' maka memungkinkan kita mengganti format output dalam satuan KB, MB, MiB dengan -S k, -S m, -S M, dsb.

Contoh penggunaan vmstat untuk profiling dan performance analysis ialah seperti dibawah ini.

Listing Active & Inactive Memory
Pada contoh dibawah terdapat 6 kolom yaitu procs, memory, swap, io, system, cpu. Namun ketika melakukan listing active & inactive memory maka field yang paling penting diperhatikan adalah bagian dibawah memory dan bagian dibawah swap. 

Gunakan options '-a' seperti gambar dibawah ini.





Execute vmstat ‘X’ seconds dan ‘N’ number of times
Sebagai contoh, kita ingin menampilkan informasi dengan vmstat setiap 2 detik dan akan otomatis berhenti ketika mencapai interval ke-5.

Gunakan command #vmstat 2 5 seperti gambar dibawah ini.







Display Timestamps
Command vmstat dengan parameter '-t' akan menampilkan timestamps di setiap line yang di print.






Display Variasi Counter
Gunakan paramater '-s' untuk menampilkan summary dari variasi event counter dan memory statistic.
























Disks Statistic
Gunakan options '-d' untuk menampilkan seluruh disks statistik.





















Display Statistik Dalam Satuan Megabytes
Command vmstat akan menampilkan informasi dalam satuan megabytes dengan parameter -S dan M (Uppercase & Megabytes). Sebagai catatan, option ini ada karna by default vmstat menampilkan informasi dalam satuan kilobytes.







4) IOSTAT COMMAND
Command iostat digunakan untuk menampilkan informasi CPU statistik dan juga informasi Input/Output dari device, partisi, NFS, dsb.

Display CPU and I/O Statistik
Command iostat tanpa argumen akan menampilkan informasi kernel apa yang digunakan, informasi statistik CPU dan I/O dari semua partisi.






Display Hanya CPU Statistik 
Gunakan options '-c' apabila hanya ingin menampilkan statistik CPU saja.





Display Hanya Disk I/O Statistik
Gunakan options '-d' apabila hanya ingin menampilkan statistik I/O dari seluruh partisi.





Display Statistik Disk I/O dari Single Device
Secara default iostat akan menampilkan informasi dari seluruh partisi, apabila ingin di filter gunakan options '-p' dan ditambah dengan device name. Sebagai contoh, dibawah ini hanya menampilkan statistik I/O dari device SDA.








Display LVM Statistik
Gunakan options '-N' untuk menampilkan statistik I/O dari device LVM.

Notes : Karna di server saya belum ada lvm maka yg tampil hanya statistik dari device sda.


5) SAR COMMAND
Command sar (system activity reporter) adalah salah satu multi-purpose analysis tools yang merupakan bagian dari sysstat package. SAR dapat bekerja dalam 2 mode, yaitu : pertama, bisa dikombinasikan dengan cronjob. Kedua, bisa juga digunakan untuk mendapatkan data instant dari state di system yang kita miliki.
Selain itu SAR dapat digunakan untuk mencollect informasi seperti :
  1. Collective CPU usage
  2. Individual CPU statistics
  3. Memory used & available
  4. Swap space used & available
  5. Overall I/O activity system
  6. Individual device I/O activity
  7. Context switch statistics
  8. Run queue & load average data
  9. Network statistics
Dibawah ini contoh penggunaannya.

Collective CPU usage
Contoh dibawah ini, akan menampilkan informasi dengan sar setiap 2 detik dan akan otomatis berhenti ketika mencapai interval ke-3.






Individual CPU statistics
Contoh dibawah ini, menampilkan informasi CPU dari seluruh core dan single core (misal core ke-0) setiap 2 detik dan akan otomatis berhenti di interval ke-3.
  1. Menampilkan seluruh core statistik. Gunakan parameter ALL(seluruh CPU core), lalu second (2), lalu interval (3).
  2. Menampilkan statisik core ke-1 (core ke-0 dalam array). Gunakan parameter 0 (Core ke-1), lalu second (2), lalu interval (3).

Memory Used & Memory Available Statistik
Gunakan options '-r' dan akan menampilkan statistik memory yang sedang digunakan saat ini. Biasanya informasi yang paling sering digunakan adalah dari kolom 'kbmemfree' dan 'kbmemuses'.






Swap Space Used & Swap Available Statistik
Gunakan options '-S' dan akan menampilkan statistik swap used dan swap available yang sedang digunakan saat ini. Biasanya informasi yang paling sering digunakan adalah dari kolom 'kbswpused' dan '%swpused'






Overall I/O Activity System
Gunakan options '-b' dan akan menampilkan informasi I/O Statistik, field informasi yang akan ditampilkan antara lain.
  • tps – Transactions per second (termasuk keduanya read & write)
  • rtps – Read transactions per second
  • wtps – Write transactions per second
  • bread/s – Bytes read per second
  • bwrtn/s – Bytes written per second






Individual Device I/O Activity
Gunakan command '-d' untuk mengindentifikasi individual block devices (contoh : spesifik mounting point, LUN, partition, dsb).






Context Switch Statistics
Gunakan option '-w' dan akan menampilkan informasi total nomor process yang dibuat dalam 1 detik dan total nomor context switch per detik.






Run Queue & Load Average Data
Gunakan options '-q' dan akan menampilkan informasi running queue size dan load average data dalam 1 menit terakhir (ldavg-1), 5 menit (ldavg-5), dan 15 menit (ldavg-15).






Network Statistics Reports
Command sar dapat digunakan untuk menampilkan berbagai macam statistik informasi dari penggunaan network device di server kita. 
Format yang digunakan antara lain adalah seperti dibawah ini.



Keyword yang digunakan juga bervariasi, antara lain.
  • DEV – Displays network devices vital statistics for eth0, eth1, dsb.
  • EDEV – Display network device failure statistics
  • NFS – Displays NFS client activity
  • NFSD – Displays NFS server activity
  • SOCK – Displays sockets pada penggunaan IPv4
  • IP – Displays IPv4 network traffic
  • EIP – Displays IPv4 network errors
  • ICMP – Displays ICMPv4 network traffic
  • EICMP – Displays ICMPv4 network errors
  • TCP – Displays TCPv4 network traffic
  • ETCP – Displays TCPv4 network errors
  • UDP – Displays UDPv4 network traffic
  • SOCK6, IP6, EIP6, ICMP6, UDP6 are for IPv6
  • ALL – Displays semua informasi diatas.
Sebagai contoh yang paling sering digunakan adalah display informasi statistic dari interface network. Gunakan options '-n' dan keyword DEV.













Dan Alhamdullilah selesai juga! Lumayan panjang nulisnya sampe harus bersambung di hari ini dan kemudian di publish. Semoga bermanfaat buat yang membaca ya.