海口企业做网站设计,天津业之峰装饰公司官网,网站免费网站免费片黄入口蜜桃观看射破屁屁,那些网站分享pr做的视频Redis-集群 主从复制和哨兵只能在主节点进行写数据#xff0c;从节点读取数据#xff0c;因此本质上#xff0c;是进行了读写的分离#xff0c;每个节点都保存了所有的数据#xff0c;并不能实现一个很好的分布式效果。
1.哈希求余算法
假设有N台主机#xff0c;对每台…Redis-集群 主从复制和哨兵只能在主节点进行写数据从节点读取数据因此本质上是进行了读写的分离每个节点都保存了所有的数据并不能实现一个很好的分布式效果。
1.哈希求余算法
假设有N台主机对每台主机进行编号[0N-1]。当请求来的时候通过hash(key)%N得到机器号映射到相应的主机上此种方式实现简单但是也存在一些问题。如果我们对集群进行扩充数据的迁移概率会很大。
2.一致性哈希算法
建立一个哈希环[0,231-1每个节点负责环中的部分内容hash(key)% 231计算得到哈希值顺时针找到距离最近的一个节点。当我们对集群进行扩充时只需要将部分数据迁移。
添加节点过程 数据倾斜问题新增的服务器n4只是减轻了n2节点的压力但是n1节点和n3节点的压力没有变化导致节点数据不均匀造成部分服务器压力过大为解决这个问题引入虚拟节点机制。
虚拟节点从物理节点中虚拟出多个节点不同的虚拟节点映射一个物理节点然后统一的对数据迁移。 3.哈希槽算法
定义一个哈希槽这些槽均匀的分给节点每个节点持有一个分片一部分槽位可以是连续的也可以不是连续的利用hash_slot crc16(key)%16384计算key属于哪一个槽位通过槽位映射到具体属于哪一个分片。
关于16384在redis cluster中默认是有16384个槽位槽位的编号是从[0,16384]
如果槽位定义过多数据迁移成本会变高而16384是相对好的选择。节点之间通过心跳包进行通信心跳包中包含了该节点持有的槽位每个节点都会使用位图的数据结构来存储持有的槽位一个比特位存储一个槽位用0/1来区分当前分片是否持有该槽位也就是只需要16484b 2KB空间如果偏大在频繁的网络传输中开销也不小。
3.1如何处理客户端请求
每个节点都会保存一份槽位映射表这份映射表记录了每个槽位所对应的节点。当一个节点收到一个操作请求时它首先会根据这个请求中的键值计算出这个键所对应的槽位然后根据槽位映射表将这个操作发送到对应的节点上。
这种机制使得Redis集群中的每个节点都能够协同工作共同维护集群中的数据一致性。即使在某个节点发生故障的情况下其他节点也能够通过槽位映射表找到对应的节点继续提供服务。
3.2扩容集群
增加节点是集群会通过哈希槽分配策略将一些哈希槽分配给新节点从而实现集群的扩容。