Amazon Web Services ist ein Technologiegigant, insbesondere wenn es darum geht, sich selbst als Pionier bei Cloud-Computing-Diensten der Spitzenklasse zu etablieren. Seine vollständig verwalteten Serviceprodukte (Amazon RDS) sind einzigartig. Aber andererseits, obwohl es für einige Unternehmen eine perfekte Plattform sein kann, kann es eine Herausforderung sein, sich davon zu entfernen, wenn dies nicht der Fall ist. Es gibt immer Bedenken, in einer Vendor-Lock-in-Situation stecken zu bleiben.
Einige Dinge, die Sie bei der Migration von RDS zu einer On-Premise-Plattform beachten sollten, sind Budgetbeschränkungen, Sicherheit und Datenautonomie. Dies liegt daran, dass Daten Ihr wertvollstes Gut sind und die Kontrolle behalten, wo immer sie sich befinden, es ist immer unerlässlich, dass die Organisation und das Unternehmen immer wettbewerbsfähig bleiben. Keine Organisation kann es sich leisten, Cloud-Lock-in zu haben, und dennoch befinden sich viele Unternehmen genau in dieser Situation und beginnen hüpfend nach alternativen bestehenden Lösungen zu suchen, die über On-Premises betrieben werden können.
Dieser Blog führt Sie durch die Migration von Amazon RDS zu einem On-Prem-Server. Unsere Zieldatenbank auf dem lokalen Server befindet sich auf einem RHEL/CentOS-Linux-Server, aber das anwendbare Verfahren gilt auch für andere Linux-Versionen, solange die Pakete ordnungsgemäß installiert sind.
Es gibt einige Lösungen von Drittanbietern, die eine Datenmigration anbieten, die jedoch nicht für eine lokale Plattform anwendbar ist. Außerdem ist es nicht kostenlos und die Migration mit kostenlosen Open-Source-Lösungen ist immer günstig und vorteilhaft. Obwohl es auch Zweifel und Bedenken gibt, da die Garantie und der Support nicht an Open-Source-Technologien gebunden sind, zeigen wir Ihnen hier, wie Sie dies in einem einfachen Verfahren erreichen können.
Da Amazon RDS die Kompatibilität mit MySQL und MariaDB unterstützt. Wir werden uns in diesem Blog auf sie konzentrieren.
Migration von Amazon RDS für MySQL oder MariaDB
Ein typischer Ansatz zur Migration Ihrer Daten von Amazon RDS auf einen lokalen Server besteht darin, eine Sicherung mit einer logischen Kopie zu erstellen. Dies kann mithilfe von Sicherungsdienstprogrammen erfolgen, die für den Betrieb mit Amazon RDS, einem vollständig verwalteten Dienst, kompatibel sind. Vollständig verwaltete Datenbankdienste bieten keine SSH-Anmeldungen, daher ist eine physische Kopie von Sicherungen keine Option.
Mysqldump verwenden
Die Verwendung von mysqldump muss in Ihrem Zieldatenbankknoten installiert sein, der sich lokal befindet. Es muss als Replikat des AWS RDS-Knotens vorbereitet werden, damit alle nachfolgenden Transaktionen auf den Knoten repliziert werden. Führen Sie dazu die folgenden Schritte aus.
AWS RDS-Quellhost :database-1.xxxxxxx.us-east-2.rds.amazonaws.com
Lokaler Serverhost :192.168.10.226 (testnode26)
Bevor Sie mit dem Dump beginnen, vergewissern Sie sich, dass die Binlog-Aufbewahrungsstunden eingestellt sind. Um es festzulegen, können Sie wie im folgenden Beispielprozeduraufruf in Ihrer Amazon RDS-Instance vorgehen,
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 installieren
-
Bereiten Sie das Repository vor.
# Für MySQL
$ yum install https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
# Für MariaDB
$ curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash
-
Mysql-Client-Paket installieren
# Für MySQL
$ yum install -y mysql-community-client.x86_64
# Für MariaDB
$ yum install -y MariaDB-client
-
Erstellen Sie einen Datendump mit mysqldump, indem Sie ihn innerhalb des Zielknotens ausführen. Beachten Sie, dass dies mit der Option --master-data=2 nur für MariaDB, aber nicht für MySQL funktioniert. Es muss also zusätzliche Arbeit für MySQL geleistet werden. Wir sprechen später darüber.
## Gilt für den MariaDB-Ansatz
[[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
-
Installieren Sie den MySQL/MariaDB-Server im Zieldatenbankknoten
# Für MySQL (überprüfen Sie immer, welche Version des Repositorys in Ihrem yum-Repository aktiviert ist. An diesem Punkt verwende ich MySQL 5.7)
$ yum --disablerepo=* --enablerepo=mysql57-community install mysql-community-common mysql-community-client mysql-community-server
# Für MariaDB
$ yum install MariaDB-server.x86_64
-
Richten Sie die MySQL/MariaDB-Serverinstanz ein (my.cnf, Dateiberechtigungen, Verzeichnisse) und starten Sie den Server
# Einrichten von my.cnf (unter Verwendung der von ClusterControl verwendeten my.cnf-Bereitstellung)
[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
## Datenverzeichnis zurücksetzen und Datenbanksystemdateien neu installieren
$ rm -rf /var/lib/mysql/*
## Erstellen Sie die Protokollverzeichnisse
$ mkdir /var/log/mysql
$ chown -R mysql.mysql /var/log/mysql
## Für MySQL
$ mysqld --initialize
## Für MariaDB
$ mysql_install_db
-
Starten Sie den MySQL/MariaDB-Server
## Für MySQL
$ systemctl start mysqld
## Für MariaDB
$ systemctl start mariadb
-
Laden Sie den Daten-Dump, den wir von AWS RDS genommen haben, in den lokalen Zieldatenbankknoten
$ mysql --show-warnings < backups/dump.sql
-
Erstellen Sie den Replikationsbenutzer aus dem AWS RDS-Quellknoten
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)
-
Richten Sie den MySQL/MariaDB-Server als Replikat/Slave des AWS RDS-Quellknotens ein
## Lassen Sie uns zuerst den Befehl CHANGE MASTER suchen oder lokalisieren
[[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;
## Führen Sie die CHANGE MASTER-Anweisung aus, aber fügen Sie den Replikationsbenutzer/das Passwort und den Hostnamen wie folgt hinzu,
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)
## Dann starten Sie die Slave-Threads
MariaDB [(none)]> START SLAVE;
Query OK, 0 rows affected (0.001 sec)
## Überprüfen Sie den Slave-Status, wie es geht
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)
Jetzt, da wir endlich in der Lage waren, von RDS als Quelle oder Master unseres Replikats, das sich vor Ort befindet, zu replizieren. Es ist noch nicht fertig. In einigen Fällen treten Replikationsfehler auf, z. B.
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'
Da On-Prem keine Daten aus der MySQL-Datenbank für Tabellen mit dem Präfix „rds%“ replizieren muss, ignorieren wir diese Tabellen einfach während der Replikation. Außerdem möchten Sie möglicherweise nicht, dass AWS RDS Ihre mysql.user-Tabelle aktualisiert und ändert. Dazu können Sie optional das Schema ignorieren oder nur eine Liste von Tabellen wie z. B.
STOP SLAVE;
Dann
SET GLOBAL replicate_wild_ignore_table='mysql.rds%';
oder
SET GLOBAL replicate_wild_ignore_table='mysql.%';
Das MySQL-Problem mit --master-data=2
Das Übernehmen von mysqldump mit --master-data=2 erfordert ausreichende Berechtigungen, was SUPER- und RELOAD-Berechtigungen erfordert. Das Problem ist, dass AWS RDS dies während der Einrichtung und Erstellung der Datenbank nicht für den Administratorbenutzer bereitstellt. Um dieses Problem zu umgehen, muss Ihr AWS RDS über ein Master- und ein Replikat- oder Slave-Setup verfügen. Sobald Sie ein Slave-Setup haben, nehmen Sie diesen als Ziel-Quellhost, wenn Sie mysqldump verwenden. Stoppen Sie dann die Slave-Threads von Ihrem AWS RDS-Replikat wie folgt:
rds-replica-mysql> CALL mysql.rds_stop_replication;
Nehmen Sie dann mysqldump ohne die Option --master-data, genau wie unten,
mysqldump -h database-1.xxxxxxx.us-east-2.rds.amazonaws.com -uadmin -p --single-transaction --databases db1 db2 db3 > backups/dump.sql
Führen Sie dann SHOW SLAVE STATUS\G von Ihrem AWS RDS-Replikat aus und notieren Sie sich Master_Log_File und Exec_Master_Log_Pos, die Sie verwenden, wenn Sie eine Verbindung zum AWS RDS-Master herstellen, der auf Ihren lokalen Server repliziert. Verwenden Sie diese Koordinaten beim Ausführen von CHANGE MASTER TO… MASTER_LOG_FILE=Master_Log_File, MASTER_LOG_POS=
rds-replica-mysql> CALL mysql.rds_start_replication;
Mit mydumper
mydumper kann hier Ihre alternative Option sein, besonders wenn der Datensatz sehr groß ist, da er Parallelität und Geschwindigkeit bietet, wenn Sie einen Dump oder eine Sicherungskopie Ihres Datensatzes von einem Quell-RDS-Knoten erstellen. Befolgen Sie die nachstehenden Schritte von der Installation von mydumper bis zum Laden auf Ihren lokalen Zielserver.
-
Installieren Sie die Binärdatei. Die Binärdateien finden Sie hier 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
-
Nehmen Sie die Sicherung vom RDS-Quellknoten. Zum Beispiel
[[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
Jetzt nimmt mydumper an dieser Stelle Sicherungsdateien in Form von *.gz-Dateien
-
Laden Sie es auf Ihren lokalen Zielserver
$ 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`
-
Richten Sie den Zielknoten als Slave/Replikat ein. MyDumper enthält eine Datei namens Metadaten, die aus binären Protokollkoordinaten einschließlich GTID -Positionen besteht, zum Beispiel:
$ 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
## Führen Sie dann einen Änderungsmaster von der Replik oder Ihrem MySQL/MariaDB-Zieldatenbankknoten aus
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)
## Starte den Slave
MariaDB [jbmrcd_date]> start slave;
Query OK, 0 rows affected (0.001 sec)
An diesem Punkt haben Sie nun von einer Amazon RDS-Instanz repliziert, auf der MySQL/MariaDB ausgeführt wird. Sobald Ihre Anwendung bereit ist, sich von Ihrer Amazon RDS-Instance zu entfernen, richten Sie den Endpunkt ein, der zu Ihrem On-Prem-Server geht, und alle verbleibenden Transaktionen von Ihrer RDS-Instance werden auf Ihre On-Prem repliziert, sodass keine Daten verloren gehen und zu Ihrem On-Prem-Server gehen. Prem-Server.
Auf Datenabweichungen prüfen
Sobald Sie Ihre Daten auf Ihren On-Prem-Server geladen oder ausgelagert haben, der als Replikat der AWS RDS-Instanz fungiert, sollten Sie dies noch einmal überprüfen, indem Sie Prüfsummenberechnungen durchführen, um festzustellen, inwieweit Ihre Daten mit dem übereinstimmen Quelle Amazon RDS. Ich schlage vor, dass Sie das pt-table-checksum-Tool von Percona verwenden, aber Sie können Ihr eigenes erstellen, indem Sie Prüfsummen-Tools wie md5 oder sha256 verwenden, aber dies dauert einige Zeit. Darüber hinaus kann die Verwendung von pt-upgrade auch hilfreich sein, nachdem Ihre Datenmigration mit diesem Replikationsansatz abgeschlossen ist.
Fazit
Die Verwendung von mysqldump oder mydumper sind kostenlose Open-Source-Tools, was ebenfalls ein großer Vorteil ist, insbesondere wenn Ihre Daten sehr vertraulich sind und Sie nicht möchten, dass Dritte darauf zugreifen. Obwohl dieser Ansatz einfach sein mag, kann es mühsame und umfangreiche Arbeit bedeuten, da immer Tests und doppelte Überprüfungen folgen, um nachzuweisen, dass die Migration vollständig und ohne Dateninkonsistenzen durchgeführt wird.