数据层迁移

目标:通过数据层迁移动手实验,掌握X86架构到ARM架构的关系型数据库(Mysql示例)及非关系型数据库(Redis示例)的迁移。

数据层迁移

小汪公司正在为如何降本增效进行评估,期望通过准确的技术手段去验证迁移到ARM架构的可行性.针对一个完整的应用迁移,我们往往要评估的第一点是数据的迁移。

Mysql 迁移

在Mysql数据库迁移场景中,常规的实践是在目标端部署对应版本的Mysql服务器,使用原生或第三方工具进行数据的同步和迁移。在异构平台下亦是如此,我们将在创建新的Graviton实例,并使用该实例部署ARM版本Mysql部署包。随后使用工具进行数据同步。

数据迁移层面有大量的第三方和云原生工具为我们提供不同侧重的选项,例如:原生的mysqldump、MySQL 5.7版本新推出的mysqlpump、Percona开源工具mydumper、AWS DMS服务、物理备份的Percona-Xtrabackup工具等等。

下表总结流行Mysql备份工具对比:

特性/工具 xtrabackup mydumper mysqldump mysqlpump
备份类型 物理备份 逻辑备份 逻辑备份 逻辑备份
原生
性能 最佳 较好 一般 一般
数据量 大容量数据库(TB 级别) 大容量数据库(数百GB 或者 TB 级别) 小容量(10GB 以下) 中小容量
多线程 支持 支持 *记录级别并发导出导入 不支持 支持 *表级并发导出
远程备份 支持 支持 支持 支持
工具便捷性 一般 最佳 较好 较好
局限性 备份文件大/不支持MyISAM表/从Linux和Windows的Mysql文件不兼容 效率比xtrabackup低 效率低 恢复只支持单线程,只支持MySQL5.7之后

*记录级别并发:单表多线程

*表级别并发:单表单线程

mydumper适用于大多数MySQL数据库迁移场景,例如跨云迁移、托管服务迁移。而Xtrabackup在,追求数据备份效率以及锁表时间最短的话是最佳选择。mysqldump和mysqlpump作为MySQL原生工具,在安装MySQL客户端的服务器上即可使用,但效率不及mydumper。所以,针对不同的迁移场景建议选择适合的工具。

Mysql 迁移实验手册

本次Mysql迁移采用的是Mydumper/Myloader进行备份还原, Mydumper/Myloader是mysql的多线程导入导出工具

实验流程:

1.创建作为目标实例的Graviton EC2,安装ARM架构下的Mysql server;

2.登录原有Mysql server,并安装Mydumper&Myloader工具

3.在原有Mysql通过Mydumper工具把原X86数据库导出到X86本地磁盘;

4.在原有Mysql通过Myloader对目标Graviton主机进行数据库还原写入操作;

5.登录Graviton MySQL server 并进行数据效验。


创建目标实例Graviton EC2,安装的Mysql server On ARM

创建EC2,在左侧的控制台导航菜单选择EC2 DashboardEC2控制面板

验证控制台右上角的Region(区域)是否与本次实验的Region值一致,然后从列表中选择 Launch instance(启动实例)下拉菜单,启动实例

选择启动实例 注意:架构处的下拉框请选中 64位(ARM),如下图

启动实例的参数如下:

创建EC2如下:

  • 名称: Graviton_Target-Mysql
  • 实例类型:R6g.large
  • Amazon Machine Image(AMI): Amazon Linux 2 AMI(HVM)
  • 架构:64位(ARM)
  • 密钥对名称:ee-default-keypair.pem
  • VPC: Graviton-GameDay-VPCStack-xxxxxxxx
  • 子网组:Private subnet 1A
  • 安全组:选择一个安全组 Graviton-GameDay-SecurityGroupStack-xxxxxxx-DBServerSecurityGroup
  • 实例实例:1
  • EBS存储空间:50G
  • EBS存储类型:gp2

最后点击启动实例按钮在,请在summary(汇总)核对下参数信息。 启动完毕EC2后,可以选择 View all instance(查看所有实例),等待实例的状态显示为Running(正在运行),这表示实例已完成启动。

登录安装目标端Mysql

登录到堡垒机后再登录到Mysql服务器,请您记录下源java的Private IP DNS name如下图所示

在堡垒机上使用ssh命令登录后端机器,输入

