百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

redis 集群数据迁移

mhr18 2024-11-24 18:43 16 浏览 0 评论

由于 centos7 停止维护,公司需要把原先运行在 centos7 主机上的 redis 集群迁移到 ubuntu。在迁移过程中 redis 集群要保持正常工作,这样使用 redis 的服务就不会受到影响。

本文以实际的 redis 集群为例,展示下如何把一个运行在centos7 主机上的 redis 集群迁移到 ubuntu。本文 redis 集群有6个实例,3主3从,每两个 redis 实例运行在同一台 centos7 主机,最终迁移效果如下图所示。

列举集群主要信息如下,方便阅读文章。

各个主机 ip
redis0010: 10.66.10.163
redis0011: 10.66.10.164
redis0012: 10.66.10.165

每台主机上使用 docker 运行了两个 redis 实例:redis-1 端口为 7000, redis-2 端口为 7001;{主机名}:{redis 实例名} 表示某个 redis 实例,譬如 redis0010 主机上 redis-1 实例我们称为 redis0010:redis-1。

迁移策略

redis 集群通过 ip 互通,若集群的 slave 节点关机,只会影响主从复制,不会影响 redis 集群功能,因此可以一步步迁移 redis slave 节点实现 redis 集群迁移。redis 迁移步骤如下:

  1. 从某一 centos7 主机开始,若 centos7 主机含有 redis master 节点,把它切换为 slave 节点。打包 centos7 redis 数据拷贝到 unbuntu 主机,把 centos7 主机关闭。
  2. ubuntu 主机 ip、主机名 更改为对应 centos7 主机 ip、主机名。在 ubuntu 主机安装 redis 服务,把上面打包好的 centos7 redis 数据放到指定目录,启动 redis 服务。
  3. 按同样步骤把所有其他 centos7 redis 节点迁移到 ubuntu,完毕后平衡下 redis 集群 master 节点。

centos7 redis 集群迁移前状态如下,本文会把主机 redis0010 迁移到 ubuntu,其他 centos7 主机可以按照相同方法操作。

root@redis0010:/root# docker exec -it redis-1 redis-cli -h 127.0.0.1 -p 7000 -a 123456 cluster nodes
# 各项含义
# 节点 id; ip:port,@17001或@1700 是 gossip 协议端口;节点标志;master 节点 id;上次此节点发送 ping 时间;上次此节点收到 pong 时间;节点的epoch值;连接状态;节点槽范围
e3966736ced5e79498ca7c44cf2db49a1854fe27 10.66.10.165:7001@17001 slave a4661cdda8da51884df58f94c56b38fe6f0d0203 0 1729928572000 6 connected # redis0012:redis-2
b97cff5886946f42d36ce2463ac5b1bba37e7e9a 10.66.10.164:7001@17001 slave 2d7ad36745f32294d9615dac771206f456dba2fb 0 1729928574594 4 connected # redis0011:redis-2
8ee7a6c4f6054d8babebdefbc819b952422f3ed1 10.66.10.165:7000@17000 master - 0 1729928573592 5 connected 10923-16383 # redis0012:redis-1
a4661cdda8da51884df58f94c56b38fe6f0d0203 10.66.10.164:7000@17000 master - 0 1729928571000 3 connected 5461-10922 # redis0011:redis-1
f609eaa15c1f7933a445a612ffb6d54b2a643603 10.66.10.163:7001@17001 slave 8ee7a6c4f6054d8babebdefbc819b952422f3ed1 0 1729928574000 5 connected # redis0010:redis-2
2d7ad36745f32294d9615dac771206f456dba2fb 10.66.10.163:7000@17000 myself,master - 0 1729928573000 1 connected 0-5460 # redis0010:redis-1

centos7 redis 切 master 保存数据

redis0010 主机上有两个 redis 实例,redis0010:redis-1 是 master 节点,对应的 slave 节点是 redis0011:redis-2(ip=10.66.10.164,port=7001)。

