1. 环境说明
RedisCluster要求至少3个主节点,因此我们需要启动6个Redis实例(3主3从)
准备3台虚拟机,分别安装Redis,步骤可以参考之前的文章:Linux安装Redis步骤
实例 | 主/从 |
---|---|
192.168.25.132:6379 | master |
192.168.25.132:6380 | slave |
192.168.25.133:6379 | master |
192.168.25.133:6380 | slave |
192.168.25.134:6379 | master |
192.168.25.134:6380 | slave |
2. 修改集群配置
cluster-enabled yes:开启集群
cluster-config-file nodes-6379.conf:集群节点信息的配置文件(同一台Linux运行多个实例记得名称不要重复)
cluster-node-timeout 15000:节点超时时间
3. 创建集群
方式一:直接批量创建,每个主节点带1个从节点。前面3个MASTER,后面3个SLAVE,但是不能指定具体的主从关系
redis-cli --cluster create 192.168.25.132:6379 192.168.25.133:6379 192.168.25.134:6379 192.168.25.132:6380 192.168.25.133:6380 192.168.25.134:6380 --cluster-replicas 1
方式二:先创建主节点,再添加从节点
添加主节点
redis-cli --cluster create 192.168.25.132:6379 192.168.25.133:6379 192.168.25.134:6379
添加从节点
redis-cli --cluster add-node 192.168.25.132:6380 192.168.25.132:6379 --cluster-slave --cluster-master-id ef201d6460ff6fcbb0ebda02dba4df118f3b876d
redis-cli --cluster add-node 192.168.25.133:6380 192.168.25.133:6379 --cluster-slave --cluster-master-id 1e78d19c63ca0c16d8c9449f72bd24baebb73b1f
redis-cli --cluster add-node 192.168.25.134:6380 192.168.25.134:6379 --cluster-slave --cluster-master-id bfb7815da6b96b030a35483698967e60b79c59cd
最后一个参数是主节点的ID,查看方式就是先redis-cli连上随便一台主节点集群,然后运行cluster nodes命令:
192.168.25.132:6379> CLUSTER NODES
bfb7815da6b96b030a35483698967e60b79c59cd 192.168.25.134:6379@16379 master - 0 1611058741637 3 connected 10923-16383
1e78d19c63ca0c16d8c9449f72bd24baebb73b1f 192.168.25.133:6379@16379 master - 0 1611058739624 2 connected 5461-10922
ef201d6460ff6fcbb0ebda02dba4df118f3b876d 192.168.25.132:6379@16379 myself,master - 0 1611058740000 1 connected 0-5460
操作完毕后,再次查看集群状态,3主3从,搭建完毕:
4. 集群槽位
Redis集群有16384个槽位,每个主节点管理互不重复的槽位。
当操作某个KEY时,通过CRC16算法进行哈希计算,得出该KEY所对应的槽位,从而确定应该连接哪个节点进行操作。
基本流程如下:
5. 主节点故障问题
集群解决的就是高可用问题,思考:当其中一台主节点挂掉之后,集群还能正常使用吗?
redis-cli -h 192.168.25.132 -p 6379 连接成功后,执行shutdown进行关闭
此时连接其他节点,查看集群状态:
- master 132:6379 先是处于disconnected状态
- 过一段时间后,master 进入fail状态
- 此时,slave 132:6380 升级成 master 节点,并继承原先的0-5460槽位
打开132:6380的节点日志,可以更清晰地看到整个过程:
拓展:如果原主节点 132:6379 重新运行后,会怎么样?
说做就做,直接启动:
redis-server /usr/local/redis-5.0.8/conf/redis.conf
查看集群状态:
由此可见,此时 132:6379 大哥变小弟了,状态是 slave 从节点