Genel Bilgi
Temel olarak kurmak istediğimiz yapı yandaki şekildeki gibidir. Tek fark OS olarak CentOS kullanacağım.
Her node'un kendi ip'si ve hangi node aktif ise onun üzerinde bulunacak olan bir adet virtual ip (cluster ip) kullanılacak. Uygulamalar virtual ip üzerinden aktif node üzerindeki MYSQL DB'sine erişecekler. Master sunucu diskine yazılan her data otomatik olarak slave sunucu diskine senkron oluyor.
Beklenmedik bir durumda master sunucu down olduğunda slave sunucu diski master ile aynı olduğu için çok kısa bir sürede slave sunucu hizmet vermeye başlıyor ve uygulamaların çalışmasında herhangi bir sorun yaşanmıyor.
DRDB
Açılımı "Distributed Replicated Block Device" olan DRBD temel olarak network üzerinden iki disk arasında replikasyon yapmaya yarar.
DRBD'nin çalışma şekli aşağıdaki şemada anlatıldığı gibidir.
DRBD ile ilgili daha detaylı bilgi almak isterseniz www.drbd.org adresine göz atabilirsiniz.
Pacemaker
MySQL clusterda kullanacağımız Node'ların durumlarından hareketle ilgili node'ların yada node'lar üzerindeki servisleri kontrol ederek cluster'ın sorunsuz bir şekilde çalışmasını sağlar.
Corosync
Corosync node'lar arasındaki iletişimin sağlanmasından sorumlu bileşendir ve Pacemaker'a bir messaging interface sağlar. Bu şekilde de Pacemaker node'lar üzerindeki servislerin durumlarından haberdar olur.
KURULUM
Kurulum sırasında yapılacak işlemler node node değişiklik gösterecektir. Kurulum öncesinde ilk olarak her iki node üzerinde hostname, selinux,firewall gibi bir kaç ayar yapılacaktır.
Hostname
Cluster yapısından node'ların birbirlerinin isimlerini ve FQDN'lerini sorunsuz bir şekilde çözebilmeleri gerekmektedir.
Node1
hostname node01.ndsr.local
sed -i '/HOSTNAME=/c\HOSTNAME=node01.ndsr.local' /etc/sysconfig/network
echo 1.1.1.11 node01.ndsr.local >> /etc/hosts
echo 1.1.1.12 node02.ndsr.local >> /etc/hosts
Node2
hostname node02.ndsr.local
sed -i '/HOSTNAME=/c\HOSTNAME=node02.ndsr.local' /etc/sysconfig/network
echo 1.1.1.11 node01.ndsr.local >> /etc/hosts
echo 1.1.1.12 node02.ndsr.local >> /etc/hosts
Tanımlamaların doğrulunu teyit için her iki node üzerinden birbirlerini hostname ile ping atarak kontrol edebilirsiniz.
IPTables ve SELinux
Ben iki node üzerinde de iptables ve selinux'ü disable edeceğim ancak isterseniz gerekli portlara izin vererekte iptables'ı kullanabilirsiniz.
Her iki node'da
> /etc/sysconfig/iptables
chkconfig iptables off && chkconfig ip6tables off
setenforce 0
sed -i '/SELINUX=/c\SELINUX=disabled' /etc/selinux/config
YUM Repo'ları
DRBD ve pacemaker paketlerini kurmak için yeni repo'ları ekliyoruz.
Her iki node'da
hostname node02.ndsr.local
sed -i '/HOSTNAME=/c\HOSTNAME=node02.ndsr.local' /etc/sysconfig/network
echo 1.1.1.11 node01.ndsr.local >> /etc/hosts
echo 1.1.1.12 node02.ndsr.local >> /etc/hosts
Tanımlamaların doğrulunu teyit için her iki node üzerinden birbirlerini hostname ile ping atarak kontrol edebilirsiniz.
IPTables ve SELinux
Ben iki node üzerinde de iptables ve selinux'ü disable edeceğim ancak isterseniz gerekli portlara izin vererekte iptables'ı kullanabilirsiniz.
Her iki node'da
chkconfig iptables off && chkconfig ip6tables off
setenforce 0
sed -i '/SELINUX=/c\SELINUX=disabled' /etc/selinux/config
YUM Repo'ları
DRBD ve pacemaker paketlerini kurmak için yeni repo'ları ekliyoruz.
Her iki node'da
rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org; rpm -Uvh http://www.elrepo.org/elrepo-release-6-5.el6.elrepo.noarch.rpm
İlgili repoları indirmekta sıkıntı yaşarsanız diye drive üzerine kopyaladım.repo linkinden ilgili repolara erişebilirsiniz.
Paketlerin Yüklenmesi
Her iki node'da
yum install drbd84-utils kmod-drbd84 corosync pacemaker
ilgili paketleri yükledikten sonra iki node'u da reboot edelim.
DRBD Yapılandırması
Ben iki node üzerinde de ikinci bir disk /dev/sdb ekledim ve mysql datalarının bu diskte tutumayı planlıyorum. Amacım ilerde disk alanı yeterli olmazsa LVM ile diski yeniden boyutlandırabilyim diye.
Her iki node'da
vgcreate vgdrbd /dev/sdb
lvcreate -l 100%FREE -n lvmysql vgdrbd
komutları ile sdb diskini kullanan bir pv ve vgdrbd isimli volume grup ve lvmysql isimli logical volume oluşturduk.
Oluşturduğumuz logical volume'ların her iki node üzerinde sync edilmesi için gerekli ayarları yapalım.
/etc/drbd.d/ dizini altında clusterdb.res (isim tamamen size kalmış ancak dosya içerisinde de aynı ismi kullanacağız.) isminde dosya açıyoruz.
vi /etc/drbd.d/clusterdb.res
Dosya içerisine aşağıdakileri ekleyin ancak belirttiğim yerleri kendi yapınıza göre düzenlemeyi unutmayın.
resource clusterdb {
protocol C;
handlers {
pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f";
fence-peer "/usr/lib/drbd/crm-fence-peer.sh";
split-brain "/sbin/iptables -A INPUT -p tcp --dport 3306 -j DROP";
}
startup {
degr-wfc-timeout 120;
outdated-wfc-timeout 2;
}
disk {
on-io-error detach;
}
net {
cram-hmac-alg "sha1";
shared-secret "123456";
after-sb-0pri disconnect;
after-sb-1pri disconnect;
after-sb-2pri disconnect;
rr-conflict disconnect;
}
syncer {
rate 10M;
al-extents 257;
on-no-data-accessible io-error;
}
volume 0 { #oluşturduğumuz yeni diskle ilgili ayarlar.
device /dev/drbd0;
disk /dev/vgdrbd/lvmysql;
meta-disk internal;
}
on node01.ndsr.local {
device /dev/drbd0;
disk /dev/vgdrbd/lvmysql;
address 1.1.1.11:7788;
flexible-meta-disk internal;
}
on node02.ndsr.local {
device /dev/drbd0;
disk /dev/vgdrbd/lvmysql;
address 1.1.1.12:7788;
flexible-meta-disk internal;
}
}
yapmış olduğumuz ayarların devreye alınması için aşağıdaki komutu çalıştıralım.
Her iki node'da (sırayla)
drbdadm create-md clusterdb # bu komut ile DRBD, /etc/drbd.d/ altındaki .res uzantılı dosyayı okuyarak belirtilen ayarları devreye alacaktır.
Writing meta data...
initializing activity log
NOT initializing bitmap
New drbd meta data block successfully created.
success
DRBD servisini her iki node da çalıştıralım.
Her iki node'da
/etc/init.d/drbd start
DRBD sorunsuz bir şekilde çalıştığında aşağııdaki gibi bir çıktı alırsınız ve oluşturduğumuz drbd0 isimli sanal diskin her iki node üzerinde de oluştuğunu göreceksiniz.
Starting DRBD resources: [
create res: clusterdb
prepare disk: clusterdb
adjust disk: clusterdb
adjust net: clusterdb
]
file /dev/drbd0
/dev/drbd0: block special
/etc/init.d/drbd status komutu ile her iki node üzerindeki drbd durumunu görebilirsiniz.
/etc/init.d/drbd status
drbd driver loaded OK; device status:
version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 599f286440bd633d15d5ff985204aff4bccffadd build by phil@Build64R6, 2013-10-14 15:33:06
m:res cs ro ds p mounted fstype
0:clusterdb Connected Secondary/Secondary Inconsistent/Inconsistent C
yukarıda bold olarak belirtilen bölümlerde clusterdb isimli drbd resource'umuzun connect olduğu gözüküyor. Ancak Node'lardan bir tanesini Primary olarak belirtmediğimiz için senkronizasyon başlamadı. Inconsistent/Inconsistent gözükmesinin nedeni budur.
Node1 sunucusunu primary olarak set etmek içinaşağıdaki komutu node01 üzerinde çalıştıralım.
drbdadm -- --overwrite-data-of-peer primary all
Bu komut ile Node01 üzerindeki DRBD primary olarak atanıp üzerindeki tüm datayı diğer node'a (Node02) yazmasını söylemektedir.
Komutu çalıştırdıktan sonra node'lardan herhangi birinin üzerinde /etc/init.d/drbd status komutu ile drbd'nin durumuna bakılabilir.
/etc/init.d/drbd status
drbd driver loaded OK; device status:
version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 599f286440bd633d15d5ff985204aff4bccffadd build by phil@Build64R6, 2013-10-14 15:33:06
m:res cs ro ds p mounted fstype
... sync'ed: 11.8% (18080/20472)M
0:clusterdb SyncSource Primary/Secondary UpToDate/Inconsistent C
Bold olarak belirtilen satır da Node01'in şu an Primary durumda ve karşısındaki node'a üzerindeki datayı sync etmeye başladı. Kırmızı ile belirtilen yerde sync durumunu göstermektedir.
Sync tamamlandıktan sonra "UpToDate/Inconsistent" yazan kısımda "UpToDate/UpToDate" şeklinde göreceksiniz.
Node01 üzerindeki /dev/drbd0 diski üzerinde ext4 dosya sistemini oluşturalım.
Sadece node01’da:
mkfs.ext4 /dev/drbd0 #komutu ile drbd0 diskini ext4 şeklinde formatladık. Artık diğer cluster dosyalarının kurulumuna geçebiliriz.
MYSQL Kurulumu
Her iki node'da
yum install mysql-server -y # komutu ile kurulumu yapıyoruz.
mkdir /mysql_drbd # root (/) altında drbd0 diskimizi mount edeceğimiz klasörü oluşturduk
chown -fR mysql:mysql /mysql_drbd # oluşturulan kalsörde mysql kullanıcısı için sahiplik verdik.
mount noktasını oluşturduktan sonra drbd0 diskimizi mount edip mysql ayarlarını yapacağız.
Sadece node01’da:
mount /dev/drbd0 /mysql_drbd
mkdir /mysql_drbd/data
cp -pr /usr/share/mysql/my-large.cnf /mysql_drbd/my.cnf
Mysql verilerin tutulacağı /mysql_drbd/data dizinini mysql conf dosyasına ekliyoruz.
vi /mysql_drdb/my.cnf
datadir = /mysql_drbd/data
# Ayrıca innodb kullanıyorsanız:
innodb_data_home_dir = /mysql_drbd/data
innodb_log_group_home_dir = /mysql_drbd/data
Default my.conf dosyası içerisinde datadir ibaresi olmayabilir kendiniz ekleyebilirsiniz. Ayrıca innodb kullanıyorsanız onlarında data dizinini değiştirmeyi unutmayın.
Mysql'in yeni dizini kullanması için aşağıdaki komutu çalıştıralım.
mysql_install_db --no-defaults --datadir=/mysql_drbd/data --user=mysql
chown -fR mysql:mysql /mysql_drbd/data
chmod -fR 755 /mysql_drbd/data
bu işlem sonrasında /mysql_drbd/data altında default oluşan mysql de test db'lerini görebilirsiniz.
Mysql ile ilgili işlemleri tamamlamış bulunuyoruz. Corosync yapılandırmasından önce mount ettiğimiz /mysql_drbd/ alanını umount edip drbd üzerinden node01'i secondary'e çekiyoruz.
umount /mysql_drbd/
drbdadm secondary clusterdb
Mysql servisini manuel olarak çalıştırmamızın, umount yapmamızın ve drbd'nin secondary'e çekmemizin nedeni bu işlemleri pacemaker üzerinden otomatik olarak yapacak olmamız.
Corosync Konfigürasyonu
Her iki node üzerinde corosync konfigürasyonunu yapacağımız için template üzerinden birer conf dosyası oluşturalım.
Her iki node'da
cp /etc/corosync/corosync.conf.example /etc/corosync/corosync.conf
Daha sonra aşağıda belirttiğim yerleri kendi yapınıza göre düzenleyin.
# Please read the corosync.conf.5 manual page
compatibility: whitetank
totem {
version: 2
secauth: off
threads: 0
interface {
ringnumber: 0
bindnetaddr: 1.1.1.0
mcastaddr: 226.94.1.1
mcastport: 5405
ttl: 1
}
}
logging {
fileline: off
to_stderr: no
to_logfile: yes
to_syslog: yes
logfile: /var/log/cluster/corosync.log
debug: off
timestamp: on
logger_subsys {
subsys: AMF
debug: off
}
}
amf {
mode: disabled
}
bindnetaddr ibaresi db'ler arasındaki iletişimin multicast olmasından dolayı benim IP networkümü belirtmektedir. Kendi network'ünüze göre düzenlemeniz gerekmektedir.
mcastaddr ibaresi de corosync iletişimi için kullanılan multicast ip'sini belirtmektedir. Aynı Ip blogu içerisinde birden fazla cluster mysql kurulumu yapacaksanız multicast ip'lerini değiştirmeyi unutmayın aksi durumda corosync iletişimi karışacaktır.
Son olarak iki node üzerinde de pcmk isimli dosya oluşturuyoruz.
Her iki node'da
vi /etc/corosync/service.d/pcmk # dosyayı açığ içeriğine aşağıdakileri ekliyoruz.
service {
# Load the Pacemaker Cluster Resource Manager
name: pacemaker
ver: 1
}
Corosync konfigürasyonunu tamamladık.
Pacemaker Konfigürasyonu
Pacemaker'ı drbd ve mysql servislerini yöentmesi için gereken ayarları yapacağız. crmsh isimli pacemaker yapılandırma aracından faydalanacağımız için ilgili depoların bulunduğu repo'yu ekliyoruz.
Her iki node'da
wget -O /etc/yum.repos.d/network:ha-clustering:Stable.repo http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-6/network:ha-clustering:Stable.repo
bu repo'yu sadece bu paket için kullancağımız için disable edelim.
sed -i s#enabled=1#enabled=0#g /etc/yum.repos.d/network\:ha-clustering\:Stable.repo
sıra paketi yüklemeye geldi.
yum install crmsh --enablerepo=network_ha-clustering_Stable -y
Her iki node üzerinde corosync ve pacemaker servislerini start ediyoruz.
/etc/init.d/corosync start
/etc/init.d/pacemaker start
servisler çalıştıktan yaklaşık 30 sn sonra node'lar birbirlerini göreceklerdir. crm_mon -1 komutu ile bu durumu görebilirsiniz.
crm_mon -1
Last updated: Wed Jan 25 14:15:04 2016
Last change: Wed Jan 25 14:14:48 2016 via crmd on node01.ndsr.local
Stack: classic openais (with plugin)
Current DC: node01.ndsr.local - partition with quorum
Version: 1.1.10-14.el6_5.2-368c726
2 Nodes configured, 2 expected votes
0 Resources configured
Online: [ node01.ndsr.local node02.ndsr.local ]
İki node'da online durumda olduğunu göreceksiniz. Şimdi DRBD ve resource tanımlarına başlayabiliriz.
Sadece Node01'de
*İlk olarak cluster'a quorum policy'sini ignore etmesini söyleyeceğiz. Quorum node'ların durumları hakkında cluster'a bilgi vermek için kullanılır. Cluster servisinin ayakta kalması için yeterli node olup olmadığını kontrol eder. 3 node'lu bir yapıda sunucunun biri down olursa sistem çalışmaya devam eder ancak 2 node'lu bir yapıda quorum kalan tek node'un yedeği olmadığı için veri bütünlüğünü koruma amaçlı olarak cluster'ı tamamen kapatacaktır. Bunu önlemek için policy'i ignore ediyoruz.
crm configure property no-quorum-policy=ignore
*resource-stickiness parametresi ile resourece'lerin node'lar arasındaki durumunu belirleyebiliyoruz. Biz default olarak 100'de bıraktık.
crm configure rsc_defaults resource-stickiness=100
*Son olarakta fencing olarak bilinen STONITH özelliğini disable etmek. Node'lar arasi iletişimde sorun yaşanması ve cluster da sorun yaşanmaması için diğer node'u kapatmaya çalışmasıdır. İki node olduğu için ve farklı bir yöntem ile kendilerini durdurmalarını sağlayacağımız için kapattık.
crm configure property stonith-enabled=false
*Pacemaker'ın yöneteceği resource'ları tanımlayacağımız için iki node'da da drbd servisini stop yapmamış gerekiyor. drbd yönetimini pacemaker'a vereceğimiz için.
Her iki node'da
/etc/init.d/drbd stop
Sadece node01'de
cmd configure # komutu ile pacemaker komut satırını başlatıyoruz.
*clusterdb isimli DRBD resource'mizi yönetecek p_drbd_mysql isimli resource'umuzu tanımlıyoruz.
primitive p_drbd_mysql ocf:linbit:drbd params drbd_resource="clusterdb" op monitor interval="15s"
*bir adet master'a izin veren master-slave relationship'i tanımlıyoruz.
ms ms_drbd_mysql p_drbd_mysql meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true"
*Daha sonra da pacemaker'ın /dev/drbd0 diskini ext4 olarak mount etmesi için pf_fs_mysql isimli tanımı yapıyoruz.
primitive p_fs_mysql ocf:heartbeat:Filesystem params device="/dev/drbd0" directory="/mysql_drbd" fstype="ext4"
*Sırada Master sunucusuna atanacak olan virtual-ip'yi set eden p_ip_mysql isimli resource'u tanımlıyoruz. Kırmızı ile belirttiğim ip'yi kendi yapınıza göre düzenlemeniz gerekmektedir.
primitive p_ip_mysql ocf:heartbeat:IPaddr2 params ip="1.1.1.10" cidr_netmask="24" nic="eth0"
*En son olarakta pacemaker'ın mysql'i nasıl başlatacağını belirten resource tanımını yapacağız. kırmızı olarak belirttiğim yere kendi virtual ip'nizi yazmayı unutmayın.
primitive p_mysql ocf:heartbeat:mysql params binary="/usr/libexec/mysqld" config="/mysql_drbd/my.cnf" user="mysql" group="mysql" datadir="/mysql_drbd/data" pid="/var/lib/mysql/mysql.pid" socket="/var/lib/mysql/mysql.sock" additional_parameters="--bind-address=1.1.1.10" op start timeout="120s" interval="0" op stop timeout="120s" interval="0" op monitor interval="20s" timeout="30s"
p_drbd_mysql, p_fs_mysql, p_ip_mysql, p_mysql olmak üzere temel resourceları tanımladık.
*Şimdi de, MYSQL servisinin başlatılabilmesi için gerekli olan p_fs_mysql, p_ip_mysql ve p_mysql i g_mysql grubunda toplayacağız.
group g_mysql p_fs_mysql p_ip_mysql p_mysql
*Oluşturduğumuz g_mysql'in master sunucu üzerinde çalışması için aşağıdaki komutu çalıştırıyoruz.
colocation c_mysql_on_drbd inf: g_mysql ms_drbd_mysql:Master
order o_drbd_before_mysql inf: ms_drbd_mysql:promote g_mysql:start
*temel tanımlamalarımız bitti. tanımlamaların devreye alınması için commit diyoruz. Commit sonrası timeout ile ilgili warning alabilirsiniz çok fazla önemli değil.
Exit diyerek crmsh'dan çıkıyoruz.
crm_mon -1 ile cluster durumunu kontrol edebiliriz.
tack: classic openais (with plugin)
Current DC: node01.ndsr.local - partition with quorum
Version: 1.1.10-14.el6_5.2-368c726
2 Nodes configured, 2 expected votes
5 Resources configured
Online: [ node01.ndsr.local node02.ndsr.local ]
Master/Slave Set: ms_drbd_mysql [p_drbd_mysql]
Masters: [ node01.ndsr.local ]
Slaves: [ node02.ndsr.local ]
Resource Group: g_mysql
p_fs_mysql (ocf::heartbeat:Filesystem): Started node01.ndsr.local
p_ip_mysql (ocf::heartbeat:IPaddr2): Started node01.ndsr.local
p_mysql (ocf::heartbeat:mysql): Started node01.ndsr.local
*Node01 üzerinden yada virtual-ip (1.1.1.10) üzerinden mysql'e erişebilmeniz gerekiyor.
mysql -u root -e "GRANT ALL ON *.* to 'root'@'%'" # komutu ile v-ip erişimine mysql üzerinde izin vermiş oluruz.
*root kullanıcısı ile heryerden erişilebileceği için v-ip'ye bağlanmayı herhangi bir node üzerinden deneyebilirsiniz.
mysql -h 1.1.1.10
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.1.71 Source distribution
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
-------
*STONITH mekanizmasını disable etmiştik. Amacımız iki node'lu yapılarda node'lar arasında yaşanacak herhangi bir iletişim sorununda cluster yapımızın tamamen servis dışı olmasını önlemek. Şimdi bunun yerine kullanacağımız monitoring'leri tanımlayacağız.
*Tekrar crm shell'e geçerek p_ping isimli gateway'imizi işaret eden resource'umuzu oluşturuyoruz. Kendi gateway'inizi girmeyi unutmayın.
crm configure
primitive p_ping ocf:pacemaker:ping params name="ping" multiplier="1000" host_list="1.1.1.2" op monitor interval="15s" timeout="60s" start timeout="60s"
*p_ping resource'umuzun iki node üzerinde de çalışması için clone'luyoruz.
clone cl_ping p_ping meta interleave="true"
*Ping sorunçlarına göre aksiyon alacak kuralımızı oluşturuyoruz.
location l_drbd_master_on_ping ms_drbd_mysql rule $role="Master" -inf: not_defined ping or ping number:lte 0
commit
exit
*GW erişimde sorun olmaması ancak Node'ların birbirine erişiminde sorun olması durumunda DRBD'nin split-brain önlemek için kendi yazdığımız scripti çalıştırabiliyoruz.
Bu işlem için Her iki Node'da
/etc/drbd.d/clusterdb.res dosyasını editleyerek handlers parantezinin içerisine aşağıdakini ekleyin.
split-brain "/sbin/iptables -A INPUT -p tcp --dport 3306 -j DROP";
*Son olarak startup'ta drbd ve mysql servislerinin otomatik olarak açılmasını engelleyerek corosync ve pacemaker servislerinin otomatik açılmasını sağlayalım.
chkconfig drbd off
chkconfig corosync on
chkconfig mysqld off
chkconfig pacemaker on
*crm resource migrate g_mysql node02.ndsr.local komutu ile cluster rolünü diğer node taşıyabilirsiniz ancak manuel taşıma işleminden sonra mutlaka yönetimi cluster'a vermeniz gerekmektedir. Yönetimi cluster'a geri veremek için crm resource unmove g_mysql komutunu kullanabilirsiniz.
Hiç yorum yok:
Yorum Gönder