ssh -i ee-default-keypair.pem ec2-user@<your-mysql-graviton-Private-name>

其中 ee-default-keypair.pem替换为您秘钥的文件名,<your-mysql-graviton-Private-name>替换为您在控制塔查看的Mysql的Private IP DNS name,输入yes以便确定连接

完成登录后在本实例上安装Mysql,请输入如下命令

sudo yum install https://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm -y

sudo yum repolist
sudo amazon-linux-extras install epel -y
sudo yum -y install mysql-community-server -y
sudo systemctl enable --now mysqld

完成安装和启动如图:

MySQL8 中会在安装完成获得一个临时密码,我们读取初始临时密码并修改root密码,请使用如下命令:

tpw="`sudo grep 'temporary password' /var/log/mysqld.log | awk '{ print $NF}'`"
sleep 1
mysql -u root -p"$tpw" --connect-expired-password <<EOF
ALTER USER 'root'@'localhost' IDENTIFIED BY 'GravitonGameDay@2022';
quit
EOF

编写sql,创建应用操作数据库的用户和权限

cat << EOF > /home/ec2-user/create_game_day.sql

# Create DBuser
CREATE USER 'graviton'@'%' IDENTIFIED BY 'GravitonGameDay@2022';
GRANT ALL PRIVILEGES ON *.* TO 'graviton'@'%';
ALTER USER 'graviton'@'%' IDENTIFIED WITH mysql_native_password BY 'GravitonGameDay@2022';

# Create database
create database webappdb;
EOF

执行sql,创建应用操作数据库的用户和权限

mysql -h 127.0.0.1 -u root -pGravitonGameDay@2022 < /home/ec2-user/create_game_day.sql

在原始环境的默认用户名密码是 graviton // GravitonGameDay@2022 ,我们这里保持了一致,您也可以在上面的命名中替换新环境的密码,但正确的传递给与之后进行的应用迁移配置

用新用户连接mysql进行验证

mysql -h 127.0.0.1 -u root -pGravitonGameDay@2022

如下,成功进入Mysql on graviton

[ec2-user@ip-10-0-3-41 ~]$ mysql -h 127.0.0.1 -u root -pGravitonGameDay@2022
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 8.0.30 MySQL Community Server - GPL

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 


登录源Mysql server,安装mydumper工具

回到控制台,记录下最初X86 mysql的Private IP DNS name如下图所示

在堡垒机上使用ssh命令登录原mysql机器,输入

ssh -i ee-default-keypair.pem ec2-user@<your-mysql-Private-name>

其中 ee-default-keypair.pem替换为您秘钥的文件名,<your-mysql-Private-name>替换为您在控制塔查看的mysql的Private IP DNS name,输入yes以便确定连接

在Mysql上使用mysql连接至数据库,输入

mysql -u graviton -p

其中 graviton是模板中默认的数据库用户名,如果您自定义了该参数请调整为您自定义的值

随后mysql会要求我们输入密码,请复制GravitonGameDay@2022进行输入,这是模板中默认的数据库密码,如果您自定义了该参数请调整为您自定义的值

GravitonGameDay@2022

输入exit退出客户端

安装mydumper工具 请输入如下命令

sudo yum install -y https://github.com/maxbube/mydumper/releases/download/v0.10.7-2/mydumper-0.10.7-2.el7.x86_64.rpm

得到如下返回

.......
Transaction Summary
==================================================================================================================
Install  1 Package

Total size: 7.9 M
Installed size: 7.9 M
Is this ok [y/d/N]: y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : mydumper-0.10.7-2.x86_64                                                                       1/1 
  Verifying  : mydumper-0.10.7-2.x86_64                                                                       1/1 

Installed:
  mydumper.x86_64 0:0.10.7-2                                                                                      

Complete!

使用mydumper工具把源X86数据库导出至本地磁盘

请输入如下命令

mkdir /home/ec2-user/mysql_backup/
mydumper -u graviton -p GravitonGameDay@2022 -G -R -E -B webappdb -o /home/ec2-user/mysql_backup/

mydumper&myloader是功能强大的mysql数据迁移和备份工具,多个参数和培训选项您可以在 https://geekswag.co/collections/mydumper 学习

关于mydumper工作原理:

