Genel

MySql Cluster ve Loadbalance kurulumu

MySql Cluster ve Loadbalance kurulumu

GİRİŞ
Bu makale, temel olarak adım adım MySQL veritabanı cluster , loadbalancing ve failover kurulumunu anlatır. Çok fazla teknik detaya girmeden basit bir şekilde anlatmaya çalışacağım. Yani her komut için açıklama ve MySQL Cluster hakkında çok ayrıntılı bir rehber arıyorsanız bu makale size göre değil. MySQL Cluster kurulumu hakkında pratik bir rehber, genel bir yardımcı kaynak arıyorsanız kesinlikle size yardımcı olacaktır. O zaman haydi başlayalım ;
MySQL Cluster bir bellek içi yüksek erişilebilirlik çözümüdür.Paylaşılan merkezi bir veritabanı mimarisine sahip olmadığından “tek nokta çökmesi” riskini minimize eder. Tüm transaction’lar diğer node’lara hafızadan replike edilir ve bu şekilde senkronizasyon sağlanır. Bu mimari yapı Cluster’a harika özellikler kazandırır, en başta dediğim gibi tek nokta çökmesi riskini en aza indirir, kolayca başka bir storage node eklenebilir ve load balanced çözümleri mümkün kılar.

NDB

MySQL Cluster NDB storage engine üzerine kurulmuştur. Burda paylaşılan birşey yoktur, NDB Engine hafızada depolar. Eğer iki node’lu bir cluster yapınız varsa, her ikisinde de birbirinden bağımsız datalar mevcuttur. Data her iki node’da eşzamanlı olarak işlenir(2-phase commit, SQL Server mirror’da olduğu gibi). NDB performans olarak çok üstün bir engine’dir.

CLUSTER KURULUMU

Cluster kurulumu için üç sunucuya ihtiyacımız var. İki Data Node ve bir tanede Management Node.

Server1   192.168.100.1 (Cluster Management Server)
Server2   192.168.100.2 (Data Node 1)
Server3   192.168.100.3 (Data Node 2)

