Redis
集群
使用redis自带的cluster架构可以支撑高并发高可用海量数据
数据分布算法
hash余数算法
一致性hash
- 圆环,以手表为例。假设为12个格子
- 按照机器的id进行hash,A找到一个位置(比如3点),B找到一个位置(比如7点),C找到一个位置10点
- 那么后面数据在3-7范围里面,就放到A节点上,7-10的就放到B节点上面。
- 如果其中一个挂掉了,就会将这些数据分到前一个节点上
- 优化:每一个节点又同时分成多个,这样避免挂掉之后,数据大量进入。 比如A节点改成369、B节点147
hash slot
- 可以看成一个hashmap,有16384个桶
- 每个节点负责 16384/节点总数 个桶
- 数据进来的时候,会通过 CRC16算法对16384取余,分配到不同的节点去
维护集群元数据
CAP
一致性、可用性、分区容错
集中式存储(基于zookeeper)
- 将所有的元数据存在走zookeeper中,有问题能直接反馈
- 缺点:集中、元数据存储压力
gossip协议
- 互相传播、将更新陆续传到各个节点
- 所有节点都持有一份元数据,数据变更,会慢慢传播到各个节点
- 一次最多发给5个节点。5个没有通信的节点
- 缺点:延时、滞后
通信端口
原来的端口加上10000
几个指令
ping
- 发送自己维护的元数据给其他节点
- 一次最多选择5个节点(最久没有通信的)
- 如果某个节点太久没有通信,则也会立即发给他
pong
收到ping指令后返回的数据,包含自身的状态信息
fail
发现某个节点挂掉的话,就发送这个指令到其他节点