- a、连接源数据库;
- b、通过show processlist来判断是否有长查询,根据参数long-query-guard和kill-long-queries决定退出或杀掉长查询;
- c、锁定myisam表,flush tables with read lock;针对innodb table开启事务,start transaction;
- d、创建worker子线程,缺省为4个;
- e、确定候选表,根据类别分别插入innodb_table,non_innodb_table以及table_schemas链表(表结构);
- f、将候选表通过g_async_queue_push加入任务队列(队列最后元素是thread shutdown),由worker子线程从队列中读取表信息并执行数据导出 
- g、执行unlock tables,处理完myisam表后立即解锁,以减少锁定时间;
- h、等待worker退出;
通过Myloader对目标Graviton主机进行数据库还原写入

请使用如下命令,将备份数据写入直新建的graviton mysql, 请把ip-10-0-3-41.ec2.internal换成您的Graviton_Target-Mysql的内网IP地址

 myloader -u graviton -p GravitonGameDay@2022 -h ip-10-0-3-41.ec2.internal -s webappdb  -o -d /home/ec2-user/mysql_backup/

登录Graviton 主机并进行效验

现在请您回到堡垒机,要登录至刚刚手动创建的Graviton_Target-Mysql服务器,请您记录下Target-mysql的Private IP DNS name如下图所示

在新的Mysql上使用mysql连接至数据库,输入

mysql -u graviton -p

其中 graviton是模板中默认的数据库用户名,如果您自定义了该参数请调整为您自定义的值

随后mysql会要求我们输入密码,请复制GravitonGameDay@2022进行输入,这是模板中默认的数据库密码,如果您自定义了该参数请调整为您自定义的值

GravitonGameDay@2022

在mysql数据库中您可以查看我们当前的数据库,查看数据库中的表,您可以使用以下命令,如

show databases; /use webappdb;/ show tables; /select * from users;

如下检验,我们完成了x86 到graviton mysql的数据迁移

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| webappdb           |
+--------------------+
5 rows in set (0.00 sec)

mysql> use webappdb;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+--------------------+
| Tables_in_webappdb |
+--------------------+
| user_account_roles |
| user_accounts      |
| users              |
+--------------------+
3 rows in set (0.00 sec)

mysql> select * from user_accounts;
+------------------+------------------+
| user_name        | user_pass        |
+------------------+------------------+
| admin            | admin            |
| graviton@aws.psa | graviton@aws.psa |
+------------------+------------------+
2 rows in set (0.00 sec)

mysql> select * from users;
+----+----------+------------------+-------------+
| id | name     | email            | company     |
+----+----------+------------------+-------------+
|  1 | Wu-JiaDe | wjiad@amazon.com | 18618191816 |
|  2 | test     | jdjia@ooo.com    | aws         |
|  3 | demo     | 213@11.cc        | aws         |
+----+----------+------------------+-------------+
3 rows in set (0.00 sec)

mysql> 

Redis 迁移

Redis是C语言编写的数据库,我们将在ARM架构中下载Redis源代码,使用GCC编译工具在ARM架构下进行编译安装。安装完成后同样在数据级别进行两个库的数据同步

Redis迁移的工具很多,但大致可以分为三类:

  • 基于SYNC/PSYNC命令的主从同步,如原生主从的SLAVEOF命令,开源Redis-shake或redis-migrate-tool模拟从节点
  • 基于SCAN命令的基于游标迭代器的批处理键值扫描,用DUMP/RESTORE来GET/SET键值数据,如Rump,RIOT Snapshot模式
  • 基于Keyspace Notification或Monitor日志进行Redis操作追踪, 用DUMP/RESTORE来GET/SET键值数据,如RIOT Live模式和Redis mirror

对比流行的Redis迁移工具:

工具 功能 优点 缺点
Redis-shake 全量、增量、TTL 基于sync/psync文件全量和增量/基于Rump全量Rdb文件导出导入/支持多线程 需要配合redis-full-check做数据校验/需要源端开启sync/psync,Rump模式下不支持增量
Rump 全量/TTL 基于SCAN命令,对源端性能负载小 不支持增量
RIOT 全量/增量*/TTL 全量基于SCAN命令对源端性能负载小/全量自带数据校验/生产者消费者消息队列模式/支持多线程 开源初期阶段,在某些跨云环境报错/需手动开启keyspace notificaiton
Redis-mirror 增量 基于Monitor STDOUT,实现原理简单,易于根据项目具体情况修改源代码 开源不支持TTL同步(可利用改造版)/开启Monitor和执行Key命令的复制都会影响源端读写性能

