Amazon Web Services je technologický gigant, zejména pokud jde o průkopnictví v oblasti špičkových služeb cloud computingu. Její produkty plně spravovaných služeb (Amazon RDS) jsou jediné svého druhu. Ale na druhou stranu, i když to může být perfektní platforma pro některé organizace, může být problém z ní odejít, pokud tomu tak není. Vždy existují obavy, že uvíznete v situaci, kdy je dodavatel uzamčen.
Některé věci, které je třeba mít na paměti při migraci z RDS na on-premise platformu, jsou rozpočtová omezení, zabezpečení a autonomie dat. Důvodem je to, že data jsou vaším nejcennějším aktivem a udržíte si kontrolu, ať už jsou kdekoli, je vždy nezbytné, aby organizace a společnost vždy zůstaly konkurenceschopné. Žádná organizace si nemůže dovolit cloud lock-in, a přesto se mnoho podniků ocitne přesně v této situaci a začnou poskakovat po hledání jakýchkoli alternativních existujících řešení, která lze provozovat on-prem.
Tento blog vás provede migrací z Amazon RDS na místní server. Naše cílová databáze na on-prem serveru je na linuxovém serveru RHEL/CentOS, ale příslušný postup platí i pro ostatní verze Linuxu, pokud jsou balíčky správně nainstalovány.
Existují některá existující řešení třetích stran, která nabízejí migraci dat, ale nelze je použít pro místní platformu. Navíc to není zdarma a migrace pomocí bezplatných řešení s otevřeným zdrojovým kódem je vždy příznivá a výhodná. I když existují pochybnosti a obavy, protože záruka a podpora nejsou vázány na technologie s otevřeným zdrojovým kódem, ale my vám zde ukážeme, jak toho dosáhnout jednoduchým postupem.
Protože Amazon RDS podporuje kompatibilitu s MySQL a MariaDB. V tomto blogu se na ně zaměříme.
Migrace z Amazon RDS pro MySQL nebo MariaDB
Typickým přístupem k migraci dat z Amazon RDS na místní server je vytvoření zálohy pomocí logické kopie. To lze provést pomocí řešení zálohovacích nástrojů, která jsou kompatibilní s provozem Amazon RDS, což je plně spravovaná služba. Plně spravované databázové služby nenabízejí přihlášení SSH, takže fyzická kopie záloh nepřichází v úvahu.
Použití mysqldump
Použití mysqldump musí být nainstalováno ve vašem cílovém databázovém uzlu umístěném na prem. Musí být připraven jako replika uzlu AWS RDS, takže všechny následné transakce budou replikovány do uzlu. Chcete-li to provést, postupujte podle následujících kroků.
Hostitel zdroje AWS RDS :databáze-1.xxxxxxx.us-východ-2.rds.amazonaws.com
On-Prem Server Host :192.168.10.226 (testnode26)
Před spuštěním výpisu se ujistěte, že je nastavena doba uchování binlogu. Chcete-li to nastavit, můžete to udělat jako příklad volání procedury níže ve vaší instanci 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)
Instalovat mysqldump
-
Připravte úložiště.
# Pro MySQL
$ yum install https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
# Pro MariaDB
$ curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash
-
Instalovat balíček mysql-client
# Pro MySQL
$ yum install -y mysql-community-client.x86_64
# Pro MariaDB
$ yum install -y MariaDB-client
-
Vytvořte výpis dat pomocí mysqldump jeho spuštěním v cílovém uzlu. Vezměte na vědomí, že s --master-data=2 zadaným jako volba to funguje pouze pro MariaDB, ale ne v MySQL. Takže je třeba udělat práci navíc pro MySQL. Promluvíme si o tom později.
## Použitelné pro přístup MariaDB
[[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
-
Instalace serveru MySQL/MariaDB do cílového databázového uzlu
# Pro MySQL (vždy zkontrolujte, jaká verze úložiště je povolena ve vašem úložišti yum. V tuto chvíli používám MySQL 5.7)
$ yum --disablerepo=* --enablerepo=mysql57-community install mysql-community-common mysql-community-client mysql-community-server
# Pro MariaDB
$ yum install MariaDB-server.x86_64
-
Nastavte instanci serveru MySQL/MariaDB (my.cnf, oprávnění k souborům, adresáře) a spusťte server
# Nastavení my.cnf (pomocí nasazení my.cnf pomocí ClusterControl)
[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
## Resetujte datový adresář a znovu nainstalujte systémové soubory databáze
$ rm -rf /var/lib/mysql/*
## Vytvořte adresáře protokolů
$ mkdir /var/log/mysql
$ chown -R mysql.mysql /var/log/mysql
## pro MySQL
$ mysqld --initialize
## Pro MariaDB
$ mysql_install_db
-
Spuštění serveru MySQL/MariaDB
## pro MySQL
$ systemctl start mysqld
## Pro MariaDB
$ systemctl start mariadb
-
Načíst výpis dat, který jsme převzali z AWS RDS, do cílového databázového uzlu on-prem
$ mysql --show-warnings < backups/dump.sql
-
Vytvořte uživatele replikace ze zdrojového uzlu 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)
-
Nastavení serveru MySQL/MariaDB jako repliky/podřízeného zdrojového uzlu AWS RDS
## Nejprve vyhledejte nebo najděte příkaz CHANGE MASTER
[[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;
## Spusťte příkaz CHANGE MASTER, ale přidejte uživatele/heslo replikace a název hostitele následovně,
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)
## Poté spusťte podřízená vlákna
MariaDB [(none)]> START SLAVE;
Query OK, 0 rows affected (0.001 sec)
## Zkontrolujte stav slave, jak to jde
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)
Nyní, když jsme konečně byli schopni replikovat z RDS jako zdroj nebo master naší repliky umístěné na prem. Ještě není hotovo. V některých případech narazíte na chyby replikace, například
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'
Jelikož on-prem nepotřebuje replikovat data pocházející z databáze mysql pro tabulky s předponou 'rds%', pak tyto tabulky během replikace prostě ignorujeme. Navíc možná nebudete chtít, aby AWS RDS aktualizoval a měnil vaši tabulku mysql.user. Chcete-li to provést, můžete volitelně ignorovat schéma nebo pouze seznam tabulek, jako je,
STOP SLAVE;
Potom
SET GLOBAL replicate_wild_ignore_table='mysql.rds%';
nebo
SET GLOBAL replicate_wild_ignore_table='mysql.%';
Problém MySQL s --master-data=2
Použití mysqldump s --master-data=2 vyžaduje dostatečná oprávnění, která vyžadují oprávnění SUPER a RELOAD. Problém je v tom, že AWS RDS toto administrátorovi během nastavování a vytváření databáze nedodává. Aby bylo možné tento problém vyřešit, musí mít vaše AWS RDS nastavení master a repliku nebo slave. Jakmile budete mít nastavení slave, vezměte jej jako cílového zdrojového hostitele při použití mysqldump. Poté zastavte podřízená vlákna z repliky AWS RDS následovně,
rds-replica-mysql> CALL mysql.rds_stop_replication;
Pak vezměte mysqldump bez možnosti --master-data, jak je uvedeno níže,
mysqldump -h database-1.xxxxxxx.us-east-2.rds.amazonaws.com -uadmin -p --single-transaction --databases db1 db2 db3 > backups/dump.sql
Potom spusťte příkaz SHOW SLAVE STATUS\G ze své repliky AWS RDS a poznamenejte si Master_Log_File a Exec_Master_Log_Pos, které použijete při připojování k hlavnímu serveru AWS RDS replikujícímu se na váš místní server. Tyto souřadnice použijte při spuštění CHANGE MASTER TO… MASTER_LOG_FILE=Master_Log_File, MASTER_LOG_POS=
rds-replica-mysql> CALL mysql.rds_start_replication;
Použití mydump
mydumper zde může být vaší alternativní možností, zejména pokud je datová sada velmi velká, protože nabízí paralelismus a rychlost při vytváření výpisu nebo záložní kopie vaší datové sady ze zdrojového uzlu RDS. Postupujte podle níže uvedených kroků od instalace mydumperu až po jeho načtení na váš cílový on-prem server.
-
Nainstalujte binární soubor. Binární soubory lze nalézt zde 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
-
Vezměte zálohu ze zdrojového uzlu RDS. Například,
[[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
Nyní, v tomto okamžiku, mydumper vezme záložní soubory ve formě *.gz souborů
-
Načtěte jej na cílový místní server
$ 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`
-
Nastavte cílový uzel jako slave/repliku. MyDumper bude zahrnovat soubor s názvem Metadata, který se skládá z binárních souřadnic protokolu, včetně pozic GTID, například:
$ 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
## Poté spusťte master změn z repliky nebo cílového cílového databázového uzlu 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)
## Spustit otroka
MariaDB [jbmrcd_date]> start slave;
Query OK, 0 rows affected (0.001 sec)
V tuto chvíli jste se replikovali z instance Amazon RDS se spuštěnou MySQL/MariaDB. Jakmile bude vaše aplikace připravena přesunout se z vaší instance Amazon RDS, nastavte koncový bod směřující na váš on-prem server a všechny zbývající transakce z vaší instance RDS budou replikovány do vaší on-prem, takže žádná data nepřijdou do vašeho on- prem server.
Kontrola datových nesrovnalostí
Jakmile budete mít svá data načtena nebo uložena na místní server fungující jako replika z instance AWS RDS, měli byste to znovu zkontrolovat spuštěním výpočtů kontrolního součtu, abyste zjistili, jak daleko jsou vaše data oproti zdroj Amazon RDS. Doporučuji použít nástroj pt-table-checksum od Percona, ale můžete si vytvořit svůj vlastní pomocí nástrojů pro kontrolní součet, jako je md5 nebo sha256, ale to nějakou dobu trvá. Po dokončení migrace dat pomocí tohoto replikačního přístupu vám může pomoci také použití pt-upgrade.
Závěr
Používání mysqldump nebo mydumper jsou bezplatné nástroje s otevřeným zdrojovým kódem, což je také velká výhoda, zvláště pokud jsou vaše data velmi důvěrná a nechcete, aby k nim měla přístup třetí strana. Ačkoli může být tento přístup jednoduchý, může to být zdlouhavá a velká práce, protože vždy následuje testování a dvojité kontroly, aby se prokázalo, že migrace je plně dosažena bez jakýchkoli nekonzistencí v datech.