当前位置: 首页 > 工具软件 > Redis Shard > 使用案例 >

Redis(三) 集群

符俊材
2023-12-01

Redis集群

Redis集群是一个分布式数据库,通过分片(Shard)实现数据共享

  • 新的节点利用CLUSTER MEET命令加入另一个节点所在的集群
  • CLUSTER MEET的执行过程:两个节点握手,其过程为主动发起握手的节点发出一条MEET消息,被动方回复PONG消息,主动方再返回PING消息

集群的分片方式

  • 集群的整个数据库被分为16384(2048*8)个槽(Slot),每个集群节点都可以处理0到16384个槽。当集群中所有槽都有节点负责处理时,集群处于上线状态,否则集群处于下线状态。通过CLUSTER ADDSLOTS命令可以将槽指派给节点
  • 每个节点维护一个2048字节长度的bit-map,用于记录自身所负责的槽。节点之间会周期性的互发消息确认自身的槽指派信息。同时每个节点也会维护一个16384长度的指针数组,用于记录所有槽具体指派给哪个节点的信息

集群接收命令的方式

  • 集群中的一个节点接收到来自客户端的命令时,会计算这个命令涉及的键属于哪个槽,并判断这个槽是否属于自己。如果属于的话会处理命令,否则的话会返回MOVED错误,将客户端引导向正确的节点

计算key属于哪个槽的方式

  • 计算key的CRC16检验和,并对16383取模

集群节点存储数据的方式

  • 当Redis服务运行在集群模式下时,仅能使用一个数据库,即0号数据库
  • 除了将键值对保存在数据库,集群节点还会维护一个跳表,用于保存槽与键之间的关系,将槽号作为跳表的分值

重新分片

  • 可以将指派到一个节点的槽指派给另一个节点,此时需要对这些槽的key进行重新分片
  • 在一个节点正在迁移槽时,客户端发来了一个命令,节点会先检查自身数据库,如果有对应数据则执行命令,否则会反回ASK命令,将客户端引导向正确的节点

故障转移

  • 集群中的节点同样分为主节点与从节点。主节点用于处理槽,从节点复制主节点。换言之,集群中的一个节点可能是一台Redis服务器,也有可能是几台Redis服务组成的主-从服务器系统。集群节点中的选主策略与哨兵节点选主策略高度类似,都使用了RAFT算法

消息

集群中的节点利用消息进行通信,共有五类消息:
  • MEET:用于加入集群
  • PING:集群中的节点每秒会向已知节点中随机找5个节点发送PING消息
  • PONG:用于响应MEET和PING
  • FAIL:一个节点发现另一个节点下线时,会向所有其他节点发送FAIL告知这个消息
  • PUBLISH:所有收到PUBLISH消息的节点都会向所有其他节点发送同样的消息
 类似资料: