Redis4.0 单节点集群到三主三从节点集群实验

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis4.0 单节点集群到三主三从节点集群实验http://www.bieryun.com/3290.html 环境相关: OS:CentOS release 7.4.1708 IP:192.168.

Redis4.0 单节点集群到三主三从节点集群实验http://www.bieryun.com/3290.html

环境相关:

OS:CentOS release 7.4.1708
IP:192.168.77.101/102/103
MEM:16G
DISK:50G

简单说明

参照《Redis4.0 三主三备集群安装配置》配置三节点主机6个redis实例并启动
第五步配置集群使用本博文操作进行

集群创建

1,在节点一上创建单实例集群:

cp -av /usr/local/redis/src/redis-trib.rb /usr/local/bin
redis-trib.rb create --replicas 0 192.168.77.101:7000
# 创建一个单实例集群会报错,因为redis的集群需要至少3个master实例
# 该报错可以忽略掉,使用fix命令进行修复

这里写图片描述

redis-trib.rb fix 192.168.77.101:7000
# 使用fix命令修复集群,需要交互式输入yes进行确认

这里写图片描述
这里写图片描述

redis-cli -c -h 192.168.77.101 -p 7000 cluster nodes
redis-trib.rb check 192.168.77.101:7000
# 查看集群状态,目前集群只有一个master实例,所有的数据槽都在该实例上
# 单实例集群创建就完成了

2,添加两个主节点:

redis-trib.rb add-node 192.168.77.102:7002 192.168.77.101:7000
redis-trib.rb add-node 192.168.77.103:7004 192.168.77.101:7000
# 使用add-node命令,将102的7002和103的7004添加到集群里
redis-trib.rb check 192.168.77.101:7000
# 查看集群状态,发现目前集群中有三个master实例,但是所有的slot都在第一个master之上
# 此时,新加入的两个master实例没有任何的slot,是可以直接删掉的
redis-trib.rb reshard 192.168.77.101:7000
# 使用reshard命令重新分配slot,需要交互输入重新分配的slot数量和接收实例以及来源实例
# 两次使用该命令,将新添加的两个实例都分配一定数量的slot

这里写图片描述
输入需要重新分配的slot数量
这里写图片描述
输入接收这些slot的实例ID
这里写图片描述
输入这些slot的来源实例ID
这里写图片描述
确认移动

如果是真实的生产环境,在移动数据槽的时候,有可能会超时失败,如移动1000个数据槽到另外一个主实例
原因是某个或某些数据槽占用内存较大,移动操作超时,就需要使用fix命令进行修复
超时失败不会对集群造成影响,已经移动成功的数据槽状态也是没问题的
可以修复后再次重新分布数据槽,减少数据槽的数量,防止再次超时失败

redis-trib.rb fix 192.168.77.101:7000
redis-trib.rb check 192.168.77.101:7000
# 检查集群节点状态,发现三个master实例都有slot存在,此时就不能直接删除master实例

3,添加三个从实例:

redis-trib.rb add-node --slave 192.168.77.101:7001 192.168.77.101:7000
redis-trib.rb add-node --slave 192.168.77.102:7003 192.168.77.101:7000
redis-trib.rb add-node --slave 192.168.77.103:7005 192.168.77.101:7000
# 添加三个slave实例,每个slave实例会自动分配到一个master实例之下
redis-cli -c -h 192.168.77.101 -p 7000 cluster nodes|sort -k2
redis-trib.rb check 192.168.77.101:7000
# 查看集群节点状态

4,生成集群状态报表:
此时的信息输出太多了,可以对cluster nodes命令的输出结果做一下转换,生成状态报表

redis-cli -c -h 192.168.77.101 -p 7000 cluster nodes|\
awk 'BEGIN{print"节点 角色 自身ID 挂接的主实例ID"}
     {if($4=="-") {print $2,$3,$1,$1} 
      else        {print $2,$3,$1,$4}}'|\
sort -rk4|column -t
# 查看集群状态,主备关系
# 当自身ID和挂接的主实例ID相同时,代表本实例是一个master实例
# 否则代表本实例是一个slave实例

5,手动调整master实例和slave实例之间的关系
当一个节点上存在两个以上的实例的时候,如果运行期间发生了宕机实例切换
会产生一个节点上运行多个master实例或者一个节点全部都是slave的情况
或者出现一个节点上的两个实例正好是一对master实例和slave实例
此时就需要手动调整master实例和slvae实例之间的对应关系,以免在节点故障时产生不可用的情况

