كيفية تكوين تكرار مجموعة MySQL على أوبونتو 20.04

المقدمة

تعكس استنساخ قواعد البيانات في MySQL البيانات والعمليات بشكل موثوق من قاعدة بيانات واحدة إلى أخرى. يشمل الاستنساخ التقليدي خادمًا أساسيًا مُكوَّنًا لقبول عمليات كتابة قاعدة البيانات مع خوادم ثانوية تنسخ وتطبق الإجراءات من سجل الخادم الأساسي على مجموعات بياناتها الخاصة. يمكن استخدام هذه الخوادم الثانوية للقراءة، ولكن عادةً ما تكون غير قادرة على تنفيذ كتابات البيانات.

تعتبر تجميع الاستنساخ وسيلة لتنفيذ آلية استنساخ أكثر مرونة وتحملًا للأخطاء. ينطوي هذا العملية على إنشاء مجموعة من الخوادم التي تشارك في ضمان نسخ البيانات بشكل صحيح. إذا واجه الخادم الأساسي مشاكل، يمكن لانتخابات الأعضاء اختيار خادم أساسي جديد من المجموعة. يسمح هذا للعقد المتبقية بالمتابعة في التشغيل، حتى في مواجهة المشاكل. توفير التفاوض بشأن العضوية، وكشف الأخطاء، وتسليم الرسائل يتم من خلال تنفيذ خوارزمية التوافق بالباكسوس.

في هذا البرنامج التعليمي، ستقوم بإعداد تجميع استنساخ MySQL باستخدام مجموعة من ثلاث خوادم Ubuntu 20.04. يُلاحظ أن العدد الأدنى من مثيلات MySQL التي تحتاج إلى نشرها في مجموعة استنساخ في MySQL هو ثلاثة، بينما الحد الأقصى هو تسعة. أثناء العمل عبر هذا البرنامج التعليمي، ستكون لديك الخيار لإعداد المجموعة سواء كمجموعة استنساخ أساسية واحدة أو متعددة الأساسيات.

ملاحظة: يمكن أن تكون لخوادم قواعد البيانات واحدة من اثنتين في إعداد النسخ: إما أن تكون مثيلًا أساسيًا (المعروف أيضًا باسم المصدر)، الذي يمكن للمستخدمين كتابة البيانات إليه؛ أو نسخة (أو مثيل ثانوي)، الذي يخزن نسخة من جميع البيانات على المصدر. تاريخيًا، كانت هذه الأدوار تُشار إليها بدلاً من ذلك بأنها مثيل رئيسي و مثيل رقيق، على التوالي. في منشور في مدونة نشر في يوليو 2020، أقر فريق MySQL بالأصل السلبي لهذا المصطلح وأعلن عن جهودهم لتحديث برنامج قواعد البيانات ووثائقه لاستخدام لغة أكثر اندماجًا.

ومع ذلك، هذه عملية مستمرة. على الرغم من أن وثائق MySQL والعديد من الأوامر في الإصدار 8 من البرنامج قد تم تحديثها للإشارة بدلاً من ذلك إلى الخوادم في توبولوجية النسخ باسم أساسي و الثواني (أو المصدر و النسخ)، هناك أماكن لا تزال فيها تظهر المصطلحات السلبية. ستفترض هذا الدليل استخدام المصطلحات الأكثر اندماجًا في كل مكان إذا أمكن، ولكن هناك بعض الحالات حيث يظهر بشكل لا مفر منه المصطلحات القديمة.

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

لإكمال هذا الدليل، ستحتاج إلى:

  • ثلاث خوادم يعملون بنظام Ubuntu 20.04. يجب أن يكون لكل منها مستخدم إداري غير جذري مع امتيازات sudo وجدار ناري مكون باستخدام UFW. اتبع دليل إعداد الخادم الأولي لـ Ubuntu 20.04 الخاص بنا لإعداد كل خادم.
  • تم تثبيت MySQL على كل خادم. يفترض هذا الدليل أنك تستخدم الإصدار الأحدث من MySQL المتوفر من مستودعات Ubuntu الافتراضية التي، حسب كتابتي لهذا، هو الإصدار 8.0.28. لتثبيت هذا على جميع خوادمك، اتبع دليلنا حول كيفية تثبيت MySQL على Ubuntu 20.04 لكل جهاز.

للمساعدة في الحفاظ على الأمور واضحة، سيشير هذا الدليل إلى الخوادم الثلاثة باسم عضو1، عضو2، و عضو3. في الأمثلة طوال هذا الدليل، ستكون لهذه الأعضاء عناوين IP التالية:

Member IP address
member1 203.0.113.1
member2 203.0.113.2
member3 203.0.113.3

أي أوامر يجب تشغيلها على عضو1 ستكون لها خلفية زرقاء، مثل هذا:

بالمثل، أي أوامر يجب تشغيلها على عضو2 ستكون لها خلفية حمراء:

وأي أوامر يجب تشغيلها على عضو3 ستكون لها خلفية خضراء:

أخيرًا، أي أوامر يجب تشغيلها على كل من الخوادم الثلاثة ستكون لها خلفية قياسية:

الخطوة ١ — إنشاء UUID لتحديد مجموعة MySQL

