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.

Sunday, February 14, 2016

Cara Menambahkan Routing di Linux Server (Centos OS)

Halo gan kali ini saya mau sharing cara menambahkan routing di linux server. Pada dasarnya konsep routing yang digunakan sama saja seperti ketika melakukan routing di router cuma kali ini kita melakukannya di linux server. Nah pada praktek kita kali ini kita saya menggunakan OS Centos 6.5 dan topologi yang dipergunakan kira-kira seperti dibawah ini.


Notes
Tujuan akhir dari lab kita kali ini yaitu :
  • Pertama, semua trafik dari Server1 ke Server2 dengan tujuan IP Address 192.168.10.1 harus keluar melewati eth0 di server1.
  • Kedua, semua trafik dari Server1 ke Server2 dengan tujuan IP Address 192.168.10.2 harus keluar melewati eth1 di server1.
Metode diatas adalah salah satu common practice yang paling sering digunakan di dunia persilatan, tujuannya macam-macam salah satunya agar tidak memberatkan beban kerja pada satu interface saja.

Dibawah ini langkah-langkahnya.

KONFIGURASI IP ADDRESS DI SERVER1

1) Pasang IP Address di eth0
[root@server1~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
BOOTPROTO="none"
HWADDR="00:0C:29:72:B0:6D"
IPV6INIT="yes"
NM_CONTROLLED="no"
ONBOOT="yes"
TYPE="Ethernet"
UUID="a0f56ca4-fba2-4e02-a916-b22e39e985a0"
IPADDR=10.10.10.1
NETMASK=255.255.255.0

2) Pasang IP Address di eth1
[root@server1 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE="eth1"
BOOTPROTO="none"
HWADDR="00:0C:29:72:B0:77"
IPV6INIT="yes"
NM_CONTROLLED="no"
ONBOOT="yes"
TYPE="Ethernet"
IPADDR=10.10.10.2
NETMASK=255.255.255.0

3) Restart Network Services
[root@server1~]# /etc/init.d/network restart


KONFIGURASI IP ADDRESS DI SERVER2

1) Pasang IP Address di eth0
[root@server2~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
BOOTPROTO="none"
HWADDR="00:0C:29:68:3F:C0"
IPV6INIT="yes"
NM_CONTROLLED="no"
ONBOOT="yes"
TYPE="Ethernet"
UUID="cef7fe38-008c-4fb7-9d08-edee39afe94f"
IPADDR=10.10.10.3
NETMASK=255.255.255.0

2) Pasang IP Address di eth1
[root@server2~]# vi /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
HWADDR=00:0C:29:68:3F:CA
TYPE=Ethernet
UUID=8ce8f11c-c8e9-4215-a575-721c32fc58b9
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=none
IPADDR=10.10.10.4
NETMASK=255.255.255.0

3) Restart Network Services
[root@server2~]# /etc/init.d/network restart


TAMBAHKAN ROUTING DI SERVER1

[root@server1~]# route add -net 192.168.10.1 netmask 255.255.255.255 gw 10.10.10.3 dev eth0
[root@server1 ~]# route add -net 192.168.10.2 netmask 255.255.255.255 gw 10.10.10.4 dev eth1

Lalu cek routingnya dengan menggunakan command # route -n

[root@server1 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask           Flags Metric Ref    Use Iface
192.168.10.2   10.10.10.4     255.255.255.255 UH    0      0        0      eth1
192.168.10.1   10.10.10.3    255.255.255.255 UH    0      0        0      eth0
10.10.10.0      0.0.0.0            255.255.255.0   U       0      0        0      eth0
10.10.10.0      0.0.0.0           255.255.255.0   U       0      0        0      eth1
169.254.0.0     0.0.0.0           255.255.0.0     U     1002   0        0     eth0
169.254.0.0     0.0.0.0          255.255.0.0     U     1003   0        0     eth1

Dari hasil output diatas sudah terlihat bahwa.
  • Traffic menuju 192.168.10.1 akan keluar menggunakan interface eth0 dengan menggunakan gateway 10.10.10.3.
  • Traffic menuju 192.168.10.2 akan keluar menggunakan interface eth1 dengan menggunakan gateway 10.10.10.4 .

Setelah itu jangan lupa test ping untuk memastikan bahwa konfigurasi yang kita lakukan sudah benar.

Ping ke 192.168.10.1
[root@localhost ~]# ping 192.168.10.1
PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data.
64 bytes from 192.168.10.1: icmp_seq=1 ttl=64 time=0.837 ms
64 bytes from 192.168.10.1: icmp_seq=2 ttl=64 time=0.649 ms
^C
--- 192.168.10.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1473ms
rtt min/avg/max/mdev = 0.649/0.743/0.837/0.094 ms

Ping ke 192.168.10.2
[root@localhost ~]# ping 192.168.10.2
PING 192.168.10.2 (192.168.10.2) 56(84) bytes of data.
64 bytes from 192.168.10.2: icmp_seq=1 ttl=64 time=2.11 ms
64 bytes from 192.168.10.2: icmp_seq=2 ttl=64 time=0.659 ms
^C
--- 192.168.10.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1500ms
rtt min/avg/max/mdev = 0.659/1.384/2.110/0.726 ms


KONFIGURASI PERSISTENT ROUTING DI SERVER1

Perlu diingat bahwa cara diatas bersifat temporary jadi apabila server mati atau di reboot maka routing yang telah dibuat akan hilang.

Apabila kita ingin membuat routing yang persistent yaitu routing yang tidak akan hilang meskipun servernya mati atau di reboot maka caranya adalah seperti dibawah ini.

1) Tambahkan Routing di Eth0
[root@server1 ~]# vi /etc/sysconfig/network-scripts/route-eth0

GATEWAY0=10.10.10.3

NETMASK0=255.255.255.255

ADDRESS0=192.168.10.1


2) Tambahkan Routing di Eth1
[root@server1 ~]# vi /etc/sysconfig/network-scripts/route-eth1

GATEWAY0=10.10.10.4

NETMASK0=255.255.255.255

ADDRESS0=192.168.10.2

3) Restart Network Services
[root@server1~]# /etc/init.d/network restart

Setelah itu jangan lupa cek routingnya menggunakan command # route -n dan testing menggunakan ping ke masing-masing destination address (192.168.10.1 dan 192.168.10.2). Testing juga apakah ketika server di reboot apakah routingnya hilang atau tidak. Kalau sudah benar harusnya routing tidak akan hilang.


Done! Semoga bermanfaat ya artikel ini.