辛德蕾拉|面试官:Redis缓存了解吗?面对这11道题是否有很多问号?( 七 )


面试题剖析redis cluster 介绍

  • 自动将数据进行分片 , 每个 master 上放一部分数据
  • 提供内置的高可用支持 , 部分 master 不可用时 , 还是可以继续工作的
在 redis cluster 架构下 , 每个 redis 要放开两个端口号 , 比如一个是 6379 , 另外一个就是 加 1w 的端口号 , 比如 16379 。
16379 端口号是用来进行节点间通信的 , 也就是 cluster bus 的东西 , cluster bus 的通信 , 用来进行故障检测、配置更新、故障转移授权 。 cluster bus 用了另外一种二进制的协议 , gossip 协议 , 用于节点间进行高效的数据交换 , 占用更少的网络带宽和处理时间 。
节点间的内部通信机制
基本通信原理
集群元数据的维护有两种方式:集中式、Gossip 协议 。 redis cluster 节点间采用 gossip 协议进行通信 。
集中式是将集群元数据(节点信息、故障等等)几种存储在某个节点上 。 集中式元数据集中存储的一个典型代表 , 就是大数据领域的 storm 。 它是分布式的大数据实时计算引擎 , 是集中式的元数据存储的结构 , 底层基于 zookeeper(分布式协调的中间件)对所有元数据进行存储维护 。
辛德蕾拉|面试官:Redis缓存了解吗?面对这11道题是否有很多问号?redis 维护集群元数据采用另一个方式 ,gossip 协议 , 所有节点都持有一份元数据 , 不同的节点如果出现了元数据的变更 , 就不断将元数据发送给其它的节点 , 让其它节点也进行元数据的变更 。
辛德蕾拉|面试官:Redis缓存了解吗?面对这11道题是否有很多问号?集中式的好处在于 , 元数据的读取和更新 , 时效性非常好 , 一旦元数据出现了变更 , 就立即更新到集中式的存储中 , 其它节点读取的时候就可以感知到;不好在于 , 所有的元数据的更新压力全部集中在一个地方 , 可能会导致元数据的存储有压力 。
gossip 好处在于 , 元数据的更新比较分散 , 不是集中在一个地方 , 更新请求会陆陆续续打到所有节点上去更新 , 降低了压力;不好在于 , 元数据的更新有延时 , 可能导致集群中的一些操作会有一些滞后 。
10000 端口:每个节点都有一个专门用于节点间通信的端口 , 就是自己提供服务的端口号+10000 , 比如7001 , 那么用于节点间通信的就是 17001 端口 。 每个节点每隔一段时间都会往另外几个节点发送 ping 消息 , 同时其它几个节点接收到 ping 之后返回 pong 。
交换的信息:信息包括故障信息 , 节点的增加和删除 , hash slot 信息等等 。
gossip 协议
gossip 协议包含多种消息 , 包含 ping、pong、meet、fail 等等 。
  • meet:某个节点发送 meet 给新加入的节点 , 让新节点加入集群中 , 然后新节点就会开始与其它节点进行通信 。 redis-trib.rb add-node其实内部就是发送了一个 gossip meet 消息给新加入的节点 , 通知那个节点去加入我们的集群 。
  • ping:每个节点都会频繁给其它节点发送 ping , 其中包含自己的状态还有自己维护的集群元数据 , 互相通过 ping 交换元数据 。
  • pong:返回ping和meeet , 包括自己的状态和其他信息 , 也用于信息广播和更新 。
  • fail:某个节点判断另一个节点fail之后 , 就发送fail给其他节点 , 通知其他节点说 , 某个节点宕机啦 。
ping 消息深入
ping 时要携带一些元数据 , 如果很频繁 , 可能会加重网络负担 。
每个节点每秒会执行 10 次 ping , 每次会选择 5 个最久没有通信的其它节点 。 当然如果发现某个节点通信延时达到了 cluster_node_timeout / 2 , 那么立即发送 ping , 避免数据交换延时过长 , 落后的时间太长了 。 比如说 , 两个节点之间都 10 分钟没有交换数据了 , 那么整个集群处于严重的元数据不一致的情况 , 就会有问题 。 所以 cluster_node_timeout 可以调节 , 如果调得比较大 , 那么会降低 ping 的频率 。


推荐阅读