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

للنسخ المتماثل للتغيير المستمر ، يستخدم pg_chameleon مكتبة النسخ المتماثل MySQL ، والتي تسمح لك بالحصول على نسخ منطقية من الصفوف من قاعدة بيانات MySQL ، والتي يتم تحويلها إلى كائن jsonb. تقوم الدالة pl / pgsql في Postgres بفك تشفير كائن jsonb وإعادة إنتاج التغييرات في قاعدة بيانات Postgres. لتكوين هذا النوع من النسخ المتماثل ، يجب تعيين متغير binlog_format لقاعدة بيانات MySQL إلى ROW (سلسلة).
بعض النقاط التي يجب معرفتها قبل إعداد هذه الأداة:
- يجب أن تحتوي الجداول التي يجب نسخها على مفتاح أساسي.
- تعمل الأداة في إصدارات PostgreSQL فوق 9.5 ونظام MySQL فوق 5.5
- لتكوين هذا النسخ المتماثل ، يجب تعيين متغير binlog_format إلى ROW.
- يجب أن يكون إصدار Python أعلى من 3.3
عند بدء النسخ المتماثل ، يسترد pg_chameleon البيانات من MySQL بتنسيق CSV وينقسم إلى مجموعات ذات طول معين لتجنب الحمل الزائد للذاكرة. يتم مسح هذه البيانات إلى Postgres باستخدام الأمر COPY. في حالة فشل النسخ ، يتم تنفيذ الأمر INSERT ، مما قد يؤدي إلى إبطاء العملية. إذا فشل الأمر INSERT ، يتم فقدان الصف.
لتكرار التغييرات من MySQL ، تحاكي pg_chameleon سلوك النسخة المتماثلة MySQL (الرقيق). يؤدي هذا إلى إنشاء مخطط في Postgres ، وتنفيذ تحميل البيانات الأولية ، والاتصال ببروتوكول النسخ المتماثل MySQL ، ونسخ الصفوف في جدول Postgres. في الوقت نفسه ، توفر وظائف Postgres المقابلة فك تشفير السلسلة والتغييرات. يشبه هذا تخزين سجلات النقل في جداول Postgres وتطبيقها على مخطط Postgres. لا يلزم إنشاء مخطط قاعدة بيانات Postgres باستخدام أي لغة وصف بيانات. للجداول المحددة عند تكوين النسخ المتماثل ، تقوم أداة pg_chameleon بذلك تلقائيًا. إذا كنت بحاجة إلى تحويل أي أنواع بطريقة معينة ، فيمكنك تحديد ذلك في ملف التكوين.
فيما يلي تمرين يمكنك تجربته. استخدم الخيارات المتوفرة إذا كانت تلبي متطلباتك بالكامل. أجرينا هذه الاختبارات على إصدار CentOS Linux 7.4.
إعداد البيئة
تكوين خادم بيركونا لـ MySQL
تثبيت MySQL الإصدار 5.7 وإضافة الخيارات المناسبة للنسخ المتماثل.
في هذا التمرين ، قمت بتثبيت Percona Server لـ MySQL الإصدار 5.7 باستخدام مستودع YUM.
yum install http://www.percona.com/downloads/percona-release/redhat/0.1-6/percona-release-0.1-6.noarch.rpm yum install Percona-Server-server-57 echo "mysql ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers usermod -s /bin/bash mysql sudo su - mysql
بالنسبة إلى pg_chameleon ، يجب تكوين المعلمات التالية في ملف my.cnf (ملف به معلمات خادم MySQL). يمكنك إضافة الخيارات التالية إلى ملف /etc/my.cnf
binlog_format= ROW binlog_row_image=FULL log-bin = mysql-bin server-id = 1
الآن ، بعد تضمين المعلمات أعلاه في ملف my.cnf ، ابدأ خادم MySQL.
$ service mysql start
الحصول على كلمة المرور المؤقتة لحساب الجذر من ملف mysqld.log وإعادة تعيين كلمة المرور الجذر باستخدام الأمر mysqladmin.
$ grep "temporary" /var/log/mysqld.log $ mysqladmin -u root -p password 'Secret123!'
اتصل الآن بمثيلك الخاص بقاعدة بيانات MySQL وقم بإنشاء نموذج مخطط / جداول. لقد قمت أيضًا بإنشاء جدول emp للتحقق.
$ wget http://downloads.mysql.com/docs/sakila-db.tar.gz $ tar -xzf sakila-db.tar.gz $ mysql -uroot -pSecret123! < sakila-db/sakila-schema.sql $ mysql -uroot -pSecret123! < sakila-db/sakila-data.sql $ mysql -uroot -pSecret123! sakila -e "create table emp (id int PRIMARY KEY, first_name varchar(20), last_name varchar(20))"
قم بإنشاء مستخدم لتكوين النسخ المتماثل باستخدام أداة pg_chameleon ومنحه الحقوق المناسبة باتباع هذه الخطوات.
$ mysql -uroot -p create user 'usr_replica'@'%' identified by 'Secret123!'; GRANT ALL ON sakila.* TO 'usr_replica'@'%'; GRANT RELOAD, REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'usr_replica'@'%'; FLUSH PRIVILEGES;
عند إنشاء مستخدم على خادم MySQL ('usr_replica' @ '٪') ، قد يكون من الضروري استبدال الحرف "٪" بعنوان IP المطابق أو اسم المضيف للخادم الذي يقوم بتشغيل pg_chameleon.
تكوين PostgreSQL
تثبيت PostgreSQL وتشغيل نسخة من قاعدة البيانات.
اتبع هذه الخطوات لتثبيت PostgreSQL الإصدار 10.x.
yum install https://yum.postgresql.org/10/redhat/rhel-7.4-x86_64/pgdg-centos10-10-2.noarch.rpm yum install postgresql10* su - postgres $/usr/pgsql-10/bin/initdb $ /usr/pgsql-10/bin/pg_ctl -D /var/lib/pgsql/10/data start
كما ترى من السجلات التالية ، أنت بحاجة إلى إنشاء مستخدم في PostgreSQL حيث ستتمكن pg_chameleon من كتابة البيانات المعدلة إلى PostgreSQL. قم أيضًا بإنشاء قاعدة بيانات الهدف.
postgres=# CREATE USER usr_replica WITH ENCRYPTED PASSWORD 'secret'; CREATE ROLE postgres=# CREATE DATABASE db_replica WITH OWNER usr_replica; CREATE DATABASE
خطوات تثبيت النسخ المتماثل وتكوينه باستخدام pg_chameleon
المرحلة 1. في هذا التمرين ، قمت بتثبيت الإصدار 3.6 من مترجم Python و pg_chameleon الإصدار 2.0.8 باتباع هذه الخطوات. إذا كان لديك بالفعل الإصدار المطلوب من مترجم Python مثبتًا ، فيمكنك تخطي الخطوات لتثبيته. يمكننا إنشاء بيئة افتراضية إذا كان نظام التشغيل لا يتضمن الإصدار 3.x من Python بشكل افتراضي.
yum install gcc openssl-devel bzip2-devel wget cd /usr/src wget https://www.python.org/ftp/python/3.6.6/Python-3.6.6.tgz tar xzf Python-3.6.6.tgz cd Python-3.6.6 ./configure --enable-optimizations make altinstall python3.6 -m venv venv source venv/bin/activate pip install pip --upgrade pip install pg_chameleon
المرحلة 2. تتطلب هذه الأداة ملف تكوين حيث سيتم تخزين معلومات حول المصدر والخوادم المستهدفة ، ومجلد لتخزين السجلات. لكي يكون pg_chameleon إنشاء قالب ملف التكوين والمجلدات المقابلة ، استخدم الأمر التالي.
$ chameleon set_configuration_files
عند تنفيذ هذا الأمر ، يتم عرض النتائج التالية. يظهرون أن هذا الأمر أنشأ العديد من المجلدات والملفات في المكان الذي قمت بتشغيله فيه.
creating directory /var/lib/pgsql/.pg_chameleon creating directory /var/lib/pgsql/.pg_chameleon/configuration/ creating directory /var/lib/pgsql/.pg_chameleon/logs/ creating directory /var/lib/pgsql/.pg_chameleon/pid/ copying configuration example in /var/lib/pgsql/.pg_chameleon/configuration//config-example.yml
انسخ نموذج ملف التكوين إلى ملف آخر ، قل default.yml
$ cd .pg_chameleon/configuration/ $ cp config-example.yml default.yml
هذا ما يبدو عليه ملف default.yml بعد تضمين جميع المعلمات الضرورية فيه. في هذا الملف ، إذا لزم الأمر ، يمكنك تحديد تحويل أنواع البيانات والجداول التي يجب تخطيها أثناء النسخ المتماثل وأحداث لغة معالجة البيانات التي يجب تجاهلها لقائمة الجداول المحددة.
--- #global settings pid_dir: '~/.pg_chameleon/pid/' log_dir: '~/.pg_chameleon/logs/' log_dest: file log_level: info log_days_keep: 10 rollbar_key: '' rollbar_env: '' # type_override allows the user to override the default type conversion into a different one. type_override: "tinyint(1)": override_to: boolean override_tables: - "*" #postgres destination connection pg_conn: host: "localhost" port: "5432" user: "usr_replica" password: "secret" database: "db_replica" charset: "utf8" sources: mysql: db_conn: host: "localhost" port: "3306" user: "usr_replica" password: "Secret123!" charset: 'utf8' connect_timeout: 10 schema_mappings: sakila: sch_sakila limit_tables: # - delphis_mediterranea.foo skip_tables: # - delphis_mediterranea.bar grant_select_to: - usr_readonly lock_timeout: "120s" my_server_id: 100 replica_batch_size: 10000 replay_max_rows: 10000 batch_retention: '1 day' copy_max_memory: "300M" copy_mode: 'file' out_dir: /tmp sleep_loop: 1 on_error_replay: continue on_error_read: continue auto_maintenance: "disabled" gtid_enable: No type: mysql skip_events: insert: # - delphis_mediterranea.foo #skips inserts on the table delphis_mediterranea.foo delete: # - delphis_mediterranea #skips deletes on schema delphis_mediterranea update:
الخطوة 3. إنشاء نسخة متماثلة (قاعدة بيانات الهدف) باستخدام الأمر:
$ chameleon create_replica_schema --debug
ينشئ الأمر أعلاه مخططًا وتسعة جداول في قاعدة بيانات PostgreSQL المحددة في ملف .pg_chameleon / config / default.yml. هذه الجداول مطلوبة للتحكم في النسخ المتماثل من قاعدة البيانات المصدر إلى الهدف. يمكن رؤية الشيء نفسه في المجلة التالية.
db_replica=# \dn List of schemas Name | Owner
الخطوة 4. إضافة بيانات قاعدة البيانات المصدر إلى pg_chameleon باستخدام الأمر التالي. حدد اسم قاعدة البيانات المصدر كما هو محدد في ملف التكوين. في هذا المثال ، اسم قاعدة البيانات المصدر هو الخلية ، والهدف هو قاعدة بيانات Postgres ، المعرفة على أنها pg_conn.
$ chameleon add_source --config default --source mysql --debug
بعد تنفيذ الأمر المحدد ، سترى أن بيانات قاعدة البيانات الأصلية تضاف إلى جدول t_sources.
db_replica=# select * from sch_chameleon.t_sources; -[ RECORD 1 ]-------+---------------------------------------------- i_id_source | 1 t_source | mysql jsb_schema_mappings | {: } enm_status | ready t_binlog_name | i_binlog_position | b_consistent | t b_paused | f b_maintenance | f ts_last_maintenance | enm_source_type | mysql v_log_table | {t_log_replica_mysql_1,t_log_replica_mysql_2} $ chameleon show_status --config default Source id Source name Type Status Consistent Read lag Last read Replay lag Last replay ----------- ------------- ------ -------- ------------ ---------- ----------- ------------ ------------- 1 mysql mysql ready Yes N/AN/A
الخطوة 5. تهيئة النسخة المتماثلة (قاعدة البيانات الهدف) باستخدام الأمر التالي. حدد قاعدة البيانات المصدر التي يتم نسخ التغييرات منها إلى قاعدة بيانات PostgreSQL.
$ chameleon init_replica --config default --source mysql --debug
تتضمن التهيئة المهام التالية على خادم MySQL (المصدر).
- امسح ذاكرة التخزين المؤقت للجدول واضبط القفل للقراءة فقط
- احصل على إحداثيات قاعدة البيانات المصدر
- نسخ البيانات
- افتح
يقوم الأمر أعلاه تلقائيًا بإنشاء مخطط قاعدة بيانات Postgres المستهدفة.
في ملف default.yml ، ذكرنا تعيينات المخطط التالية (schema_mappings).
schema_mappings: sakila: sch_sakila
تم الآن إنشاء مخطط سكوت جديد في قاعدة بيانات db_replica الهدف.
db_replica=# \dn List of schemas Name | Owner
الخطوة 6. الآن ابدأ النسخ المتماثل باستخدام الأمر التالي.
$ chameleon start_replica --config default --source mysql
الخطوة 7. تحقق من حالة النسخ المتماثل والأخطاء باستخدام الأوامر التالية.
$ chameleon show_status --config default $ chameleon show_errors
هذا ما تبدو عليه حالة النسخ المتماثل:
$ chameleon show_status --source mysql Source id Source name Type Status Consistent Read lag Last read Replay lag Last replay ----------- ------------- ------ -------- ------------ ---------- ----------- ------------ ------------- 1 mysql mysql running No N/AN/A == Schema mappings == Origin schema Destination schema --------------- -------------------- sakila sch_sakila == Replica status == --------------------- --- Tables not replicated 0 Tables replicated 17 All tables 17 Last maintenance N/A Next maintenance N/A Replayed rows Replayed DDL Skipped rows
الآن يمكنك أن ترى أن التغييرات يتم نسخها باستمرار من قاعدة بيانات MySQL إلى قاعدة بيانات PostgreSQL.
الخطوة 8. للتحقق ، يمكنك إدراج سجل في جدول قاعدة بيانات MySQL الذي أنشأناه للتحقق من النسخ المتماثل في قاعدة بيانات Postgres.
$ mysql -u root -pSecret123! -e "INSERT INTO sakila.emp VALUES (1,'avinash','vallarapu')" mysql: [Warning] Using a password on the command line interface can be insecure. $ psql -d db_replica -c "select * from sch_sakila.emp" id | first_name | last_name ----+------------+----------- 1 | avinash | vallarapu (1 row)
يمكن أن نرى من السجل أعلاه أنه تم نسخ السجل المدرج في جدول MySQL إلى الجدول في قاعدة بيانات Postgres.
يمكنك أيضًا إضافة قواعد بيانات متعددة للنسخ المتماثل المصدر إلى قاعدة بيانات Postgres المستهدفة.
رابط
من هذه الوثائق ، يمكنك التعرف على العديد من الميزات الإضافية المتاحة في pg_chameleon.