قبل فتح ملف تكوين MySQL لتكوين إعدادات التكرار الجماعي للمجموعة، يجب عليك إنشاء UUID يمكنك استخدامه لتحديد مجموعة MySQL التي ستقوم بإنشائها.

على العضو1، استخدم أمر uuidgen لإنشاء UUID صالح للمجموعة:

  1. uuidgen
Output
168dcb64-7cce-473a-b338-6501f305e561

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

الخطوة ٢ — إعداد التكرار الجماعي في ملف تكوين MySQL

الآن أنت جاهز لتعديل ملف تكوين MySQL الرئيسي. قم بفتح ملف تكوين MySQL الرئيسي على كل خادم MySQL باستخدام محرر النص المفضل لديك. هنا، سنستخدم nano:

  1. sudo nano /etc/mysql/my.cnf

على أوبونتو، يأتي MySQL مثبتًا مع عدد من الملفات المختلفة التي يمكنك استخدامها لتحديد مختلف التغييرات في التكوين. بشكل افتراضي، يُستخدم ملف my.cnf فقط لتحميل ملفات إضافية من الأدلة الفرعية. ستحتاج إلى إضافة تكويناتك الخاصة تحت خطوط !includedir. سيتيح لك ذلك تجاوز أي إعدادات من الملفات المضمنة.

للبدء، قم بإنشاء قسم جديد عن طريق تضمين عنوان [mysqld] ثم أضف الإعدادات التي تحتاج إليها لتمكين تكوين المجموعة، كما هو موضح في المثال التالي. يرجى ملاحظة أن هذه الإعدادات معدلة عن الإعدادات الدنيا المطلوبة لتكوين المجموعة المتكررة المذكورة في الوثائق الرسمية لـ MySQL. البادئة loose- تُتيح لـ MySQL التعامل مع الخيارات التي لا تتعرف عليها بأناقة ودون فشل. ستحتاج إلى ملء وتخصيص بعض هذه الإعدادات قريبًا:

/etc/mysql/my.cnf
. . .
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

[mysqld]

# General replication settings
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
gtid_mode = ON
enforce_gtid_consistency = ON
master_info_repository = TABLE
relay_log_info_repository = TABLE
binlog_checksum = NONE
log_slave_updates = ON
log_bin = binlog
binlog_format = ROW
transaction_write_set_extraction = XXHASH64
loose-group_replication_bootstrap_group = OFF
loose-group_replication_start_on_boot = OFF
loose-group_replication_ssl_mode = REQUIRED
loose-group_replication_recovery_use_ssl = 1

# Shared replication group configuration
loose-group_replication_group_name = ""
loose-group_replication_ip_whitelist = ""
loose-group_replication_group_seeds = ""

# Single or Multi-primary mode? Uncomment these two lines
# for multi-primary mode, where any host can accept writes
#loose-group_replication_single_primary_mode = OFF
#loose-group_replication_enforce_update_everywhere_checks = ON

# Host specific replication configuration
server_id = 
bind-address = ""
report_host = ""
loose-group_replication_local_address = ""

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

إعدادات التكرار الأساسية

القسم الأول يحتوي على الإعدادات العامة المطلوبة للتكرار الجماعي التي لا تتطلب تعديلًا:

/etc/mysql/my.cnf
. . .
# الإعدادات العامة للتكرار
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
gtid_mode = ON
enforce_gtid_consistency = ON
master_info_repository = TABLE
relay_log_info_repository = TABLE
binlog_checksum = NONE
log_slave_updates = ON
log_bin = binlog
binlog_format = ROW
transaction_write_set_extraction = XXHASH64
loose-group_replication_bootstrap_group = OFF
loose-group_replication_start_on_boot = OFF
loose-group_replication_ssl_mode = REQUIRED
loose-group_replication_recovery_use_ssl = 1
. . .

متطلب محدد للتكرار الجماعي في MySQL هو أن يتم تخزين البيانات في محرك تخزين InnoDB. يوصي دليل MySQL بتعطيل استخدام محركات التخزين الأخرى بشكل صريح يمكن أن يتسبب في أخطاء بالطريقة الموضحة في السطر الأول غير المعلق في هذا القسم.

تقوم الإعدادات المتبقية بتشغيل معرفات المعاملات العالمية، وتكوين تسجيل البيانات الثنائي الذي يتطلبه التكرار الجماعي، وتكوين SSL للمجموعة. يقوم هذا التكوين أيضًا بإعداد بعض العناصر الأخرى التي تساعد في الاسترجاع وبدء التشغيل. لا يجب عليك تعديل أي شيء في هذا القسم، ويجب أن يكون متطابقًا على جميع الخوادم الثلاثة الخاصة بك، لذا يمكنك المتابعة بعد إضافته.

إعدادات التكرار الجماعي المشتركة

القسم الثاني يقوم بإعداد إعدادات مشتركة للمجموعة. ستحتاج إلى تخصيص هذا مرة واحدة ثم استخدام نفس الإعدادات على كل من العقد الخاصة بك. على وجه الخصوص، يجب عليك إضافة معرف UUID للمجموعة (الذي قمت بإنشائه في الخطوة السابقة)، وقائمة بأعضاء المجموعة المصرح بهم، وأعضاء البذور للاتصال بهم للحصول على البيانات الأولية عند الانضمام إلى المجموعة.

