主从同步
CAP原理
C:一致性
P:分区容忍性
A:可用性
分布式事务基本满足CP、AP不可能同时满足CAP、CA,因为一致性保证就不能保证可用性。
注:Zookeeper就是满足的CP、nacos满足的是AP默认、也可以通过修改配置满足CP
最终一致性
最终一致性是指在分布式事务下,我只保证最后的事务在所有分布式情况下的数据一致性,允许在分布式情况下的过程中存在事务不一致的情况。BASE理论。
主从同步和从从同步
从从同步是Redis后续版本引入的功能,主要目的是解决主机的负担。
增量同步
快照同步
非常消耗资源。
- 将主节点的数据进行一次bgsave
- 将快照发送给所有子节点
- 子节点进行全量加载,加载前要清空数据
增加从节点
当从节点刚刚加入到集群,要先快照同步之后做增量同步。
sentinel 哨兵
哨兵主要负责监控节点状态,当主节点挂掉之后,自动选择一个最优的从节点切换为主节点。
- 客户端来链接集群时,先连接哨兵
- 通过哨兵查询主节点地址。
- 然后连接主节点做数据交互,客户端会缓存主节点信息
- 节点故障时,哨兵会告诉客户端主节点更换,客户端拉去最新的主节点
消息丢失
sentinel基本用法
默认端口是26379
分而治之——Codis
Codis分片原理
- codis默认所有的key分成1024个槽位
- 然后更具请求的key进行CRC32运算计算hash
- 然后更具hash后的整数值队1024这个整数进行取模得到一个余数,这个余数就是key的槽位。
不同的Codis实例之间槽位关系如何同步
通过ZK来管理槽位
扩容
Codis的优点
- 简单它将分布式的处理交给了ZK或etcd去负责。自己省去分布式的一致性代码维护工作。
mget指令的操作过程
mget指令用于批量获取key 的值,Codis时通过将key按照所分配的实例打散分布,然后一次对每个实例进行调用,然后把结果汇总统一返回。
Cluster
Cluster将所有数据分为16384个槽位。
槽位算法
cluster是通过crc16算法进行hash计算,得到一个整数值,然后用这个数据对16384进行取模计算具体槽位。
跳转
当客户端发送了一个求情指令如果槽位错误,那么cluster会更具正确的槽位信息,告诉客户端应该请求的是哪个槽位,客户端会从新缓存新的槽位表。
容错
Redis Cluster可以为每个主节点设置若干个从节点,当主节点故障时通过选举来选出新的主节点,如果某个主节点没有从节点,那么它将会不可用。
网络抖动
指当从节点发现主节点下线后,从节点会等待一定时间在进行主从切换,这是避免从节点时因为网络原因没有收到主节点的状态信息。