root@redis0010:/data1/redis# docker exec -it redis-1 redis-cli -h 127.0.0.1 -p 7000 -a 123456 info replication
Warning: Using a password with '-a' option on the command line interface may not be safe.
# Replication
role:master # 节点角色
connected_slaves:1 # 连接的 slave 节点数
slave0:ip=10.66.10.164,port=7001,state=online,offset=460628,lag=0 #  slave 节点信息,对应 redis0011:redis-2
master_replid:27afbc43fa796ee4719a20fe1d6b86df9aa28244 # master 复制 id
master_replid2:0000000000000000000000000000000000000000 # 第二个复制 ID,用于部分重新同步。如果未使用,则设置为全零
master_repl_offset:460628 # master 节点复制位置
second_repl_offset:-1 # 第二个复制 ID 的复制位置
repl_backlog_active:1 # 标志 backlog 是否处于活动状态,1表示处于活动状态
repl_backlog_size:1048576 # backlog 大小
repl_backlog_first_byte_offset:1 # backlog 首字节位置
repl_backlog_histlen:460628 # backlog 的数据量大小

在 redis0011:redis-2 实例上执行 cluster failover 指令切换 redis0010:redis-1 为 slave 节点,redis0011:redis-2 为master节点。

root@redis0011:/home/supper-user# docker exec -it redis-2 redis-cli -h 127.0.0.1 -p 7001 -a 123456 cluster failover
Warning: Using a password with '-a' option on the command line interface may not be safe.
OK
root@redis0011:/home/supper-user# docker exec -it redis-2 redis-cli -h 127.0.0.1 -p 7001 -a 123456 info replication
Warning: Using a password with '-a' option on the command line interface may not be safe.
# Replication
role:master # redis0011:redis-2 变为了 master 
connected_slaves:1  # 连接的 slave 节点数为1
slave0:ip=10.66.10.163,port=7000,state=online,offset=465374,lag=1 # slave 节点是 redis0010:redis-1
master_replid:394c1be24b1128f1b814e1bee32bbe62e614e3cb # master 复制 id
master_replid2:27afbc43fa796ee4719a20fe1d6b86df9aa28244 # 第二个复制 ID,用于部分重新同步
master_repl_offset:478492 # master 节点复制位置
second_repl_offset:465319 # 第二个复制 ID 的复制位置
repl_backlog_active:1 # 标志 backlog 是否处于活动状态,1表示处于活动状态
repl_backlog_size:1048576 # backlog 大小
repl_backlog_first_byte_offset:1 # backlog 首字节位置
repl_backlog_histlen:478492 # backlog 的数据量大小

查看下 redis0010:redis-1 节点,验证其确实变为 slave 节点。

root@redis0010:/home/supper-user# docker exec -it redis-1 redis-cli -h 127.0.0.1 -p 7000 -a 123456 info replication
Warning: Using a password with '-a' option on the command line interface may not be safe.
# Replication
role:slave # redis0010:redis-1 节点 变为了 slave
master_host:10.66.10.164 # redis0011 主机ip
master_port:7001 # redis-2 实例端口
master_link_status:up # master 连接状态
master_last_io_seconds_ago:6 # 上次和 master 节点连接后过去的时间 
master_sync_in_progress:0 #  表明 slave 是否正在和 master 进行数据同步,0 表示否
slave_repl_offset:478618 # slave 节点复制位置
slave_priority:100 # slave 节点优先级
slave_read_only:1 # read only
connected_slaves:0 # 连接的 slave 节点数为0
master_replid:394c1be24b1128f1b814e1bee32bbe62e614e3cb # master 复制 id
master_replid2:27afbc43fa796ee4719a20fe1d6b86df9aa28244 # 第二个复制 ID,用于部分重新同步
master_repl_offset:478618 # master 节点复制位置
second_repl_offset:465319 # 第二个复制 ID 的复制位置
repl_backlog_active:1 # 标志 backlog 是否处于活动状态,1表示处于活动状态
repl_backlog_size:1048576 # backlog 大小
repl_backlog_first_byte_offset:1 # backlog 首字节位置
repl_backlog_histlen:478618 # backlog 的数据量大小

redis0010 主机上另一 redis 实例 redis0010:redis-2 是 slave 节点。关闭实例 redis0010:redis-1,redis0010:redis-2。

root@redis0010:/home/supper-user# docker exec -it redis-1 redis-cli -h 127.0.0.1 -p 7000 -a 123456 shutdown save
root@redis0010:/home/supper-user# docker exec -it redis-2 redis-cli -h 127.0.0.1 -p 7001 -a 123456 shutdown save