قم بتعيين loose-group_replication_group_name إلى قيمة UUID التي أنشأتها سابقًا باستخدام أمر uuidgen. تأكد من وضع UUID بين زوج فارغ من علامات الاقتباس المزدوجة.

بعد ذلك، ضع loose-group_replication_ip_whitelist إلى قائمة بجميع عناوين IP لخادم MySQL الخاص بك، مفصولة بفواصل. يجب أن يكون إعداد loose-group_replication_group_seeds تقريبًا نفس الشيء مثل القائمة البيضاء، ولكن يجب أن يلحق بنهاية كل عضو منها منفذ مجموعة التكرار المخصص. بغرض هذا الدليل، استخدم منفذ مجموعة التكرار الموصى به، 33061:

/etc/mysql/my.cnf
. . .
# إعداد تكرار المجموع المشترك
loose-group_replication_group_name = "168dcb64-7cce-473a-b338-6501f305e561"
loose-group_replication_ip_whitelist = "203.0.113.1,203.0.113.2,203.0.113.3"
loose-group_replication_group_seeds = ""203.0.113.1:33061,203.0.113.2:33061,203.0.113.3:33061"
. . .

يجب أن يكون هذا القسم متماثلاً على كل خوادم MySQL الخاصة بك، لذا تأكد من نسخه بعناية على كل منها.

اختيار النظام الأساسي الفردي أو النظام الأساسي المتعدد

بعد ذلك، يتعين عليك أن تقرر ما إذا كنت تريد تكوين مجموعة أساسية واحدة أم أساسية متعددة. في تكوين الأساسي الفردي، يُعين MySQL خادمًا أساسيًا واحدًا (تقريبًا دائمًا العضو الأول في المجموعة) للتعامل مع عمليات الكتابة. تُسمح في مجموعة الأساسي المتعددة لأي من أعضاء المجموعة بأداء الكتابات.

إذا كنت ترغب في تهيئة مجموعة متعددة الرؤوس الرئيسية، قم بفك تعليق التوجيهات loose-group_replication_single_primary_mode و loose-group_replication_enforce_update_everywhere_checks. سيؤدي ذلك إلى إعداد مجموعة متعددة الرؤوس الرئيسية. بالنسبة لمجموعة ذات رأس رئيسي واحد، اترك هاتين السطرين معلقتين:

/etc/mysql/my.cnf
. . .
# وضع رئيسي واحد أم متعدد؟ قم بفك تعليق هاتين السطرين
# لوضع متعدد الرؤوس الرئيسية، حيث يمكن لأي مضيف قبول الكتابات
#loose-group_replication_single_primary_mode = OFF
#loose-group_replication_enforce_update_everywhere_checks = ON
. . .

يجب أن تكون هذه الإعدادات متطابقة على كل من خوادم MySQL الخاصة بك.

يمكنك تغيير هذا الإعداد في وقت لاحق، ولكن بعد القيام بذلك يجب إعادة تشغيل كل عضو في مجموعة MySQL الخاصة بك. للتحول إلى التكوين الجديد، سيتعين عليك إيقاف كل من مثيلات MySQL في المجموعة، وبدء كل عضو بالإعدادات الجديدة، ثم إعادة تشغيل تكوين المجموعة التكرارية. هذا لن يؤثر على أي من بياناتك، ولكن يتطلب نافذة صغيرة من الزمن دون تشغيل.

إعدادات التكوين الخاصة بالمضيف

القسم الرابع يحتوي على الإعدادات التي ستكون مختلفة على كل من الخوادم، بما في ذلك:

  • معرف الخادم
  • عنوان الربط
  • عنوان التقرير للأعضاء الآخرين
  • عنوان التكرار المحلي ومنفذ الاستماع

يجب تعيين التوجيه server_id إلى رقم فريد. للعضو الأول، قم بتعيين هذا إلى 1 وزيادة الرقم في كل مضيف إضافي. ثم ، قم بتعيين bind-address و report_host إلى عنوان IP الخاص بالخادم المعني بذلك حتى يتمكن مثيل MySQL من الاستماع للاتصالات الخارجية والإبلاغ عن عنوانه بشكل صحيح للمضيفين الآخرين. يجب أيضًا تعيين loose-group_replication_local_address إلى عنوان IP الخاص بالخادم الحالي مع منفذ التكرار المجموعة (33061) مُلصق بالعنوان IP.

كمثال، فيما يلي جزء من هذا التكوين لـ العضو1 باستخدام عنوان IP عينته:

/etc/mysql/my.cnf
. . .
# تكوين التكرار الخاص بالمضيف
server_id = 1
bind-address = "203.0.113.1"
report_host = "203.0.113.1"
loose-group_replication_local_address = "203.0.113.1:33061"

قم بإكمال هذه العملية على كل من خوادم MySQL الخاصة بك. ها هو التكوين لـ العضو2:

/etc/mysql/my.cnf
. . .
# تكوين التكرار الخاص بالمضيف
server_id = 2
bind-address = "203.0.113.2"
report_host = "203.0.113.2"
loose-group_replication_local_address = "203.0.113.2:33061"

وهنا التكوين لـ العضو3:

/etc/mysql/my.cnf
. . .
# تكوين التكرار الخاص بالمضيف
server_id = 3
bind-address = "203.0.113.3"
report_host = "203.0.113.3"
loose-group_replication_local_address = "203.0.113.3:33061"

