अमेज़ॅन वेब सर्विसेज एक तकनीकी दिग्गज है, खासकर जब टॉप-ऑफ-द-लाइन क्लाउड कंप्यूटिंग सेवाओं में खुद को अग्रणी बनाने की बात आती है। इसका पूरी तरह से प्रबंधित सेवा उत्पाद (अमेज़ॅन आरडीएस) एक तरह का है। लेकिन फिर, जबकि यह कुछ संगठनों के लिए एक आदर्श मंच हो सकता है, अगर ऐसा नहीं है तो इससे बाहर निकलना एक चुनौती हो सकती है। विक्रेता लॉक-इन स्थिति में हमेशा फंसने की चिंता होती है।
आरडीएस से ऑन-प्रिमाइसेस प्लेटफॉर्म पर माइग्रेट करते समय ध्यान रखने योग्य कुछ चीजें हैं बजट की कमी, सुरक्षा और डेटा स्वायत्तता। ऐसा इसलिए है क्योंकि डेटा आपकी सबसे मूल्यवान संपत्ति है और जहां भी वह रहता है वहां नियंत्रण बनाए रखना संगठन और कंपनी के लिए हमेशा प्रतिस्पर्धी बने रहना अनिवार्य है। कोई भी संगठन क्लाउड लॉक-इन का जोखिम नहीं उठा सकता है, और फिर भी, कई उद्यम खुद को ठीक उसी स्थिति में पाते हैं और किसी भी वैकल्पिक मौजूदा समाधान की खोज करना शुरू कर देते हैं जो ऑन-प्रिमाइसेस के माध्यम से संचालित किया जा सकता है।
यह ब्लॉग आपको बताएगा कि ऑन-प्रिमाइसेस सर्वर पर जाकर Amazon RDS से माइग्रेट कैसे किया जाता है। ऑन-प्रिमाइसेस सर्वर पर हमारा लक्ष्य डेटाबेस एक आरएचईएल/सेंटोस लिनक्स सर्वर पर है, लेकिन लागू प्रक्रिया लिनक्स के अन्य संस्करणों के साथ-साथ तब तक लागू होगी जब तक कि पैकेज ठीक से स्थापित नहीं हो जाते।
कुछ तीसरे पक्ष के मौजूदा समाधान हैं जो डेटा माइग्रेशन की पेशकश करते हैं लेकिन यह ऑन-प्रिमाइसेस प्लेटफॉर्म के लिए लागू नहीं है। इसके अतिरिक्त, यह मुफ़्त नहीं है और मुक्त स्रोत समाधानों के साथ माइग्रेट करना हमेशा अनुकूल और लाभप्रद होता है। हालांकि संदेह और चिंताएं भी मौजूद हैं क्योंकि वारंटी और समर्थन ओपन-सोर्स प्रौद्योगिकियों से बंधे नहीं हैं, लेकिन हम आपको यहां दिखाएंगे कि इसे एक सीधी प्रक्रिया में कैसे प्राप्त किया जाए।
चूंकि Amazon RDS MySQL और MariaDB के साथ संगतता का समर्थन करता है। हम इस ब्लॉग के लिए उन पर ध्यान देंगे।
Amazon RDS से MySQL या MariaDB के लिए माइग्रेट करना
अमेज़ॅन आरडीएस से अपने डेटा को ऑन-प्रिमाइसेस सर्वर पर माइग्रेट करने का एक विशिष्ट तरीका एक तार्किक प्रतिलिपि का उपयोग करके बैकअप लेना है। यह बैकअप उपयोगिता समाधानों का उपयोग करके किया जा सकता है जो अमेज़ॅन आरडीएस के साथ काम करने के लिए संगत हैं जो पूरी तरह से प्रबंधित सेवा है। पूरी तरह से प्रबंधित डेटाबेस सेवाएं SSH लॉगिन की पेशकश नहीं करती हैं, इसलिए बैकअप की भौतिक प्रतिलिपि एक विकल्प नहीं है।
mysqldump का उपयोग करना
mysqldump का उपयोग करके अपने लक्षित डेटाबेस नोड में समय-समय पर स्थापित किया जाना चाहिए। इसे एडब्ल्यूएस आरडीएस नोड की प्रतिकृति के रूप में तैयार किया जाना है ताकि बाद के सभी लेनदेन नोड में दोहराए जा सकें। ऐसा करने के लिए, नीचे दिए गए चरणों का पालन करें।
एडब्ल्यूएस आरडीएस स्रोत होस्ट :डेटाबेस-1.xxxxxxx.us-east-2.rds.amazonaws.com
ऑन-प्रेम सर्वर होस्ट :192.168.10.226 (टेस्टनोड26)
डंप शुरू करने से पहले, सुनिश्चित करें कि बिनलॉग प्रतिधारण घंटे सेट हैं। इसे सेट करने के लिए, आप अपने Amazon RDS इंस्टेंस में नीचे दी गई उदाहरण प्रक्रिया कॉल को पसंद कर सकते हैं,
mysql> call mysql.rds_set_configuration('binlog retention hours', 24);
Query OK, 2 rows affected (0.23 sec)
mysql> CALL mysql.rds_show_configuration;
+------------------------+-------+------------------------------------------------------------------------------------------------------+
| name | value | description |
+------------------------+-------+------------------------------------------------------------------------------------------------------+
| binlog retention hours | 24 | binlog retention hours specifies the duration in hours before binary logs are automatically deleted. |
+------------------------+-------+------------------------------------------------------------------------------------------------------+
1 row in set (0.23 sec)
Query OK, 0 rows affected (0.23 sec)
mysqldump स्थापित करें
-
रिपॉजिटरी तैयार करें।
# MySQL के लिए
$ yum install https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
# मारियाडीबी के लिए
$ curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash
-
mysql-client पैकेज स्थापित करें
# MySQL के लिए
$ yum install -y mysql-community-client.x86_64
# मारियाडीबी के लिए
$ yum install -y MariaDB-client
-
एक डेटा डंप बनाएं mysqldump का उपयोग करके इसे लक्ष्य नोड के अंदर निष्पादित करके। ध्यान दें, एक विकल्प के रूप में निर्दिष्ट --मास्टर-डेटा =2 के साथ, यह केवल मारियाडीबी के लिए काम करता है लेकिन MySQL में नहीं। तो MySQL के लिए अतिरिक्त काम करना पड़ता है। हम इस पर बाद में बात करेंगे।
## मारियाडीबी दृष्टिकोण के लिए लागू
[[email protected] ~]# mysqldump -h database-1.xxxxxxx.us-east-2.rds.amazonaws.com -uadmin -p --single-transaction --master-data=2 --databases db1 db2 db3 > backups/dump.sql
Enter password:
[[email protected] ~]# ls -alth backups/dump.sql
-rw-r--r--. 1 root root 196M Oct 18 02:34 backups/dump.sql
-
लक्ष्य डेटाबेस नोड में MySQL/MariaDB सर्वर स्थापित करें
# MySQL के लिए (हमेशा जांचें कि आपके यम रिपॉजिटरी में कौन सा वर्जन रिपोजिटरी सक्षम है। इस समय, मैं MySQL 5.7 का उपयोग कर रहा हूं)
$ yum --disablerepo=* --enablerepo=mysql57-community install mysql-community-common mysql-community-client mysql-community-server
# मारियाडीबी के लिए
$ yum install MariaDB-server.x86_64
-
MySQL/MariaDB सर्वर इंस्टेंस सेट करें (my.cnf, फ़ाइल अनुमतियां, निर्देशिका), और सर्वर प्रारंभ करें पी>
# my.cnf सेट करना (ClusterControl द्वारा my.cnf परिनियोजन उपयोग का उपयोग करके)
[MYSQLD]
user=mysql
basedir=/usr/
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
pid_file=/var/lib/mysql/mysql.pid
port=3306
log_error=/var/log/mysql/mysqld.log
log_warnings=2
slow_query_log_file=/var/log/mysql/mysql-slow.log
long_query_time=2
slow_query_log=OFF
log_queries_not_using_indexes=OFF
innodb_buffer_pool_size=2G
innodb_flush_log_at_trx_commit=2
innodb_file_per_table=1
innodb_data_file_path=ibdata1:100M:autoextend
innodb_read_io_threads=4
innodb_write_io_threads=4
innodb_doublewrite=1
innodb_log_file_size=256M
innodb_log_buffer_size=32M
innodb_buffer_pool_instances=1
innodb_log_files_in_group=2
innodb_thread_concurrency=0
innodb_flush_method=O_DIRECT
innodb_rollback_on_timeout=ON
innodb_autoinc_lock_mode=2
innodb_stats_on_metadata=0
default_storage_engine=innodb
server_id=1126
binlog_format=ROW
log_bin=binlog
log_slave_updates=1
relay_log=relay-bin
expire_logs_days=7
read_only=OFF
report_host=192.168.10.226
key_buffer_size=24M
tmp_table_size=64M
max_heap_table_size=64M
max_allowed_packet=512M
skip_name_resolve=true
memlock=0
sysdate_is_now=1
max_connections=500
thread_cache_size=512
query_cache_type=0
query_cache_size=0
table_open_cache=1024
lower_case_table_names=0
performance_schema=OFF
performance-schema-max-mutex-classes=0
performance-schema-max-mutex-instances=0
[MYSQL]
socket=/var/lib/mysql/mysql.sock
[client]
socket=/var/lib/mysql/mysql.sock
[mysqldump]
socket=/var/lib/mysql/mysql.sock
max_allowed_packet=512M
## डेटा निर्देशिका को रीसेट करें और डेटाबेस सिस्टम फ़ाइलों को फिर से स्थापित करें
$ rm -rf /var/lib/mysql/*
## लॉग निर्देशिकाएं बनाएं
$ mkdir /var/log/mysql
$ chown -R mysql.mysql /var/log/mysql
## MySQL के लिए
$ mysqld --initialize
## मारियाडीबी के लिए
$ mysql_install_db
-
MySQL/MariaDB सर्वर प्रारंभ करें
## MySQL के लिए
$ systemctl start mysqld
## मारियाडीबी के लिए
$ systemctl start mariadb
-
हमारे द्वारा AWS RDS से लिए गए डेटा डंप को समय-समय पर लक्ष्य डेटाबेस नोड में लोड करें
$ mysql --show-warnings < backups/dump.sql
-
AWS RDS स्रोत नोड से प्रतिकृति उपयोगकर्ता बनाएं
MariaDB [(none)]> CREATE USER 'repl_user'@'149.145.213.%' IDENTIFIED BY 'repl_passw0rd';
Query OK, 0 rows affected (0.242 sec)
MariaDB [(none)]> GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO repl_user'@'149.145.213.%' IDENTIFIED BY 'repl_passw0rd' ;
Query OK, 0 rows affected (0.229 sec)
-
MySQL/MariaDB सर्वर को AWS RDS स्रोत नोड की प्रतिकृति/दास के रूप में सेट करें
## सबसे पहले, आइए चेंज मास्टर कमांड को खोजें या खोजें
[[email protected] ~]# grep -rn -E -i 'change master to master' backups/dump.sql |head -1
22:-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin-changelog.000584', MASTER_LOG_POS=421;
## CHANGE MASTER कथन चलाएँ लेकिन प्रतिकृति उपयोगकर्ता/पासवर्ड और होस्टनाम निम्नानुसार जोड़ें,
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='database-1.xxxxxxx.us-east-2.rds.amazonaws.com', MASTER_LOG_FILE='mysql-bin-changelog.000584', MASTER_LOG_POS=421, MASTER_USER='repl_user', MASTER_PASSWORD='repl_passw0rd';
Query OK, 0 rows affected (0.004 sec)
## फिर स्लेव थ्रेड प्रारंभ करें
MariaDB [(none)]> START SLAVE;
Query OK, 0 rows affected (0.001 sec)
## गुलाम की स्थिति जांचें कि यह कैसे जाता है
MariaDB [(none)]> SHOW SLAVE STATUS \G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: database-1.xxxxxxx.us-east-2.rds.amazonaws.com
Master_User: repl_user
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin-changelog.000584
Read_Master_Log_Pos: 421
Relay_Log_File: relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: mysql-bin-changelog.000584
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 421
Relay_Log_Space: 256
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1675507089
Master_SSL_Crl:
Master_SSL_Crlpath:
Using_Gtid: No
Gtid_IO_Pos:
Replicate_Do_Domain_Ids:
Replicate_Ignore_Domain_Ids:
Parallel_Mode: optimistic
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Slave_DDL_Groups: 0
Slave_Non_Transactional_Groups: 0
Slave_Transactional_Groups: 0
1 row in set (0.000 sec)
अब जबकि हम अंतत:समय पर स्थित हमारी प्रतिकृति के स्रोत या मास्टर के रूप में आरडीएस से दोहराने में सक्षम हो गए हैं। यह अभी तक नहीं किया गया है। कुछ मामलों में आप प्रतिकृति त्रुटियों का सामना करेंगे, जैसे,
Last_SQL_Errno: 1146
Last_SQL_Error: Error 'Table 'mysql.rds_heartbeat2' doesn't exist' on query. Default database: 'mysql'. Query: 'INSERT INTO mysql.rds_heartbeat2(id, value) values (1,1602988485784) ON DUPLICATE KEY UPDATE value = 1602988485784'
चूंकि ऑन-प्रिमाइसेस को mysql डेटाबेस से आने वाले डेटा को 'rds%' से पहले वाली तालिकाओं के लिए दोहराने की आवश्यकता नहीं है, तो हम प्रतिकृति के दौरान इन तालिकाओं को अनदेखा कर देते हैं। इसके अतिरिक्त, हो सकता है कि आप नहीं चाहते कि AWS RDS आपकी mysql.user तालिका को अद्यतन और परिवर्तित करे। ऐसा करने के लिए, आप वैकल्पिक रूप से स्कीमा या केवल तालिकाओं की सूची को अनदेखा कर सकते हैं, जैसे,
STOP SLAVE;
फिर,
SET GLOBAL replicate_wild_ignore_table='mysql.rds%';
या
SET GLOBAL replicate_wild_ignore_table='mysql.%';
MySQL की समस्या --मास्टर-डेटा=2 के साथ
mysqldump को --master-data=2 के साथ लेने के लिए पर्याप्त विशेषाधिकारों की आवश्यकता होती है जिसके लिए सुपर और रीलोड विशेषाधिकारों की आवश्यकता होती है। समस्या यह है कि एडब्ल्यूएस आरडीएस डेटाबेस सेटअप और निर्माण के दौरान व्यवस्थापक उपयोगकर्ता के लिए इसकी आपूर्ति नहीं करता है। इस समस्या को हल करने के लिए, यह होना चाहिए कि आपके AWS RDS में एक मास्टर और एक प्रतिकृति या दास सेटअप हो। एक बार जब आपके पास एक दास सेटअप हो, तो उसे mysqldump लेते समय लक्ष्य स्रोत होस्ट के रूप में लें। फिर अपने एडब्ल्यूएस आरडीएस प्रतिकृति से दास धागे को निम्नानुसार रोकें,
rds-replica-mysql> CALL mysql.rds_stop_replication;
फिर नीचे दिए गए जैसे --मास्टर-डेटा विकल्प के बिना mysqldump लें,
mysqldump -h database-1.xxxxxxx.us-east-2.rds.amazonaws.com -uadmin -p --single-transaction --databases db1 db2 db3 > backups/dump.sql
फिर अपने AWS RDS प्रतिकृति से SHOW SLAVE STATUS\G चलाएँ और Master_Log_File और Exec_Master_Log_Pos पर ध्यान दें, जिसका उपयोग आप अपने ऑन-प्रिमाइसेस सर्वर पर प्रतिकृति AWS RDS मास्टर से कनेक्ट करते समय करेंगे। CHANGE MASTER TO चलाते समय उन निर्देशांकों का उपयोग करें… MASTER_LOG_FILE=Master_Log_File, MASTER_LOG_POS=
rds-replica-mysql> CALL mysql.rds_start_replication;
माईडम्पर का उपयोग करना
mydumper यहां आपका वैकल्पिक विकल्प हो सकता है, खासकर जब डेटासेट बहुत बड़ा हो क्योंकि यह स्रोत RDS नोड से आपके डेटासेट की डंप या बैकअप कॉपी लेते समय समानता और गति प्रदान करता है। mydumper को स्थापित करने से लेकर इसे अपने गंतव्य ऑन-प्रिमाइसेस सर्वर पर लोड करने के लिए नीचे दिए गए चरणों का पालन करें।
-
बाइनरी स्थापित करें। बायनेरिज़ यहां https://github.com/maxbube/mydumper/releases पर स्थित हो सकते हैं।
$ yum install https://github.com/maxbube/mydumper/releases/download/v0.9.5/mydumper-0.9.5-2.el6.x86_64.rpm
-
आरडीएस स्रोत नोड से बैकअप लें। उदाहरण के लिए,
[[email protected] mydumper-2]# /usr/bin/mydumper --outputdir=. --verbose=3 --host=database-1.xxxxxxx.us-east-2.rds.amazonaws.com --port=3306 --kill-long-queries --chunk-filesize=5120 --build-empty-files --events --routines --triggers --compress --less-locking --success-on-1146 --regex='(db1\.|db2\.|db3\.|mydb4\.|testdb5\.)' -u admin --password=admin123
** Message: Connected to a MySQL server
** (mydumper:18904): CRITICAL **: Couldn't acquire global lock, snapshots will not be consistent: Access denied for user 'admin'@'%' (using password: YES)
** Message: Started dump at: 2020-10-18 09:34:08
** Message: Written master status
** Message: Multisource slave detected.
** Message: Thread 5 connected using MySQL connection ID 1109
अब, इस बिंदु पर, mydumper *.gz फाइलों के रूप में एक बैकअप फाइल लेगा
-
इसे अपने गंतव्य ऑन-प्रिमाइसेस सर्वर पर लोड करें
$ myloader --host localhost --directory=$(pwd) --queries-per-transaction=10000 --threads=8 --compress-protocol --verbose=3
** Message: 8 threads created
** Message: Creating database `db1`
** Message: Creating table `db1`.`folders_rel`
** Message: Creating table `db2`.`p`
** Message: Creating table `db2`.`t1`
** Message: Creating table `db3`.`AddressCodeTest`
-
गंतव्य नोड को दास/प्रतिकृति के रूप में सेट करें। MyDumper में मेटाडेटा नामक एक फ़ाइल शामिल होगी जिसमें बाइनरी लॉग निर्देशांक शामिल हैं, जिसमें GTID पदों सहित शामिल हैं, उदाहरण के लिए:
$ cat metadata
Started dump at: 2020-10-18 10:23:35
SHOW MASTER STATUS:
Log: mysql-bin-changelog.000680
Pos: 676
GTID:0-1675507089-3044
## फिर प्रतिकृति या अपने लक्ष्य गंतव्य MySQL/MariaDB डेटाबेस नोड से एक परिवर्तन मास्टर चलाएं
MariaDB [jbmrcd_date]> CHANGE MASTER TO MASTER_HOST='database-1.cmu8qdlvkepg.us-east-2.rds.amazonaws.com', MASTER_USER='repl_user', MASTER_PASSWORD='repl_passw0rd', MASTER_LOG_FILE='mysql-bin-changelog.000680', MASTER_LOG_POS
=676;
Query OK, 0 rows affected (0.002 sec)
## स्लेव प्रारंभ करें
MariaDB [jbmrcd_date]> start slave;
Query OK, 0 rows affected (0.001 sec)
इस बिंदु पर, आपने अब MySQL/MariaDB चलाने वाले Amazon RDS इंस्टेंस से प्रतिकृति बना ली है। एक बार जब आपका एप्लिकेशन आपके अमेज़ॅन आरडीएस इंस्टेंस से दूर जाने के लिए तैयार हो जाता है, तो अपने ऑन-प्रिमाइसेस सर्वर पर जाने वाले एंडपॉइंट को सेटअप करें और आपके आरडीएस इंस्टेंस से शेष सभी लेनदेन को आपके ऑन-प्रिमाइसेस में दोहराया जाएगा, जिससे आपके ऑन- प्रेम सर्वर।
डेटा विसंगतियों की जांच करें
एक बार जब आप अपना डेटा लोड कर लेते हैं या अपने ऑन-प्रिमाइसेस सर्वर पर डंप कर देते हैं जो AWS RDS इंस्टेंस से प्रतिकृति के रूप में कार्य करता है, तो आपको यह निर्धारित करने के लिए चेकसम गणना चलाकर इसे दोबारा जांचना चाहिए कि आपका डेटा कितनी दूर है स्रोत अमेज़न आरडीएस। मेरा सुझाव है कि आप Percona द्वारा pt-table-checksum टूल का उपयोग करें, लेकिन आप md5 या sha256 जैसे चेकसमिंग टूल का उपयोग करके अपना स्वयं का बना सकते हैं, लेकिन ऐसा करने में समय लगता है। इसके अतिरिक्त, इस प्रतिकृति दृष्टिकोण का उपयोग करके आपके डेटा माइग्रेशन के बाद पीटी-अपग्रेड का उपयोग करने में भी मदद मिल सकती है।
निष्कर्ष
mydumper या mydumper का उपयोग करना मुक्त ओपन-सोर्स टूल हैं जो एक बहुत अच्छा लाभ है, खासकर यदि आपका डेटा बहुत गोपनीय है और आप नहीं चाहते कि कोई तीसरा पक्ष इसे एक्सेस करे। हालांकि इस दृष्टिकोण को लेना आसान हो सकता है, लेकिन परीक्षण के रूप में थकाऊ और बड़ा काम हो सकता है और दोहरी जांच हमेशा यह साबित करने के लिए होती है कि माइग्रेशन पूरी तरह से बिना किसी डेटा विसंगतियों के हासिल किया गया है।