*RIOT增量不支持Redis集群版,且当前时间版本的RIOT增量可能会出现数据丢失

Redis 迁移实验手册

RIOT 是一个开源在线迁移工具,由 Redis Labs 的解决方案架构师 Julien Ruaux 构建。 RIOT 使用生产者/消费者(producer/consumer)方法实现客户端复制。 生产者是由Key Reader和Value Reader两部分组成。

  • Key reader: Key Reader通过Scan(全量)和订阅Keyspace notification键空间通知(增量)识别要复制的Key并传递给Value Reader
  • Value reader: 执行DUMP和TTL命令将结果键+值+ttl传递给消费者
  • Key/Value writer: 执行RESTORE 和EXPIRE.

本次实验使用RIOT方式进行示范

实验流程:

1.创建作为目标实例的Graviton EC2,安装ARM架构下的Redis server;

2.登录原有Redis server,并安装RIOT工具;

3.RIOT执行数据同步;

4.登录Graviton Redis server 并进行数据效验。


创建作为目标实例的Graviton EC2,安装ARM架构下的Redis server

创建作为目标实例的Graviton EC2,安装ARM架构下的Redis server

创建EC2,在左侧的控制台导航菜单选择EC2 DashboardEC2控制面板

验证控制台右上角的Region(区域)是否与本次实验的Region值一致,然后从列表中选择 Launch instance(启动实例)下拉菜单,启动实例

选择启动实例 注意:架构处的下拉框请选中 64位(ARM),如下图

启动实例的参数如下:

创建EC2如下:

  • 名称: Graviton_Target-Redis
  • 实例类型:R6g.large
  • Amazon Machine Image(AMI): Amazon Linux 2 AMI(HVM)
  • 架构:64位(ARM)
  • 密钥对名称:ee-default-keypair.pem
  • VPC: Graviton-GameDay-VPCStack-xxxxxxxx
  • 子网组:Private subnet 1A
  • 安全组:选择一个安全组 Graviton-GameDay-SecurityGroupStack-xxxxxxx-DBServerSecurityGroup
  • 实例实例:1

最后点击启动实例按钮在,请在summary(汇总)核对下参数信息。 启动完毕EC2后,可以选择 View all instance(查看所有实例),等待实例的状态显示为Running(正在运行),这表示实例已完成启动。

安装ARM架构下的Redis server 依旧我们需要在堡垒机上使用ssh命令登录后端新部署的Redis机器,输入

ssh -i ee-default-keypair.pem ec2-user@<your-graviton-redis-Private-name>

其中 ee-default-keypair.pem替换为您秘钥的文件名,<your-graviton-redis-Private-name>替换为您在控制塔查看的redis的Private IP DNS name,输入yes以便确定连接

[ec2-user@ip-10-0-0-67 ~]$ ssh -i jiade.pem ec2-user@ip-10-0-3-152.ec2.internal
The authenticity of host 'ip-10-0-3-152.ec2.internal (10.0.3.152)' can't be established.
ECDSA key fingerprint is SHA256:Da7Zd0NfDZpoXbfP9dvJnCmBAWwS7Fk7oHrtlCVN9q4.
ECDSA key fingerprint is MD5:6d:86:d2:59:d4:7b:4c:da:d6:1a:d8:06:c0:0f:cd:73.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'ip-10-0-3-152.ec2.internal,10.0.3.152' (ECDSA) to the list of known hosts.

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
3 package(s) needed for security, out of 8 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-10-0-3-152 ~]$ 

通过如下命令安装Redis源码并且进行编译

cd /home/ec2-user/
Redisversion=6.0.9
sudo amazon-linux-extras install epel -y
sudo yum install gcc jemalloc-devel openssl-devel tcl tcl-devel -y
sudo wget https://download.redis.io/releases/redis-$Redisversion.tar.gz  -O ./redis.tar.gz 

sudo tar xvzf redis.tar.gz
cd redis-$Redisversion
sudo make BUILD_TLS=yes

源码编译完成,得到如下返回

...........
    CC acl.o
    CC gopher.o
    CC tracking.o
    CC connection.o
    CC tls.o
    CC sha256.o
    CC timeout.o
    CC setcpuaffinity.o
    LINK redis-server
    INSTALL redis-sentinel
    CC redis-cli.o
    LINK redis-cli
    CC redis-benchmark.o
    LINK redis-benchmark
    INSTALL redis-check-rdb
    INSTALL redis-check-aof