تأكد من تحديث كل عنوان IP مميز إلى تلك التي تحرر تكوينها.

عند الانتهاء، تحقق مرتين من أن إعدادات التكرار المشتركة هي نفسها على كل مضيف وأن إعدادات كل مضيف مخصصة لذلك المضيف. احفظ وأغلق الملف على كل مضيف عند الانتهاء. إذا كنت تستخدم nano لتحرير الملف، فيمكنك القيام بذلك عن طريق الضغط على CTRL + X ، Y ، ثم ENTER.

كل ملفات تكوين MySQL الخاصة بخوادمك الآن تحتوي على التوجيهات المطلوبة لبدء تشغيل تجميع مجموعة MySQL. لتطبيق الإعدادات الجديدة على مثيل MySQL، أعد تشغيل الخدمة على كل خادم باستخدام الأمر التالي:

  1. sudo systemctl restart mysql

من خلال ذلك، يمكنك المضي قدمًا في تمكين الوصول عن بعد عن طريق تحديث قواعد جدار الحماية الخاصة بكل من خوادمك.

الخطوة 3 — تحديث قواعد UFW لكل الخوادم

بناءً على افتراضك بمتابعة دليل إعداد الخادم الأولي فإنك قد قمت بإعداد جدار حماية على كل الخوادم التي قمت بتثبيت MySQL فيها وتمكين الوصول لملف تعريف UFW لـ OpenSSH. هذا إجراء أمان مهم، حيث يقوم هذه الجدران الحالية بحظر الاتصالات إلى أي منفذ على خوادمك، باستثناء اتصالات ssh التي تقدم مفاتيح تتطابق مع تلك الموجودة في ملفات authorized_keys الخاصة بكل خادم بشكل منفصل.

في ملف تكوين MySQL، قمت بتكوين الخدمة للاستماع للاتصالات الخارجية على المنفذ الافتراضي 3306. كما قمت بتعريف 33061 كمنفذ يجب على الأعضاء استخدامه لتنسيق التكرار.

على كل من خوادم الأعضاء الخاصة بك، تحتاج إلى فتح الوصول إلى كل من هذين المنفذين لأعضاء الفريق الآخرين في هذه المجموعة حتى يتمكنوا من التواصل مع بعضهم البعض. لفتح الوصول إلى هذين المنفذين على عضو1 لـ عضو2، قم بتشغيل الأوامر ufw التالية على عضو1:

  1. sudo ufw allow from member2_server_ip to any port 3306
  2. sudo ufw allow from member2_server_ip to any port 33061

تأكد من تغيير عنوان_خادم_عضو2 ليعكس عنوان IP الفعلي لخادم عضو2 الخاص بك. ثم، لفتح نفس المنافذ لـ عضو3، قم بتشغيل هذه الأوامر:

  1. sudo ufw allow from member3_server_ip to any port 3306
  2. sudo ufw allow from member3_server_ip to any port 33061

ثم قم بتحديث قواعد جدار الحماية للخوادم الأخرى الاثنين الخاصة بك. قم بتشغيل الأوامر التالية على عضو2، مع التأكد من تغيير عناوين الآي بي لتعكس تلك التابعة لـ عضو1 و عضو3 على التوالي:

  1. sudo ufw allow from member1_server_ip to any port 3306
  2. sudo ufw allow from member1_server_ip to any port 33061
  3. sudo ufw allow from member3_server_ip to any port 3306
  4. sudo ufw allow from member3_server_ip to any port 33061

أخيرًا، قم بتشغيل هذه الأوامر الاثنتين على عضو3. مرة أخرى، تأكد من إدخال عناوين الآي بي الصحيحة لكل خادم:

  1. sudo ufw allow from member1_server_ip to any port 3306
  2. sudo ufw allow from member1_server_ip to any port 33061
  3. sudo ufw allow from member2_server_ip to any port 3306
  4. sudo ufw allow from member2_server_ip to any port 33061

بعد إضافة هذه القواعد UFW، سيتم السماح لكل من ثلاث حالات MySQL لديك بالوصول إلى المنافذ المستخدمة من قبل MySQL على الخوادم الأخرى الاثنين.

مع فتح الوصول إلى منافذ MySQL، يمكنك الآن إنشاء مستخدم للتكرار وتمكين إضافة تكرار المجموعة.

الخطوة 4 — تكوين مستخدمي التكرار وتمكين إضافة تكرار المجموعة

لتأسيس الاتصالات مع الخوادم الأخرى في مجموعة التكرار، يجب أن يكون لكل نسخة من MySQL مستخدم تكرار مخصص.

على كل من خوادم MySQL الخاصة بك، قم بتسجيل الدخول إلى نسخة MySQL الخاصة بك باستخدام مستخدم الإدارة لبدء جلسة تفاعلية:

  1. sudo mysql

ملاحظة: تأكد من تشغيل كل من الأوامر في هذا القسم على كل من خوادم MySQL الخاصة بك.

