Merhaba,
Bu makalede galera cluster üzerinde mysql kullanırken, son derece önemli bir parametreden bahsedeceğim.
Galera Cluster aslında open source ve free bir cluster yazılımı. Mysql ile uyumundan dolayı MariaDB ve Percona aktif-aktif cluster konfigürasyonunda Galera Cluster altyapısını tercih ediyor.
Shared noting mantığında çalışan bu clusterda data tüm node’larda tutuluyor. Uygulama istediği node’a bağlanıp işlemlerini gerçekleştirebiliyor. Yapılan DML, DDL, DCL işlemleri wsrep api’si ile diğer node’lara taşınıyor.
Data tüm node’larda ayrı ayrı tutulduğundan node ekleme durumunda datanın tamamının diğer node’a aktarılması gerekli. Bu işleme SST (State Snapshot Transfer) deniyor.
Eğer clusterdaki node’lardan birisi belli bir süre kesinti yaşamış ve daha sonra cluster’a tekrar dahil oluyor ise bu işleme de IST (Incremental Snapshot Transfer) deniyor. IST sırasında datanın tamamı değil, sadece değişen kısmı diğer node’a aktarılıyor. Ancak bu noktada çok önemli bir soru var;
IST için cluster ne kadarlık bir kesintiyi tolere edebilir?
Bu sorunun cevabı ortamdan ortama değişkenlik gösterecektir. Galera üzerinden incremental datanın tutulduğu bir fiziksel dosya var; galera.cache. Bu dosya her node’da bulunuyor ve ilgili node üzerinde yapılan tüm işlemler tutuluyor. Bir nevi bin log doyası gibi düşünebilirsiniz. Dosyayı data dizini içerisinde bulabilirsiniz;
root@dbnode4:~# ls -ltrh /var/lib/mysql/galera.cache
-rw-rw---- 1 mysql mysql 11G Feb 25 08:16 /var/lib/mysql/galera.cache
Bu cache’in default değeri 128MB. Mevcut değeri kontrol etmek için aşağıdaki komutu kullanabilirsiniz.
mysql> SHOW GLOBAL VARIABLES LIKE 'wsrep_provider_options'\G
* 1. row *
Variable_name: wsrep_provider_options
…
evs.user_send_window = 2; evs.version = 0; evs.view_forget_timeout = P1D; gcache.dir = /var/lib/mysql/; gcache.keep_pages_count = 0; gcache.keep_pages_size = 0; gcache.mem_size = 0; gcache.name = /var/lib/mysql//galera.cache; gcache.page_size = 128M; gcache.recover = no; gcache.size = 128M; gcomm.thread_prio = ; gcs.fc_debug = 0; gcs.fc_factor =
…
1 row in set (0.00 sec)
Peki bu cache size’ının değeri ne olmalı?
Bunun için öncelikle ortamın incelenmesi gerekli. Bu inceleme sırasında dakikalık ve saatlik kullanımlara bakılarak bir cache size parametresi belirlenebilir. Bu işlem için aşağıdaki shell scripti belli bir süre çalıştırıp logunu inceleyebilirsiniz.
root@dbnode4:~/scripts# cat gcache.sh
03.04.2018-Galeri Cache Script
script kullanimi: /root/scripts/gcache.sh
export DDATE=$(date +'%H:%M:%S-%d.%m.%y')
echo $DDATE >> /root/scripts/gcache_log.log
mysql -u root -h localhost -pPassword --execute=" set @start := (select sum(VARIABLE_VALUE/1024/1024) from information_schema.global_status where VARIABLE_NAME like 'WSREP%bytes'); do sleep(60); set @end := (select sum(VARIABLE_VALUE/1024/1024) from information_schema.global_status where VARIABLE_NAME like 'WSREP%bytes'); set @gcache := (select SUBSTRING_INDEX(SUBSTRING_INDEX(@@GLOBAL.wsrep_provider_options,'gcache.size = ',-1), 'M', 1)); select round((@end - @start),2) as 'MB/min', round((@end - @start),2) * 60 as 'MB/hour', @gcache as 'gcache Size(MB)', round(@gcache/round((@end - @start),2),2) as 'Time to full(minutes)';" >> /root/scripts/gcache_log.log
Log dosyasını inceleyerek optimum cache size parametresini hesaplaybilirsiniz.
08:30:01-17.04.18
MB/min MB/hour gcache Size(MB) Time to full(minutes)
0.14 8.40 128 914.29
08:35:01-17.04.18
MB/min MB/hour gcache Size(MB) Time to full(minutes)
0.12 7.20 128 1066.67
08:40:01-17.04.18
MB/min MB/hour gcache Size(MB) Time to full(minutes)
0.15 9.00 128 853.33
08:45:01-17.04.18
MB/min MB/hour gcache Size(MB) Time to full(minutes)
0.14 8.40 128 914.29
08:50:01-17.04.18
MB/min MB/hour gcache Size(MB) Time to full(minutes)
0.06 3.60 128 2133.33
Tolere etmek istediğiniz kesinti süresi ile birlikte yeterli cache değerini hesapladıktan sonra conf dosyasına aşağıdaki parametre eklenir.
wsrep_provider_options=”gcache.size=1G”
mysql> SHOW GLOBAL VARIABLES LIKE 'wsrep_provider_options'\G
* 1. row *
Variable_name: wsrep_provider_options
…
evs.user_send_window = 2; evs.version = 0; evs.view_forget_timeout = P1D; gcache.dir = /var/lib/mysql/; gcache.keep_pages_count = 0; gcache.keep_pages_size = 0; gcache.mem_size = 0; gcache.name = /var/lib/mysql//galera.cache; gcache.page_size = 128M; gcache.recover = no; gcache.size = 10G; gcomm.thread_prio = ; gcs.fc_debug = 0; gcs.fc_factor =
…
1 row in set (0.00 sec)
Eğer ihtiyacınızdan daha az bir cache size belirlerseniz, cluster’dan çıkan node tekrar cluster’a dahil olurken SST yapacaktır. SST sırasında hem vakit kaybedilecek hem de eğer RSYNC kullanılıyor ise donor node’da (datanın kopyalandığı kaynak node) kesinti yaşanacaktır. Kesintiyi önlemek için RSYNC yerine xtrabackup kullanmanızı öneririm.
Faydalı olması dileğiyle.