Mysql Cluster

Mysql Cluster,

Yüksek trafiğe ve yüksek miktarda veri alış verişine sahip bir
database’iniz varsa, ve bu database’iniz ölüp ölüp diriliyorsa
artık cluster’a geçme vakti gelmiş demektir. Cluster kelime anlamı
olarak kümeleme demektir. Mysql Clustering dataları tablo boyutunda,
cluster’e dahil ndb node’larda kümeler halinde tutar. Ve yine bu
node’lar kendi aralarında data kopya tutma işlerini bu şekilde yaparlar.
Yani tabloları farklı fiziksel makinalarda tutup , datanın kopyalarını
oluştururlar. İstenirse kümeye yeni makinalar(ndb node) eklenebilir.
Bu şekilde bir büyüme de sağlanmış olur.

Clusterin performans’a olan katkısı haricinde database’inizin
sürekliliğini sağlar. Yani ndb node’lardan biri çökerse diğeri
kaldığı yerden devam edecektir.

şimdi yukarıdaki diagramda ,

1 adet (192.168.1.21) ip’li yönetim nodu
2 adet (192.168.1.22-192.168.1.23) ip’li ndb node (depolama nodu)
1 adet (192.168.1.24) ip’li Api node mevcuttur.(sorguların gönderileceği mysql server)

Adım adım cluster yapımızı kurmaya başlayalım.

1-Adım: Tüm makinalarda Mysql server kurulu olduğunu varsayıyorum.
192.168.1.21 ip’li makinada sırayla,

mkdir /var/lib/mysql-cluster –> /var/lib/ in altında mysql-cluster
isimli bir dizin oluşturuyoruz.
cd /var/lib/mysql-cluster –> oluşturduğumuz klasörün içine giriyoruz.
nano config.ini –> diyerek config.ini adında bir conf dosyası
oluşturup içini aşağıdaki gibi dolduruyoruz.,

Dosyayı kaydedip kapatıyoruz. Ve ndb_mgmd komutunu,
daha sonra da, ps -ef | grep [n]db komutunu Çalıştırıyoruz.
ps -ef | grep [n]db komutu ile yonetim nodunun Çalışıp , Çalışmadığını
kontrol ediyoruz.

2-Adım: şimdi ise her iki depolama nodunu bulunduğu makinalarda
(192.168.1.22-192.168.1.23) :

Not:Bu arada her iki makinada da mysql stop durumda olacak.
nano /etc/mysql/my.cnf dosyalarını aÇıp aşağıdaki gibi dolduruyoruz.

[mysqld]
ndbcluster
ndb-connectstring=’host=192.168.1.21’Â Â Â # Yonetim nodunun ip adresi

[mysql_cluster]
ndb-connectstring=’host=192.168.1.21’Â Â Â # Yonetim nodunun ip adresi

Dosyaları kaydedip kapattıkdan sonra ,

mkdir /var/lib/mysql-cluster –> /var/lib/ in altında mysql-cluster
isimli bir dizin oluşturuyoruz.
/usr/bin/ndbd – – initial –> komutunu veriyoruz.Ve mysql server’ı
/etc/init.d/mysql start –>komutu ile start ediyoruz.
ps -ef | grep [n]dbd –> komutu ile ndb nodların Çalışıp Çalışmadığını
kontrol ediyoruz.

3-Adım: Yonetim noduna geçiyoruz.(192.168.1.21)

ndb_mgm komutunu Çalıştırıp yonetim konsolunu
aÇmış oluyoruz.
Sonra show komutu ile yonetim ve depolama nodlarının Çalıştığını
görebiliriz.

şimdi test aÇısından depolama nodlarına gidip, her iki node da da
aynı isme sahip bir database oluşturun. Ve devamında da
serverlardan birinde bir tablo oluşturup, tabloya birkaÇ satır
veri girişi yapın. Gidip diğer server’a baktığınızda aynı tablonun
diğer server da da oluştuğunu göreceksiniz. Tam tersi iÇinde
geÇerlidir.

DİKKAT: Tabloyu create ederken engine=ndbcluster; ifadesini
eklemeyi unutmayın.
create table test (id int) engine=ndbcluster;
Ama ben her tablo create ettiğimde engine olarak bu tablonun
ndbcluster olduğunu belitmek istemiyorum diyorsanız
my.cnf conf dosyasının içine ,
[mysqld]
default-table-type=NDBCLUSTER