此时 redis 集群状态图如下

在 redis0011:redis-2 实例上查看 redis 集群状态,与集群状态图一致。

root@redis0011:/home/supper-user# docker exec -it redis-2 redis-cli -h 127.0.0.1 -p 7001 -a 123456 cluster nodes
Warning: Using a password with '-a' option on the command line interface may not be safe.
# 各项含义
# 节点 id; ip:port,@17001或@1700 是 gossip 协议端口;节点标志;master 节点 id;上次此节点发送 ping 时间;上次此节点收到 pong 时间;节点的epoch值;连接状态;节点槽范围
a4661cdda8da51884df58f94c56b38fe6f0d0203 10.66.10.164:7000@17000 master - 0 1729949734825 3 connected 5461-10922 # redis0011:redis-1
f609eaa15c1f7933a445a612ffb6d54b2a643603 10.66.10.163:7001@17001 slave,fail 8ee7a6c4f6054d8babebdefbc819b952422f3ed1 1729949267898 1729949265393 5 disconnected # redis0010:redis-2 服务已经关闭
e3966736ced5e79498ca7c44cf2db49a1854fe27 10.66.10.165:7001@17001 slave a4661cdda8da51884df58f94c56b38fe6f0d0203 0 1729949736000 6 connected # redis0012:redis-2
8ee7a6c4f6054d8babebdefbc819b952422f3ed1 10.66.10.165:7000@17000 master - 0 1729949736831 5 connected 10923-16383 # redis0012:redis-1
2d7ad36745f32294d9615dac771206f456dba2fb 10.66.10.163:7000@17000 slave,fail b97cff5886946f42d36ce2463ac5b1bba37e7e9a 1729949266696 1729949264000 7 disconnected # redis0010:redis-1 服务已经关闭
b97cff5886946f42d36ce2463ac5b1bba37e7e9a 10.66.10.164:7001@17001 myself,master - 0 1729949735000 7 connected 0-5460 # redis0011:redis-2 

打包 redis0010 主机 redis0010:redis-1,redis0010:redis-2 数据,并发送到 ubuntu 主机 redis0007,然后关闭主机 redis0010 主机

root@redis0010:/home/supper-user# tar -zcvf redis_data.tar.gz /data1/redis
root@redis0010:/home/supper-user# scp redis_data.tar.gz redis0007:/data1/
root@redis0010:/home/supper-user# init 0

ubuntu 主机系统设置启动 redis 服务

ubuntu 主机名 redis0007 修改为 redis0010

root@redis0007:/data1# hostname 
redis0007 # 修改前主机名为 redis0007
root@redis0007:/data1# hostnamectl set-hostname redis0010
root@redis0007:/data1# sed -i 's/redis0007/redis0010/g' /etc/hosts
root@redis0007:/data1# hostname 
redis0010 # 现在主机名修改为 redis0010

ubuntu 主机 ip 10.66.10.160 切换为 redis0010 主机 ip 10.66.10.163

root@redis0007:/data1# sed -i 's/10.66.10.160/10.66.10.163/g' /etc/hosts  # 把 redis0007 ip 改为 redis0010 ip
root@redis0007:/data1# sed -i 's/10.66.10.160/10.66.10.163/g' /etc/netplan//99-netcfg-vmware.yaml # 修改 /etc/netplan 下的配置文件,把redis0007 ip 配置为 10.66.10.163,然后设置网络
root@redis0007:/data1# netplan apply

在 ubuntu redis0010 主机,redis 使用从 centos7 redis 迁移过来的数据 redis_data.tar.gz,启动 redis 服务,这里省略 redis 服务部署过程。查看 redis 集群状态。

