MySQL NDB Cluster SQL Node Yapılandırması

Selamlar, bu yazımda MySQL NDB Cluster mimarisindeki SQL node'ların nasıl yapılandırıldığına bakacağız. Konuya yeni başlayan arkadaşlar için kafa karıştırıcı tarafı şu: NDB Cluster dediğimizde aslında üç farklı rol var ve siz mysqld'yi onlardan yalnızca birine, yani SQL node tarafına yerleştiriyorsunuz. İşin püf noktası bu ayrımı kavramak. Hadi başlayalım.

NDB Cluster mimarisi kısaca

NDB Cluster üç tür node'dan oluşur. Yönetim node'u (management node, ndb_mgmd) cluster topolojisini tutar ve diğer node'ları koordine eder. Veri node'ları (data node, ndbd veya ndbmtd) gerçek veriyi bellekte tutar ve replikasyonu üstlenir. SQL node'ları ise klasik mysqld süreçleridir; uygulamalarınız onlara bağlanır, SQL sorgularını alır ve arka planda data node'lara forward ederler.

Yani SQL node aslında üzerine NDB storage engine yüklenmiş bir MySQL server. Veriyi kendi disklerinde tutmuyor, sadece bir geçit. Bence bu kısmı baştan netleştirmek lazım çünkü ilk kurulumda 'verim nerede?' diye saçma soruları beraberinde getiriyor.

my.cnf üzerinde temel ayarlar

Her SQL node sunucusunda /etc/mysql/my.cnf dosyasına mysqld'yi NDB'ye bağlayan satırları eklememiz gerekiyor. Minimum yapılandırma şöyle:

[mysqld]
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
user=mysql
port=3306

# NDB Cluster ayarlari
ndbcluster
ndb-connectstring=192.168.1.10

[mysql_cluster]
ndb-connectstring=192.168.1.10

Burada iki kritik satır var. ndbcluster direktifi mysqld'ye 'NDB engine'i yükle' demek. ndb-connectstring ise management node'un adresini söylüyor; SQL node başlar başlamaz oraya el sıkışmaya gidiyor. [mysql_cluster] bloğundaki connectstring de ndb_mgm gibi cluster yardımcı araçları için.

Management node tarafinda kayit

SQL node'unuzu yapılandırırken iş yarısı oluyor. Management node'un config.ini dosyasında her SQL node için ayrı bir [mysqld] girdisi olmak zorunda, yoksa cluster sizi içeri almıyor:

[mysqld]
NodeId=4
hostname=192.168.1.13

[mysqld]
NodeId=5
hostname=192.168.1.14

Bu girdileri eklemeyi unutursanız mysqld ayağa kalkar ama NDB tarafından 'tanımadığım bir API node' diye reddedilir. Bağlanamayan SQL node'un hata loguna Failed to allocate nodeid yazar; gördüyseniz buraya bakın.

NDB engine yuklendi mi?

SQL node'u başlattıktan sonra mysql istemcisiyle bağlanıp doğrulama yapalım:

SHOW ENGINES;

Çıktıda şu satırı görmeniz lazım:

Engine     | Support | Comment
NDBCLUSTER | YES     | Clustered, fault-tolerant tables

Support sütunu YES değilse engine yüklenmemiş demektir; my.cnf'de ndbcluster direktifini kontrol edin. Cluster bağlantısının durumunu da şu komutla görebilirsiniz:

SHOW STATUS LIKE 'Ndb_cluster_node_id';

Sıfırdan farklı bir değer döndüyse SQL node cluster'a sağlıklı bağlanmış demektir. Ardından bir test tablosu oluşturup engine'i NDBCLUSTER olarak işaretleyin:

CREATE TABLE orders (
    id INT NOT NULL AUTO_INCREMENT,
    customer VARCHAR(100) NOT NULL,
    PRIMARY KEY (id)
) ENGINE=NDBCLUSTER;

Bu tablo artık yerel diske değil, data node'lara dağıtılarak saklanır.

Sık karşılaşılan tuzaklar

  • Connectstring uyumsuzluğu: my.cnf ile config.ini'deki management node IP'si farklıysa SQL node bağlanamaz. İkisini birbirine kopyala-yapıştır şeklinde tutmak güvenli.
  • NodeId çakışması: Aynı NodeId'yi iki SQL node'a vermek cluster'ı kafadan reddettirir. Her node için tekil bir id ayırın, listeyi yazılı tutun.
  • Firewall portu kapalı: Management node ile SQL node arasında 1186 numaralı portun açık olması şart. Bizde bir keresinde her şey doğru görünüyordu, sebep iptables'tı.
  • ndbcluster satırını [mysqld] dışına yazmak: Direktifin doğru blokta olduğundan emin olun; aksi halde sessizce yok sayılır.

Kapanış

Bu yazıda NDB Cluster'da SQL node'ları nasıl yapılandırdığımıza, mysqld'yi ndbcluster engine'e nasıl bağladığımıza ve management node tarafında karşı kayıt gerektiğine baktık. Bana sorarsanız ilk kurulumda iki node ile minimum bir test cluster'ı kaldırıp SHOW ENGINES ile ndb_mgm -e show çıktılarını karşılaştırarak ilerlemek en sağlıklı yol. Umarım faydalı olur, bir sonraki yazıda görüşmek üzere.