Hint: It's a good idea to run 'make test' ;)

make[1]: Leaving directory `/home/ec2-user/redis-6.0.9/src'

使用下列命令开启服务访问,并启动Redis服务

hostname=`curl -s http://169.254.169.254/latest/meta-data/hostname`
sudo sed -i "s|protected-mode yes|protected-mode no|g" /home/ec2-user/redis-$Redisversion/redis.conf
sudo sed -i "s|bind 127.0.0.1|bind $hostname|g" /home/ec2-user/redis-$Redisversion/redis.conf
sudo sed -i "s|notify-keyspace-events ""|notify-keyspace-events AKE|g" /home/ec2-user/redis-$Redisversion/redis.conf

nohup sudo /home/ec2-user/redis-$Redisversion/src/redis-server /home/ec2-user/redis-$Redisversion/redis.conf &

得到如下返回:

[ec2-user@ip-10-0-3-152 redis-6.0.9]$ 3451:C 09 Sep 2022 06:59:22.332 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
3451:C 09 Sep 2022 06:59:22.332 # Redis version=6.0.9, bits=64, commit=00000000, modified=0, pid=3451, just started
3451:C 09 Sep 2022 06:59:22.332 # Configuration loaded
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 6.0.9 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 3451
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

3451:M 09 Sep 2022 06:59:22.334 # Server initialized
3451:M 09 Sep 2022 06:59:22.334 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
3451:M 09 Sep 2022 06:59:22.335 * Ready to accept connections
登录源Redis server

现在我们登录到源redis服务器,请您记录下源redis的Private IP DNS name如下图所示

依旧我们需要在堡垒机上使用ssh命令登录后端机器,输入

ssh -i ee-default-keypair.pem ec2-user@<your-redis-Private-name>

其中 ee-default-keypair.pem替换为您秘钥的文件名,<your-redis-Private-name>替换为您在控制塔查看的redis的Private IP DNS name,输入yes以便确定连接

在redis机器上您可以通过redis-cli命令打开redis客户端,里面保持着您的用户登录状态,请使用如下命令登录redis客户端

./redis-6.0.9/src/redis-cli -h ip-10-0-3-134.ec2.internal

其中ip-10-0-3-134.ec2.internal请替换为您自己的redis服务器Private IP DNS name,随后您可以使用命令查看redis中的数据,例如keys * / HGETALL "redisson:tomcat_session:xxxxxxxxx"

检查完成请exit退出redis-cil

并安装 RIOT工具及依赖组件

sudo amazon-linux-extras install java-openjdk11 -y
sudo wget https://github.com/redis-developer/riot/releases/download/v2.18.1/riot-redis-2.18.1.zip
sudo unzip riot-redis-2.18.1.zip
cd /home/ec2-user/riot-redis-2.18.1/bin
sudo ./riot-redis –help

RIOT执行数据同步

实验中我们使用RIOT SNAPSHOT全量模式:

sudo ./riot-redis --info -h <Source endpoint> -p 6379 replicate -h <Target endpoint> -p 6379 --mode=snapshot

请将<Source endpoint><Target endpoint>替换为您环境的服务器地址。例如sudo ./riot-redis --info -h ip-10-0-3-178.ec2.internal -p 6379 replicate -h ip-10-0-3-152.ec2.internal -p 6379 --mode snapshot

得到以下返回