root@redis0010:/data1/tempdir# docker exec -it redis-2 redis-cli -h 127.0.0.1 -p 7001 -a 123456 cluster nodes
Warning: Using a password with '-a' option on the command line interface may not be safe.
# 各项含义
# 节点 id; ip:port,@17001或@1700 是 gossip 协议端口;节点标志;master 节点 id;上次此节点发送 ping 时间;上次此节点收到 pong 时间;节点的epoch值;连接状态;节点槽范围
2d7ad36745f32294d9615dac771206f456dba2fb 10.66.10.163:7000@17000 slave b97cff5886946f42d36ce2463ac5b1bba37e7e9a 0 1730022238000 7 connected # redis0010:redis-1, 刚从 centos7 主机迁移到 ubuntu 主机
e3966736ced5e79498ca7c44cf2db49a1854fe27 10.66.10.165:7001@17001 slave a4661cdda8da51884df58f94c56b38fe6f0d0203 0 1730022239087 6 connected # redis0012:redis-2
f609eaa15c1f7933a445a612ffb6d54b2a643603 10.66.10.163:7001@17001 myself,slave 8ee7a6c4f6054d8babebdefbc819b952422f3ed1 0 1730022237000 2 connected # redis0010:redis-2, 刚从 centos7 主机迁移到 ubuntu 主机
b97cff5886946f42d36ce2463ac5b1bba37e7e9a 10.66.10.164:7001@17001 master - 0 1730022236082 7 connected 0-5460 # redis0011:redis-2
a4661cdda8da51884df58f94c56b38fe6f0d0203 10.66.10.164:7000@17000 master - 0 1730022238085 3 connected 5461-10922 # redis0011:redis-1
8ee7a6c4f6054d8babebdefbc819b952422f3ed1 10.66.10.165:7000@17000 master - 0 1730022237083 5 connected 10923-16383 # redis0012:redis-1

此时 redis 集群状态图如下:

其他 centos7 主机 redis0011,redis0012 上 redis 服务可按相同方法迁移。

平衡 redis 集群 master 节点

centos7 redis 都迁移到 ubuntu 主机后,redis 集群状态 如下图所示,其中两个 master 节点在同一台 ubuntu 主机 redis0010,需要把 master 节点均匀分布到不同主机。

在 redis0012:redis-1 执行 cluster failover 把它转为 master 节点,redis0010:redis-2 转为 slave 节点,即可实现 master 节点均匀分布到不同主机。

docker exec -it redis-2 redis-cli -h 127.0.0.1 -p 7000 -a 123456 cluster failover
Warning: Using a password with '-a' option on the command line interface may not be safe.
OK
root@redis0012:/data1# docker exec -it redis-2 redis-cli -h 127.0.0.1 -p 7000 -a 123456 cluster nodes
Warning: Using a password with '-a' option on the command line interface may not be safe.
# 各项含义
# 节点 id; ip:port,@17001或@1700 是 gossip 协议端口;节点标志;master 节点 id;上次此节点发送 ping 时间;上次此节点收到 pong 时间;节点的epoch值;连接状态;节点槽范围
b97cff5886946f42d36ce2463ac5b1bba37e7e9a 10.66.10.164:7001@17001 slave 2d7ad36745f32294d9615dac771206f456dba2fb 0 1730028806000 8 connected # redis0011:redis-2
2d7ad36745f32294d9615dac771206f456dba2fb 10.66.10.163:7000@17000 master - 0 1730028806148 8 connected 0-5460 # redis0010:redis-1
8ee7a6c4f6054d8babebdefbc819b952422f3ed1 10.66.10.165:7000@17000 myself,master - 0 1730028804000 14 connected 10923-16383 # redis0012:redis-1
e3966736ced5e79498ca7c44cf2db49a1854fe27 10.66.10.165:7001@17001 slave a4661cdda8da51884df58f94c56b38fe6f0d0203 0 1730028807150 13 connected # redis0012:redis-2
a4661cdda8da51884df58f94c56b38fe6f0d0203 10.66.10.164:7000@17000 master - 0 1730028805145 13 connected 5461-10922 # redis0011:redis-1
f609eaa15c1f7933a445a612ffb6d54b2a643603 10.66.10.163:7001@17001 slave 8ee7a6c4f6054d8babebdefbc819b952422f3ed1 0 1730028805000 14 connected # redis0010:redis-2

redis 集群状态图最终如下


本文介绍了如何把运行在 centos7 上的 redis 集群 迁移到 ubuntu,并保持 redis 集群不停服,作此记录,以兹后用。

相关推荐

如何检查 Linux 服务器是物理服务器还是虚拟服务器?

