Redis 集群
作者:互联网
1. 简介
Redis cluster 由多个节点组成,节点类型分为主节点和从节点。主节点负责读写请求和集群信息维护,从节点负责复制主节点的数据和状态信息。
集群将数据分散到多个节点,每一个主节点都可以提供服务
支持故障自动转移
2. 集群方案
根据数据根据路由规则写入节点,并维护数据和节点的关系
- 客户端分片(客户端)
- proxy(代理)
- Redis Cluster(集群)
目前流行的是Redis Cluster
3. 搭建集群
- 将所有节点以集群模式启动;
- 节点握手,将其他节点加入集群(cluster meet ip port);
- 分配16384个槽(cluster addsolts {0...5461})
- 指定主从关系(cluster replicate node_id)
4. 数据分区方案
方案判断依据:
-
数据分布是否均匀
-
节点变化时对数据分布的影响大小
-
哈希分区
对key进行hash取值,然后根据节点数量取余
这种方案节点变化时对数据分布影响较大 -
一致性哈希分区
将哈希算法所有值组织为一个虚拟圆环,将节点分布在环上,然后根据key的哈希值,沿圆环顺时针找到的第一个节点就存储到这个服务器
节点新增时,将这个节点前面的一部分节点数据迁移到这个节点;节点减少时,将该节点的数据迁移到前面的节点;
节点数量较少时,对数据分布影响较大 -
带虚拟节点的哈希分区
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. 重定向
moved: 数据不在该节点,重定向到数据所在节点
ask: 数据迁移时如果数据从该节点已经迁移,则返回ask错误, 不确定何时数据前已完成,此时重定向是临时的
标签:Redis,数据分布,集群,消息,哈希,数据,节点 来源: https://www.cnblogs.com/virgosnail/p/14810624.html