نسخ MySQL Master-Slave على نفس الجهاز

نشرت: 2022-03-11

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

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

النسخ المتماثل الرئيسي والعبد في MySQL

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

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

النسخ المتماثل الرئيسي والعبد في MySQL

تثبيت أول مثيل MySQL

إذا كان لديك بالفعل مثيل واحد من قاعدة بيانات MySQL مثبتًا على جهازك ، فيمكنك تخطي هذه الخطوة.

أسهل طريقة لتثبيت MySQL على Ubuntu هي تشغيل الأمر التالي من موجه طرفي:

 sudo apt-get install mysql-server

أثناء عملية التثبيت ، سيُطلب منك تعيين كلمة مرور لمستخدم root MySQL.

إعداد mysqld_multi

من أجل إدارة مثيلين MySQL على نفس الجهاز بكفاءة ، نحتاج إلى استخدام mysqld_multi .

الخطوة الأولى في إعداد mysqld_multi هي إنشاء مجموعتين منفصلتين [mysqld] في ملف my.cnf الحالي. الموقع الافتراضي لملف my.cnf على أوبونتو هو /etc/mysql/ . لذا ، افتح ملف my.cnf باستخدام محرر النصوص المفضل لديك ، وأعد تسمية مجموعة [mysqld] الموجودة إلى [mysqld1] . ستُستخدم هذه المجموعة المُعاد تسميتها لتهيئة أول مثيل MySQL وسيتم تهيئتها أيضًا كمثيل رئيسي. كما هو الحال في النسخ المتماثل الرئيسي والعبد في MySQL ، يجب أن يكون لكل مثيل server-id فريد خاص به ، أضف السطر التالي في مجموعة [mysqld1] :

 server-id = 1

نظرًا لأننا نحتاج إلى مجموعة [mysqld] منفصلة لمثال MySQL الثاني ، انسخ مجموعة [mysqld1] مع جميع التكوينات الحالية ، والصقها أدناه في نفس ملف my.cnf . الآن ، أعد تسمية المجموعة المنسوخة إلى [mysqld2] ، وقم بإجراء التغييرات التالية في تكوين التابع:

 server-id = 2 port = 3307 socket = /var/run/mysqld/mysqld_slave.sock pid-file = /var/run/mysqld/mysqld_slave.pid datadir = /var/lib/mysql_slave log_error = /var/log/mysql_slave/error_slave.log relay-log = /var/log/mysql_slave/relay-bin relay-log-index = /var/log/mysql_slave/relay-bin.index master-info-file = /var/log/mysql_slave/master.info relay-log-info-file = /var/log/mysql_slave/relay-log.info read_only = 1

لإعداد مثيل MySQL الثاني كعبد ، اضبط server-id على 2 ، حيث يجب أن يكون مختلفًا عن معرف الخادم الرئيسي.

نظرًا لأن كلتا الحالتين ستعملان على نفس الجهاز ، فاضبط port للمثيل الثاني على 3307 لأنه يجب أن يكون مختلفًا عن المنفذ المستخدم للمثيل الأول ، وهو 3306 افتراضيًا.

لتمكين هذا المثيل الثاني من استخدام نفس ثنائيات MySQL ، نحتاج إلى تعيين قيم مختلفة socket pid-file و datadir و log_error .

نحتاج أيضًا إلى تمكين relay-log من أجل استخدام المثيل الثاني كعبد (المعلمات relay-log و relay-log-index و relay-log-info-file ) ، وكذلك لتعيين master-info-file .

أخيرًا ، من أجل جعل المثيل التابع للقراءة فقط ، تم تعيين المعلمة read_only على 1 . يجب أن تكون حذرًا مع هذا الخيار لأنه لا يمنع تمامًا التغييرات على العبد. حتى عند تعيين read_only على 1 ، لن يُسمح بالتحديثات إلا من المستخدمين الذين لديهم امتياز SUPER . أدخلت MySQL مؤخرًا المعامل الجديد super_read_only لمنع مستخدمي SUPER من إجراء تغييرات. هذا الخيار متاح مع الإصدار 5.7.8.

بصرف النظر عن [mysqld1] و [mysqld2] ، نحتاج أيضًا إلى إضافة مجموعة جديدة [mysqld_multi] إلى ملف my.cnf :

 [mysqld_multi] mysqld = /usr/bin/mysqld_safe mysqladmin = /usr/bin/mysqladmin user = multi_admin password = multipass

بمجرد تثبيت مثيل MySQL الثاني ، وبدء تشغيل كليهما ، سنمنح امتيازات مناسبة للمستخدم multi_admin حتى نتمكن من إيقاف تشغيل مثيلات MySQL.

قم بإنشاء مجلدات جديدة لمثال MySQL الثاني