在企业级运维、故障排查和性能调优过程中,准确了解服务器的运行环境至关重要。无论是物理机还是虚拟机,都存在各自的优势与限制。在很多场景下,尤其是当你继承一台服务器而不清楚底层硬件细节时,如何快速辨识它是...

第四节 Windows 系统 Docker 安装全指南

一、Docker在Windows上的运行原理(一)架构限制说明Docker本质上依赖Linux内核特性(如Namespaces、Cgroups等),因此在Windows系统上无法直...

C++ std:shared_ptr自定义allocator引入内存池

当C++项目里做了大量的动态内存分配与释放,可能会导致内存碎片,使系统性能降低。当动态内存分配的开销变得不容忽视时,一种解决办法是一次从操作系统分配一块大的静态内存作为内存池进行手动管理,堆对象内存分...

Activiti 8.0.0 发布,业务流程管理与工作流系统

Activiti8.0.0现已发布。Activiti是一个业务流程管理(BPM)和工作流系统,适用于开发人员和系统管理员。其核心是超快速、稳定的BPMN2流程引擎。Activiti可以...

MyBatis动态SQL的5种高级玩法,90%的人只用过3种

MyBatis动态SQL在日常开发中频繁使用,但大多数开发者仅掌握基础标签。本文将介绍五种高阶技巧,助你解锁更灵活的SQL控制能力。一、智能修剪(Trim标签)应用场景:动态处理字段更新,替代<...

Springboot数据访问(整合Mybatis Plus)

Springboot整合MybatisPlus1、创建数据表2、引入maven依赖mybatis-plus-boot-starter主要引入这个依赖,其他相关的依赖在这里就不写了。3、项目结构目录h...

盘点金州勇士在奥克兰13年的13大球星 满满的全是...

见证了两个月前勇士与猛龙那个史诗般的系列赛后,甲骨文球馆正式成为了历史。那个大大的红色标志被一个字母一个字母地移除,在周四,一切都成为了过去式。然而这座,别名为“Roaracle”(译注:Roar怒吼...

Mybatis入门看这一篇就够了(mybatis快速入门)

什么是MyBatisMyBatis本是apache的一个开源项目iBatis,2010年这个项目由apachesoftwarefoundation迁移到了googlecode,并且改名为M...

Springboot数据访问(整合druid数据源)

Springboot整合druid数据源基本概念SpringBoot默认的数据源是:2.0之前:org.apache.tomcat.jdbc.pool.DataSource2.0及之后:com.z...

Linux 中的 &quot;/etc/profile.d&quot; 目录有什么作用 ?

什么是/etc/profile.d/目录?/etc/profile.d/目录是Linux系统不可或缺的一部分保留配置脚本。它与/etc/profile文件相关联,这是一个启动脚本,该脚...

企业数据库安全管理规范(企业数据库安全管理规范最新版)

1.目的为规范数据库系统安全使用活动,降低因使用不当而带来的安全风险,保障数据库系统及相关应用系统的安全,特制定本数据库安全管理规范。2.适用范围本规范中所定义的数据管理内容,特指存放在信息系统数据库...

Oracle 伪列!这些隐藏用法你都知道吗?

在Oracle数据库中,有几位特殊的“成员”——伪列,它们虽然不是表中真实存在的物理列,但却能在数据查询、处理过程中发挥出意想不到的强大作用。今天给大家分享Oracle伪列的使用技巧,无论...

Oracle 高效处理数据的隐藏神器:临时表妙用

各位数据库搬砖人,在Oracle的代码世界里闯荡,处理复杂业务时,是不是总被数据“搅得头大”?今天给大家安利一个超实用的隐藏神器——临时表!当你需要临时存储中间计算结果,又不想污染正式数据表...

Oracle 数据库查询:多表查询(oracle多表关联查询)

一、多表查询基础1.JOIN操作-INNERJOIN:返回两个表中满足连接条件的匹配行,不保留未匹配数据。SELECTa.emp_id,b.dept_nameFROMempl...

一文掌握怎么利用Shell+Python实现多数据源的异地备份程序

简介:在信息化时代,数据安全和业务连续性已成为企业和个人用户关注的焦点。无论是网站数据、数据库、日志文件,还是用户上传的文档、图片等,数据一旦丢失,损失难以估量。尤其是当数据分布在多个不同的目录、服务...

取消回复欢迎 发表评论: