Amazon Web Services is een technologiegigant, vooral als het gaat om het pionieren op het gebied van top-of-the-line cloud computing-services. De volledig beheerde dienstenproducten (Amazon RDS) zijn uniek in hun soort. Maar aan de andere kant, hoewel het voor sommige organisaties een perfect platform kan zijn, kan het een uitdaging zijn om eruit te stappen als dat niet het geval is. Er zijn altijd zorgen om vast te zitten in een vendor lock-in situatie.
Sommige dingen om in gedachten te houden bij het migreren van RDS naar een lokaal platform zijn budgetbeperkingen, beveiliging en gegevensautonomie. Omdat gegevens uw meest waardevolle bezit zijn en de controle behouden, waar ze zich ook bevinden, is het altijd noodzakelijk voor de organisatie en het bedrijf om altijd concurrerend te blijven. Geen enkele organisatie kan het zich veroorloven om cloud-lock-in te hebben, en toch bevinden veel bedrijven zich precies in die situatie en beginnen ze te zoeken naar alternatieve bestaande oplossingen die via on-premise kunnen worden gebruikt.
In deze blog wordt uitgelegd hoe u kunt migreren van Amazon RDS naar een on-premises server. Onze doeldatabase op de lokale server bevindt zich op een RHEL/CentOS Linux-server, maar de toepasselijke procedure is van toepassing op andere versies van Linux en zolang de pakketten correct zijn geïnstalleerd.
Er zijn enkele bestaande oplossingen van derden die gegevensmigratie bieden, maar deze zijn niet van toepassing op een lokaal platform. Bovendien is het niet gratis en is gratis migreren met open source-oplossingen altijd gunstig en voordelig. Hoewel er ook twijfels en zorgen bestaan, aangezien de garantie en ondersteuning niet gebonden zijn aan open source-technologieën, maar we zullen u hier laten zien hoe u dit in een eenvoudige procedure kunt bereiken.
Aangezien Amazon RDS compatibiliteit met MySQL en MariaDB ondersteunt. We zullen ons daarop concentreren voor deze blog.
Migreren van Amazon RDS voor MySQL of MariaDB
Een typische benadering voor het migreren van uw gegevens van Amazon RDS naar een on-prem server is het maken van een back-up met een logische kopie. Dit kan worden gedaan met behulp van back-uphulpprogramma's die compatibel zijn om te werken met Amazon RDS, een volledig beheerde service. Volledig beheerde databaseservices bieden geen SSH-aanmeldingen, dus een fysieke kopie van back-ups is geen optie.
Mysqldump gebruiken
Het gebruik van mysqldump moet worden geïnstalleerd in uw doeldatabaseknooppunt op locatie. Het moet worden voorbereid als een replica van het AWS RDS-knooppunt, zodat alle volgende transacties naar het knooppunt worden gerepliceerd. Volg hiervoor de onderstaande stappen.
AWS RDS-bronhost :database-1.xxxxxxx.us-east-2.rds.amazonaws.com
On-Prem Server Host :192.168.10.226 (testnode26)
Voordat u de dump start, moet u ervoor zorgen dat de binlog-retentie-uren zijn ingesteld. Om het in te stellen, kunt u het onderstaande voorbeeldprocedure-aanroep doen in uw Amazon RDS-instantie,
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 installeren
-
Maak de repository gereed.
# Voor MySQL
$ yum install https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
# Voor MariaDB
$ curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash
-
Mysql-client-pakket installeren
# Voor MySQL
$ yum install -y mysql-community-client.x86_64
# Voor MariaDB
$ yum install -y MariaDB-client
-
Maak een gegevensdump met mysqldump door deze uit te voeren in het doelknooppunt. Let op, met --master-data=2 gespecificeerd als optie, werkt dit alleen voor MariaDB maar niet in MySQL. Er moet dus extra werk voor MySQL worden gedaan. We praten hier later over.
## Van toepassing op MariaDB-aanpak
[[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
-
Installeer de MySQL/MariaDB-server in het doeldatabaseknooppunt
# Voor MySQL (controleer altijd welke versierepository is ingeschakeld in uw yum-repository. Op dit moment gebruik ik MySQL 5.7)
$ yum --disablerepo=* --enablerepo=mysql57-community install mysql-community-common mysql-community-client mysql-community-server
# Voor MariaDB
$ yum install MariaDB-server.x86_64
-
Stel de MySQL/MariaDB Server-instantie in (my.cnf, bestandsrechten, directory's) en start de server
# De my.cnf instellen (met behulp van de my.cnf-implementatie door 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
## Reset de gegevensmap en installeer de databasesysteembestanden opnieuw
$ rm -rf /var/lib/mysql/*
## Maak de logmappen
$ mkdir /var/log/mysql
$ chown -R mysql.mysql /var/log/mysql
## Voor MySQL
$ mysqld --initialize
## Voor MariaDB
$ mysql_install_db
-
Start de MySQL/MariaDB-server
## Voor MySQL
$ systemctl start mysqld
## Voor MariaDB
$ systemctl start mariadb
-
Laad de datadump die we van AWS RDS hebben gehaald naar het doeldatabaseknooppunt op locatie
$ mysql --show-warnings < backups/dump.sql
-
Maak de replicatiegebruiker vanaf het AWS RDS-bronknooppunt
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)
-
Stel de MySQL/MariaDB-server in als een replica/slave van het AWS RDS-bronknooppunt
## Laten we eerst het CHANGE MASTER-commando zoeken of lokaliseren
[[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;
## Voer de CHANGE MASTER-instructie uit, maar voeg de replicatie gebruiker/wachtwoord en de hostnaam als volgt toe,
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)
## Start dan de slave-threads
MariaDB [(none)]> START SLAVE;
Query OK, 0 rows affected (0.001 sec)
## Controleer de status van de slave hoe het gaat
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)
Nu we eindelijk in staat zijn geweest om te repliceren vanuit RDS als de bron of master van onze replica op locatie. Het is nog niet gedaan. Er zijn enkele gevallen waarin u replicatiefouten tegenkomt, zoals:
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'
Aangezien het on-prem niet nodig is om gegevens uit de mysql-database te repliceren voor tabellen met het voorvoegsel 'rds%', negeren we deze tabellen tijdens de replicatie. Bovendien wilt u misschien niet dat AWS RDS uw mysql.user-tabel bijwerkt en wijzigt. Om dit te doen, kunt u optioneel het schema negeren of gewoon een lijst met tabellen zoals,
STOP SLAVE;
Dan,
SET GLOBAL replicate_wild_ignore_table='mysql.rds%';
of
SET GLOBAL replicate_wild_ignore_table='mysql.%';
Het MySQL-probleem met --master-data=2
Het nemen van de mysqldump met --master-data=2 vereist voldoende privileges waarvoor SUPER en RELOAD privileges nodig zijn. Het probleem is dat AWS RDS dit niet levert voor de admin-gebruiker tijdens het instellen en maken van de database. Om dit probleem te omzeilen, moet uw AWS RDS een master- en een replica- of slaveconfiguratie hebben. Als je eenmaal een slave-configuratie hebt, neem die dan als de doelbronhost bij het nemen van mysqldump. Stop vervolgens de slave-threads van uw AWS RDS-replica als volgt,
rds-replica-mysql> CALL mysql.rds_stop_replication;
Neem dan de mysqldump zonder de --master-data optie, zoals hieronder,
mysqldump -h database-1.xxxxxxx.us-east-2.rds.amazonaws.com -uadmin -p --single-transaction --databases db1 db2 db3 > backups/dump.sql
Voer vervolgens de SHOW SLAVE STATUS\G uit vanaf uw AWS RDS-replica en noteer de Master_Log_File en Exec_Master_Log_Pos die u gaat gebruiken wanneer u verbinding maakt met de AWS RDS-master die repliceert naar uw lokale server. Gebruik deze coördinaten bij het uitvoeren van MASTER WIJZIGEN IN... MASTER_LOG_FILE=Master_Log_File, MASTER_LOG_POS=
rds-replica-mysql> CALL mysql.rds_start_replication;
Mijndumper gebruiken
mijndumper kan hier uw alternatieve optie zijn, vooral wanneer de dataset erg groot is, omdat het parallellisme en snelheid biedt bij het nemen van een dump- of back-upkopie van uw dataset vanaf een bron-RDS-knooppunt. Volg de onderstaande stappen vanaf het installeren van de mydumper tot het laden op de on-prem-server van uw bestemming.
-
Installeer het binaire bestand. De binaire bestanden zijn hier te vinden 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
-
Maak de back-up van het RDS-bronknooppunt. Bijvoorbeeld,
[[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
Nu, op dit punt zal mydumper een back-up van bestanden maken in de vorm van *.gz-bestanden
-
Laad het naar de lokale server van uw bestemming
$ 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`
-
Stel het bestemmingsknooppunt in als een slave/replica. MyDumper bevat een bestand genaamd metadata dat bestaat uit binaire logcoördinaten, waaronder GTID -posities, bijvoorbeeld:
$ 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
## Voer vervolgens een wijzigingsmaster uit vanaf de replica of uw doelbestemming MySQL/MariaDB-databaseknooppunt
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)
## Start de slave
MariaDB [jbmrcd_date]> start slave;
Query OK, 0 rows affected (0.001 sec)
Je hebt nu gerepliceerd vanaf een Amazon RDS-instantie met MySQL/MariaDB. Zodra uw toepassing klaar is om weg te gaan van uw Amazon RDS-instantie, stelt u het eindpunt in dat naar uw on-prem-server gaat en worden alle resterende transacties van uw RDS-instantie gerepliceerd naar uw on-prem, zodat er geen gegevens worden gemist die naar uw on-prem gaan. prem-server.
Controleren op gegevensverschillen
Zodra u uw gegevens hebt geladen of gedumpt naar uw on-prem server die fungeert als een replica van de AWS RDS-instantie, moet u dit dubbel controleren door checksum-berekeningen uit te voeren om te bepalen hoe ver uw gegevens zijn ten opzichte van de bron Amazon RDS. Ik raad je aan om de tool pt-table-checksum van Percona te gebruiken, maar je kunt er ook zelf een maken door checksumming-tools zoals md5 of sha256 te gebruiken, maar dit kost tijd. Bovendien kan het gebruik van pt-upgrade ook helpen nadat uw gegevensmigratie met deze replicatieaanpak is voltooid.
Conclusie
Het gebruik van mysqldump of mydumper zijn gratis open-source tools, wat ook een groot voordeel is, vooral als je gegevens erg vertrouwelijk zijn en je niet wilt dat een derde partij er toegang toe heeft. Hoewel het misschien eenvoudig is om deze benadering te volgen, kan er vervelend en groot werk bij komen kijken, aangezien er altijd tests en dubbele controles volgen om te bewijzen dat de migratie volledig wordt bereikt zonder enige inconsistentie in de gegevens.