两个端口
在哨兵系统中,节点分为数据节点和哨兵节点:前者存储数据,后者实现额外的控制功能。在集群中,没有数据节点与非数据节点之分:所有的节点都存储数据,也都参与集群状态的维护。为此,集群中的每个节点,都提供了两个
TCP端口
- 普通端口:即我们在前面指定的端口(7000等)。普通端口主要用于为客户端提供服务(与单机节点类似);但在节点间数据迁移时也会使用。
- 集群端口:端口号是普通端口+10000(10000是固定值,无法改变),如7000节点的集群端口为17000。集群端口只用于节点之间的通信,如搭建集群、增减节点、故障转移等操作时节点间的通信;不要使用客户端连接集群接口。为了保证集群可以正常工作,在配置防火墙时,要同时开启普通端口和集群端口。
节点通信机制
维护集群的元数据(集群节点信息,主从角色,节点数量,各节点共享的数据等)有两种方式:集中式和gossip ;
Redis cluster节点间采取gossip协议进行通信 。
-
集中式(广播)
向集群内所有节点发送消息; 优点在于元数据的更新和读取,时效性非常好,一旦元数据出现变更立即就会更新到集中式的存储中,其他节点读取的时候立即就可以立即感知到;
不足在于所有的元数据的更新压力全部集中在一个地方,每条消息都要发送给所有节点,CPU、带宽等消耗较大;可能导致元数据的存储压力。 很多中间件都会借助zookeeper集中式存储元数据。 -
gossip
节点间通信,按照通信协议可以分为几种类型:单对单、广播、Gossip协议等。重点是广播和Gossip的对比。
gossip协议的优缺点
- gossip协议的优点在于元数据的更新比较分散(负载),不是集中在一个地方(去中心化),更新请求会陆陆续续,打到所有节点上去更新(容错性高),有一定的延时,降低了压力;
- 缺点在于元数据更新有延时可能导致集群的一些操作会有一些滞后(收敛速度慢)。
gossip节点间发送的消息主要分为5种:meet消息、ping消息、pong消息、fail消息、publish消息。
不同的消息类型,通信协议、发送的频率和时机、接收节点的选择等是不同的。
- MEET:在节点握手阶段,当节点收到客户端的CLUSTER MEET命令时,会向新加入的节点发送MEET消息,请求新节点加入到当前集群;新节点收到MEET消息后会回复一个PONG消息。
- PING:集群里每个节点每秒钟会选择部分节点发送PING消息,接收者收到消息后会回复一个PONG消息。PING消息的内容是自身节点和部分其他节点的状态信息;作用是彼此交换信息,以及检测节点是否在线。PING消息使用Gossip协议发送,接收节点的选择兼顾了收敛速度和带宽成本,具体规则如下:(1)随