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 间接装置)
- 别离装置 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 号服务器)
- 配置
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
- 装置
ruby
组件。如果不装置这个软件,集群的时候,会报组件谬误。你须要在那台服务器下面做集群,你就须要在哪台服务器上安装这个组件,并不是每台服务器下面都装置。这里采纳第一台服务器做集群,因而在第一台服务器上安装ruby
组件。(在 28 号服务器上操作)
sudo apt install ruby
- 装置其余组件 (在 28 号服务器上操作)
sudo gem install redis
- 配置集群 (在 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 就能够了
- 连贯集群 (在任意一台服务器上操作)
这里我筛选的是 ip 地址为:192.168.174.131 的服务器,特地阐明下,当执行 keys
命令的时候,只针对于以后服务器
# 带 -c 参数示意连贯集群
redis-cli -h 192.168.174.131 -c
- 测试
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 号服务器下面
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 号服务器下面
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>
原文链接地址