Redis(四)-集群搭建

基本架构

节点

与普通模式下节点的区别是它有一个配置是cluster-enabled:yes,即以集群模式启动

meet

节点之间通过meet实现通信

指派槽

复制

每个主节点都有从节点,主从复制。

搭建步骤(原生安装)

redis-cli -p 7000 cluster nodes/info查看节点信息(不开启客户端)

1.开启节点

redis-server redis-7000.conf 
redis-server redis-7001.conf 
redis-server redis-7002.conf 
redis-server redis-7003.conf 
redis-server redis-7004.conf 
redis-server redis-7005.conf

2.节点握手(meet)

redis-cli -p 7000 cluster meet 127.0.0.1 7001
redis-cli -p 7000 cluster meet 127.0.0.1 7002
redis-cli -p 7000 cluster meet 127.0.0.1 7003
redis-cli -p 7000 cluster meet 127.0.0.1 7004
redis-cli -p 7000 cluster meet 127.0.0.1 7005

此时通过redis-cli -p 7000 cluster info查看任意一个节点得到的信息中,cluster_known_nodes的值都为6,即集群中6个节点都能互通。

3.分配槽

由于分配槽的命令很多且重复,编写脚本如下:

start=$1
end=$2
port=$3
for slot in `seq ${start} ${end}`
do
        redis-cli -p ${port} cluster addslots ${slot}
done

运行脚本为7000、7001、7002分配槽:

sh addslots.sh 0 5461 7000
sh addslots.sh 5462 10922 7001
sh addslots.sh 10923 16383 7002

4.主从分配

通过redis-cli -p 7000 cluster nodes查看节点ID(第一列)。

然后

redis-cli -p 从节点端口 cluster replicate 主节点ID

redis-cli -p 7003 cluster replicate d378ca9057747ed4643e9604de048c72b1e37ebc

redis-cli -p 7004 cluster replicate a41a11969445c1b34b1a7f450339be9dfea6dcd7

redis-cli -p 7005 cluster replicate 6e745ee42dc19ea4259d16aa0837bbba483832a9

Redis Cluster提供了Rubby的安装脚本,可以通过Rubby方便地搭建集群,而不需要通过Redis-cli的原生安装方式。

集群伸缩

集群伸缩:槽和数据在节点之间的移动

扩容集群

  1. 准备新节点

    redis-server redis-7006.conf
    即开启一个新的redis-server

  2. 加入集群

    新节点和已创建的集群握手(meet)

  3. 迁移槽和数据


    通过redis-cli做会很麻烦,一般使用官方的redis-trib迁移。

收缩集群

  1. 下线迁移槽

  2. 让其他节点忘记被除去的节点

  3. 关闭节点

客户端路由

move重定向

被客户端访问的槽已经迁移到别的节点

ask重定向

被客户端访问的槽正在迁移中

smart客户端

如:JedisCluster

  1. 从集群中选一个可运行节点,使用cluster slots初始化槽和节点映射
  2. 将cluster slots的结果映射到本地
  3. 准备执行命令

这样在客户端就有了槽和节点的对应信息,就能直接访问目标节点

故障

故障发现

  • 主观下线:某个节点认为另一个节点不可用
  • 客观下线:当半数以上持有槽的主节点都标记某节点主观下线

尝试客观下线

  1. 通知集群内所有节点标记故障节点为客观下线
  2. 通知故障节点的从节点触发故障转移流程

故障恢复

  1. 资格检查:检查哪些从节点有成为主节点的资格
  2. 准备选举时间
  3. 选举投票:主节点对参选的从节点投票
  4. 替换主节点:
    • 当前节点取消复制变为主节点
    • 撤销故障主节点负责的槽,并将这些槽分配给自己
    • 向集群广播自己的pong消息,表明已经替换了故障主节点
posted @ 2020-07-05 21:47  tianqibucuo  阅读(135)  评论(0编辑  收藏  举报