في الخطوة السابقة ، قمنا بإعداد ملف التكوين لمثيل MySQL الثاني. في ملف التكوين هذا ، يتم استخدام مجلدين جديدين. يجب استخدام أوامر Linux التالية لإنشاء تلك المجلدات بالامتيازات المناسبة:

 mkdir -p /var/lib/mysql_slave chmod --reference /var/lib/mysql /var/lib/mysql_slave chown --reference /var/lib/mysql /var/lib/mysql_slave mkdir -p /var/log/mysql_slave chmod --reference /var/log/mysql /var/log/mysql_slave chown --reference /var/log/mysql /var/log/mysql_slave

إعدادات أمان إضافية في AppArmor

في بعض بيئات Linux ، تكون إعدادات أمان AppArmor ضرورية لتشغيل مثيل MySQL الثاني. على الأقل ، هم مطلوبون على Ubuntu.

لإعداد AppArmor بشكل صحيح ، قم بتحرير ملف /etc/apparmor.d/usr.sbin.mysqld باستخدام محرر النصوص المفضل لديك ، أضف الأسطر التالية:

 /var/lib/mysql_slave/ r, /var/lib/mysql_slave/** rwk, /var/log/mysql_slave/ r, /var/log/mysql_slave/* rw, /var/run/mysqld/mysqld_slave.pid rw, /var/run/mysqld/mysqld_slave.sock w, /run/mysqld/mysqld_slave.pid rw, /run/mysqld/mysqld_slave.sock w,

بعد حفظ الملف ، أعد تشغيل الجهاز حتى تدخل هذه التغييرات حيز التنفيذ.

تثبيت مثيل MySQL الثاني

يمكن اتباع عدة طرق مختلفة لتثبيت مثيل MySQL الثاني. يستخدم الأسلوب المقدم في هذا البرنامج التعليمي نفس ثنائيات MySQL مثل الأول ، مع ملفات بيانات منفصلة ضرورية للتثبيت الثاني.

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

نفّذ الأمر التالي لتهيئة دليل بيانات MySQL جديد:

 mysql_install_db --user=mysql --datadir=/var/lib/mysql_slave

بمجرد تهيئة دليل بيانات MySQL ، يمكنك بدء مثيلي MySQL باستخدام خدمة mysqld_multi :

 mysqld_multi start

قم بتعيين كلمة مرور root لمثيل MySQL الثاني باستخدام mysqladmin مع المضيف والمنفذ المناسبين. ضع في اعتبارك ، إذا لم يتم تحديد المضيف والمنفذ ، mysqladmin بالاتصال بمثيل MySQL الأول افتراضيًا:

 mysqladmin --host=127.0.0.1 --port=3307 -u root password rootpwd

في المثال أعلاه ، قمت بتعيين كلمة المرور على "rootpwd" ، ولكن يوصى باستخدام كلمة مرور أكثر أمانًا.

التكوين الإضافي mysqld_multi

في نهاية قسم "Setting up mysqld_multi" ، كتبت أننا سنمنح الامتيازات المناسبة لمستخدم multi_admin لاحقًا ، لذا حان الوقت الآن لذلك. نحتاج إلى منح هذا المستخدم الامتيازات المناسبة في كلتا الحالتين ، لذلك دعونا أولاً نتصل بالمثال الأول:

 mysql --host=127.0.0.1 --port=3306 -uroot -p

بمجرد تسجيل الدخول ، قم بتنفيذ الأمرين التاليين:

 mysql> GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost' IDENTIFIED BY 'multipass'; mysql> FLUSH PRIVILEGES;

اخرج من عميل MySQL ، واتصل بالمثيل الثاني:

 mysql --host=127.0.0.1 --port=3307 -uroot -p

بمجرد تسجيل الدخول ، قم بتنفيذ نفس الأمرين على النحو الوارد أعلاه:

 mysql> GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost' IDENTIFIED BY 'multipass'; mysql> FLUSH PRIVILEGES;

اخرج من عميل MySQL.

ابدأ كلاً من مثيلات MySQL تلقائيًا عند التمهيد

الخطوة الأخيرة في إعداد mysqld_multi هي تثبيت نص التمهيد التلقائي في init.d

للقيام بذلك ، قم بإنشاء ملف جديد باسم mysqld_multi في /etc/init.d ، ومنحه الامتيازات المناسبة:

 cd /etc/init.d touch mysqld_multi chmod +x /etc/init.d/mysqld_multi

افتح هذا الملف الجديد باستخدام محرر النصوص المفضل لديك ، وانسخ البرنامج النصي التالي:

 #!/bin/sh ### BEGIN INIT INFO # Provides: scriptname # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start daemon at boot time # Description: Enable service provided by daemon. ### END INIT INFO bindir=/usr/bin if test -x $bindir/mysqld_multi then mysqld_multi="$bindir/mysqld_multi"; else echo "Can't execute $bindir/mysqld_multi"; exit; fi case "$1" in 'start' ) "$mysqld_multi" start $2 ;; 'stop' ) "$mysqld_multi" stop $2 ;; 'report' ) "$mysqld_multi" report $2 ;; 'restart' ) "$mysqld_multi" stop $2 "$mysqld_multi" start $2 ;; *) echo "Usage: $0 {start|stop|report|restart}" >&2 ;; esac

أضف خدمة mysqld_multi إلى مستويات runlevels الافتراضية باستخدام الأمر التالي:

 update-rc.d mysqld_multi defaults

أعد تشغيل جهازك وتحقق من تشغيل مثيلي MySQL باستخدام الأمر التالي:

 mysqld_multi report

إعداد النسخ المتماثل الرئيسي والعبد

الآن ، عندما يكون لدينا مثيلين من MySQL يعملان على نفس الجهاز ، سنقوم بإعداد المثال الأول كمتحدث رئيسي ، والثاني كعبد.

تم تنفيذ جزء من الضبط بالفعل في فصل "إعداد mysqld_multi". التغيير الوحيد المتبقي في ملف my.cnf هو ضبط التسجيل الثنائي على الشريحة الرئيسية. للقيام بذلك ، قم بتحرير ملف my.cnf بالتغييرات والإضافات التالية في مجموعة [mysqld1] :

 log_bin = /var/log/mysql/mysql-bin.log innodb_flush_log_at_trx_commit = 1 sync_binlog = 1 binlog-format = ROW

أعد تشغيل مثيل MySQL الرئيسي حتى تصبح هذه التغييرات سارية المفعول:

 mysqld_multi stop 1 mysqld_multi start 1

من أجل أن يتصل العبد بالسيد بامتيازات النسخ المتماثل الصحيحة ، يجب إنشاء مستخدم جديد على السيد. اتصل بالمثيل الرئيسي باستخدام عميل MySQL مع المضيف والمنفذ المناسبين:

 mysql -uroot -p --host=127.0.0.1 --port=3306

إنشاء مستخدم جديد للنسخ المتماثل:

 mysql> CREATE USER 'replication'@'%' IDENTIFIED BY 'replication'; mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%';

اخرج من عميل MySQL.

نفّذ الأمر التالي لإنشاء تفريغ للبيانات الرئيسية:

 mysqldump -uroot -p --host=127.0.0.1 --port=3306 --all-databases --master-data=2 > replicationdump.sql

هنا نستخدم الخيار --master-data=2 من أجل الحصول على تعليق يحتوي على جملة CHANGE MASTER داخل ملف النسخ الاحتياطي. يشير هذا التعليق إلى إحداثيات النسخ في وقت النسخ الاحتياطي ، وسنحتاج إلى هذه الإحداثيات لاحقًا لتحديث المعلومات الرئيسية في مثيل الرقيق. هذا مثال على ذلك التعليق:

 -- -- Position to start replication or point-in-time recovery from -- -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=349;

قم باستيراد ملف التفريغ الذي قمت بإنشائه في الخطوة السابقة إلى مثيل العبيد:

 mysql -uroot -p --host=127.0.0.1 --port=3307 < replicationdump.sql

أخيرًا ، من أجل اتصال مثيل الرقيق بالمثيل الرئيسي ، يجب تحديث المعلومات الرئيسية على التابع بمعلمات الاتصال المناسبة.

اتصل بمثيل العبد باستخدام عميل MySQL مع المضيف والمنفذ المناسبين:

 mysql -uroot -p --host=127.0.0.1 --port=3307

قم بتنفيذ الأمر التالي لتحديث المعلومات الرئيسية (خذ إحداثيات النسخ المتماثل من ملف التفريغ replicationdump.sql ، كما هو موضح أعلاه):

 mysql> CHANGE MASTER TO -> MASTER_HOST='127.0.0.1', -> MASTER_USER='replication', -> MASTER_PASSWORD='replication', -> MASTER_LOG_FILE='mysql-bin.000001', -> MASTER_LOG_POS=349;

نفّذ الأمر التالي لبدء التابع:

 mysql> START SLAVE;

نفّذ الأمر التالي للتحقق من تشغيل النسخ المتماثل:

 mysql> SHOW SLAVE STATUS \G

تهانينا. تم الآن إعداد النسخ المتماثل MySQL master-slave الخاص بك على نفس الجهاز بنجاح.

النسخ المتماثل الرئيسي والعبد في MySQL

يتم إحتوائه

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

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