كيفية إعداد عنقود غاليرا ذي عقدتين لـ ماي إس كيو إل على أوبونتو/دبيان وسنت أو إس/أر إتش إل

إعداد عنقود غاليرا ذي عقدتين لـ ماي إس كيو إل

مقدمة

يتيح عنقود Galera Cluster بناء عنقود قاعدة بيانات MySQL عالي التوافر دون المساس باتساق البيانات. من خلال نسخ البيانات عبر العقد في الوقت الفعلي، يوفر Galera توافرًا مستمرًا حتى عند حدوث أعطال في عقد منفردة.

في هذا الدليل الشامل، سنستعرض خطوات إعداد عنقود Galera ذي عقدتين على أنظمة أوبونتو/دبيان وسنت أو إس/أر إتش إل لينكس.

المتطلبات الأساسية

قبل البدء، تأكد من توفر:

  • خادمين أو آلة افتراضية بنظامي أوبونتو 18.04+ / دبيان 9+ أو سنت أو إس 7+ / أر إتش إل 7+ مثبتين.
  • 2 غيغابايت رام على الأقل و 2 نوى معالج على كل عقدة.
  • وصول جذر إلى الخوادم عبر SSH.
  • خادم MySQL مثبت بالفعل على كلا العقدتين. يوصى بالإصدار 5.7+.
  • قواعد جدار حماية أساسية مهيأة للسماح بحركة مرور على المنافذ 3306، 4567، 4568، و 4444.

سنقوم بتنفيذ معظم الأوامر كمستخدم جذر أو بامتيازات sudo.

تثبيت Galera والحزم ذات الصلة

نبدأ بتثبيت برامج Galera Cluster وأدوات أخرى مطلوبة لعمل العنقود بشكل صحيح.

على أوبونتو/دبيان

قم بتحديث مؤشرات مستودع apt وتثبيت الحزم المطلوبة:

$ apt update
$ apt install galera-4 mariadb-server socat python3-mysql.connector

سيقوم هذا بتثبيت:

  • galera-4 – أطر عمل Galera Cluster
  • mariadb-server – لخادم قاعدة بيانات MySQL
  • socat – لاختبار ومراقبة العناقيد
  • python3-mysql.connector – لاتصالات MySQL من بايثون

على سنت أو إس/أر إتش إل

استخدم yum لتثبيت مستودع epel وتثبيت Galera والاعتماديات:

$ yum install epel-release
$ yum install galera mariadb-server rsync socat mysql-connector-python

سيقوم هذا بتثبيت:

  • galera – Galera Cluster
  • mariadb-server – خادم MySQL
  • rsync – لنقل لقطات حالة SST
  • socat – أداة مراقبة
  • mysql-connector-python – وصلة MySQL لبايثون

بهذا أصبح Galera Cluster جاهزًا للإعداد على كلا العقدتين.

تهيئة MySQL لاستخدام Galera

لكي يستخدم MySQL تجميع Galera، نحتاج إلى تهيئة بعض الخيارات في ملف my.cnf.

افتح ملف الإعداد:

$ nano /etc/my.cnf

أضف ما يلي تحت [mysqld]:

binlog_format=ROW  
default-storage-engine=innodb
innodb_autoinc_lock_mode=2 
bind-address=0.0.0.0
   
# إعدادات Galera
wsrep_provider=/usr/lib64/galera-4/libgalera_smm.so  
wsrep_cluster_name='my_galera_cluster' 
wsrep_cluster_address="gcomm://node1,node2"
  
# هذا فقط على العقدة 1
wsrep_node_address='192.168.1.101'
wsrep_node_name='node1'
  
# هذا فقط على العقدة 2
wsrep_node_address='192.168.1.102'
wsrep_node_name='node2'
wsrep_sst_method=rsync

يحتوي wsrep_cluster_address على قائمة بعناوين IP لعقد العنقود.

يجب أن تكون كل من wsrep_node_address و wsrep_node_name فريدة على كل خادم.

احفظ الملف وأغلقه بعد إجراء التغييرات.

كرر هذه الخطوة على كلا الخادمين باستخدام عنوان الـ IP والاسم الصحيحين لكل منهما.

سيقوم هذا بتهيئة MySQL لاستخدام ملحق Galera للتكرار.

تشغيل العنقود

بعد إكمال الإعدادات، أصبحنا جاهزين لتهيئة العنقود.

ابدأ تشغيل MySQL على العقدة الأولى (node1) فقط:

$ systemctl start mysql  
# أو
$ systemctl start mariadb

سيقوم هذا بتهيئة عنقود Galera.

