Showing posts with label CentOS. Show all posts
Showing posts with label CentOS. Show all posts

Saturday, May 27, 2017

Migrasi Mailbox Cpanel ke Zimbra

Kalau di tutorial sebelumnya kita melakukan migrasi account Cpanel ke Zimbra kali ini catatan saya akan membahas bagaimana memindahkan mailbox Cpanel ke Zimbra. Mailbox yang dimaksud sendiri ialah isi dari email atau surat elektronik yang dimiliki masing2 account di POP3/IMAP Server di Cpanel. 
Hal ini bisa diibaratkan tiap masing2 account di Cpanel memiliki kotak surat masing-masing yang di dalam kotak surat tersebut berisi surat-surat elektronik dari pengirimnya.
Hal paling umum yang biasa dilakukan ketika migrasi mail server ialah sekaligus memindahkan mailbox yang ada di tempat lama ke tempat baru.

Berikut dibawah ini ialah langkah-langkahnya.

1. Migrasi Account Cpanel ke Zimbra
Tahap ini sudah pernah saya bahas di tutorial sebelumnya. Untuk lebih lengkapnya bisa kunjungi tutorial saya Migrasi Account Cpanel ke Zimbra.

2. Migrasi Mailbox
Migrasi Mailbox dari Cpanel ke zimbra dilakukan dengan cara mensinkronisasikan IMAP dengan command imapsync. Ada beberapa requirement yang diperlukan dalam tahap ini, beberapa diantaranya ialah.
  • Kita harus mengetahui username dan password dari tiap2 account. Dalam tahap ini biasanya menjadi kendala karna kita biasanya tidak tahu password dari masing2 account, namun kita masih bisa mengakalinya dengan membuat password default terlebih dahulu ketika migrasi mailbox lalu setelah selesai baru kita migrasikan ulang account nya sesuai dengan password yg lama.
  • Agar memudahkan pekerjaan sebaiknya Domain zimbra mail server sudah dikenal oleh DNS.
  • Perhatikan port IMAP yang digunakan oleh Cpanel dan Zimbra. Ketika menggunakan teknik imapsync biasanya kita menggunakan port 993 (IMAP SSL) di Cpanel dan port 993/7993 di Zimbra (IMAP SSL)
  • Apabila kita tidak mengetahui Domain Cpanel yg akan kita migrasikan maka kita dapat menggunakan IP Address dari Cpanel, untuk mengetahuinya bisa menggunakan ping dari zimbra server kita.
Setelah memperhatikan beberapa hal diatas, kita bisa menggunakan command dibawah ini. 
[root@azpstudent ~]# imapsync --buffersize 8192000 --nosyncacls --subscribe --syncinternaldates --host1 IPADDRESSCPANEL --user1 customer.service@domaincpanel.com --password1 passwordcustomerservicecpanel --ssl1 --port1 993 --host2 mail.azpstudent.com --user2 customer.service@azpstudent.com --password2 passwordcustomerservicezimbra -ssl2 --port2 7993 --noauthmd5

Notes
  • Ganti parameter yang saya bold diatas sesuai yang Anda dibutuhkan dan Anda konfigurasikan di system Anda.
  • Perhatikan pada parameter port2 command diatas saya menggunakan port 7993 di zimbra saya sebagai IMAP SSL. Sesuaikan port tersebut dengan parameter konfigurasi yang ada di sistem Anda.

3. Verifikasi
Untuk verifikasi apakah proses migrasi mailbox sukses atau tidak, Anda bisa masuk ke Zimbra Account Anda, contoh dari disini adalah mailbox customer.service.

























Migrasi Email Account Cpanel ke Zimbra

Okeh jadi hal pertama yang harus dilakukan adalah migrasikan atau export user account tiap pengguna email cpanel ke zimbra. Kebeneran saya dapat script dari salah satu kenalan saya di excellent yang juga dulu ngajarin zimbra (thx mas imanuddin, dhenandi, & team).

Script tersebut kira-kira seperti dibawah ini.

[zimbra@azpstudent ex-im]$ cat script-export-acc-cpanel.sh 
#!/bin/sh

# Clear screen
clear
LOCATION=`pwd`
rm $LOCATION/create-account-zimbra.zmp
touch $LOCATION/create-account-zimbra.zmp
echo "Looping for all users"

DOMAIN=`hostname`
USER_LIST="shadow"
USERS=`cat $LOCATION/$USER_LIST`


for ACCOUNT in $USERS; 
do
        PASS=`echo $ACCOUNT | cut -d ':' -f2`
        ACC=`echo $ACCOUNT | cut -d ":" -f1`

echo "Retrieve password account $ACC@$DOMAIN"
echo "ca $ACC@$DOMAIN PasswordTemp" >> create-account-zimbra.zmp
echo "ma $ACC@$DOMAIN userPassword '{crypt}$PASS'" >> create-account-zimbra.zmp

