إعادة التسمية
MySQL 8.0.22 قدم تغييرًا كبيرًا في المصطلحات: تم استبدال المصطلحين Master و Slave في أوامر وأعمدة إخراج النسخ المتماثل بـ Source و Replica.
إنه ليس مجرد تغيير تجميلي. بشكل ملموس:
SHOW SLAVE STATUSيصبحSHOW REPLICA STATUSCHANGE MASTER TOيصبحCHANGE REPLICATION SOURCE TO- يصبح العمود
Master_Hostفي الإخراجSource_Host Slave_IO_RunningيصبحReplica_IO_RunningSlave_SQL_RunningيصبحReplica_SQL_RunningSeconds_Behind_MasterيصبحSeconds_Behind_Source
وهكذا لنحو ثلاثين عمودًا.
MySQL 8.0 يحافظ على التوافق: الأوامر القديمة لا تزال تعمل (مع تحذير الإهمال). لكن MySQL 8.4 يبدأ في إزالة الأسماء المستعارة القديمة. وMariaDB، من جهته، يحتفظ بالمصطلحات التاريخية.
مشكلة أدوات المراقبة
أي أداة تقوم بتحليل مخرجات SHOW SLAVE STATUS / SHOW REPLICA STATUS يجب أن تتعامل الآن مع مجموعتين من أسماء الأعمدة اعتمادًا على إصدار الخادم:
| قديم (MariaDB، MySQL 5.7) | جديد (MySQL 8.0+) |
|---|---|
| Master_Host | Source_Host |
| Master_User | المصدر_المستخدم |
| Master_Port | Source_Port |
| ملف_السجل_الرئيسي | Source_Log_File |
| قراءة_Master_Log_Pos | قراءة_Source_Log_Pos |
| Slave_IO_Running | Replica_IO_Running |
| Slave_SQL_Running | Replica_SQL_Running |
| Slave_IO_State | Replica_IO_State |
| ثواني_خلف_السيد | ثواني_خلف_المصدر |
| Last_IO_Error | Last_IO_Error |
| Last_SQL_Error | Last_SQL_Error |
| Exec_Master_Log_Pos | Exec_Source_Log_Pos |
المشكلة ذات شقين:
- الكود الموجود يستخدم أسماء الأعمدة القديمة في كل مكان. مئات الإشارات إلى
$row['Master_Host']أو$row['Slave_IO_Running']. - البنية التحتية مختلطة: MariaDB 10.6 و10.11، MySQL 5.7 في نهاية العمر الافتراضي، MySQL 8.0، MySQL 8.4 تم نشرها حديثًا. الكل في نفس PmaControl.
الحل الساذج (ولماذا لا ينجح)
الفكرة الأولى: الكشف عن الإصدار واستخدام اسم العمود الصحيح.
// Ne faites pas ça
if ($version >= '8.0.22') {
$host = $row['Source_Host'];
$io_running = $row['Replica_IO_Running'];
} else {
$host = $row['Master_Host'];
$io_running = $row['Slave_IO_Running'];
}
هذا النمط كارثي للحفاظ عليه. يجب تكرار كل مكان في الكود يقرأ حقل النسخ المتماثل. مع 30 عمودًا وعشرات الأماكن في الكود، نصل إلى مئات الشروط.
ومتى سيضيف MySQL 9.0 أسماء مستعارة جديدة؟ هل يجب علينا مضاعفة الكود ثلاث مرات؟
النهج الدبقي: الاسم المستعار ثنائي الاتجاه على مستوى السائق
الحل المطبق في إطار عمل Glial (الذي يوفر طبقة الوصول MySQL لـ PmaControl) أكثر أناقة: الاسم المستعار ثنائي الاتجاه على مستوى برنامج التشغيل.
عندما ينفذ برنامج التشغيل Glial SHOW REPLICA STATUS (أو SHOW SLAVE STATUS)، فإنه يثري النتيجة بإضافة الاسمين لكل عمود:
// Dans le driver MySQL de Glial
$replication_aliases = [
'Master_Host' => 'Source_Host',
'Master_User' => 'Source_User',
'Master_Port' => 'Source_Port',
'Master_Log_File' => 'Source_Log_File',
'Read_Master_Log_Pos' => 'Read_Source_Log_Pos',
'Slave_IO_Running' => 'Replica_IO_Running',
'Slave_SQL_Running' => 'Replica_SQL_Running',
'Slave_IO_State' => 'Replica_IO_State',
'Seconds_Behind_Master'=> 'Seconds_Behind_Source',
'Exec_Master_Log_Pos' => 'Exec_Source_Log_Pos',
// ... toutes les paires
];
// Après fetch du résultat
foreach ($replication_aliases as $old => $new) {
if (isset($row[$old]) && !isset($row[$new])) {
$row[$new] = $row[$old];
}
if (isset($row[$new]) && !isset($row[$old])) {
$row[$old] = $row[$new];
}
}
النتيجة: يمكن لرمز المستهلك استخدام الاسم القديم أو الجديد بالتساوي. سواء كان الخادم MariaDB 10.6، أو MySQL 5.7، أو MySQL 8.0، أو MySQL 8.4، فإن كلا الاسمين موجودان دائمًا في النتيجة.
ميزة هذا النهج
1. لا توجد تغييرات على التعليمات البرمجية الموجودة
تستمر مئات الإشارات إلى $row['Master_Host'] في PmaControl في العمل. لا يلزم ترحيل التعليمات البرمجية.
2. يمكن للكود الجديد استخدام مصطلحات جديدة
يمكن للمطورين الذين يكتبون تعليمات برمجية جديدة استخدام $row['Source_Host'] الآن. عندما تتم إعادة صياغة الكود القديم تدريجيًا، سيكون الانتقال سلسًا.
3. نقطة صيانة واحدة
يتم تعريف الاسم المستعار مرة واحدة فقط، في برنامج التشغيل. إذا أضاف MySQL 9.0 حقولًا جديدة أو أعاد تسمية أعمدة أخرى، فما عليك سوى توسيع جدول الاسم المستعار.
4. التوافق مع إظهار حالة العبد وإظهار حالة النسخة المتماثلة
يحاول برنامج التشغيل أولاً SHOW REPLICA STATUS. إذا فشل الأمر (MySQL 5.7, MariaDB)، فسيعود إلى SHOW SLAVE STATUS. وفي كلتا الحالتين، تحتوي النتيجة على مجموعتي الأسماء.
try {
$result = $db->query('SHOW REPLICA STATUS');
} catch (Exception $e) {
$result = $db->query('SHOW SLAVE STATUS');
}
// Dans tous les cas, $result contient Master_Host ET Source_Host
حالة المصادر المتعددة
MySQL 8.0 يدعم النسخ المتماثل متعدد المصادر (قنوات متعددة). يقوم الأمر SHOW REPLICA STATUS بعد ذلك بإرجاع عدة أسطر، سطر واحد لكل قناة. ينطبق الاسم المستعار على كل سطر على حدة.
يدعم MariaDB أيضًا النسخ المتماثل متعدد المصادر ولكن بصيغة مختلفة (SHOW SLAVE 'channel_name' STATUS أو SHOW ALL SLAVES STATUS). يقوم برنامج التشغيل Glial بتسوية هذه الاختلافات بحيث يتلقى PmaControl تنسيقًا موحدًا.
التأثير على PmaControl
بفضل هذا الاسم المستعار في برنامج التشغيل Glial، يدير PmaControl بشفافية:
- MariaDB 10.6 / 10.11: المصطلحات الرئيسية/التابعة،
SHOW SLAVE STATUS - MySQL 5.7: مصطلحات السيد/التابع،
SHOW SLAVE STATUS - MySQL 8.0: مصطلحات المصدر/النسخة المتماثلة،
SHOW REPLICA STATUS(مع الرجوع القديم) - MySQL 8.4: مصطلحات المصدر/النسخة المتماثلة فقط،
SHOW REPLICA STATUS
تعرض واجهة PmaControl معلومات النسخ المتماثل بشكل موحد، بغض النظر عن إصدار الخادم. تعرض لوحة معلومات النسخ المتماثل Source_Host في الأعمدة، لكن الاستعلامات الداخلية تعمل مع كلا الاسمين.
أوامر أيضا
لا تقتصر إعادة التسمية على أعمدة الإخراج فقط. تمت إعادة تسمية أوامر SQL نفسها:
| قديم | جديد |
|---|---|
CHANGE MASTER TO |
CHANGE REPLICATION SOURCE TO |
START SLAVE |
START REPLICA |
STOP SLAVE |
STOP REPLICA |
RESET SLAVE |
RESET REPLICA |
SHOW SLAVE HOSTS |
SHOW REPLICAS |
يستخدم PmaControl نفس الأسلوب: جرب الأمر الجديد، ثم قم بالرجوع إلى الأمر القديم.
توصيات لأدواتك الخاصة
إذا كنت تحتفظ بالبرامج النصية أو الأدوات التي تحلل مخرجات النسخ المتماثل:
- لا تستخدم شروط الإصدار — فهي هشة وغير قابلة للقياس
- تنفيذ الاسم المستعار ثنائي الاتجاه على أدنى مستوى ممكن (المحرك، طبقة التجريد)
- اكتب رمزًا جديدًا بالمصطلحات الجديدة — المصدر/النسخة المتماثلة
- اختبار على الإصدارات الأربعة الرئيسية: MariaDB 10.x، MySQL 5.7، MySQL 8.0، MySQL 8.4
- التحضير لـ MySQL 9.x — قد تختفي الأسماء المستعارة القديمة تمامًا
الخلاصة
تعد إعادة تسمية Master/Slave إلى Source/Replica في MySQL 8.0 تغييرًا بسيطًا على ما يبدو ولكنه من المحتمل أن يكسر أي أداة مراقبة أو نسخ احتياطي أو تنسيق تقوم بتوزيع مخرجات النسخ المتماثل.
الحل النظيف هو الاسم المستعار ثنائي الاتجاه على مستوى برنامج التشغيل: تنفيذ واحد، عدم إجراء أي تغييرات في كود المستهلك، التوافق الكامل من MariaDB 10.x إلى MySQL 8.4.
هذا ما يفعله إطار عمل Glial، وهذا ما يسمح لـ PmaControl بالإشراف على البنى التحتية المختلطة MariaDB / MySQL بدون تكوين خاص لكل إصدار.
تعليقات (0)
لا توجد تعليقات حتى الآن.
اترك تعليقا