将MySQL数据库从Amazon RDS迁移到DigitalOcean

发布于:2021-01-25 15:15:58

0

79

0

MySQL 数据库 Amazon RDS DigitalOcean

在以前的博客(第1部分和第2部分)中,我们讨论了如何将RDS数据迁移到EC2实例中。在这个过程中,我们成功地将数据移出RDS,但我们仍然在AWS上运行。如果您想将数据完全移出amazonweb服务,还有更多的工作要做。在今天的博客文章中,我们将向你展示如何做到这一点。

环境介绍

我们将要使用的环境与本系列最后一篇文章中的环境非常相似。唯一的区别是没有发生切换,因为我们将使用EC2实例作为移出AWS过程中的中间步骤。

行动计划

在上一篇博客中,我们首先将数据从RDS迁移到一个EC2实例,我们可以完全访问该实例。因为我们已经在EC2实例上运行了MySQL,所以我们有更多的选择来选择如何将数据复制到另一个云。DigitalOcean仅用于演示目的,我们下面描述的过程可用于迁移到任何其他主机或云提供商。您需要直接访问VPS实例。在这个过程中,我们将使用xtrabackup来复制数据(尽管使用任何其他二进制传输方法都可以)。我们需要在AWS和DigitalOcean之间建立一个安全连接。一旦我们这样做了,我们将设置从EC2实例到digitaloceandroplet的复制。下一步是执行切换和移动应用程序,但我们将不在这里介绍。

确定连通性方法

amazonweb服务允许您从许多不同的方法中选择一种来创建到外部网络的连接。如果您有支持VPN连接的硬件设备,您可以使用它在AWS中的VPC和本地基础设施之间形成VPN连接。如果您的网络提供商为您提供与AWS网络的对等连接,并且您有BGP路由器,则可以通过AWS direct Connect在您的网络和AWS之间获得直接VLAN连接。如果您有多个独立的网络,您可以使用awsvpncloudhub将它们与Amazon链接在一起。最后,由于EC2实例由您管理,您还可以使用OpenVPN等软件解决方案在该EC2实例和本地网络之间建立VPN。

在我们讨论数据库时,您还可以决定在EC2上的MySQL(主服务器)和DigitalOcean上运行的从服务器之间设置SSL复制。-我们仍然需要弄清楚如何将初始数据传输到从属服务器—一个解决方案可能是对xtrabackup的输出加焦油,加密该文件,然后通过WAN(rsync)发送该文件,或者上传到S3 bucket,然后从那里下载。您还可以依赖SSH加密,只需scp(甚至rsync,使用SSH)将数据传输到新位置。

有很多选择。不过,我们将使用另一种解决方案—我们将在EC2实例和DigitalOcean droplet之间建立一个SSH隧道,以形成一个用于复制数据的安全通道。初始传输将通过SSH连接使用rsync进行。

将数据复制到DigitalOcean

一旦MySQL5.7在DigitalOcean实例上启动并运行,我们需要对EC2实例执行备份,然后将其传输到DO。从技术上讲,应该可以在节点之间执行xtrabackup数据的直接流,但我们不能真正推荐它。广域网链接可能不可靠,最好在本地进行备份,然后使用rsync,它可以在出现问题时重试传输。

首先,让我们对EC2实例进行备份:

[email protected]:~# innobackupex --user=tpcc --password=tpccpass /tmp/backup

一旦准备好了,我们需要把它传送到数字海洋网络。为了以安全的方式执行,我们将在do droplet上创建一个新用户,生成一个SSH密钥并使用该用户复制数据。当然,您也可以使用任何现有用户,创建新用户不是必需的。所以,让我们添加一个新用户。有很多方法可以做到这一点,我们将使用'adduser'命令。

