当前位置: 首页 > news >正文

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

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

环境相关:

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再宕机的话就会对服务产生影响了

原文地址http://www.bieryun.com/3290.html

相关文章:

  • 基于面向对象编程的设计模式
  • 查询是否sci或者ei收录
  • 直接写position:absolute,后面不加top和left等值,是什么意思?分两种情况
  • 创建镜像iso文件
  • 深入理解HashMap底层原理剖析(JDK1.8)
  • 软件测试--测试用例
  • 【vuejs深入二】vue源码解析之一,基础源码结构和htmlParse解析器
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • SQL SERVER全面优化-------写出好语句是习惯
  • IIS PHP
  • Lsyncd - 实时文件同步工具(精译)
  • oo第二次博客作业
  • react 进行时
  • Spark2.1.0之运行环境准备
  • 静态路由与扩展ACL配置
  • bootstrap创建登录注册页面
  • create-react-app项目添加less配置
  • es6
  • JavaScript函数式编程(一)
  • JavaScript设计模式之工厂模式
  • nginx 配置多 域名 + 多 https
  • Sass Day-01
  • vue 配置sass、scss全局变量
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 基于webpack 的 vue 多页架构
  • 七牛云假注销小指南
  • 前端学习笔记之观察者模式
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 实现菜单下拉伸展折叠效果demo
  • - 转 Ext2.0 form使用实例
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • ​TypeScript都不会用,也敢说会前端?
  • #if #elif #endif
  • $.each()与$(selector).each()
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (八)Flask之app.route装饰器函数的参数
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (十八)SpringBoot之发送QQ邮件
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (四)库存超卖案例实战——优化redis分布式锁
  • (转载)Linux网络编程入门
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .gitignore文件—git忽略文件
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .net CHARTING图表控件下载地址
  • .NET Core 成都线下面基会拉开序幕
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • .NET序列化 serializable,反序列化
  • .NET中的Exception处理(C#)
  • .pub是什么文件_Rust 模块和文件 - 「译」