ifadesini eklemeniz gerekecektir.

4-Adım: Evet şimdi ise Apı nodumuzu clusterımıza ekleyelim.
(192.168.1.24). Bu makinada da mysql serverın kurulu olduğunu
ve şu an stop durumda olduğunu varsayıyorum.

nano /etc/mysql/my.cnf dosylarını aÇıp aşağıdaki gibi dolduruyoruz.

[mysqld]
ndbcluster
ndb-connectstring=’host=192.168.1.21’Â Â Â # Yonetim nodunun ip adresi

[mysql_cluster]
ndb-connectstring=’host=192.168.1.21’Â Â Â # Yonetim nodunun ip adresi

Kaydedip kapatıyoruz.
/etc/init.d/mysql start –> komutunu vererek mysql start ediyoruz.
Evet böylece Apı nodumuzda cluster yapısına eklenmiş oldu.
Api nodun bulunduğu mysql server’a bağlanıp ndb nodlarda
test iÇin oluşturduğumuz db yi, bu serverda da create edin.
Ve göreceksiniz ki yeni oluşturduğumuz db içinde, test için
diğer tarafta oluşturduğumuz ve kayıt girdiğimiz tablolar
olmuş olacak.
Apı nodunu sadece select işlemleri için kullanmanız tavsiye
edilir.Tabi ki burada yapılan herhangi bir update ,insert
anında diğer dblere yansır.

Yonetim noduna gidip show komutunu tekrardan verirseniz
api nodununda cluster yapısına eklenmiş olduğunu görürsünüz.

Clustring le ilgili püf noktaları anlatan bir makele de kısa süre
sonra yayına girecektir.

Bir sonraki makalelerde görüşmek dileğiyle,

Tayfur BÖLER
Database Administrator

