アマゾンウェブサービスは、特に最先端のクラウドコンピューティングサービスの先駆者となると、テクノロジーの巨人です。そのフルマネージドサービス製品(Amazon RDS)は他に類を見ないものです。繰り返しになりますが、一部の組織にとっては完璧なプラットフォームになる可能性がありますが、そうでない場合は、そこから脱却するのは難しい場合があります。ベンダーロックインの状況で立ち往生する懸念は常にあります。
RDSからオンプレミスプラットフォームに移行する際に留意すべき点は、予算の制約、セキュリティ、およびデータの自律性です。これは、データが最も価値のある資産であり、データがどこにあっても制御を維持するため、組織と企業が常に競争力を維持することが常に不可欠であるためです。クラウドをロックインする余裕のある組織はありませんが、多くの企業はまさにその状況にあり、オンプレミスで運用できる代替の既存のソリューションを探し始めています。
このブログでは、AmazonRDSからオンプレミスサーバーに移行する方法について説明します。オンプレミスサーバー上のターゲットデータベースはRHEL/CentOS Linuxサーバー上にありますが、パッケージが適切にインストールされている限り、該当する手順は他のバージョンのLinuxにも適用されます。
データ移行を提供するサードパーティの既存のソリューションがいくつかありますが、オンプレミスプラットフォームには適用できません。さらに、それは無料ではなく、オープンソースソリューションで無料を使用して移行することは常に有利で有利です。保証とサポートはオープンソーステクノロジーに拘束されていないため、疑問や懸念もありますが、ここでは簡単な手順でこれを実現する方法を紹介します。
AmazonRDSはMySQLおよびMariaDBとの互換性をサポートしているため。このブログではそれらに焦点を当てます。
MySQLまたはMariaDB用のAmazonRDSからの移行
Amazon RDSからオンプレミスサーバーにデータを移行する一般的なアプローチは、論理コピーを使用してバックアップを取ることです。これは、フルマネージドサービスであるAmazonRDSと互換性のあるバックアップユーティリティソリューションを使用して実行できます。フルマネージドデータベースサービスはSSHログインを提供しないため、バックアップの物理コピーはオプションではありません。
mysqldumpの使用
mysqldumpの使用は、オンプレミスにあるターゲットデータベースノードにインストールする必要があります。 AWS RDSノードのレプリカとして準備する必要があるため、後続のすべてのトランザクションはノードに複製されます。これを行うには、以下の手順に従います。
AWSRDSソースホスト :database-1.xxxxxxx.us-east-2.rds.amazonaws.com
オンプレミスサーバーホスト :192.168.10.226(testnode26)
ダンプを開始する前に、binlogの保持時間が設定されていることを確認してください。これを設定するには、AmazonRDSインスタンスで以下のプロシージャコールの例のように行うことができます
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
#MariaDBの場合
$ curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash
-
mysql-clientパッケージをインストール
#MySQLの場合
$ yum install -y mysql-community-client.x86_64
#MariaDBの場合
$ yum install -y MariaDB-client
-
mysqldumpを使用して、ターゲットノード内で実行することによりデータダンプを作成します。オプションとして--master-data=2を指定すると、これはMariaDBでのみ機能し、MySQLでは機能しないことに注意してください。したがって、MySQLの追加作業を行う必要があります。これについては後で説明します。
##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
-
MySQL/MariaDBサーバーをターゲットデータベースノードにインストールします
#MySQLの場合(yumリポジトリで有効になっているバージョンリポジトリを常に確認してください。この時点では、MySQL 5.7を使用しています)
$ yum --disablerepo=* --enablerepo=mysql57-community install mysql-community-common mysql-community-client mysql-community-server
#MariaDBの場合
$ 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
##MariaDBの場合
$ mysql_install_db
-
MySQL/MariaDBサーバーを起動します
##MySQLの場合
$ systemctl start mysqld
##MariaDBの場合
$ systemctl start mariadb
-
AWSRDSから取得したデータダンプをオンプレミスのターゲットデータベースノードにロードします
$ mysql --show-warnings < backups/dump.sql
-
AWSRDSソースノードからレプリケーションユーザーを作成します
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サーバーをAWSRDSソースノードのレプリカ/スレーブとして設定
##まず、CHANGEMASTERコマンドを検索または検索しましょう
[[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)
これで、オンプレミスにあるレプリカのソースまたはマスターとしてRDSからようやく複製できるようになりました。まだ終わっていません。
などのレプリケーションエラーが発生する場合があります。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'
on-premは、「rds%」というプレフィックスが付いたテーブルのmysqlデータベースからのデータを複製する必要がないため、複製中はこれらのテーブルを無視します。さらに、AWSRDSでmysql.userテーブルを更新および変更したくない場合があります。これを行うには、オプションでスキーマを無視するか、
などのテーブルのリストだけを無視することができます。STOP SLAVE;
次に、
SET GLOBAL replicate_wild_ignore_table='mysql.rds%';
SET GLOBAL replicate_wild_ignore_table='mysql.%';
--master-data=2に関するMySQLの問題
--master-data =2を指定してmysqldumpを取得するには、SUPERおよびRELOAD特権を必要とする十分な特権が必要です。問題は、AWSRDSがデータベースのセットアップおよび作成中に管理ユーザーにこれを提供しないことです。この問題を回避するには、AWSRDSにマスターとレプリカまたはスレーブのセットアップがある必要があります。スレーブを設定したら、mysqldumpを使用するときにそれをターゲットソースホストとして使用します。次に、次のようにAWSRDSレプリカからスレーブスレッドを停止します。
rds-replica-mysql> CALL mysql.rds_stop_replication;
次に、以下のように--master-dataオプションを指定せずにmysqldumpを取得します。
mysqldump -h database-1.xxxxxxx.us-east-2.rds.amazonaws.com -uadmin -p --single-transaction --databases db1 db2 db3 > backups/dump.sql
次に、AWSRDSレプリカからSHOWSLAVE STATUS \ Gを実行し、オンプレミスサーバーに複製するAWSRDSマスターに接続するときに使用するMaster_Log_FileとExec_Master_Log_Posをメモします。 CHANGEMASTERTO…MASTER_LOG_FILE=Master_Log_File、MASTER_LOG_POS =
rds-replica-mysql> CALL mysql.rds_start_replication;
mydumperの使用
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
-
RDSソースノードからバックアップを取ります。たとえば、
[[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 will include a file called metadata which consists of binary log coordinates including GTID positions, for example:
$ 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を実行しているAmazonRDSインスタンスからレプリケートされています。アプリケーションをAmazonRDSインスタンスから移動する準備ができたら、オンプレミスサーバーに移動するエンドポイントをセットアップすると、RDSインスタンスからの残りのすべてのトランザクションがオンプレミスに複製され、オンプレミスにデータが失われることはありません。プレミスサーバー。
AWS RDSインスタンスからレプリカとして機能するオンプレミスサーバーにデータをロードまたはダンプしたら、チェックサム計算を実行してこれを再確認し、データがソースAmazonRDS。 Perconaのpt-table-checksumツールを使用することをお勧めしますが、md5やsha256などのチェックサムツールを使用して独自のツールを作成することもできますが、これには時間がかかります。さらに、pt-upgradeを使用すると、このレプリケーションアプローチを使用したデータ移行が完了した後にも役立ちます。
mysqldumpまたはmydumperの使用は、無料のオープンソースツールです。これは、特にデータの機密性が高く、サードパーティにアクセスさせたくない場合にも大きな利点です。このアプローチを採用するのは簡単かもしれませんが、データの不整合なしに移行が完全に達成されたことを証明するために、テストとダブルチェックが常に続くため、面倒で大規模な作業が必要になる可能性があります。