Aykut Genç
İş kariyerimde edindiğim bilgileri paylaşıyorum.
Aykut Genç
İş kariyerimde edindiğim bilgileri paylaşıyorum.

Makalem

Mariadb Cluster Çökme Senaryoları

February 20, 2022 Linux
Mariadb Cluster Çökme Senaryoları

Bir önceki makalem de yayınladığım mariadb cluster’ı oluşturulmasından sonraki oluşabilecek çökme senaryoları bu makalemde anlatıyorum.

Mariadb cluster makaleme bu link üzerinde erişebilirsiniz.

Cluster Down Senaryoları

Sunucu hatası sayısına bağlı olarak, galera sunucuların çökmelerini aşağıdaki üç senaryoda kategorize edebiliriz:

  • Tek sunucunun çökme senaryosu 
  • Çoklu sunucunun çökme senaryosu 
  • Tüm cluster’in çökme senaryosu 

Üç senaryodan en önemlisi tüm sunucuların çökmesidir bu veritabanı bağlantısının tamamen kaybolmasına neden olur. Normal koşullarda, güncellemeler ve düzenli bakım nedeniyle sunucuların yeniden başlatılması gerekebilir. Bir sunucu normal  bir şekilde yeniden başlatıldığında, cluster’a yeniden katılır ve sunucuların geri kalanıyla kendisini eşitler. Cluster yeniden başlatılırken, cluster durumunda belirli bir sunucunun eksik olduğunu görmek normaldir. Bu bir sunucunun çökmesi olarak kabul edilmez.

Sağlıklı Sunucuları Doğrulayalım

Bir galera sunucunun sağlıklı olup olmadığını nasıl kontrol edeceğimizi bilmek önemlidir, böylece bir felaket olduğunda sunucuların durumunu hızlıca kontrol edebiliriz. Üç sunucudan oluşan sağlıklı bir galera cluster veritabanı aşağıdaki gibi görünecektir:

MariaDB [(none)]> show status like 'wsrep_incoming_addresses';
+--------------------------+----------------+
| Variable_name | Value |
+--------------------------+----------------+
| wsrep_incoming_addresses | AUTO,AUTO,AUTO |
+--------------------------+----------------+
1 row in set (0.001 sec)

Şu anda cluster’ın üyesi olan toplam sunucuların sayısını kontrol etmek için:

MariaDB [(none)]> show status like 'wsrep_cluster_size';
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| wsrep_cluster_size | 3 |
+--------------------+-------+
1 row in set (0.001 sec)

Cluster durumunun UUID’sini almak için:

MariaDB [(none)]> show status like 'wsrep_cluster_state_uuid';
+--------------------------+--------------------------------------+
| Variable_name | Value |
+--------------------------+--------------------------------------+
| wsrep_cluster_state_uuid | 1eb4913c-928c-11ec-b94f-b7fe66a70abb |
+--------------------------+--------------------------------------+
1 row in set (0.001 sec)

Üye sunucular’ın clusterda eşitlenip eşitlenmediğini kontrol etmek için:

MariaDB [(none)]> show status like 'wsrep_local_state_comment';
+---------------------------+--------+
| Variable_name | Value |
+---------------------------+--------+
| wsrep_local_state_comment | Synced |
+---------------------------+--------+
1 row in set (0.002 sec)

Tek Sunucunun Çökmesi Durumu

Bu senaryoda, cluster da yalnızca bir sunucu da hata meydana geldi ve mariadb başlatılmadı. Bu durumda hiçbir veri kaybolmaz veya veritabanı bağlantısı kesilmez. Üç sunuculu bir clusterda bir sunucu hatası sırasında durum aşağıdaki gibi görünecektir:

MariaDB [(none)]> show status like 'wsrep_incoming_addresses';
+--------------------------+-----------+
| Variable_name | Value |
+--------------------------+-----------+
| wsrep_incoming_addresses | AUTO,AUTO |
+--------------------------+-----------+
1 row in set (0.002 sec)

Cluster size kontrol ediyoruz. 

MariaDB [(none)]> show status like 'wsrep_cluster_size';
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| wsrep_cluster_size | 2 |
+--------------------+-------+
1 row in set (0.001 sec)

Başarısız olan sunucu yeniden başlatıldıktan sonra, cluster’a yeniden katıldığından emin olmak için durumu tekrar kontrol etmemiz gerekir. Herhangi bir nedenle yeniden katılmadıysa, MariaDB’yi yeniden başlatmanız yeterlidir:

#systemctl restart mariadb

Çoklu Sunucunun Çökme Senaryosu

Bu senaryoda, herhangi bir sunucu kaybındaki biri sunucu dışındaki tüm sunucular başarısız olur. Bu aşamada, galera cluster’ı artık SQL isteklerini işleyemez. Bir sunucu hala çalışır durumda olduğundan, hiçbir veri kaybolmaz. Eğer başarısız sunucular tekrar online olduğunda cluster olmadığından clustar’a katılamazlar. Bunu hayatta kalan sunucularda cluster size ve cluster status komutunu kullanarak doğrulayabiliriz:

MariaDB [(none)]> show status like 'wsrep_cluster_size';
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| wsrep_cluster_size | 1 |
+--------------------+-------+
1 row in set (0.001 sec)

MariaDB [(none)]> show status like 'wsrep_cluster_status';
+----------------------+---------+
| Variable_name | Value |
+----------------------+---------+
| wsrep_cluster_status | Primary |
+----------------------+---------+
1 row in set (0.001 sec)

Nadir bir durumda, cluster durumun değeri non-Primary gösterebilir. Eğer öyleyse, hata sadece sunucu kaybı değil, aynı zamanda ağ bağlantısı da olabilir. Sunucuyu elde etmeye devam etmeden önce sunucu cluster durumunun Primary değer döndürdüğünden emin olmalıyız.

Sunucuyu elde etmeye devam etmeden önce, hayatta kalan sunucuların gerçekten en son taahhütlere sahip olduğundan emin olmalıyız. İçeriği görüntüleyerek kontrol edebiliriz. Sunucuların sıfırlanmasının iki yolu vardır, böylece diğer sunucular cluster’a yeniden katılabilir:

Automatic Bootstrap

Mariadb’yi sıfırlamanın en basit yolu otomatik önyüklemedir. Sunucuyu
otomatik olarak önyüklemek için veritabanında aşağıdaki komutu
çalıştırabiliriz:

MariaDB [(none)]> set global wsrep_provider_options='pc.bootstrap=YES';
Query OK, 0 rows affected (0.001 sec)

Bu, diğer başarısız sunucuların cluster’a yeniden katılabilmesi için hayatta kalan sunucuyu birincil başlangıç sunucusu olarak önyükleyecektir.

Manual Bootstrap

#systemctl stop mariadb
#galera_new_cluster
#systemctl restart mariadb

Birincil sunucuyu çalıştırıldıktan sonra, kalan tüm sunucuların birer birer MariaDB hizmetini yeniden başlatabiliriz.

#systemctl start mariadb

Tüm cluster’in çökme senaryosu

Bu senaryoda, tüm sunucuların başarısız oldu veya doğru bir şekilde kapanmadı. Mariadb veri kaybı oluştu ve cluster tüm SQL isteklerini işleyemiyor.  Cluster’ı tamamen kaybettikten sonra tüm sunucular tekrar online olsa bile, MariaDB servisi başlatılamayacaktır. Bir galera cluster’ı çeşitli şekillerde çökebilir ve bu da tam bir çökmeden kurtulmak için farklı yöntemlerle sonuçlanabilir.

En yüksek seqno değerine sahip sunucuyu kurtarma

Bu yöntem, çökme sırasında en az bir sunucunun normal  bir şekilde kapanabildiği küçük bir olasılık olduğunda varsayılır. En son verilere sahip sunucu, tüm çökmüş sunucular arasında en yüksek seqno değerine sahip olacaktır. Bu değeri kontrol edebilmek için cat /var/lib/mysql/grastate içeriğinde seqno’nun değerini gösterecektir. Çökmenin niteliğine bağlı olarak, sunucuların tümü aynı negatif seqno değerine sahip olacak veya sunuculardan biri en yüksek pozitif seqno değerine sahip olacaktır.