تحقق من حالة MySQL ومتغيرات wsrep:

$ mysql -u root -e "SHOW STATUS LIKE '%wsrep%';"

مثال للناتج:

+------------------------------+------------------------------------------+
| Variable_name                | Value                                    |
+------------------------------+------------------------------------------+
| wsrep_local_state_uuid       | af2a75b4-9e1c-11ed-9838-be4b133a6b15     |
| wsrep_protocol_version       | 7                                        |   
| wsrep_last_committed         | 0                                        |
| wsrep_replicated             | 0                                        |
| wsrep_replicated_bytes       | 0                                        |
| wsrep_received               | 1                                        |
| wsrep_received_bytes         | 119                                      |
| wsrep_local_commits          | 0                                        |
| wsrep_local_cert_failures    | 0                                        |
| wsrep_local_replays          | 0                                        |
| wsrep_local_send_queue       | 0                                        |
| wsrep_local_send_queue_avg   | 0.000000                                 |
| wsrep_local_recv_queue       | 0                                        |
| wsrep_local_recv_queue_avg   | 0.000000                                 |
| wsrep_cluster_size           | 1                                        |  
+------------------------------+------------------------------------------+

سيؤكد هذا أن Galera أصبحت جاهزة للعمل. لاحظ أن حجم العنقود المحلي حاليًا هو 1.

الآن ابدأ تشغيل MySQL على العقدة الثانية لإضافتها إلى العنقود:

$ systemctl start mysql
# أو  
$ systemctl start mariadb

تحقق من انضمامها بنجاح:

$ mysql -u root -e "SHOW STATUS LIKE '%wsrep%';"

يجب أن نرى الآن حجم العنقود على أنه 2:

| wsrep_cluster_size | 2 |

بالإضافة إلى ذلك، شغل mysql -e "SHOW STATUS LIKE '%wsrep%';" على العقدة 1 مرة أخرى ويجب أن تتزامن متغيرات الحالة بين العقدتين.

أصبح عنقود Galera ذو العقدتين جاهزًا!

اختبار عمل العنقود

دعنا نختبر أن التكرار بين العقدتين يعمل كما هو متوقع.

على العقدة 1، أنشئ قاعدة بيانات اختبار وأدخل بعض البيانات:

mysql> CREATE DATABASE cluster_test;  
mysql> USE cluster_test;
mysql> CREATE TABLE test (id INT, message VARCHAR(20));
mysql> INSERT INTO test VALUES (1, 'مرحبا بك في Galera');
mysql> SELECT * FROM test;
+------+----------------------+
| id   | message              |
+------+----------------------+
|    1 | مرحبا بك في Galera |
+------+----------------------+

الآن تحقق من نفس محتويات الجدول من العقدة 2:

mysql> USE cluster_test;
mysql> SELECT * FROM test;
+------+----------------------+
| id   | message              |  
+------+----------------------+
|    1 | مرحبا بك في Galera |
+------+----------------------+

تمت نسخ الصف بنجاح من العقدة 1 إلى العقدة 2 كما هو متوقع.

دعنا نختبر أيضًا استعادة الإيقاف. أوقف MySQL على العقدة 1:

$ systemctl stop mysql
# أو  
$ systemctl stop mariadb

على العقدة 2، اتصل بـ MySQL وتحقق من استمرار عمل الاستعلامات:

mysql> USE cluster_test;
mysql> SELECT * FROM test;
+------+----------------------+
| id   | message              |
+------+----------------------+
|    1 | مرحبا بك في Galera |  
+------+----------------------+

تظل العقدة 2 تعمل بالرغم من إيقاف تشغيل العقدة 1 لأن جميع البيانات مكررة.

أعد تشغيل العقدة 1:

$ systemctl start mysql
# أو
$ systemctl start mariadb 

ستقوم تلقائيًا بالمزامنة مرة أخرى مع العقدة 2. شغّل SHOW STATUS LIKE '%wsrep%'; على كلا العقدتين للتأكد من مطابقة القيم.

هذا يوضح التوافر العالي الذي توفره Galera!

مراقبة العنقود وإدارته

الآن بعد أن لدينا عنقود Galera يعمل، دعنا نلقي نظرة على بعض النصائح لمراقبته وإدارته.

التحقق من حالة العنقود

استخدم خادم garbd للتحقق من إحصاءات العنقود الرئيسية عالية المستوى:

$ garbd -a gcomm://192.168.1.101,192.168.1.102 -g my_galera_cluster
Galera cluster Node 1/2 info:
  evs::protover => 7
  evs::uuid     => af2a75b4-9e1c-11ed-9838-be4b133a6b15
  evs::status   => Primary
  evs::state    => Synced