İlk olarak MySQL Cluster Management Server kurulumunu gerçekleştireceğiz. Bunun için MySQL Cluster 7.2 sürümünü MySQl web sitesinden indirelim. (http://dev.mysql.com/downloads/cluster/). Bu yazımızda debian temelli sunucuları kullanıyoruz bundan dolayı nonrpm paketi indireceğiz                    ( mysql-cluster-gpl-7.2.6-linux2.6-x86_64.tar.gz) . MySQL Cluster Management Server (ndb_mgmd ) ve Cluster Management Client (ndb_mgm) kurulumu için aşağıdaki adımları takip edin.

mkdir /usr/src/mysql-mgm
cd /usr/src/mysql-mgm
wget  MySQL websitesi
tar xvfz mysql-cluster-gpl-7.2.6-linux2.6-x86_64.tar.gz
cd mysql-cluster-gpl-7.2.6-linux2.6-x86_64
mv bin/ndb_mgm /usr/bin
mv bin/ndb_mgmd /usr/bin
chmod 755 /usr/bin/ndb_mg*
cd /usr/src
rm -rf /usr/src/mysql-mgm

Sonraki adım Cluster konfigurasyon dosyasını oluşturmak ;

mkdir /var/lib/mysql-cluster
cd /var/lib/mysql-cluster
vi config.ini

(Ben nano text editörünü kullanıyorum, vi’den çok daha kullanışlı)

Aşağıda örnek konfigürasyon dosyası var ;

[NDBD DEFAULT] NoOfReplicas=2  # Eşzamanlı replike edilecek sunucu sayısı
[MYSQLD DEFAULT] [NDB_MGMD DEFAULT] [TCP DEFAULT] # cluster management node kısmı
[NDB_MGMD] # management node Ip adresi (server1)
HostName=192.168.100.1
# data node’lar kısmı
[NDBD] # ilk data node’un IP adresi (Server2)
HostName=192.168.100.2
DataDir= /var/lib/mysql-cluster
[NDBD] # ikinci data node’un IP adresi (Server3)
HostName=192.168.100.3
DataDir=/var/lib/mysql-cluster
# her data node için bir tane  [MYSQLD] [MYSQLD] [MYSQLD]

Şimdi Management Server’ımızı başlatalım ;

ndb_mgmd -f /var/lib/mysql-cluster/config.ini

# -f parametresi ile config dosyasının path’ini belirtiyorum.

Şimdi Management Server ‘ın herhangi bir reboot durumunda otomatik başlaması için aşağıdaki init scripti ekleyelim.

echo ‘ndb_mgmd -f /var/lib/mysql-cluster/config.ini’ > /etc/init.d/ndb_mgmd
chmod 755 /etc/init.d/ndb_mgmd
update-rc.d ndb_mgmd defaults

DATA NODE KURULUMU

Şimdi data node’larımızın kurulumuna geçelim. Bunun için aşağıdaki adımları tüm data node’larda uygulayın.

groupadd mysql
useradd -g mysql mysql
cd /usr/local/
wget MySQL websitesi
tar xvfz mysql-cluster-gpl-7.2.6-linux2.6-x86_64.tar.gz
ln -s mysql-cluster-gpl-7.2.6-linux2.6-x86_64 mysql
cd mysql
scripts/mysql_install_db –user=mysql
chown -R root:mysql .
chown -R mysql data
cp support-files/mysql.server /etc/init.d/
chmod 755 /etc/init.d/mysql.server
update-rc.d mysql.server defaults
cd /usr/local/mysql/bin
mv * /usr/bin
cd ../
rm -fr /usr/local/mysql/bin
ln -s /usr/bin /usr/local/mysql/bin

Şimdi MySQL konfigürasyon dosyasını (/etc/my.cnf)her iki sunucuda oluşturalım.

vi /etc/my.cnf

Örnek dosya ;

[mysqld] ndbcluster
# cluster management server IP adresi (Server1)
ndb-connectstring=192.168.100.1
[mysql_cluster] # cluster management server IP adresi (Server1)
ndb-connectstring=192.168.100.1

MySQL kurulumumuz nerdeyse bitmek üzere, şimdi her iki sunucuda data klasörlerini oluşturalım ve MySQL servisini başlatalım.

mkdir /var/lib/mysql-cluster
cd /var/lib/mysql-cluster
ndbd –initial
/etc/init.d/mysql.server start

(Önemli: ndbd –initial komutunda initial parametresi sadece ilk kez çalıştırıldığında ve Management Server’da  /var/lib/mysql-cluster/config.ini dosyasında değişiklik yapıldığında kullanılmalıdır.)

MySQL kurulumu tamamlandı, şimdi sunucularımıa root şifresi verelim.

mysqladmin -u root password yenişifre

Şimdi eğer sunucularımız reboot ederse ndbd servisinin otomatik başlaması için ndbd init script ekleyelim.

echo ‘ndbd’ > /etc/init.d/ndbd
chmod 755 /etc/init.d/ndbd
update-rc.d ndbd defaults

Bu işlemle birlikte Cluster kurulumumuz tamamlandı, şimdi bakalım herşey yolundamı.

Test :

Cluster Management Server’da Cluster Management Client’ı başlatalım ;

ndb_mgm

Bu bize aşağıdaki prompt ekranını getirir;

— NDB Cluster — Management Client —
ndb_mgm>

Şimdi show komutunu verelim;

ndb_mgm> show;

Aşağıdaki gibi bir çıktı almanız gerekli;

ndb_mgm> show;
Connected to Management Server at: localhost:1186
Cluster Configuration
———————
[ndbd(NDB)] 2 node(s)
id=2 @192.168.100.2 (Version: mysql-5.5.24 ndb-7.2.24, Nodegroup: 0, Master)
id=3 @192.168.100.3 (Version: mysql-5.5.24 ndb-7.2.24, Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)

id=1 @192.168.100.1 (Version: mysql-5.5.24 ndb-7.2.24)
[mysqld(API)] 2 node(s)

id=4 @192.168.100.2 (Version: mysql-5.5.24 ndb-7.2.24)
id=5 @192.168.100.3 (Version: mysql-5.5.24 ndb-7.2.24)
ndb_mgm>

Yukardaki ekranda data Node’larımızın bağlandığını görüyoruz. Şimdi quit yazarak Managemenet Client’tan çıkalım.

ndb_mgm>quit;

Cluster test:

Şimdi Server2 (192.168.100.2) üzerinde Test isimli bir veritabanı oluşturalım ve test edelim.

mysql -u root -p
CREATE DATABASE testdb;
USE testdb;
CREATE TABLE tblMusteri (ID INT) ENGINE=NDBCLUSTER;
INSERT INTO tblMusteri VALUES (1);
SELECT * FROM tblMusteri;
quit;

Table oluşturma komutumuza dikkatli bakarsak ENGINE=NDBCLUSTER kullandığımızı görürüz. Eğer tablolarımızın clustered yapıda olmasını istiyorsak bunu mutlaka kullanmalıyız.

Select komutu bize aşağıdaki çıktıyı verir;

 

mysql> SELECT * FROM tblMusteri;
+——+
| ID   |
+——+
| 1    |
+——+

MySQL Cluster Tablo düzeyinde olduğundan database’i diğer sunucularımıza oluşturmamız gereklidir. Tablolar ndbcluster engine olduğu sürece anında replike olacaktır.

Şimdi servr3’te veritabanımızı oluşturalım;

mysql -u root -p
CREATE DATABASE testdb;
USE testdb;
SELECT * FROM tblMusteri;

Şimdi Server3 e bir data ekleyelim ;

INSERT INTO tblMusteri VALUES (2);

SELECT sorgusunu sever2 de çalıştırınca aşağıdaki çıktıyı görürüz;

mysql> SELECT * FROM tblMusteri;
+——+
| ID   |
+——+
| 1    |
| 2    |
+——+

Cluster’ımız başarılı bir şekilde çalışıyor.

MySQL Cluster’ın kapatılması ve restart edilmesi:

Bazı durumlarda Cluster’ı kapamamız veya yeniden başlatmamız gerekebilir. Şimdi Cluster’ı nasıl kapatacağımızı görelim ;

Server1’de Management Consol’u açıyoruz

ndb_mgm

Sonra

shutdown;

Komutunu veriyoruz ve aşağıdaki gibi bir çıktı alıyoruz

ndb_mgm> shutdown;
Node 3: Cluster shutdown initiated
Node 2: Node shutdown completed.
2 NDB Cluster node(s) have shutdown.
NDB Cluster management server shutdown.
ndb_mgm>

Bu Cluster Data Node’ları ve Management Node’un kapatıldığı anlamına geliyor.

Management Console’dan çıkmak için;

quit;

Cluster Management Server’i tekrar başlatmak için (Managemenet Server, Server1 üzerinde);

ndb_mgmd -f /var/lib/mysql-cluster/config.ini

Server2 ve Server3 (Data Node’lar) üzerinde;

Ndbd

Eğer Management Server üzerindeki konfigürasyon dosyasında (/var/lib/mysql-cluster/config.ini) değişiklik yapmış isek;

ndbd –initial

Şimdi Management Node’a geri dönüp Cluster’ımız sorunsuz başlamışmı kontrol edelim;

Ndb_mgm ve ardından show; komutu ile Cluster konfigürasyonumuza bakıyoruz.

Mevcut tabloları Cluster’a taşımak ;

Halen kullandığımız veritabanlarını Cluster yapısına dahil etmek için her bir tablo için ;

alter table tablo_ismi engine=ndbcluster;

Komutu yeterlidir.

LOADBALANCING KURULUMU

MySQL Cluster kurulumunu başarıyla gerçekleştirdik. Fakat bu sistemi kullanmak için tek bir Sanal IP’ye ihtiyacımız var ayrıca sunucular arasında yük dağılımı yapmak için loadbalancer sunucusu olması gerekiyor. Biz bu kurduğumuz sistemde Loadbalancing yapan sunucumuzuda yüksek erişilebilirlik sağlamak amacıyla yedekli kullanacağız. Loadbalancer sunucularımızın MySQL Proxy ile backend data sunucularına erişimini sağlayacağız, keepalived ile de loadbalancing sunucularını aktif/pasif yedekli  ve tek bir sanal IP adresi ile kullanacağız.

MySQL Proxy ile ilgili detaylı bilgiye buradan ulaşabilirsiniz.

LoadBalancer1       192.168.100.4
LoadBalancer2       192.168.100.5
Sanal IP            192.168.100.6 (MySQL istemciler bu IP adresini kullanacak)

MySQL Proxy Kurulumu

Kurulum çok basittir , aşağıdaki komutla MySQL Proxy kurulumunu gerçekleştiriyoruz. (Bu işlemi her iki loadbalancer sunucusunda da yapıyoruz)

apt-get install mysql-proxy

Kurulumdan sonra MySQL Proxy /etc/default/mysql-proxy dosyasını oluşturur, bu dosyayı

vi /etc/default/mysql-proxy

komutuyla açıp aşağıdaki şekilde editliyoruz ;

ENABLED=”true”
OPTIONS=”–defaults-file=/etc/mysql-proxy.cnf”

Daha sonra default Options dosyasını oluşturuyoruz ;

vi /etc/mysql-proxy.cnf

Ve aşağıdaki gibi düzenliyoruz ;

[mysql-proxy] daemon = true
proxy-address = 192.168.100.4:3306 # LoadBalancer2 sunucusu için 192.168.100.5
proxy-skip-profiling = true
keepalive = true
event-threads = 50
pid-file = /var/run/mysql-proxy.pid
log-file = /var/log/mysql-proxy.log
log-level = debug
proxy-backend-addresses = 192.168.100.2:3306,192.168.100.3:3306
proxy-lua-script=/usr/lib/mysql-proxy/lua/proxy/balance.lua

Şimdi MySQL proxy servisini başlatabiliriz

/etc/init.d/mysql-proxy start

Şimdi bağlantımızı test edelim ;

Mysql –h 192.168.100.4 –u root –p

Komutu ile MySQL sunucumuza bağlanabiliyoruz. Şu anda iki Loadbalancer sunucumuzda backend data sunucularımız olan 192.168.100.2 ve 192.168.100.3 e bağlanabiliyor. Tablo oluşturup data girerek testlerimizi yapabiliriz. Sırada Loadbalancer sunucularımızı tek ip ile kullanmamızı sağlayacak keepalived kurulumu var.

apt-get install keepalived

komutu ile kurulumu yapıyoruz.  Bu iki sunucu arasında paylaşılan bir sanal IP kullanacağımızdan , elimizde MySQL proxy servisine bağlanacak bir sanal IP adresi olduğunu  kernel’e söylememiz gerekiyor. Bunun için /etc/sysctl.conf dosyasına ;

net.ipv4.ip_nonlocal_bind = 1

satırını ekleyip

sysctl –p

ile değişiklikleri kaydediyoruz. Default olarak keepalived konfigürasyon dosyasını /usr/local/etc/keepalived/keepalived.conf kaydeder, biz işimizi biraz kolaylaştırmak için symlink oluşturalım ve /etc/keepalived.conf pathini kullanalım ;

ln -s /usr/local/etc/keepalived/keepalived.conf /etc/keepalived.conf

Şimdi her iki loadBalancer için ayrı ayrı konfigürasyon dosyalarını oluşturacağız. Birinci Loadbalancer sunucusu için ;

 

vrrp_script chk_mysqlproxy {
script “killall -0 mysql-proxy” # verify the pid is exist or not
interval 2                             # check every 2 seconds
weight 2                               # add 2 points of prio if OK
}
vrrp_instance VI_1 {
interface eth0                         # interface to monitor
state MASTER
virtual_router_id 51                   # Assign one ID for this route
priority 101                           # 101 on master, 100 on backup
virtual_ipaddress {
192.168.100.6                      # sanal IP
}
track_script {
chk_mysqlproxy
}
}

 

İkinci Loadbalancer sunucusu için ;

vrrp_script chk_mysqlproxy {
script “killall -0 mysql-proxy” # verify the pid is exist or not
interval 2                             # check every 2 seconds
weight 2                               # add 2 points of prio if OK
}
vrrp_instance VI_1 {
interface eth0                         # interface to monitor
state MASTER
virtual_router_id 51                   # Assign one ID for this route
priority 100                           # 101 on master, 100 on backup
virtual_ipaddress {
192.168.100.6                      # sanal IP
}
track_script {
chk_mysqlproxy
}
}

Her iki sunucuda ;

keepalived -f /etc/keepalived.conf

komutu ile servisi başlatalım.

Birinci Loadbalancer sunucusu master olarak görev yapacak, eğer devre dışı kalırsa ikinci sunucu görevi devralacak. Şimdi MySQL istemcilerimiz 192.168.100.6 IP si ile veritabanına erişebilir.

Aşağıdaki çizimde kurduğumuz yapıyı görebilirsiniz.

MySql Cluster ve Loadbalance kurulumu

Hazırlayan : Bülent Ö.

MySql Cluster ve Loadbalance kurulumu” yazısı için 4 yorum yazılmış.

  1. Bu güzel yazıyı yazan Bülent beye teşekkürler tek data nodelarından biri uçarsa nasıl node eklenır

    • Özgür Bey Merhaba ,

      Data node’larımızdan birisinde sorun meydana gelirse veya Data Node eklemek istersek, yazımızda anlattığımız şekilde Data Node kuruyoruz, eğer fazladan Data Node ekliyorsak Management Server’daki Konfigürasyon dosyasına bunu belirtmemiz gerekir. Yani çok basit bir şekilde ekleyebiliriz. Ekledikten hemen sonra Cluster otomatik olarak replikasyona başlayacaktır.

  2. Yazınızı okudum bu güzel paylaşım için teşekkürler, ben aynı yapıyı Bulut sunucular üzerinde uyguladım, fakat bir sorun yaşıyorum keepalived sanal ip adresi veriliyor, peki bu sanal ip adresine dışarıdan nası nasıl ulaşabiliriz?

    • Merhaba Erdinç Bey, Verilen sanal ip diğer normal ip adresleri gibi tanımlanabilir, yapınız nasıl bilmiyorum tabi ama normal bir ip adresi gibi muamele etmeniz yeterli.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir