Redis Cluster 集群解决方案

Redis Cluster 集群解决方案

  • 多个 Redis 实例协同进行
  • 采用 slot (槽)分割数据,是 CRC16 与 16384 取模后分散
  • 主从结构和选举算法,保证每个节点的可靠性
  • 客户端可以连接任意一个 node 进行操作

主从协同进行

  • 所有的 redis 节点彼此互联(PING-PONG 机制),内部使用二进制协议优化传输速度和带宽。
  • 节点的 fail 是通过集群中超过半数的节点检测失效时才生效。
  • 客户端与 redis 节点直连,不需要中间 proxy 层,客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。
  • redis-cluster 把所有的物理节点映射到 [0-16383] slot 上,cluster 负责维护 node <-> slot <-> value

当有一台服务器出现故障时

Redis Cluster 注意事项

  • 不完全支持批量操作:mset、mget
  • 事务不能跨节点支持
  • 不支持多实例
  • key 是最小粒度
  • 最少 6 个才能保证组成完整高可用的集群
  • 连接的时候只需要连接 1 台服务器即可。
  • 如果 1 个主从连接宕机的话,那么集群就宕机了。

Redis Cluster 配置步骤

(建议使用官方安装包的方式安装 redis,不要使用 apt-get install 或者 yum 直接安装)

  1. 分别安装 6 台 服务器,三个主节点,三个从节点

我这里采用的是虚拟机,相应的 ip 地址分别为:

  • 192.168.174.128 (28 号服务器)
  • 192.168.174.129 (29 号服务器)
  • 192.168.174.130 (30 号服务器)
  • 192.168.174.131 (31 号服务器)
  • 192.168.174.132 (32 号服务器)
  • 192.168.174.133 (33 号服务器)
  1. 配置 redis.conf 配置文件 (在所有的服务器上操作)

vim /etc/redis/redis.conf

  • 第一步:

# 默认为本地 ip 地址,需要改成当前服务器的 ip 地址,以便其他服务器可以正常访问
  69 bind 127.0.0.1 ::1
  
# 比如 28 号服务器更改为以下 ip 地址
bind 192.168.174.128
  • 第二步:

# 这个参数的含义是指:禁止公网连接 redis 缓存,这样可以加强 redis 安全性。如果是在线上环境的话,我们不需要更改此参数值,然后需要进行设置账号密码,进行 auth 认证。这里为了测试方便,我们直接改成 no
  89 protected-mode yes
  
# 需要更改为以下
protected-mode no
  • 第三步:开启集群相关参数

# 默认集群是关闭的
 815 # cluster-enabled yes

# 需要更改为以下(去除掉 # 号注释即可)
 815 cluster-enabled yes
  • 第四步:开启集群配置文件
# 默认集群配置文件是关闭的
 823 # cluster-config-file nodes-6379.conf
 
# 需要更改为以下(去除掉 # 号注释即可) 
 823 cluster-config-file nodes-6379.conf 
 
  • 第五步:开启集群超时时间
# 当一个节点出现问题的时候,最大超时连接时间为 15s ,当超过 15s 还没有连接的时候,就会认为该节点出现故障了,就会通过选举算法,将从服务器提升为主服务器。该参数默认是关闭的。
 829 # cluster-node-timeout 15000
 
# 需要更改为以下(去除掉 # 号注释即可)
 829 cluster-node-timeout 15000
 
  1. 安装 ruby 组件。如果不安装这个软件,集群的时候,会报组件错误。你需要在那台服务器上面做集群,你就需要在哪台服务器上安装这个组件,并不是每台服务器上面都安装。这里采用第一台服务器做集群,因此在第一台服务器上安装 ruby 组件。(在 28 号服务器上操作)
sudo apt install ruby
  1. 安装其他组件 (在 28 号服务器上操作)
sudo gem install redis
  1. 配置集群 (在 28 号服务器上操作)

因为我是直接采用的 apt-get install 的方式安装的 redis 因此,服务器上面的 redis 工具 redis-trib.rb/usr/share/doc/redis-tools/examples 目录下。如果你是通过安装包安装的 redis 那么请直接到 redis 解压目录中执行命令,如: ~/redis-4.0.9/src/redis-trib.rb

/usr/share/doc/redis-tools/examples/redis-trib.rb create --replicas 1 192.168.174.128:6379 192.168.174.129:6379 192.168.174.130:6379 192.168.174.131:6379 192.168.174.132:6379 192.168.174.133:6379

配置集群

如果出现如下报错时

插槽节点被占用

问题原因:
slot 插槽被占用了(这是搭建集群前时,以前 redis 的旧数据和配置信息没有清理干净。)
解决方案如下:
用 redis-cli 登录到每个节点执行 flushall 和 cluster reset 就可以了

解决方案如图所示

再次设置集群,则可以连接成功

  1. 连接集群 (在任意一台服务器上操作)

这里我挑选的是 ip 地址为 : 192.168.174.131 的服务器,特别说明下,当执行 keys 命令的时候,只针对于当前服务器

# 带 -c 参数表示连接集群
redis-cli -h 192.168.174.131 -c
  1. 测试
alex@alex-virtual-machine:~$ redis-cli -h 192.168.174.131 -c    # 连接的 31 号服务器
192.168.174.131:6379> keys *  # 这里的 keys 也只能查看所有在 31 号服务器上面的 keys
(empty list or set)
192.168.174.131:6379> set aa 111  # 随便设置一个 key
-> Redirected to slot [1180] located at 192.168.174.128:6379  # 数据却在 28 号服务器上被保存
OK
192.168.174.128:6379>   # 并且此时的状态直接跳到了 28 号服务器上面

连接 31 号服务器,数据存到了 28 号服务器上

alex@alex-virtual-machine:~$ redis-cli -h 192.168.174.129 -c  # 通过 29 号服务器连接集群
192.168.174.129:6379> get aa  # 从 29 号服务器中去取值
-> Redirected to slot [1180] located at 192.168.174.128:6379  # 会直接从 28 号服务器中返回值
"111"
192.168.174.128:6379>   # 并且此时的状态直接跳到了 28 号服务器上面

从 30 号服务器上面取刚刚设置的值,会直接跳到 28 号服务器返回值

alex@alex-virtual-machine:~$ redis-cli -h 192.168.174.130 -c  # 通过 30 号服务器连接集群
192.168.174.130:6379> keys *  # 30 号服务器中并没有设置过 key,如果 30 号服务器可以取出值,证明可以跨服务器取出 keys,但是并没有数据,证明 keys 只能取出当前服务器中的 keys
(empty list or set)
192.168.174.130:6379> 

keys 只能取出当前服务器中的所有 key

原文链接地址

生活不止眼前的苟且,你不努力,还有未来的苟且……

45 声望
6 粉丝
0 条评论
推荐阅读
简单易用且优雅的跨境支付 PHP SDK 扩展包
支持国际版支付的 PHP SDK,目前只支持支付宝国际版。因目前支付宝跨境在线支付服务只支持 app、wap、web 和报关这四种,本 SDK 提供了 app、wap、web 这三种跨境支付,详见国际支付宝官方文档 。

削个椰子皮给个梨阅读 811

【Linux】Docker 中搭建Redis单节点以及集群
[[【RocketMq】RocketMq 4.9.4 Windows-docker 部署]]([链接]) 中提到了Windows安装Docker的一部分些细节,这里不再过多讨论,安装完成之后的Redis集群搭建同样可以参考本篇进行构建。

Xander阅读 609

带读 |《Redis 设计与实现》(英文名:The Design and Implementation of Redis)
Redis是一种运行速度很快,并发很强,跑在内存上的NoSql数据库,支持键到五种数据类型的映射。根据Redis官方提供的benchmark测试数据,redis读的速度是110000次/s,写的速度是81000次/s,并且实验证明,数据没在缓...

LiberHome1阅读 565

封面图
Redis集群和哨兵搭建说明_亲测成功
Redis集群和哨兵搭建说明_亲测成功1.运行环境说明1.1 服务器系统主流Linux系统1.2 Redis版本Redis-5.0.3 redis从3.0开始支持集群2. Redis安装1 新建一个软件保存目录如:/data/software/ {代码...} 2 新建一个应用...

阿亮说技术阅读 386

Redis最佳实践(上)
尽管 redis 是一款非常优秀的 NoSQL 数据库,但更重要的是,作为使用者我们应该学会在不同的场景中如何更好的使用它,更大的发挥它的价值。主要可以从这四个方面进行优化:Redis键值设计、批处理优化、服务端优化...

紧张的羊肉串aa阅读 316

Redis这个内存回收,确实有点牛逼!!!
1. 过期 key 处理Redis 之所以性能强,最主要的原因就是基于内存存储。然而单节点的 Redis 其内存大小不宜过大,会影响持久化或主从同步性能。我们可以通过修改配置文件来设置 Redis 的最大内存: {代码...} 当内...

紧张的羊肉串aa阅读 221

技术分享 | Redis 集群架构解析
作者:贲绍华爱可生研发中心工程师,负责项目的需求与维护工作。其他身份:柯基铲屎官。本文来源:原创投稿*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

爱可生云数据库阅读 180

生活不止眼前的苟且,你不努力,还有未来的苟且……

45 声望
6 粉丝
宣传栏