Galera cluster Node 2/2 info:
  evs::protover => 7
  evs::uuid     => af2a75b4-9e1c-11ed-9838-be4b133a6b15
  evs::status   => Primary
  evs::state    => Synced

سيظهر هذا أن كلا العقدتين في حالة Synced وجزء من نفس العنقود.

مراقبة حالة العقد

استخدم mysqladmin للتحقق من متغيرات Galera على كل عقدة:

$ mysqladmin -uroot -p -h192.168.1.101 variables | grep wsrep
| wsrep_cluster_conf_id | 25 |
| wsrep_cluster_size | 2 |
| wsrep_cluster_state_uuid | af2a75b4-9e1c-11ed-9838-be4b133a6b15 |
| wsrep_cluster_status | Primary |
$ mysqladmin -uroot -p -h192.168.1.102 variables | grep wsrep
| wsrep_cluster_conf_id | 25 |  
| wsrep_cluster_size | 2 |
| wsrep_cluster_state_uuid | af2a75b4-9e1c-11ed-9838-be4b133a6b15 |
| wsrep_cluster_status | Primary |

يجب أن تتطابق قيم مثل حجم العنقود وUUID والحالة على جميع العقد.

التحقق من حالة نقل SST

عند انضمام عقدة جديدة، يُستخدم نقل لقطة الحالة (SST) لمزامنة البيانات إليها.

راقب تقدم SST مع:

$ mysql -e "SHOW STATUS LIKE 'wsrep_local_state_uuid'"
+----------------------------------+--------------------------------------+
| Variable_name                    | Value                                |
+----------------------------------+--------------------------------------+
| wsrep_local_state_uuid           | af2a75b4-9e1c-11ed-9838-be4b133a6b15 | 
+----------------------------------+--------------------------------------+
$ mysql -e "SHOW STATUS LIKE 'wsrep_local_state_comment'" 
+-----------------------------------+---------+
| Variable_name                     | Value   |
+-----------------------------------+---------+
| wsrep_local_state_comment         | Synced  | 
+-----------------------------------+---------+

أثناء تقدم SST، سيعرض wsrep_local_state_comment نسبة المزامنة.

التحقق من حالة الاسترداد

عند إعادة انضمام عقدة بعد انقطاع الاتصال، يمكن التحقق من الحالة باستخدام:

mysql>SHOW STATUS WHERE `variable_name` LIKE'wsrep_%';

راقب wsrep_local_state_comment لقيم مثل Recovering أو Donor/Desynced أثناء الاسترداد.

بهذه الطريقة يمكن تتبع مراحل مزامنة العنقود واستردادها.

مراقبة حجم العنقود

للتحقق من عدد العقد في العنقود:

mysql> SHOW STATUS LIKE 'wsrep_cluster_size';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+ 
| wsrep_cluster_size | 2     |
+--------------------+-------+

يجب أن يطابق العدد المتوقع للعقد.

يمكننا أيضًا استخدام النص clustercheck لمراقبة حجم العنقود:

$ clustercheck  
Cluster is CORRECT (2 nodes)
$

سيحذر إذا كانت هناك عقد مفقودة أو إضافية.

التحقق من اتساق العقد

يجب التحقق من حالة العنقود للتأكد من احتواء جميع العقد على نفس البيانات.

إن مقارنة متغير wsrep_local_state_uuid بين العقد تشير إلى الاتساق:

$ mysql -e "SHOW STATUS LIKE 'wsrep_local_state_uuid'\G" -h192.168.1.101
   *************************** 1. row ***************************
   Variable_name: wsrep_local_state_uuid
        Value: af2a75b4-9e1c-11ed-9838-be4b133a6b15
$ mysql -e "SHOW STATUS LIKE 'wsrep_local_state_uuid'\G" -h192.168.1.102
   *************************** 1. row ***************************
   Variable_name: wsrep_local_state_uuid
        Value: af2a75b4-9e1c-11ed-9838-be4b133a6b15  

إذا تطابق UUID عبر العقد، فالبيانات متسقة.

مراقبة حالة الاتصال

استخدم socat للتحقق من حالة اتصال TCP بين العقد:

$ socat - TCP:192.168.1.101:4567
>
$ socat - TCP:192.168.1.102:4567  
>

سيؤكد هذا أن منفذ TCP 4567 مفتوح بين العقد لحركة مرور تكرار عنقود Galera.

يمكننا أيضًا استخدام MySQL للتحقق من حالة الاتصال:

mysql> SHOW STATUS WHERE `variable_name` LIKE '%connection%';
+-----------------------------+-------+ 
| Variable_name               | Value |
+-----------------------------+-------+
| Slave_connections           | 0     |
| Max_used_connections        | 2     |
| Aborted_connects            | 0     | 
| Max_used_connections        | 2     |
+-----------------------------+-------+

راقب عدد الاتصالات المفتوحة لاكتشاف المشاكل.

يوفر هذا لمحة عن الصحة العامة للعنقود والاتصالية.

تتبع سجل العقدة

يمكن أن يكون سجل العقدة مفيدًا عند استكشاف الأخطاء أو تحليل الأحداث:

mysql> SHOW STATUS LIKE 'wsrep_local_state_uuid%'; 
+--------------------------------+--------------------------------------+
| Variable_name                  | Value                                | 
+--------------------------------+--------------------------------------+
| wsrep_local_state_uuid         | af2a75b4-9e1c-11ed-9838-be4b133a6b15 |
| wsrep_local_state_uuid_history | af2a75b4-9e1c-11ed-9838-be4b133a6b15 |
+--------------------------------+--------------------------------------+

سيتم إلحاق أي UUID سابقة للعنقود إلى wsrep_local_state_uuid_history عند وقوع أحداث مثل الاستردادات.

وبالمثل، يتم تتبع عدد تغييرات عضوية العنقود بواسطة:

mysql> SHOW STATUS LIKE 'wsrep_cluster_size_change%';
+-------------------------------+-------+
| Variable_name                 | Value |
+-------------------------------+-------+   
| wsrep_cluster_size_changes    | 1     |
| wsrep_cluster_size_change_history | 1 |
+-------------------------------+-------+

يوفر هذا رؤى حول نشاط العنقود مع مرور الوقت.

باستخدام هذه المتغيرات الحالية والأوامر، يمكن مراقبة عنقود Galera للتأكد من التشغيل السليم. يمكن اكتشاف المشاكل مثل انقطاع اتصال العقدة وتأخر النسخ وفقدان الاتساق وتصحيحها بسرعة أيضًا.

تهيئة حكم Galera

بالنسبة لعنقود مكون من عقدتين، يجب علينا إعداد حكم Galera لتجنب سيناريوهات تشتت العقل. الحكم عبارة عن عملية خفيفة الوزن توفر نصابًا للعنقود لتحديد أي العقد يجب أن تستمر في العمل في حالة حدوث انقسامات شبكية.

على خادم ثالث، قم بتثبيت حزمة galera-4 أو galera فقط.

عدل /etc/my.cnf بما يلي:

[mysqld] 
wsrep_provider=/usr/lib64/galera-4/libgalera_smm.so
[galera]
wsrep_cluster_address="gcomm://192.168.1.101,192.168.1.102"
wsrep_cluster_name='my_galera_cluster' 

شغّل الحكم:

$ galera_arbitrator

تحقق من السجلات في /var/log/mysql/galera.log للتأكد من اتصاله بالعنقود بنجاح.

سيشارك الحكم الآن في حسابات النصاب ويوفر التبديل التلقائي في حالات تشتت العقل. هذا يمنع فقدان البيانات في حالة حدوث انقسامات شبكية.

الخلاصة

في هذا الدليل التفصيلي، قمنا بتغطية خطوات تثبيت وتهيئة ومراقبة عنقود Galera ذي عقدتين على توزيعات أوبونتو/دبيان وسنت أو إس/أر إتش إل خطوة بخطوة مع أمثلة عملية.

وتشمل النقاط الرئيسية:

  • تتيح Galera بناء عناقيد MySQL متعددة الماستر لتحقيق الارتفاع.
  • توفر المعاملة بالصفوف في الوقت الفعلي اتساقًا.
  • يمكن إضافة العقد وإزالتها بشكل ديناميكي.
  • انضمام العقدة ونقل الحالة ومناولة النصاب تتم تلقائيًا.
  • مراقبة متغيرات الحالة الرئيسية مثل مقاييس wsrep.
  • يمنع حكم Galera سيناريوهات تشتت العقل.

يعمل عنقود Galera ذو عقدتين بشكل جيد لتقليل أوقات التوقف وتوفير الاحتياط للعديد من التطبيقات. يمكن إدخال عقد إضافية بسلاسة في وقت لاحق إذا لزم الأمر.

باتباع هذا الدليل، يمكنكم الآن نشر عناقيد MySQL عالية التوافر باستخدام Galera على أوبونتو/دبيان وسنت أو إس/أر إتش إل.

LEAVE A COMMENT