[email protected]:~# adduser rdscopy
Adding user `rdscopy' ...
Adding new group `rdscopy' (1001) ...
Adding new user `rdscopy' (1001) with group `rdscopy' ...
Creating home directory `/home/rdscopy' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for rdscopy
Enter the new value, or press ENTER for the default
   Full Name []:
   Room Number []:
   Work Phone []:
   Home Phone []:
   Other []:
Is the information correct? [Y/n] y

现在,是时候生成一对ssh密钥用于连接了:

[email protected]:~# ssh-keygen -C 'rdscopy' -f id_rsa_rdscopy -t rsa -b 4096
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in id_rsa_rdscopy.
Your public key has been saved in id_rsa_rdscopy.pub.
The key fingerprint is:
3a:b0:d2:80:5b:b8:60:1b:17:58:bd:8e:74:c9:56:b3 rdscopy
The key's randomart image is:
+--[ RSA 4096]----+
|   ..            |
|  o  . o         |
| . .. + o        |
| o ..* E         |
|+o+.*   S        |
|o+++ + .         |
|o.. o o          |
|   .   .         |
|                 |
+-----------------+

有了SSH密钥,我们需要在数字海洋水滴上设置它。我们需要创建.ssh目录并创建具有适当访问权限的授权密钥文件。

[email protected]:~# mkdir /home/rdscopy/.ssh[email protected]:~# cat id_rsa_rdscopy.pub > /home/rdscopy/.ssh/authorized_keys[email protected]:~# chown rdscopy.rdscopy /home/rdscopy/.ssh/authorized_keys[email protected]:~# chmod 600 /home/rdscopy/.ssh/authorized_keys

然后,我们需要将私钥复制到EC2实例。当我们准备好的时候,我们可以复制我们的数据。正如我们前面提到的,我们将使用rsync来实现这一点——它将允许我们在进程因任何原因中断时重新启动传输。结合SSH,我们创建了一种通过WAN复制数据的安全而健壮的方法。让我们在EC2主机上启动rsync:

[email protected]:~# rsync -avz -e "ssh -i id_rsa_rdscopy -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --progress /tmp/backup/2017-02-20_16-34-18/ [email protected]:/home/rdscopy

过一段时间,这将取决于数据量和传输速度,我们的备份数据应该可以在DigitalOcean droplet上使用。这意味着是时候通过应用InnoDB redo logs,然后将其复制回MySQL数据目录来准备它了。为此,我们需要停止MySQL,删除当前数据目录,使用innobackupex或手动将文件复制回,最后,验证新文件的所有者和组是否设置为MySQL:

[email protected]:~# innobackupex --apply-log /home/rdscopy/[email protected]:~# service mysql stop[email protected]:~# rm -rf /var/lib/mysql/*[email protected]:~# innobackupex --copy-back /home/rdscopy/[email protected]:~# chown -R mysql.mysql /var/lib/mysql

在启动MySQL之前,我们还需要确保服务器的id和UUID是不同的。前者可以在中编辑我的.cnf后者可以通过以下方式得到保证:

[email protected]:~# rm /var/lib/mysql/auto.cnf

现在,我们可以启动MySQL:

[email protected]:~# service mysql start

设置复制

我们已经准备好在EC2和DO之间设置复制,但是首先我们需要设置一个ssh隧道——我们将在EC2实例上为ubuntu用户创建一个额外的ssh密钥,并将其复制到DO实例。然后我们将使用ubuntu用户创建一个用于复制的隧道。

让我们从创建新的ssh密钥开始:

[email protected]:~# ssh-keygen -C 'tunnel' -f id_rsa_tunnel -t rsa -b 4096
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in id_rsa_tunnel.
Your public key has been saved in id_rsa_tunnel.pub.
The key fingerprint is:
c4:44:79:39:9c:c6:ce:45:bb:13:e5:6f:c5:d9:8c:14 tunnel
The key's randomart image is:
+--[ RSA 4096]----+
|       .o+ +. E. |
|       o. O .= +o|
|        o= oo o.=|
|       .  o  o ..|
|        S   o   o|
|             . . |
|                 |
|                 |
|                 |
+-----------------+

下一步-我们需要将公钥添加到EC2实例上的authorized u keys文件中,我们将从DigitalOcean连接到该文件以创建一个隧道。

[email protected]:~# cat id_rsa_tunnel.pub >> /home/ubuntu/.ssh/authorized_keys

我们还需要一个私钥来传输到DO droplet。可以通过多种方式完成,但我们将使用安全的scp,使用我们先前创建的rdscopy user和key:

[email protected]:~# scp -i id_rsa_rdscopy id_rsa_tunnel [email protected]:/home/rdscopy
id_rsa_tunnel                                                                                                                                                                    100247     3.2KB/s   00:00

这就是我们所需要的-现在我们可以创建SSH隧道了。我们希望它一直可用,所以我们将使用屏幕会话。

[email protected]:~# screen -S tunnel[email protected]:~# ssh -L 3307:localhost:3306 [email protected] -i /home/rdscopy/id_rsa_tunnel

我们在这里做的是使用“ubuntu”用户和位于/home/rdscopy/idu rsau tunnel中的密钥打开localhost、端口3307和远程主机54.224.107.6、端口3306之间的SSH隧道。应通过127.0.0.1:3307分离屏幕会话和远程主机。

要设置复制,我们仍然需要添加n个用户,用于连接EC2上的MySQL。我们将在EC2主机上创建它,并使用“127.0.0.1”作为主机-通过SSH隧道的连接看起来像来自本地主机:

mysql> CREATE USER [email protected] IDENTIFIED BY 'rds_rpl_pass';
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT REPLICATION SLAVE ON *.* TO [email protected];
Query OK, 0 rows affected (0.00 sec)

一切都准备好了,现在是时候遵循传统的基于xtrabackup数据创建从机的过程了。我们需要使用来自xtrabackupu binlogu info的数据来确定备份时的主位置。这个位置是我们想用在我们的改变主人…命令。我们来看看xtrabackupu binlogu info文件的内容:

[email protected]:~# cat /home/rdscopy/xtrabackup_binlog_info
binlog.000052    896957365

这是二进制日志文件和位置,我们将在更改母版中使用它:

[email protected]:~# mysql -u root -ppass

mysql> CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_PORT=3307, MASTER_USER='rds_rpl', MASTER_PASSWORD='rds_rpl_pass', MASTER_LOG_FILE='binlog.000052', MASTER_LOG_POS=896957365; START SLAVE;

这是它-复制现在应该是和运行,我们的DigitalOcean奴隶应该赶上复制。一旦赶上,我们的数据库层就可以进行切换了。当然,通常不仅仅是一个节点,在基础设施准备好处理生产流量之前,您很可能需要在DO上设置多个从属节点。

切换本身是一个不同的主题-你将不得不设计一个计划,以尽量减少停机时间。一般来说,交通应该从旧的位置转移到新的位置,但如何进行主要取决于您的环境。它可以是任何东西,从简单的DNS条目更改,到复杂的脚本,这些脚本将以正确的顺序拉取所有触发器以重定向流量。不管怎样,您的数据库现在已经位于新位置,可以为请求提供服务。