done
echo "Complete"

Seperti yang kita tahu bahwa username & password di linux tersimpan di file /etc/passwd dan /etc/shadow. Begitupula dengan Cpanel, username dan passwordnya juga disimpan di file tersebut.

Jadi dibawah ini langkah-langkahnya.

1. Log in ke Cpanel dan Go To direktori /etc/DOMAIN/ lalu Download SHADOW File



















2. SSH ke Server Zimbra lalu Masukan Command di Bawah.
Isi dari file yang di download dibawah ini sebenernya adalah script yang sudah di deskripsikan diatas.

cd /srv
wget -c https://dhenandi.com/repo/export-import-acc-cpanel.zip
unzip export-import-acc-cpanel.zip
cd ex-im/

Setelah itu masukan file SHADOW yang sudah di download dari Cpanel ke Zimbra Server direktori /srv/ex-im/ (Bisa gunakan SCP/Win SCP). 

Apabila selesai maka dalam direktori /srv/ex-im akan ada file dibawah ini.



3. Execute Script script-export-acc-cpanel.sh 
Langkah paling krusial yaitu mengeksekusi script yang sudah di download lalu memasukan account tersebut ke zimbra. Ubah permission file agar bisa dieksekusi dengan command dibawah ini.
cd /srv/ex-im
chmod +x script-export-acc-cpanel.sh
./script-export-acc-cpanel.sh

Lalu setelah mengeksekusi command diatas maka akan muncul satu buah file bernama create-account-zimbra.zmp. File tersebut berisi account yang ada di Cpanel yang akan kita migrasikan ke Zimbra.








4. Migrate Account ke Zimbra
Setelah kita berhasil mengenerate file create-account-zimbra.zmp dengan script script-export-acc-cpanel.sh maka langkah selanjutnya kita migrasikan seluruh account dari Cpanel yang ada di create-account-zimbra.zmp ke dalam Zimbra Mail Server.

Langkahnya ialah masuk ke user zimbra lalu gunakan command zmprov.
[root@azpstudent ~]# su - zimbra
[zimbra@azpstudent ~]$ cd /srv/ex-im/  
[zimbra@azpstudent ex-im]$ zmprov < create-account-zimbra.zmp 

####Maka Akan Keluar Output Seperti Dibawah Ini####
prov> ca customer.service@azpstudent.com PasswordTemp
ERROR: account.ACCOUNT_EXISTS (email address already exists: customer.service@azpstudent.com, at DN: uid=customer.service,ou=people,dc=azpstudent,dc=com)
prov> ma customer.service@azpstudent.com userPassword '{crypt}$6$cbL8PhBuZ6EcaUA4$uc4/26w2kqzjNUksrk2n0x9BbUivGbcVgK.1S6ZBcMqSfiHDxkiVpuYt5SWpc7ZsdEPT0M.pUGj1.IA01WDSt0'

5. Verifikasi di Zimbra
Dari langkah diatas kita hanya migrasikan account customer.service dari account Cpanel ke Zimbra.
Untuk melihat apakah account tersebut sudah ada di zimbra kita bisa login ke web zimbra administrator lalu ke bagian Manage -> Accounts.







Bisa dilihat dari tampilan zimbra administrator diatas bahwa account customer.service sudah berhasil di migrasi/export ke zimbra mail server kita.

Sekian tutorial dan catatan saya ini.

Sumber : 

Wednesday, April 19, 2017

Konfigurasi SNMP Trapper di Zabbix

Dalam NMS (Network Monitoring System) metode untuk menerima SNMP Traps adalah metode yang terbalik dengan query SNMP-Enabled ke device tujuan. Dalam kasus SNMP Traps, informasi di SNMP-Enabled device dikirim dan dianalisa di server NMS (Dalam tutorial ini NMS yang dimaksud ialah Zabbix). Biasanya Traps dikirim ke port 162 di NMS.

Notes
  • Tutorial ini dengan asumsi bahwa zabbix sudah di install di tempat Anda. Untuk tutorial Zabbix bisa liat di link ini Installasi Zabbix di CentOS.
  • Selinux disabled.

Dibawah ini langkah-langkah untuk konfigurasinya.

1. Apabila CentOS Anda Mengaktifkan IPTables, Allow Port UDP 162
[root@localhost ~]# vi /etc/sysconfig/iptables:
###tambahkan line dibawah ini
-A INPUT -p udp -m udp --dport 162 -j ACCEPT

###Lalu restart service iptables
[root@localhost ~]# /etc/init.d/iptables restart

2. Setting Zabbix Agar Dapat Menerima SNMP Traps Menggunakan zabbix_trap_receiver.pl
[root@localhost ~]# yum install -y net-snmp-utils net-snmp-perl

