نسخ MySQL Master-Slave على نفس الجهاز
نشرت: 2022-03-11النسخ المتماثل MySQL هو عملية تتيح نسخ البيانات من خادم قاعدة بيانات MySQL واحد (الرئيسي) تلقائيًا إلى واحد أو أكثر من خوادم قاعدة بيانات MySQL (العبيد). يتم استخدامه عادةً لنشر الوصول للقراءة على خوادم متعددة من أجل قابلية التوسع ، على الرغم من أنه يمكن استخدامه أيضًا لأغراض أخرى مثل تجاوز الفشل ، أو تحليل البيانات الموجودة على العبد حتى لا يفرط في التحميل على الخادم الرئيسي.
نظرًا لأن النسخ المتماثل للسيد والعبد هو نسخ متماثل أحادي الاتجاه (من السيد إلى العبد) ، يتم استخدام قاعدة البيانات الرئيسية فقط لعمليات الكتابة ، بينما يمكن نشر عمليات القراءة على قواعد بيانات متعددة للرقيق. ما يعنيه هذا هو أنه إذا تم استخدام النسخ المتماثل الرئيسي والعبد كحل واسع النطاق ، فأنت بحاجة إلى تحديد مصدري بيانات على الأقل ، أحدهما لعمليات الكتابة والثاني لعمليات القراءة.
عادةً ما يعمل مطورو MySQL على جهاز واحد فقط ويميلون إلى امتلاك بيئة التطوير الكاملة الخاصة بهم على هذا الجهاز ، مع منطق أنهم لا يعتمدون على شبكة أو اتصال إنترنت. إذا كانت هناك حاجة إلى النسخ المتماثل الرئيسي والعبد لأنهم ، على سبيل المثال ، يحتاجون إلى اختبار النسخ المتماثل في بيئة تطوير قبل نشر التغييرات في مكان آخر ، فيجب عليهم إنشائها على نفس الجهاز. في حين أن إعداد مثيل MySQL واحد بسيط إلى حد ما ، فنحن بحاجة إلى بذل بعض الجهد الإضافي لإعداد نسخة ثانية ، ثم النسخ المتماثل الرئيسي والعبد.
بالنسبة لهذا البرنامج التعليمي خطوة بخطوة ، اخترت Ubuntu Linux كنظام تشغيل مضيف ، والأوامر المقدمة مخصصة لنظام التشغيل هذا. إذا كنت ترغب في إعداد النسخ المتماثل MySQL master-slave الخاص بك على بعض أنظمة التشغيل الأخرى ، فستحتاج إلى إجراء تعديلات على أوامره المحددة. ومع ذلك ، فإن المبادئ العامة لإعداد النسخ المتماثل لـ 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 الخاص بك على نفس الجهاز بنجاح.
يتم إحتوائه
يعد تكوين النسخ المتماثل الرئيسي والعبد في بيئة التطوير الخاصة بك مفيدًا إذا كنت في حاجة إليه لحل التدرج في بيئة الإنتاج. بهذه الطريقة ، سيكون لديك أيضًا مصادر بيانات منفصلة تم تكوينها لعمليات الكتابة والقراءة حتى تتمكن من اختبار أن كل شيء يعمل محليًا كما هو متوقع قبل المزيد من النشر.
بالإضافة إلى ذلك ، قد ترغب في تكوين العديد من مثيلات الرقيق على نفس الجهاز لاختبار موازن التحميل الذي يوزع عمليات القراءة على العديد من العبيد. في هذه الحالة ، يمكنك استخدام نفس هذا الدليل لإعداد مثيلات الرقيق الأخرى بتكرار جميع الخطوات نفسها.