نظرًا لأن كل خادم سيمتلك مستخدم تكرار خاص به، يجب عليك إيقاف تسجيل التدفق الثنائي أثناء عملية الإنشاء. وإلا، بمجرد بدء التكرار، ستحاول المجموعة نشر مستخدم التكرار من الأساسي إلى الخوادم الأخرى، مما يؤدي إلى تعارض مع مستخدم التكرار الموجود بالفعل. قم بتشغيل الأمر التالي من موجه MySQL على كل من الخوادم الخاصة بك:

  1. SET SQL_LOG_BIN=0;

الآن يمكنك تشغيل بيان CREATE USER لإنشاء مستخدم التكرار الخاص بك. قم بتشغيل الأمر التالي، الذي ينشئ مستخدمًا بالاسم repl. يحدد هذا الأمر أنه يجب على مستخدم التكرار الاتصال باستخدام SSL. كما تأكد من استخدام كلمة مرور آمنة بدلاً من password عند إنشاء مستخدم التكرار هذا:

  1. CREATE USER 'repl'@'%' IDENTIFIED BY 'password' REQUIRE SSL;

بعد ذلك، قم بمنح مستخدم التكرار الجديد امتيازات التكرار على الخادم:

  1. GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

ثم قم بتفريغ الامتيازات لتنفيذ التغييرات:

  1. FLUSH PRIVILEGES;

بعد ذلك، قم بإعادة تمكين تسجيل التدفق الثنائي لاستئناف العمليات العادية:

  1. SET SQL_LOG_BIN=1;

بعد ذلك، قم بتعيين القناة group_replication_recovery لاستخدام مستخدم التكرار الجديد وكلمة مرورهم. ستستخدم كل نسخة هذه الاعتمادات للمصادقة على المجموعة:

  1. CHANGE REPLICATION SOURCE TO SOURCE_USER='repl', SOURCE_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';

ملاحظة: إذا كنت تستخدم إصدارًا من MySQL أقدم من 8.0.23 ، فستحتاج إلى استخدام بناء جملة MySQL التقليدي لإعداد هذا:

  1. CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';

بعد توفير مستخدم التكرار، يمكنك تمكين مكون group_replication للتحضير لبدء تهيئة المجموعة:

  1. INSTALL PLUGIN group_replication SONAME 'group_replication.so';

تحقق من أن المكون نشط عن طريق تشغيل الأمر التالي:

  1. SHOW PLUGINS;

سيظهر مكون group_replication في القائمة في الأسفل نظرًا لأنه هو المكون الأحدث المضاف:

Output
+----------------------------+----------+--------------------+----------------------+---------+ | Name | Status | Type | Library | License | +----------------------------+----------+--------------------+----------------------+---------+ | | | | | | | . . . | . . . | . . . | . . . | . . . | | | | | | | | group_replication | ACTIVE | GROUP REPLICATION | group_replication.so | GPL | +----------------------------+----------+--------------------+----------------------+---------+ 45 rows in set (0.00 sec)

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

الخطوة 5 — بدء تشغيل التكرار الجماعي

الآن بعد أن تم تكوين مستخدم التكرار على كل خادم MySQL وتم تمكين مكون التكرار الجماعي، يمكنك البدء في تشغيل مجموعتك.

بدء تشغيل العقدة الأولى

لبدء المجموعة، أكمل الخطوات التالية على عضو واحد فقط من المجموعة. لأغراض العرض، ستكتمل هذه الخطوات على العضو1

يعتمد أعضاء المجموعة على الأعضاء الحاليين لإرسال بيانات التكرار وقوائم الأعضاء الحديثة ومعلومات أخرى عند الانضمام إلى المجموعة في البداية. ولهذا السبب، تحتاج إلى استخدام إجراء مختلف بعض الشيء لبدء عضو المجموعة الأولي حتى يعلم أنه لا ينبغي له أن يتوقع هذه المعلومات من الأعضاء الآخرين في قائمة البذور الخاصة به.

إذا تم تعيينه، تخبر متغير group_replication_bootstrap_group العضو بعدم توقع استقبال المعلومات من الأقران وبدلاً من ذلك يجب عليه إنشاء مجموعة جديدة وانتخاب نفسه كعضو أساسي. يمكنك تشغيل هذا المتغير بالأمر التالي:

  1. SET GLOBAL group_replication_bootstrap_group=ON;

ثم يمكنك بدء التكرار لعضو المجموعة الأولي:

  1. START GROUP_REPLICATION;

بعد ذلك، يمكنك ضبط متغير group_replication_bootstrap_group مرة أخرى إلى OFF، حيث أن الحالة الوحيدة التي يكون فيها هذا مناسبًا هي عندما لا توجد أعضاء مجموعة حاليين:

  1. SET GLOBAL group_replication_bootstrap_group=OFF;

سيتم بدء المجموعة بهذا الخادم كعضو وحيد. يمكن التحقق من ذلك عن طريق التحقق من الإدخالات في جدول replication_group_members في قاعدة البيانات performance_schema:

  1. SELECT * FROM performance_schema.replication_group_members;

سيُرجع هذا الاستعلام صفًا واحدًا يمثل المضيف الحالي:

Output
+---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK | +---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+ | group_replication_applier | 13324ab7-1b01-11e7-9dd1-22b78adaa992 | 203.0.113.1 | 3306 | ONLINE | PRIMARY | 8.0.28 | XCom | +---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+ 1 row in set (0.00 sec)

تشير القيمة ONLINE لـ MEMBER_STATE إلى أن هذا العقد معمل تمامًا داخل المجموعة.

ثم يمكنك إنشاء قاعدة بيانات اختبارية وجدول مع بعض البيانات العينية. وعندما يتم إضافة المزيد من الأعضاء إلى هذه المجموعة، سيتم تكرار هذه البيانات تلقائيًا لهم.

ابدأ بإنشاء قاعدة بيانات اختبارية تسمى playground:

  1. CREATE DATABASE playground;

ثم أنشئ مثالًا للجدول يسمى equipment داخل قاعدة البيانات playground باستخدام الأمر التالي:

  1. CREATE TABLE playground.equipment (
  2. id INT NOT NULL AUTO_INCREMENT,
  3. type VARCHAR(50),
  4. quant INT,
  5. color VARCHAR(25),
  6. PRIMARY KEY(id)
  7. );

هذا الجدول يحتوي على أربعة أعمدة تالية:

  • id: ستحتوي هذه العمود على قيم صحيحة تتزايد تلقائيًا، مما يعني أنه لن تحتاج إلى تحديد قيم لهذا العمود عند تحميل الجدول ببيانات عينة
  • type: ستحتوي هذه العمود على قيم نصية تصف نوع معدات الملعب التي تمثلها الصف
  • quant: ستحتوي هذه العمود على قيم صحيحة لتمثيل الكمية من نوع معدات الملعب المعطاة
  • color: ستحتوي هذه العمود على قيم نصية تحدد لون المعدات المعطاة

أيضًا، لاحظ أن العمود id محدد كمفتاح أساسي لهذا الجدول. في MySQL، يجب أن يحتوي كل جدول تم نسخه إلى مجموعة على عمود محدد كمفتاح أساسي للجدول.

أخيرًا، قم بتشغيل الأمر التالي لإدراج صف واحد من البيانات في الجدول:

  1. INSERT INTO playground.equipment (type, quant, color) VALUES ("slide", 2, "blue");

استعلم عن الجدول للتأكد من إدخال البيانات بشكل صحيح:

  1. SELECT * FROM playground.equipment;
Output
+----+-------+-------+-------+ | id | type | quant | color | +----+-------+-------+-------+ | 1 | slide | 2 | blue | +----+-------+-------+-------+ 1 row in set (0.00 sec)

بعد التحقق من أن هذا الخادم هو عضو في المجموعة وأن لديه قدرات الكتابة، يمكن للخوادم الأخرى الانضمام إلى المجموعة.

بدء تشغيل العقد المتبقية

بعد ذلك، ابدأ تكوين التكرار الجماعي على عضو2. نظرًا لوجود عضو نشط بالفعل، لا داعي لتهيئة المجموعة مسبقًا، ويمكن لهذا العضو الانضمام مباشرة:

  1. START GROUP_REPLICATION;

على عضو3، ابدأ التكرار الجماعي بنفس الطريقة:

  1. START GROUP_REPLICATION;

تحقق مرة أخرى من قائمة الأعضاء على أي من الخوادم الثلاثة. في هذا الوقت، ستظهر ثلاث خوادم في الناتج:

  1. SELECT * FROM performance_schema.replication_group_members;
Output
+---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK | +---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+ | group_replication_applier | 13324ab7-1b01-11e7-9dd1-22b78adaa992 | 203.0.113.1 | 3306 | ONLINE | PRIMARY | 8.0.28 | XCom | | group_replication_applier | 1ae4b211-1b01-11e7-9d89-ceb93e1d5494 | 203.0.113.2 | 3306 | ONLINE | SECONDARY | 8.0.28 | XCom | | group_replication_applier | 157b597a-1b01-11e7-9d83-566a6de6dfef | 203.0.113.3 | 3306 | ONLINE | SECONDARY | 8.0.28 | XCom | +---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+ 3 rows in set (0.00 sec)

يجب أن يكون لدى جميع الأعضاء قيمة MEMBER_STATE كـ ONLINE. للمجموعة الجديدة، إذا كان أحد العقد مدرجًا كـ RECOVERING لأكثر من بضع ثوانٍ، فهذا عادة مؤشر على وجود خطأ أو أن هناك خطأ في التكوين. قم بفحص السجلات في /var/log/mysql/error.log للحصول على معلومات إضافية حول ما حدث.

بعد ذلك، تحقق مما إذا كانت معلومات قاعدة البيانات التجريبية قد تم تكرارها على الأعضاء الجدد:

  1. SELECT * FROM playground.equipment;
Output
+----+-------+-------+-------+ | id | type | quant | color | +----+-------+-------+-------+ | 1 | slide | 2 | blue | +----+-------+-------+-------+ 1 row in set (0.01 sec)

إذا كانت البيانات متوفرة على الأعضاء الجدد، فهذا يعني أن التكرار الجماعي يعمل بشكل صحيح.

الخطوة 6 — اختبار إمكانيات الكتابة لأعضاء المجموعة الجديدة

بعد ذلك، يمكنك محاولة الكتابة إلى قاعدة البيانات من أعضاء مجموعتك الجديدة. ما إذا نجحت هذه العملية أم لا يعتمد على ما إذا اخترت تكوين مجموعة أولية واحدة أو متعددة الأولية.

اختبار كتابات في بيئة أساسية واحدة

