Hello World

Redis 集群

1. 简介

Redis cluster 由多个节点组成,节点类型分为主节点和从节点。主节点负责读写请求和集群信息维护,从节点负责复制主节点的数据和状态信息。
集群将数据分散到多个节点,每一个主节点都可以提供服务
支持故障自动转移

2. 集群方案

根据数据根据路由规则写入节点,并维护数据和节点的关系

  1. 客户端分片(客户端)
  2. proxy(代理)
  3. Redis Cluster(集群)
    目前流行的是Redis Cluster

3. 搭建集群

  1. 将所有节点以集群模式启动;
  2. 节点握手,将其他节点加入集群(cluster meet ip port);
  3. 分配16384个槽(cluster addsolts {0...5461})
  4. 指定主从关系(cluster replicate node_id)

4. 数据分区方案

方案判断依据:

  1. 数据分布是否均匀

  2. 节点变化时对数据分布的影响大小

  3. 哈希分区
    对key进行hash取值,然后根据节点数量取余
    这种方案节点变化时对数据分布影响较大

  4. 一致性哈希分区
    将哈希算法所有值组织为一个虚拟圆环,将节点分布在环上,然后根据key的哈希值,沿圆环顺时针找到的第一个节点就存储到这个服务器
    节点新增时,将这个节点前面的一部分节点数据迁移到这个节点;节点减少时,将该节点的数据迁移到前面的节点;
    节点数量较少时,对数据分布影响较大

  5. 带虚拟节点的哈希分区
    Redis Cluster 采用的这种方案,假定有16384个槽,每个槽包含哈希值在一定范围内的数据;
    在数据节点和数据之间加入一层槽,解耦了数据节点和数据之间的关系
    节点增加时,将其他节点的一部分槽迁移到新节点;
    节点较少时,将该节点的数据均分给其他节点,保证数据槽的均匀分布,不能完全解决数据分布均匀的问题

4. 节点通信

端口信息

普通端口:主要为客户端提供服务,数据迁移也会使用
集群端口:普通端口+10000,只用于集群节点间的通信

Gossip协议

节点随机与部分节点通信(有一定规则),经过这样的通信,每个几点的节点的状态很快达到一致

消息类型

meet消息:节点握手阶段,向新加入的节点发送meet命令,新节点收到消息后回复pong消息
ping消息:每个节点每秒钟选择部分节点发送ping消息,接收后回复pong消息;ping消息采用gossip协议,消息发送规则:1. 随机选择5个接点,与最久未通信的节点通信;2. 与超过cluster_node_timeout/2 的所有节点通信
pong消息:pong消息包含自身状态数据。1. 在收到meet/ping消息后进行回复 2. 节点向集群广播pong消息,其他节点获取到该节点的最新信息
fail消息:当一个主节点判断另一个主节点进入fail状态,则向集群广播这一fail消息
publish消息:节点收到该命令,先执行命令,再向集群广播该消息,其他节点执行该命令

5. 数据倾斜

5.1 数据量倾斜

节点上的数据分布不均匀

1. slot分布不均匀导致倾斜

将负载高的节点上的slot迁移到负载较低的节点

2. bigkey导致倾斜

避免将过多的数据保存在同一个key中
若key对应的类型为集合,可以将集合拆分成多个小的集合

3. hash tag 导致的数据倾斜

6. 重定向

moved: 数据不在该节点,重定向到数据所在节点
ask: 数据迁移时如果数据从该节点已经迁移,则返回ask错误, 不确定何时数据前已完成,此时重定向是临时的

posted @ 2021-05-25 21:24  小小忧愁米粒大  阅读(87)  评论(0编辑  收藏  举报
瞅啥瞅,好好看书