redis-cli -c -h 192.168.77.101 -p 7001 cluster replicate 45c239f2a6637cb8c5209c7ccd5754acfbaeb6b4
redis-cli -c -h 192.168.77.102 -p 7003 cluster replicate 8af251aab2566469e8742abc80737acc9f7b60a2
redis-cli -c -h 192.168.77.103 -p 7005 cluster replicate 48c93c36580fc7314307ed4eeae6363b15b1be50
# 根据 生成集群状态报表 命令查看集群状态,验证切换操作

6,手动宕机master实例,查看集群热切:

redis-cli -c -h 192.168.77.102 -p 7002 debug segfault
# 将102的7002实例停机
# 根据 生成集群状态报表 命令查看集群状态,验证集群热切
# 发现角色一栏102的7002实例 出现 master,fail 信息
# 该实例原本的slave实例现在变成的master实例,集群热切成功

节点2将停掉的实例启动

/usr/local/bin/redis-server /usr/local/redis/redis_cluster/redis_7002.conf
# 根据 生成集群状态报表 命令查看集群状态,查看集群状态
# 发现停掉的实例启动后变成了slave状态的实例

集群删除

1,删除slave实例:

redis-trib.rb del-node 192.168.77.101:7000 45c239f2a6637cb8c5209c7ccd5754acfbaeb6b4
redis-trib.rb del-node 192.168.77.101:7000 d65247f83fbe5f3c9bc0b25c8ffbd3aace203bea
redis-trib.rb del-node 192.168.77.101:7000 a1c5ede35007ba6c1bf6d9fad907dbe09f7c6f62
# slave角色的实例可以直接删除
# 实例从集群删除后,实例会关闭

2,删除master实例:

redis-trib.rb reshard 192.168.77.101:7000
# 需要将即将删除的master实例上的slot移动到其他master实例上
# 当master实例上有slot存在时,是无法删除的
redis-trib.rb check 192.168.77.101:7000
# 查看待删除的实例上已经没有slot了
redis-trib.rb del-node 192.168.77.101:7000 f2b7cb07b0f3a16c7c650df205ef269933d5badc
redis-trib.rb del-node 192.168.77.101:7000 8af251aab2566469e8742abc80737acc9f7b60a2
# 根据 生成集群状态报表 命令查看集群状态 只剩下一个master实例了
redis-cli -c -h 192.168.77.101 -p 7000 debug segfault
# 将最后一个master实例关闭

3,残余信息删除:
实例删除后,存在残余信息,需要删除才可以做集群的再次创建添加等操作
这些残余信息是实例运行产生的,因此三个节点主机都要删除缓存信息

cd /usr/local/redis/run/data
rm -rf nodes*.conf
# 删除集群配置信息
rm -rf dump*.rdb
# 删除内存快照
rm -rf appendonly*.aof
# 删除aof日志文件
cd ..
rm -rf log/redis*.log
# 删除实例运行日志
tree

简单总结

从本次实验可以看出,redis集群其实没有对master数量和slave数量做限制
两种实例的添加和删除比较灵活,可以根据内存的使用情况增加master,然后迁移数据槽
当然被添加的master的内存限额也是没有限制的,可以根据实际生产负载添加翻倍内存限额的master
slave一般要和master内存限额一样大,因为slave在master宕机后会自动切换成master
为了集群安全,一般一个master至少有一个slave,而且要保证slave不会先于master宕机
如果一个master的所有slave都已经宕机,此时master再宕机的话就会对服务产生影响了

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
3月前
|
监控 NoSQL Redis
看完这篇就能弄懂Redis的集群的原理了
看完这篇就能弄懂Redis的集群的原理了
112 0
|
3月前
|
缓存 NoSQL Redis
【Azure Redis 缓存】Windows版创建 Redis Cluster 实验 (精简版)
【Azure Redis 缓存】Windows版创建 Redis Cluster 实验 (精简版)
|
3月前
|
NoSQL Redis
Redis——单机迁移cluster集群如何快速迁移
Redis——单机迁移cluster集群如何快速迁移
121 0
|
3月前
|
NoSQL Linux Redis
使用docker-compose搭建redis-cluster集群
使用docker-compose搭建redis-cluster集群
503 0
|
3月前
|
NoSQL Linux Redis
基于redis6搭建集群
基于redis6搭建集群
|
1月前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(一)
数据的存储--Redis缓存存储(一)
|
NoSQL Redis 数据安全/隐私保护
|
1月前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
68 6