pong|Redis高可用架构—Redis集群(Redis Cluster)详细介绍( 二 )


● MEET:当需要向集群中加入新节点时 , 需要集群中的某个节点发送MEET消息到新节点 , 通知新节点加入集群 。 新节点收到MEET消息后 , 会回复PONG命令给发送者 。
● PING:集群内每个节点每秒会向其他节点发送PING消息 , 用来检测其他节点是否正常工作 , 并交换彼此的状态信息 。 PING消息中会包括自身节点的状态数据和其他部分节点的状态数据 。
● PONG:当接收到PING消息和MEET消息时 , 会向发送发回复PONG消息 , PONG消息中包括自身节点的状态数据 。 节点也可以通过广播的方式发送自身的PONG消息来通知整个集群对自身状态的更新 。
● FAIL:当一个节点判定另一个节点下线时 , 会向集群内广播一个FAIL消息 , 其他节点接收到FAIL消息之后 , 把对应节点更新为下线状态 。
Redis集群的MOVED重定向Redis客户端可以向Redis集群中的任意master节点发送操作指令 , 可以向所有节点(包括slave节点)发送查询指令 。 当Redis节点接收到相关指令时 , 会先计算key落在哪个哈希槽上(对key进行CRC16校验后再对16384取模) , 如果key计算出的哈希槽恰好在自己节点上 , 那么就直接处理指令并返回结果 , 如果key计算出的哈希槽不在自己节点上 , 那么当前节点就会查看它内部维护的哈希槽与节点ID之间的映射关系 , 然后给客户端返回一个MOVED错误:MOVED [哈希槽
[节点IP:端口
。 这个错误包含操作的key所属的哈希槽和能处理这个请求的Redis节点的IP和端口号 , 例如“MOVED 3999 127.0.0.1:6379” , 客户端需要根据这个信息重新发送查询指令到给定的IP和端口的Redis节点 。

Redis集群的搭建及使用要让集群正常运作至少需要3个master节点 , 为了高可用 , 每个master节点至少要有一个slave节点 , 所以我们就用3个master节点+3个slave节点来搭建集群 。
首先准备三台虚拟机 , 并在每台虚拟机上安装好redis 。 我本地的三台虚拟机为:192.168. 31.77、192.168. 31.78、192.168. 31.79 。 如果本地还未安装过虚拟机 , 可以根据我之前的教程配置安装: VMware Workstation 14安装教程 、 虚拟机环境搭建(VMware14+centos7) 、 VMware+CentOS7 网络及静态IP配置 、 Linux安装Redis  。
以192.168.31.77这台虚拟机操作演示 , 拷贝出两份单独的redis配置文件 , 其中一个作为master节点的配置 , 一个作为slave节点的配置 。

修改这两个配置文件 , 下面是一个集群需要的最少选项配置:

基于这两个配置文件分别启动一个redis实例:

另外两台虚拟机执行同样的步骤启动好各自的两台redis实例 。 此时 , 我们就有了6台运行中的redis实例:

接下来我们需要使用这些实例来创建集群 。 在Redis3.x版本中 , 只能用redis-trib.rb程序来创建集群 , redis-trib.rb是一个Ruby程序 , 使用前需要先配置Ruby环境 。 创建集群命令如下:
其中 , --replicas 1 表示为集群中的每个master节点创建一个slave节点 。 Redis4.x版本后 , Redis提供了另一种创建集群的方式 , 即使用 redis-cli 命令 , 该命令多了一个可以认证集群密码的功能 , 所以后来Redis就推荐使用 redis-cli 的方式来创建集群 , 命令如下:
其中 , --cluster-replicas 1 表示为集群中的每个master节点创建一个slave节点 。 我们在任意一台虚拟机上执行上面的命令:

可以看到创建的集群信息 , 包括master节点及其哈希槽信息、slave节点信息 。 输入“yes”确认信息 , 即可看到集群创建成功:

至此 , 我们的集群就创建好了 , 接下来就可以测试一下集群是否正常 。 在任意一台虚拟机上测试都可以 , 比如我们在192.168.31.77的master节点上添加一条数据 , 执行以下命令:

可以看到 , 当我们执行“set name aaa”的时候 , 自动重定向到了192.168.31.78:7002这台Redis实例中执行 , 而且也可以正常获取数据 。
向Redis集群中添加新节点如果我们要向上面运行的Redis集群中添加一个新节点 , 分两种情况:添加一个master节点 , 添加一个slave节点 。 这两种情况的第一步都是要新启动一个Redis实例 , 启动使用的配置文件与上面集群中的各节点的配置文件一致 , 只需要改一下port、cluster-config-file、pidfile三个选项的配置 。 此处 , 我们先在192.168.31.79虚拟机上启动一个端口号为7006的Redis实例 。
●添加一个master节点:如果要添加一个master节点到集群中 , 需要执行以下命令:
./bin/redis-cli --cluster add-node 192.168.31.79:7006 192.168.31.77:7000