في مجموعة أساسية واحدة، يجب أن تتوقع رفض أي عمليات كتابة من خادم غير أساسي لأسباب تتعلق بالاتساق. يمكنك العثور على الأساسي الحالي في أي وقت عن طريق تشغيل الاستعلام التالي على أي عضو في مجموعة النسخ الاحتياطي الخاصة بك:

  1. SHOW STATUS LIKE '%primary%';
Output
+----------------------------------+--------------------------------------+ | Variable_name | Value | +----------------------------------+--------------------------------------+ | group_replication_primary_member | 13324ab7-1b01-11e7-9dd1-22b78adaa992 | +----------------------------------+--------------------------------------+ 1 row in set (0.01 sec)

قيمة الاستعلام ستكون MEMBER_ID يمكنك مطابقته مع مضيف عن طريق الاستعلام عن قائمة أعضاء المجموعة كما فعلت من قبل:

  1. SELECT * FROM performance_schema.replication_group_members;
Output
+---------------------------+--------------------------------------+--------------+-------------+--------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | +---------------------------+--------------------------------------+--------------+-------------+--------------+ | group_replication_applier | 13324ab7-1b01-11e7-9dd1-22b78adaa992 | 203.0.113.1 | 3306 | ONLINE | | group_replication_applier | 1ae4b211-1b01-11e7-9d89-ceb93e1d5494 | 203.0.113.2 | 3306 | ONLINE | | group_replication_applier | 157b597a-1b01-11e7-9d83-566a6de6dfef | 203.0.113.3 | 3306 | ONLINE | +---------------------------+--------------------------------------+--------------+-------------+--------------+ 3 rows in set (0.01 sec)

كما يشير مخرج الأمثلة هذا، فإن المضيف في 203.0.113.1العضو1 — هو حاليًا الخادم الأساسي. إذا حاولت الكتابة إلى قاعدة البيانات من عضو آخر، ستفشل العملية:

  1. INSERT INTO playground.equipment (type, quant, color) VALUES ("swing", 10, "yellow");
Output
ERROR 1290 (HY000): The MySQL server is running with the --super-read-only option so it cannot execute this statement

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

اختبار كتابات في بيئة أساسية متعددة

بالنسبة للمجموعات التي تم تكوينها في توجيه متعدد الأساسيات، يجب أن يكون بإمكان أي عضو القيام بكتابات معتمدة على قاعدة البيانات.

يمكنك التحقق مرة أخرى من أن مجموعتك تعمل في وضع متعدد الرئيسية عن طريق فحص قيمة المتغير group_replication_primary_member مرة أخرى:

  1. SHOW STATUS LIKE '%primary%';
Output
+----------------------------------+-------+ | Variable_name | Value | +----------------------------------+-------+ | group_replication_primary_member | | +----------------------------------+-------+ 1 row in set (0.02 sec)

إذا كان المتغير فارغًا، فهذا يعني أنه لا يوجد مضيف رئيسي معين وأن أي عضو يجب أن يكون قادرًا على قبول عمليات الكتابة.

قم بتجربة هذا على العضو2 من خلال محاولة كتابة بعض البيانات إلى جدول equipment:

  1. INSERT INTO playground.equipment (type, quant, color) VALUES ("swing", 10, "yellow");
Output
Query OK, 1 row affected (0.00 sec)

العضو2 قام بتنفيذ عملية الكتابة بدون وجود أي أخطاء.

على العضو3، قم بتشغيل الاستعلام التالي للتحقق مما إذا كانت العنصر الجديد قد تمت إضافته:

  1. SELECT * FROM playground.equipment;
Output
+----+-------+-------+--------+ | id | type | quant | color | +----+-------+-------+--------+ | 1 | slide | 2 | blue | | 2 | swing | 10 | yellow | +----+-------+-------+--------+ 2 rows in set (0.00 sec)

هذا يؤكد أن عملية الكتابة التي قام بها العضو2 تم تكرارها بنجاح.

الآن، قم بتجربة قدرات الكتابة على العضو3 عن طريق تشغيل البيان التالي INSERT:

  1. INSERT INTO playground.equipment (type, quant, color) VALUES ("seesaw", 3, "green");
Output
Query OK, 1 row affected (0.02 sec)

عد إلى العضو1، وتأكد من أن عمليات الكتابة من كل من الأعضاء الجدد قد تم تكرارها مرة أخرى:

  1. SELECT * FROM playground.equipment;
Output
+----+--------+-------+--------+ | id | type | quant | color | +----+--------+-------+--------+ | 1 | slide | 2 | blue | | 2 | swing | 10 | yellow | | 3 | seesaw | 3 | green | +----+--------+-------+--------+ 3 rows in set (0.01 sec)

هذا يؤكد أن التكرار يعمل في كلا الاتجاهين وأن كل عضو قادر على أداء عمليات الكتابة.

الخطوة 7 — إعادة تشغيل المجموعة

بمجرد أن يتم تشغيل المجموعة، يمكن لأفرادها الانضمام والمغادرة دون أن يؤثروا على التوفر، طالما كان هناك عدد كاف من الأعضاء لانتخاب الخوادم الأساسية. ومع ذلك، إذا تم إجراء تغييرات معينة في التكوين (مثل التبديل بين بيئات الخادم الأساسي الفردية والمتعددة)، أو إذا غادر جميع أعضاء المجموعة، فقد تحتاج إلى إعادة تشغيل المجموعة بنفس الطريقة التي اتبعتها في البداية.

