在实际工作中,由于某些原因,我们可能需要移动或复制存储在一个redis实例中的数据。这时,就需要进行数据迁移。
Redis作为现在最火的缓存存储系统,本身自带了很多功能可以满足数据迁移的需求。我们来看看如何使用redis自带的功能来实现单个实例与单个实例,单个实例与集群之间的数据迁移。
1、单个实例之间的数据迁移
1.1主从同步方式
a、启动两个redis实例
./redis-serverconf/redis1.conf
./redis-serverconf/redis2.conf
b、通过把目的实例设置为源实例的一个从实例,我们可以复制源Redis实例中的所有数据
Slaveof192.168.1.7 6379
c、同步完成后,我们通过slave noone命令将目的实例设置为主实例
Slaveofno one
1.2加载持久化文件同步
a、 除了主从关系外还可以使用AOF持久化文件来进行数据迁移。源实例和目的实例都需要启用AOF持久化,并将aof-use-rdb-preamble参数设为yes。这样做可以同时利用RDB和AOF的优点:
两个实例节点都执行如下命令:
Config set appendonly yes
Config set aof-use-rdb-preamble yes
b、 在源实例中执行BGREWRITEAOF命令
c、 Shutdown命令停止目的实例
d、 将append.aof文件复制到目的实例的数据目录并重新启动目的实例。
e、 启动目的实例,在目的实例中查看复制的数据
1.3使用MIGRATE命令
使用MIGRATE命令将特定的键从一个实例移动到另一个实例。
执行如下命令
//查询要移动的键
$KEYS = ‘bin/redis-cli –p 6379 –scan –patternuser:* | awk ‘{printf(“%s ”,$1)}’’
//输出查询结果
echo $KEYS
//执行migrate命令
bin/redis-cli –p 6379 migrate 127.0.0.16380 “” 0 500 replace keys $KEYS
//查询复制结果
bin/redis-cli –p 6380 –scan –pattern user:*
2、Redis实例与Redis集群间数据迁移
Redis实例与redis集群间数据迁移都是基于AOF功能来实现,所不同的是集群加载aof文件的节点不同。
2.1集群主实例加载AOF文件
a、 创建集群,集群中只有主实例没有从实例。
b、 单个源实例启用AOF持久化,并将aof-use-rdb-preamble设为yes
c、 关闭集群中拥有所有槽的主实例,然后将源实例的AOF持久化文件复制到这个实例的数据目录
d、 启动集群中的主实例,并检查AOF文件是否已被加载
e、 使用redis-trib.rb脚本对数据集重新分片
f、 在集群中使用clusternodes命令检查是否所有的槽都已经按照我们的意愿进行了分片
g、 向集群的每个主节点发送DBSIZE命令。计算所有键综合,查看所有数据是否已被迁移到redis集群
2.2集群非主实例节点加载AOF文件
a、 配置redi集群中的所有主节点并完成槽的分配。
b、 关闭集群中的一个节点,并将AOF持久化文件复制到节点的数据目录中。重启节点:
c、 使用bin/redis-cli的-c选项链接到集群。当尝试获取位于在集群其它节点上的键时,将会报错
d、 使用redis-trib.rb的fix命令修复这个问题。然后,在集群的每个节点上执行DBSIZE命令
f、 现在我们可以成功地获取键了
我们可以利用这种方法将数据从一个小的redis集群迁移到另一个具有更多节点的集群。
除了复制持久化文件外,我们还可以使用redis-trib.rb直接进行数据迁移。
script/redis-trib.rbimport --replace --from 192.168.1.7:6379 192.168.1.65:6379
3、数据迁移原理分析
单实例与单实例之间数据迁移前两种方法利用了主从同步及加载持久化文件,这两种方法都很容易理解。
第三种方法使用了migrate命令。正如redis命令文档中所述,该命令实际上在源实例中执行了dump,并在目的实例中执行了restore。Migrate命令有两个选项,copy和replace,用于决定这个命令的行为。如果指定了copy选项,那么源实例中的数据在迁移后不会被删除。此外,使用replace选项可以在迁移过程中覆盖目的实例中已有的键。
单实例与一个redis集群间的数据迁移。前两种方法利用了aof持久化做为数据迁移的媒介。第三中方法实际在内部使用了scan和migrate命令从源实例向集群的一个节点复制键。通过计算键和槽的映射,redis-trib.rb脚本会直接把键发送到相应的槽。所以,我们不需要重新定位键或进行槽分片。
留言与评论(共有 0 条评论) |