Download zabbix_trap_receiver.pl di URL ini -> https://github.com/miraclelinux/MIRACLE-ZBX-2.0.3-NoSQL/blob/master/misc/snmptrap/zabbix_trap_receiver.pl

Isi dari script perl tersebut kurang lebih seperti dibawah ini.

[root@localhost ~]# cat /usr/bin/zabbix_trap_receiver.pl
#!/usr/bin/perl

#
# Zabbix
# Copyright (C) 2001-2014 Zabbix SIA
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
#

#########################################
#### ABOUT ZABBIX SNMP TRAP RECEIVER ####
#########################################

# This is an embedded perl SNMP trapper receiver designed for sending data to the server.
# The receiver will pass the received SNMP traps to Zabbix server or proxy running on the
# same machine. Please configure the server/proxy accordingly.
#
# Read more about using embedded perl with Net-SNMP:
#       http://net-snmp.sourceforge.net/wiki/index.php/Tut:Extending_snmpd_using_perl

#################################################
#### ZABBIX SNMP TRAP RECEIVER CONFIGURATION ####
#################################################

### Option: SNMPTrapperFile
#       Temporary file used for passing data to the server (or proxy). Must be the same
#       as in the server (or proxy) configuration file.
#
# Mandatory: yes
# Default:
$SNMPTrapperFile = '/tmp/zabbix_traps.tmp';

### Option: DateTimeFormat
#       The date time format in strftime() format. Please make sure to have a corresponding
#       log time format for the SNMP trap items.
#
# Mandatory: yes
# Default:
$DateTimeFormat = '%H:%M:%S %Y/%m/%d';

###################################
#### ZABBIX SNMP TRAP RECEIVER ####
###################################

use Fcntl qw(O_WRONLY O_APPEND O_CREAT);
use POSIX qw(strftime);

sub zabbix_receiver
{
        my (%pdu_info) = %{$_[0]};
        my (@varbinds) = @{$_[1]};

        # open the output file
        unless (sysopen(OUTPUT_FILE, $SNMPTrapperFile, O_WRONLY|O_APPEND|O_CREAT, 0666))
        {
                print STDERR "Cannot open [$SNMPTrapperFile]: $!\n";
                return NETSNMPTRAPD_HANDLER_FAIL;
        }

        # get the host name
        my $hostname = $pdu_info{'receivedfrom'} || 'unknown';
        if ($hostname ne 'unknown') {
                $hostname =~ /\[(.*?)\].*/;                    # format: "UDP: [127.0.0.1]:41070->[127.0.0.1]"
                $hostname = $1 || 'unknown';
        }

        # print trap header
        #       timestamp must be placed at the beggining of the first line (can be omitted)
        #       the first line must include the header "ZBXTRAP [IP/DNS address] "
        #              * IP/DNS address is the used to find the corresponding SNMP trap items
        #              * this header will be cut during processing (will not appear in the item value)
        printf OUTPUT_FILE "%s ZBXTRAP %s\n", strftime($DateTimeFormat, localtime), $hostname;

        # print the PDU info
        print OUTPUT_FILE "PDU INFO:\n";
        foreach my $key(keys(%pdu_info))
        {
                printf OUTPUT_FILE "  %-30s %s\n", $key, $pdu_info{$key};
        }

        # print the variable bindings:
        print OUTPUT_FILE "VARBINDS:\n";
        foreach my $x (@varbinds)
        {
                printf OUTPUT_FILE "  %-30s type=%-2d value=%s\n", $x->[0], $x->[2], $x->[1];
        }

        close (OUTPUT_FILE);

        return NETSNMPTRAPD_HANDLER_OK;
}

NetSNMP::TrapReceiver::register("all", \&zabbix_receiver) or
        die "failed to register Zabbix SNMP trap receiver\n";

print STDOUT "Loaded Zabbix SNMP trap receiver\n";

3. Copy Script Perl tersebut ke /usr/bin
[root@localhost ~]# cp zabbix_trap_receiver.pl /usr/bin
[root@localhost ~]# chmod +x /usr/bin/zabbix_trap_receiver.pl

4. Update snmptrad.conf
[root@localhost ~]# vi /etc/snmp/snmptrapd.conf
### tambahkan line dibawah ini
authCommunity execute public
perl do "/usr/bin/zabbix_trap_receiver.pl";

5. Enable Zabbix SNMP Trapper 
[root@localhost ~]# vi /etc/zabbix/zabbix_server.conf
### Enable SNMP Trap di Zabbix Server 
StartSNMPTrapper=1
### Konfigurasi SNMPTrapperFile harus sama dengan yang ada di zabbix_trap_receiver.pl file.
SNMPTrapperFile=/tmp/zabbix_traps.tmp 