19 Replies to “Mysql Cluster”

  1. Merhaba,
    Bir kaç şey sormak istiyorum;
    1- 2 Senkron MySQL için en az 4 makinamı gereklidir? Biraz daha hafif bir sistem kuramaz mıyız?
    2- Ben tamamen yanlış anlamış olabilir ama default-table-type=NDBCLUSTER şeklinde tablo yaratıyoruz ancak cluster için tek DB engine’ı bu mudur? ben tablolarımda INNODB kullanmak isteyemez miyim?

  2. Merhaba,

    1. sorun için: Aslında en az 4 makina gerekli değil.
    Yönetim nodu her hangi bir makina da olabilir.Bu makina ndb node’ lardan biri veya api nodu
    da olabilir.Çünkü yönetim nodunda mysql server yoktur, sadece mysql cluster programı çalıcaktır.Yani ndb nodelardan birini yönetim nodu yapabilirsin. Api nodunu kurmayadabilirsin
    ama kurmak ideal olanıdır.Minumum 2 makinada da yapılabilir.

    2.sorun için: Evet, mysql cluster yapısı için (en azından benim bildiğim kadarıyla) default-table-type=NDBCLUSTER dır. Farklı bir table engine tanımlayamazsın. Ben yaptım olmadı.:)

  3. dün gece bir cevap yazmıştım ama bi problem oldu galiba.

    yaklaşık olarak demiştim ki,

    o zaman clustering ile INNODB haliyle transaction’lardan vazgeçmiş olacağız demektir bu. Ama belki de umutsuzluğa düşmemeliyim aklımdaki size anlatırsam umarım bana yol gösterebilirsiniz..
    hali hazırdaki bir LAMP’e eş zamanlı yedek olacak (eğer mümkünse de yükünü paylaşabilecek) bir sistem kurmak istiyorum. İşlemler ve işlemlerin bütünlüğünün kritik olmasından daha güvenli ve stabil olarak okuduğum INNODB kullanmak istiyorum. lakin bunu bir farm (çiftlik)’dan ziyade bir family (aile) ile yapmak istiyorum. Bir de belki de yine yanlış anlamış olabilirim ama node’ları birleştirmekten kastınız yöntem olarak tek fiziksel makina üzerinde olabilecek sanal makina mıdır?

  4. Şimdi aslında bana db nin boyutları hakkında ve db üzerindeki hareket yoğunluğu hakkında bilgi verirseniz size yardımcı olmaya çalışırım.

  5. hmm.. henüz production değil ancak beklenen hareket zamanla 50-75bin/gün olarak diyebilirim. bu bir işlemin farklı tablolardaki Insert ve Update’lerini de içeriyor.

  6. Ok o zaman çok yoğun hareket yok diyebiliriz.
    Asenkron replication önerebilirim.
    Master-Master veya Master – Slave Yapısı olabilir.

    Aralarındaki farklar için sitede makaleleri okuyabilirsiniz.

  7. konuşmamız ışığında Master / Master yaptım gayette güzel çalışmakta idi.. Yönlendirmeniz için teşekkür ederim. Ancak bazı yerlerde Master/ Master’da iki Master’a da yazıldığından problem olabileceği söylenmiş. Benim şöyle bir denemem oldu. Ayrı ayrı yeni satırlarda problem yok gibi bunun nedeni de ayrı auto_increment ayarları kullandığımızda galiba. Bir başka durumda ise server’lar ayrı ayrı diğerini görmeyecek şekilde “stop”layıp “AYNI” satır/row’da “AYNI” field’ları değiştirdiğimizde ve sonrasında tekrar “start” ile senkronlanmalarını bekledikten sonra ortaya çıkan şey son değişimin iki tarafta da geçerli olması. Ama en büyük sorun server’ları ayrı ayrı diğerini görmeyecek şekilde “stop”layıp “AYNI” satır/row’da “AYRI” field’ları değiştirdiğimizde ortaya çıkıyor ve bendeki etkisini söyleyeyim senkron durdu. Düzeltmek için bir öneriniz var mı?

    Lakin bir not olarak belirteyim, hiç bilmeyenler için yukarıdaki notasyonunuz biraz zorlayabilir. Kodaman’da yazdıklarınızdaki gibi mysql komutlarının farklı bir komut satırı düzeyinde olduğunu belirtirseniz (mysql -u root -p) süper olur.

    Bir de blogla ilgili önerim olacak, yorumum sonrası gelenlerden e-posta ile haberdar olmak güzel olurdu.

    son not: bu yorumu 4. defa gönderiyorum, diğer 3’ü master / master konusunaydı.

  8. Merhaba bu son yorumunuz spam olarak algılanıp istenmeyen yorumlara düşmüş o yüzden farkedip onaylayamadım. Şu an için ne durumdasınız? Nasıl yardımcı olabilirim

  9. selamlar.
    4-5 yıldan beri max 80 kullanıcının olduğu fakat db lerin toplam 1Gb boyutunda olduğu ve yüksek yoğunluklu bir mysql kullanmaktayım.
    hatta öyleki master-master master-slave replikasyon zamanına %90 oranında sağlıklı çalışmıştı.
    ozamanlarda sitelerde yaptığım araştırmalarda ve yetersiz ingilizcemle asıl cözümün cluster olduğunu öğrenmiş hatta howtoforge den 4 makinali debian sistemi denemiştim.
    ama bunu anlamak ve uygulamak benim icin cok karısık bir durumdu.
    yazınızı okudum sade ve basit şekilde anlaşılır yazmızşınız tebrik ve teşekkür ediyorum .

    Bende arkadaşın 2 maikene sorusuna takıldım.eğer mümkünse ben hazırladığım konf dosyalarını sizinle paylaşşam doğru yada yanlış şeklinde bana yardımcı olabilirmisiniz?
    api kurmazsak sorguları hangi makineye yollarız? biraz daha açabilirmisiniz?
    saygılar…

  10. Merhaba ,
    tayfurboler@gmail.com adresine gönderin bakalım.Api nodu kurmazsanız ndb node lardan herhangi birine gönderebilirsiniz. Veya 2 ndb noduna birden yoğunluğa göre göndermek isterseniz sqlrelay kullanmanız gerekecektir.
    Ama bu işi sqlrelay kullanmadan yapamaz mıyım derseniz mysql proxy yi araştırmanızı tavsiye ederim.
    Kolay gelsin

  11. Merhaba,
    cluster yönteminin master-master ile arasındaki fark nedir. Tam anlayamadım.
    Gelen istekleri otomatik olarak sunucular arasında mı paylaştırıyor.
    Bir yerde okumuştum. Yanlış ta okumuş olabilirim. Tablolar içindeki verileri her satırı farklı sunucuda saklıyor diye. Yanlış mı okudum acaba?

  12. Merhaba Bahattin Arıcı,
    Cluster yöntemiyle , Master-Master yöntemi arasındaki en büyük fark,
    Cluster yönteminde senkron bir data eşleme vardır.
    Master-Master yönteminde asenkron bir data eşleme vardır.

  13. This is such a great resource that you are providing and you give it away for free. I enjoy seeing websites that understand the value of providing a prime resource for free. I truly loved reading your post. Thanks!

  14. Merhabalar,
    Öncelikle paylaşımınız için teşekkür etmeliyim.
    Yukarıdaki yapıda “yönetim nodu” ile “api nodu” arasındaki görev dağılımı tam olarak nedir?

    Biz php üzerinden mysql connect komutunu kullanarak hangisine veriyoruz?

    Cluster nodelar arasındaki yük dağılımını api node mi yoksa yönetim nodu mu sağlıyor?

    Haberpan.com sitesi için kurmayı planladığım yapıda minimum burada belirttiğiniz 4 sunuculu bir mimari düşünüyorum. Yarın bu 4 sunucu yetersiz kaldığında sadece cluster node’leri mi artırmalıyım sizce?

    Bilgi: Haberpan.Com’da 1.7 milyon içerik var ve FULLTEXT indexler kullandığım için 6GB veri tabanı boyutu oluştu. 1-2 yıl içerisinde 20 milyon içerik ve yaklaşık 60GB database boyutlarına ulaşacağımı tahmin ediyorum.

  15. Tekrar merhabalar,
    Aradan geçen bir ay içerisinde epeyce değişiklik oldu. Faydası olur düşüncesiyle buradan paylaşmak istedim.
    4 tane daha sunucu kiraladım, küçük bir server farm’ım oldu 🙂
    – Öncelikle Cluster yöntemiyle yük dağıtımı fikri sunucunuzun ram sınırına takılıyor. toplam database boyutundan %10 daha fazla ram’e ihtiyacınız var. Bu durumda benim 8GB ram ile yaklaşık 7.8 GB limitini aşmam mümkün görünmüyor.
    -Cluster’de fulltext indexler servis dışı kalıyor.
    -Load balance yöntemi için hazır bir çözüm yok.
    -MYSQL’in sitesinde, Clusterlerin güvenlik sorunu olduğu için internete bağlı olmayan sunucular kullanılmalı diyor.

    Tabi tüm bunlara karşın çözümü şöyle buldum;
    -Önce multi master replication denedim. 48 saat kadar kusursuz çalıştı. sonra sunuculardan bir tanesi -sanırım indexleri yeniden oluşturmak için- tekledi ve replication durdu. replication durunca hangi sunucunun daha güncel olduğunu bulmak ve yeniden replication’u başlatmak gerçekten büyük bir sorun olduğunu gördüm. performans testlerimden de memnun kalmadım.

    -sonra 1 sunucu master ve diğer 3 sunucu da slave olarak ayarladım. yazılımımdaki tüm update ve insert komutlarını 1.sunucuya, tüm select komutlarını da diğer 3 sunucuya rastgele dağıttım. sonuç: mükemmel. biraz stress testi yapayim dedim. replicationları defalarca sabote ettim. sorun çıkmadı. bu yapıyı mysql’in resmi sitesinde tavsiye ettiğini belirtmeliyim. bu sunucular yetersiz kaldığında yeni slave’ler ile destekleyebileceğimi öğrendim.

    ipuçları:
    – büyük veritabanınız varsa (4GB+) şu ayarları yapmanızı öneririm;
    skip-innodb
    skip-bdb
    delay-key-write=ALL
    sql-mode=TRADITIONAL
    concurrent_insert=2
    low_priority_updates=1

    hepsinin açıklamasını mysql’in sitesinde bulabilirsiniz.
    – key-buffer ayarını sunucu ram’inin %25’i civarında ayarlayın.
    – benim kurduğum yapının bir avantajı da, master sunucusu patladığında slave’lerden her hangi birisini master yapmak çok kolay. böylece sürekliliği sağlamış oluyor.

  16. Merhaba yazınız için teşekkürler.
    herşey tamam da,
    ndb_mgmd komutuna geldim bir türlü bu komutu çalıştıramadım komut bulunamıyor diyor ?
    Neden dir yardımcı olabilir misiniz _?

Bir cevap yazın

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