[ec2-user@ip-10-0-3-86 bin]$ sudo ./riot-redis --info  -h ip-10-0-3-86.us-west-1.compute.internal -p 6379 replicate -h ip-10-0-2-17.us-west-1.compute.internal -p 6379 --mode snapshot
Job: [SimpleJob: [name=snapshot-replication]] launched with the following parameters: [{}]
Executing step: [snapshot-replication]
Scanning  ? % ?? 0/0 (0:00:00 / ?) ?/s
Job: [SimpleJob: [name=scan-reader]] launched with the following parameters: [{}]
Executing step: [scan-reader]
Step: [scan-reader] executed in 57ms
Closing with items still in queue
Scanning 100% ????????????????????????????????????????????????????????????????????????????????????????????????????????????? 7/7 (0:00:00 / 0:00:00) ?/s
Step: [snapshot-replication] executed in 1s516ms
Executing step: [verification]
Job: [SimpleJob: [name=RedisItemReader]] launched with the following parameters: [{}]
Verifying  ? % ?? 0/0 (0:00:00 / ?) ?/s
Executing step: [RedisItemReader]
Step: [RedisItemReader] executed in 68ms
Closing with items still in queue
Verifying 100% ????????????????????????????????????????????????????????????????????????????? 7/7 (0:00:00 / 0:00:00) ?/s >0 T0 ?0 ?0
Verification completed - all OK
Step: [verification] executed in 404ms
Job: [SimpleJob: [name=snapshot-replication]] completed with the following parameters: [{}] and the following status: [COMPLETED] in 2s170ms
[ec2-user@ip-10-0-3-86 bin]$ /home/ec2-user/redis-6.0.9/src/redis-cli  -h ip-10-0-3-86.us-west-1.compute.internal
ip-10-0-3-86.us-west-1.compute.internal:6379> keys *
1) "redisson:tomcat_session:52C74548779C3E3B6834FB5896F56700"
2) "1"
3) "3"
4) "5"
5) "test"
6) "2"
7) "4"
ip-10-0-3-86.us-west-1.compute.internal:6379>
[ec2-user@ip-10-0-3-86 bin]$ /home/ec2-user/redis-6.0.9/src/redis-cli  -h ip-10-0-2-17.us-west-1.compute.internal
ip-10-0-2-17.us-west-1.compute.internal:6379> keys *
1) "4"
2) "1"
3) "2"
4) "test"
5) "3"
6) "redisson:tomcat_session:52C74548779C3E3B6834FB5896F56700"
7) "5"

登上目标去检查

依旧我们需要在堡垒机上使用ssh命令登录后端Grviton Redis机器,输入

ssh -i ee-default-keypair.pem ec2-user@<your-graviton-redis-Private-name>

在Graviton redis机器上您可以通过redis-cli命令打开redis客户端,里面保持着您的用户登录状态,请使用如下命令登录redis客户端

/home/ec2-user/redis-6.0.9/src/redis-cli -h ip-10-0-3-134.ec2.internal

其中ip-10-0-3-134.ec2.internal请替换为您自己的redis服务器Private IP DNS name,随后您可以使用命令查看redis中的数据,例如keys * / HGETALL "redisson:tomcat_session:xxxxxxxxx"

[ec2-user@ip-10-0-3-134 ~]$ 
[ec2-user@ip-10-0-3-134 ~]$ /home/ec2-user/redis-6.0.9/src/redis-cli -h ip-10-0-3-134.ec2.internal
ip-10-0-3-134.ec2.internal:6379> keys *
1) "redisson:tomcat_session:31C777EB4C99DFB418980B8D25AA9037"
ip-10-0-3-134.ec2.internal:6379> 
ip-10-0-3-134.ec2.internal:6379> HGETALL "redisson:tomcat_session:31C777EB4C99DFB418980B8D25AA9037"
 1) "session:principal"
 2) "\x04\x04\t>@org.apache.catalina.realm.GenericPrincipal$SerializablePrincipal\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04>\x04name\x16\x00>\bpassword\x16\x00>\tprincipal\x16\x00>\x05roles\x16\x00\x16>\x05admin>\x05admin\x01B\x01\x14>\bstandard"
 3) "session:maxInactiveInterval"
 4) "\x04K\x00\x00\a\b"
 5) "session:authtype"
 6) "\x04>\x04FORM"
 7) "session:creationTime"
 8) "\x04L\x00\x00\x01\x83\x0c\x9f\xf3\x80"
 9) "session:isNew"
10) "\x04Q"
11) "session:isValid"
12) "\x04P"
13) "session:thisAccessedTime"
14) "\x04L\x00\x00\x01\x83\x0c\xa1\x12\xdc"
15) "session:lastAccessedTime"
16) "\x04L\x00\x00\x01\x83\x0c\xa1\x12\xdc"
ip-10-0-3-134.ec2.internal:6379> 

您可以通过exit命令回到redis服务器中,在redis服务器中,您可以再次通过exit命令回到您的堡垒机。


总结

本次迁移完成了Redis和MySql的数据迁移,验证。

本次Redis使用Redis-RIOT工具进行迁移。Mysql迁移采用的是MyDumper,MyLoad进行备份还原。

接下来开始准备应用迁移。