Aşağıda grastate.dat içeriği üçüncü sunucuda gösterilmektedir. Bu sunucuda negatif seqno ve grup kimliği yok. Bu, Veri Tanımlama Dili (DDL) işleme sırasında bir sunucunun çökmesi durumudur:

[root@depo3 ~]# cat /var/lib/mysql/grastate.dat
# GALERA saved state
version: 2.1
uuid:    1eb4913c-928c-11ec-b94f-b7fe66a70abb
seqno:   7
safe_to_bootstrap: 0

Aşağıda grastate.dat içeriği ikinci sunucuda gösterilmektedir. Bu sunucuda negatif seqno ve grup kimliği yok. Bu, Veri Tanımlama Dili (DDL) işleme sırasında bir sunucunun çökmesi durumudur:

[root@depo2 ~]# cat /var/lib/mysql/grastate.dat
# GALERA saved state
version: 2.1
uuid:    1eb4913c-928c-11ec-b94f-b7fe66a70abb
seqno:   9
safe_to_bootstrap: 0

Aşağıda grastate.dat içeriği birinci sunucuda gösterilmektedir. Bu sunucuda negatif seqno ve grup kimliği yok. En yüksek seqno değerine sahip sunucudur.

[root@depo1 ~]# cat /var/lib/mysql/grastate.dat
# GALERA saved state
uuid:    1eb4913c-928c-11ec-b94f-b7fe66a70abb
seqno:   10
version: 2.1
safe_to_bootstrap: 1

Bir sunucu yalnızca normal kapanabildiğinde pozitif en yüksek seqno değerine sahip olacağını unutmamalıyız. Bu sunucu en önce kurtarılması gereken düğümdür.

Tüm sunucularda seqno değerleri için -1 veya safe_to_bootstrap için 0 değerini içeriyorsa, bu tam cluster çökmesinin oluştuğunun bir göstergesidir. Bu noktada galera_new_cluster komutunu kullanarak kümeyi başlatabiliriz. Ancak, her sunucu veritabanındaki verilerinin aynı veriler sahip olduğunu bilmenin bir yolu olmadığından dolayı bu hiç önerilmez.

Birinci sunucuyu yeniden başlatmadan önce cluster yapılandırmasında bir değişiklik yapmamız gerekir. Bu değişiklik  /etc/my.cnf.d/server.cnf içinde bulunan gcomm:// ipleridir. wsrep_cluster_address bölümündeki  tüm üye sunucuların ıp’sini gösterdiğini unutmayınız. Adresleri aşağıdaki gibi kaldırmamız gerekiyor:

wsrep_cluster_address="gcomm://"

İlgili ipleri kaldırdıktan sonra bu sunucuda mariadb servisinin yeniden başlatabiliriz:

#systemctl restart mariadb

Yalnızca servisin başarıyla başlatıldığını doğruladıktan sonra, diğer sunuculardan  servisleri tek tek  yeniden başlatmaya devam edebiliriz. Yalnızca tüm sunucular başarıyla çalıştıktan sonra, tüm üye sunucuların IP adreslerini eklemek ve servisi yeniden başlatmak için birinci sunucudaki cluster yapılandırmasını düzenlememiz gerekir:

wsrep_cluster_address="gcomm:// 10.38.100.7,10.38.100.8,10.38.100.9"

Galera cluster’ı bu noktada çalışır durumda olmalı ve tüm sunucular birbirleri ile eşitlenmelidir.

MariaDB [(none)]> show status like 'wsrep_local_state_comment';
+---------------------------+--------+
| Variable_name             | Value  |
+---------------------------+--------+
| wsrep_local_state_comment | Synced |
+---------------------------+--------+
1 row in set (0.001 sec)

Herhangi bir sorunuz olursa bana yorum üzerinde veya iletişim kısmından ulaşabilirsiniz. 🙂 

Taggs:
2 Comments
  • Mark 02:34 September 6, 2022 Reply

    Thanks for your blog, nice to read. Do not stop.

Write a comment to Mark Cancel Reply