设为首页 收藏本站
查看: 587|回复: 0

[经验分享] Redis Cluster高可用(HA)集群环境搭建详细步骤

[复制链接]

尚未签到

发表于 2018-11-3 06:00:20 | 显示全部楼层 |阅读模式
  1.为什么要有集群
  由于Redis主从复制架构每个数据库都要保存整个集群中的所有数据,容易形成木桶效应,所以Redis3.0之后的版本添加特性就是集群(Cluster)
  2.Redis集群架构说明

  架构细节:
  (1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
  (2)节点的fail是通过集群中超过半数的master节点检测失效时才生效.
  (3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
  (4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护nodeslotkey
  3.Redis Cluster环境搭建
  3.1 分别修改配置文件,将端口分别设置为:6379、6380、6381,同时要设置pidfile文件为不同的路径。并且允许集群模式,修改集群配置文件指向地址,并且开启远程访问
修改配置文件  
# vim /opt/redis/6379/6379.conf
  

  
# 开启守护进程模式
  
daemonize yes
  

  
# 修改启动端口为6379
  
port 6379
  

  
# 修改pidfile指向路径
  
pidfile /opt/redis/6379/redis_6379.pid
  

  
# 开启允许集群
  
cluster-enabled yes
  

  
# 修改集群配置文件指向路径
  
cluster-config-file nodes-6379.conf
  

  
# 注释一下内容开启远程访问
  
# bind 127.0.0.1 端口不用放开
  
#aof开启
  
appendonly yes
  
# 关闭保护模式
  
#protected-mode no
  
以此类推,修改端口6380及6381配置。
  3.2 分别启动redis实例
# cd /opt/redis/redis-3.2.8/bin  
# ./redis-server /opt/redis/6379/6379.conf
  
# ./redis-server /opt/redis/6380/6380.conf
  
# ./redis-server /opt/redis/6381/6381.conf
  3.3 查看redis状态


  说明redis已经是以集群方式启动了,但是redis之间关系还没确定下来
  3.4 因为redis-trib.rb是由ruby语言编写的所以需要安装ruby环境
安装ruby环境  
# yum -y install zlib ruby rubygems
  

  
#gem install redis
  
报异常:解决
  
https://www.cnblogs.com/PatrickLiu/p/8454579.html
  3.5 建立集群Redis关系
首先,进入redis的安装包路径下  
# cd /opt/redis/redis-3.2.8/src
  

  
执行命令:
  
# ./redis-trib.rb create --replicas 0 192.168.29.128:6379 192.168.29.128:6380 192.168.29.128:6381
  

  
说明:--replicas 0:指定了从数据的数量为0
  
注意:这里不能使用127.0.0.1,否则在Jedis客户端使用时无法连接到!
  3.6 如果出现如下异常
sr/local/share/gems/gems/redis-3.2.1/lib/redis/client.rb:113:in `call': ERR Slot 0 is already busy (Redis::CommandError)  
        from /usr/local/share/gems/gems/redis-3.2.1/lib/redis.rb:2556:in `block in method_missing'
  
        from /usr/local/share/gems/gems/redis-3.2.1/lib/redis.rb:37:in `block in synchronize'
  
        from /usr/share/ruby/monitor.rb:211:in `mon_synchronize'
  
        from /usr/local/share/gems/gems/redis-3.2.1/lib/redis.rb:37:in `synchronize'
  
        from /usr/local/share/gems/gems/redis-3.2.1/lib/redis.rb:2555:in `method_missing'
  
        from ./redis-trib.rb:212:in `flush_node_config'
  
        from ./redis-trib.rb:776:in `block in flush_nodes_config'
  
        from ./redis-trib.rb:775:in `each'
  
        from ./redis-trib.rb:775:in `flush_nodes_config'
  
        from ./redis-trib.rb:1296:in `create_cluster_cmd'
  
        from ./redis-trib.rb:1701:in `'
  经检查,这是由于上一次配置集群失败时留下的配置信息导致的。 只要把redis.conf中定义的 cluster-config-file 所在的文件删除,重新启动redis-server及运行redis-trib即可。
  3.7 建立集群Redis关系正常执行响应如下
>>> Creating cluster  
>>> Performing hash slots allocation on 3 nodes...
  
Using 3 masters:
  
192.168.29.128:6379
  
192.168.29.128:6380
  
192.168.29.128:6381
  
M: d5d0951bb185a67a44d29dd2142170dbce84d977 192.168.29.128:6379
  
   slots:0-5460 (5461 slots) master
  
M: e41fe58ef571836d891656b482307628b3f7ab35 192.168.29.128:6380
  
   slots:5461-10922 (5462 slots) master
  
M: ddbc810661f81500059e0b22b1550713a0e3766d 192.168.29.128:6381
  
   slots:10923-16383 (5461 slots) master
  
Can I set the above configuration? (type 'yes' to accept): yes
  
>>> Nodes configuration updated
  
>>> Assign a different config epoch to each node
  
>>> Sending CLUSTER MEET messages to join the cluster
  
Waiting for the cluster to join...
  
>>> Performing Cluster Check (using node 192.168.29.128:6379)
  
M: d5d0951bb185a67a44d29dd2142170dbce84d977 192.168.29.128:6379
  
   slots:0-5460 (5461 slots) master
  
   0 additional replica(s)
  
M: ddbc810661f81500059e0b22b1550713a0e3766d 192.168.29.128:6381
  
   slots:10923-16383 (5461 slots) master
  
   0 additional replica(s)
  
M: e41fe58ef571836d891656b482307628b3f7ab35 192.168.29.128:6380
  
   slots:5461-10922 (5462 slots) master
  
   0 additional replica(s)
  
[OK] All nodes agree about slots configuration.
  
>>> Check for open slots...
  
>>> Check slots coverage...
  
[OK] All 16384 slots covered.
  
成功
*****************************************************************************  
注:redis集群 Waiting for the cluster to join 一直等待
  
./redis-trib.rb create --replicas 1 XXXX:PORT1 XXXX:PORT2 ....
  
的时候
  
一直等待 Waiting for the cluster to join 很久都没有反应
  
原因:
  
redis集群不仅需要开通redis客户端连接的端口,而且需要开通集群总线端口
  
集群总线端口为redis客户端连接的端口 + 10000
  
如redis端口为6379
  
则集群总线端口为16379
  
故,所有服务器的点需要开通redis的客户端连接端口和集群总线端口
  
注意:iptables 放开,如果有安全组,也要放开这两个端口
  
*******************************************************************************
  3.8 查看集群节点信息

  3.9 测试
  3.9.1 测试插入数据

  因为abc的hash槽信息是在6380上,现在使用redis-cli连接的6379,无法完成set操作,需要客户端跟踪重定向。使用redis-cli -c
  3.9.2 重新测试插入数据

  4. 插槽的概念及插槽分配
  整个Redis提供了16384个插槽,也就是说集群中的每个节点分得的插槽数总和为16384。./redis-trib.rb
脚本实现了是将16384个插槽平均分配给了N个节点。当我们执行set abc 123命令时,redis是如何将数据保存到集群中的呢?执行步骤:
i.接收命令set abc 123ii.通过key(abc)计算出插槽值,然后根据插槽值找到对应的节点。abc的插槽值为:7638iii.重定向到该节点执行命令123  注意:如果插槽数有部分是没有指定到节点的,那么这部分插槽所对应的key将不能使用。
  5.新增集群节点
  5.1 再开启一个实例的端口为6382 配置同上

  5.2 执行脚本建立6382节点与集群的关系

  5.3 查看集群状态,发现新增的节点没有插槽

  5.4 给6382节点分配插槽

  5.5 查看集群节点状态

  6.删除集群节点
  想要删除集群节点中的某一个节点,需要严格执行2步:
  6.1.将这个节点上的所有插槽转移到其他节点上
  6.1.1执行脚本:./redis-trib.rb reshard 192.168.29.128:6382
  6.1.2选择需要转移的插槽的数量,因为6382有100个,所以转移100个
  6.1.3输入转移的节点的id,我们转移到6379节点
  6.1.4输入插槽来源id,也就是6382的id
  6.1.5输入done,开始转移

  6.1.6查看集群节点信息,可以看到6380节点已经没有插槽了

  6.2.删除节点
  6.2.1 删除节点

  6.2.2 查看集群节点信息

  7. Redis Cluster高可用
  7.1 假设集群中某一节点宕机 测试数据写入操作


  我们尝试执行set命令,结果发现无法执,行集群不可用了?? 这集群也太弱了吧??
  7.2 集群中的主从复制架构

  7.3 本教程不详细介绍集群中主从复制架构的具体安装,只提一下过程
  7.3.1 为每个集群节点添加Slave,形成主从复制架构,主从复制架构可参考:主从复制架构,搭建结构如下所示
6379(Master)     6479(Slave of 6379)     6579(Slave of 6379)  
6380(Master)     6480(Slave of 6380)     6580(Slave of 6380)
  
6381(Master)     6481(Slave of 6381)     6581(Slave of 6381)
  7.3.2 为每个主从复制架构添加哨兵集群,哨兵模式集群可参考:哨兵模式集群
  7.3.3 创建集群 使用如下命令
./redis-trib.rb create --replicas 2 192.168.29.128:6379 192.168.29.128:6380 192.168.29.128:6381 192.168.29.128:6479 192.168.29.128:6480 192.168.29.128:6481 192.168.29.128:6579 192.168.29.128:6580 192.168.29.128:6581  参考:
  https://blog.csdn.net/robertohuang/article/details/70833231



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-629946-1-1.html 上篇帖子: Redis 高可用部署 下篇帖子: redis单实例安装
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表