Setelah selesai save & quit, lalu restart zabbix server services.
[root@localhost ~]# /etc/init.d/zabbix_server restart

Notes : 
  • Untuk cek SNMPTrapperFile di zabbix_trap_receiver.pl dapat gunakan command ini, pastikan outputnya sama dengan di zabbix_server.conf
    [root@localhost ~]# cat /usr/bin/zabbix_trap_receiver.pl | grep \$SNMPTrapperFile\ =
    $SNMPTrapperFile = '/tmp/zabbix_traps.tmp';
  • [root@localhost ~]# cat /usr/local/etc/zabbix_server.conf | grep SNMPTrapperFile

  • SNMPTrapperFile=/tmp/zabbix_traps.tmp

6. Setting snmptrad Agar Start on Reboot 
[root@localhost ~]# chkconfig snmptrapd on
[root@localhost ~]# /etc/init.d/snmptrapd restart

7. Enable SNMP Trap Transmission File Rotation
[root@localhost ~]# mkdir -p /var/log/zabbix_traps_archive
[root@localhost ~]# chmod 777 /var/log/zabbix_traps_archive

Lalu tambahkan script dibawah ini untuk rotasi log di file /etc/logrotate.d/zabbix_traps.
/tmp/zabbix_traps.tmp {
    weekly
    size 10M
    compress
    compresscmd /usr/bin/bzip2
    compressoptions -9
    notifempty
    dateext
    dateformat -%Y%m%d
    missingok
    olddir /var/log/zabbix_traps_archive
    maxage 365
    rotate 10
}

8. Testing Send Traps
Langkah terakhir ialah send traps ke NMS atau localhost untuk memastikan bahwa NMS Zabbix yang kita configure dapat menerima traps dari device lain.

Gunakan Command Dibawah ini Untuk Sendtraps:
[root@localhost ~]# snmptrap -v 1 -c public 127.0.0.1 '.1.3.6.1.6.3.1.1.5.4' '0.0.0.0' 6 33 '55' \ .1.3.6.1.6.3.1.1.5.4 s "eth0"

Lalu cek di file /tmp/zabbix_trapper.tmp
[root@localhost ~]# cat /tmp/zabbix_traps.tmp
PDU INFO:
  notificationtype               TRAP
  version                        0
  receivedfrom                   UDP: [127.0.0.1]:33161->[127.0.0.1]
  errorstatus                    0
  messageid                      0
  community                      public
  transactionid                  1
  errorindex                     0
  requestid                      0
VARBINDS:
  iso.3.6.1.2.1.1.3.0            type=67 value=Timeticks: (55) 0:00:00.55
  iso.3.6.1.6.3.1.1.4.1.0        type=6  value=OID: iso.3.6.1.6.3.1.1.5.4.0.33
  iso.3.6.1.6.3.1.1.5.4          type=4  value=STRING: "eth0"
  iso.3.6.1.6.3.18.1.4.0         type=4  value=STRING: "public"
  iso.3.6.1.6.3.1.1.4.3.0        type=6  value=OID: iso.3.6.1.6.3.1.1.5.4


Apabila output diatas sudah sesuai berarti konfigurasi SNMP Trapper sudah berhasil. Untuk contoh SNMP Trap di device Cisco yang dikirim ke NMS Zabbix bisa liat tutorial ini Konfigurasi IPSLA di Router Cisco dan Send SNMP Trap ke Zabbix NMS.

Done...............

Konfigurasi Web Proxy di CentOS 6

Ada saat dimana OS CentOS yang kita install ada dibelakang proxy dan harus menggunakan proxy untuk mengakses internet baik itu browsing maupun instalasi package yang repository nya ada di Internet. 

Nah agar kita dapat koneksi internet maka kita harus menggunakan proxy tersebut. Dibawah ini merupakan langkah-langkahnya.

1. Konfigurasi di /etc/environment
[root@localhost ~]# vi /etc/environment 
http_proxy="http://proxysrv:8080/"
https_proxy="https://proxysrv:8080/"
ftp_proxy="ftp://proxysrv:8080/"
no_proxy=".mylan.local,.domain1.com,host1,host2"

2. Apabila Ingin Apply Setting Tanpa Restart Machine, Execute Command dibawah ini.
[root@localhost ~]# export http_proxy="http://proxysrv:8080/"
[root@localhost ~]# export https_proxy="https://proxysrv:8080/"
[root@localhost ~]# export ftp_proxy="ftp://proxysrv:8080/"
[root@localhost ~]# export no_proxy=".mylan.local,.domain1.com,host1,host2"

3. Apabila Anda Perlu Internet Untuk Instalasi Package Melalui Yum
[root@localhost ~]# vi /etc/yum.conf
proxy=http://proxysrv:8080/

Done...

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...