على عضو1، قم بتعيين متغير group_replication_bootstrap_group إلى ON:

  1. SET GLOBAL GROUP_REPLICATION_BOOTSTRAP_GROUP=ON;

ثم قم بتهيئة المجموعة:

  1. START GROUP_REPLICATION;

بعد ذلك، يمكنك تعيين متغير group_replication_bootstrap_group مرة أخرى إلى OFF:

  1. SET GLOBAL GROUP_REPLICATION_BOOTSTRAP_GROUP=OFF;

بمجرد أن يبدأ العضو الأول المجموعة، يمكن لأعضاء آخرين الانضمام:

  1. START GROUP_REPLICATION;

اتبع هذه العملية لأي أعضاء إضافيين:

  1. START GROUP_REPLICATION;

يجب أن تكون المجموعة الآن على الإنترنت مع توافر جميع الأعضاء:

  1. SELECT * FROM performance_schema.replication_group_members;
Output
+---------------------------+--------------------------------------+--------------+-------------+--------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | +---------------------------+--------------------------------------+--------------+-------------+--------------+ | group_replication_applier | 13324ab7-1b01-11e7-9dd1-22b78adaa992 | 203.0.113.1 | 3306 | ONLINE | | group_replication_applier | 1ae4b211-1b01-11e7-9d89-ceb93e1d5494 | 203.0.113.2 | 3306 | ONLINE | | group_replication_applier | 157b597a-1b01-11e7-9d83-566a6de6dfef | 203.0.113.3 | 3306 | ONLINE | +---------------------------+--------------------------------------+--------------+-------------+--------------+ 3 rows in set (0.01 sec)

يمكن استخدام هذه العملية لبدء المجموعة مرة أخرى كلما اقتضت الضرورة.

الخطوة 8 — الانضمام إلى مجموعة تلقائيًا عند بدء تشغيل MySQL

مع الإعدادات الحالية، إذا أعادت خادم العضو تشغيل نفسه، فلن ينضم تلقائيًا إلى المجموعة عند البدء. إذا كنت ترغب في أن ينضم الأعضاء تلقائيًا إلى المجموعة، يمكنك تعديل ملف التكوين قليلاً.

تعتبر الإعدادات المحددة في هذه الخطوة مفيدة عندما ترغب في أن ينضم الأعضاء تلقائيًا عند تشغيلهم. ومع ذلك، هناك بعض الأمور التي يجب أن تكون على علم بها. أولاً، تؤثر هذه الإعدادات فقط عندما يتم تشغيل نفس مثيل MySQL. إذا تمت إزالة العضو من المجموعة بسبب مشاكل في الوقت النهائي، ولكن مثيل MySQL ما زال متصلاً بالإنترنت، فلن يعود العضو تلقائيًا.

ثانيًا، قد تكون هذه الإعدادات ضارة عندما تقوم بتهيئة المجموعة للمرة الأولى. عندما لا تكون هناك مجموعة موجودة للانضمام إليها، سيستغرق عملية MySQL وقتًا طويلاً للبدء لأنه سيحاول الاتصال بأعضاء آخرين غير موجودين للبدء. فقط بعد فترة طويلة من الانتظار سيتخلى عن المحاولة ويبدأ بشكل طبيعي. بعد ذلك، ستضطر إلى استخدام الإجراء المذكور أعلاه لتهيئة المجموعة.

باعتبار هذه التحذيرات المذكورة أعلاه، إذا كنت ترغب في تكوين العقد للانضمام إلى المجموعة تلقائيًا عند بدء تشغيل MySQL، فافتح ملف التكوين الرئيسي لـ MySQL:

  1. sudo nano /etc/mysql/my.cnf

داخل الملف، ابحث عن متغير loose-group_replication_start_on_boot وقم بتعيينه إلى ON:

/etc/mysql/my.cnf

[mysqld]
. . .
loose-group_replication_start_on_boot = ON
. . .

احفظ وأغلق الملف عند الانتهاء. يجب أن يحاول العضو تلقائيًا الانضمام إلى المجموعة في المرة القادمة التي يتم فيها تشغيل مثيل MySQL الخاص به.

الختام

با إكمال هذا البرنامج التعليمي، تعلمت كيفية تكوين تكرار المجموعة في MySQL بين ثلاث خوادم تعمل بنظام Ubuntu 20.04. بالنسبة لإعدادات الأساسية الفردية، سيقوم الأعضاء تلقائياً باختيار أساسي يمكنه الكتابة عند الضرورة. بالنسبة للمجموعات ذات الأساسيات المتعددة، يمكن لأي عضو القيام بالكتابة والتحديثات.

يوفر تكرار المجموعة توبولوجيا للتكرار مرنة تسمح للأعضاء بالانضمام أو المغادرة بحرية مع توفير في الوقت نفسه ضمانات بشأن توافق البيانات وترتيب الرسائل. قد يكون تكوين تكرار المجموعة في MySQL معقداً قليلاً، ولكنه يوفر إمكانيات لا يمكن تحقيقها في التكرار التقليدي.

Source:
https://www.digitalocean.com/community/tutorials/how-to-configure-mysql-group-replication-on-ubuntu-20-04