
مقدمة
يتيح عنقود 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 على أوبونتو/دبيان وسنت أو إس/أر إتش إل.