10.2.1 准备节点

  1. Redis 集群一般由多个节点组成, 节点数量至少为6个才能保证组成完整高可用的集群。
  2. 每个节点需要开启配置 cluster-enabled yes, 让 Redis 运行在集群模式下。
  3. 建议为集群内所有节点统一目录, 一般划分三个目录: conf、data、log, 分别存放配置、数据和日志相关文件。把6个节点配置统一放在 conf 目录下

集群相关配置如下:

image.png

启动所有节点:

image.png

检查日志:

image.png

启动过程:

image.png

Redis 自动维护集群配置文件, 不要手动修改, 防止节点重启时产生集群信息错乱。

首次启动后生成的集群配置:

image.png

节点 ID 不同于运行 ID。节点 ID 在集群初始化时只创建一次, 节点重启时会加载集群配置文件进行重用, 而 Redis 的运行 ID 每次重启都会变化。

在节点6380执行 cluster nodes 命令获取集群节点状态:

image.png

每个节点目前只能识别出自己的节点信息。我们启动6个节点,但每个节点彼此并不知道对方的存在, 下面通过节点握手让6个节点彼此建立联系从而组成一个集群。

10.2.2 节点握手

节点握手是指一批运行在集群模式下的节点通过 Gossip 协议彼此通信, 达到感知对方的过程。节点握手是集群彼此通信的第一步, 由客户端发起命令: cluster meet {ip} {port}

image.png

cluster meet 命令是一个异步命令,执行之后立刻返回。

image.png

  1. 节点6379本地创建6380节点信息对象, 并发送 meet 消息
  2. 节点6380接受到 meet 消息后, 保存6379节点信息并回复 pong 消息
  3. 之后节点6379和6380彼此定期通过 ping/pong 消息进行正常的节点通信

6379和6380节点通过 meet 命令彼此建立通信之后, 集群结构:

image.png

只需要在集群内任意节点上执行 cluster meet 命令加入新节点, 握手状态会通过消息在集群内传播, 这样其他节点会自动发现新节点并发起握手流程。

最后执行 cluster nodes 命令确认6个节点都彼此感知并组成集群:

image.png

image.png

节点建立握手之后集群还不能正常工作, 这时集群处于下线状态, 所有的数据读写都被禁止。通过如下命令可以看到:

  1. 127.0.0.1:6379> set hello redis
  2. (error) CLUSTERDOWN The cluster is down

查看集群状态:

image.png

从输出内容可以看到, 被分配的槽 (cluster_slots_assigned) 是0, 由于目前所有的槽没有分配到节点, 因此集群无法完成槽到节点的映射。只有当16384个槽全部分配给节点后, 集群才进入在线状态

10.2.3 分配槽

cluster addslots:

  • {start…end}: bash 扩展, 下图显示的用法在 Bash 的模式扩展 里没找到 ( . 的个数有问题)

image.png

查看集群状态:

image.png

查看节点和槽的分配关系:

image.png
image.png

剩下三个节点作为从节点:

  • cluster replicate {nodeId}, 在从节点上执行, nodeId 为主节点的节点 ID

image.png

整个集群的结构:

image.png

查看集群状态和复制关系:

image.png

10.2.4 用 redis-trib.rb 搭建集群

这个命令被弃用了, 跳过