(1) Redis 主从结构(主备)
主从复制:
1.当从服务器第一次启动时,
从服务器发送SYNC给主,主生成RDB文件,在过程中将一些新来的命令缓存,然后一起发送。
以上是复制初始化。
2.然后每次主接受新的命令,会增量同步给从数据库。
****乐观复制:
Redis采用的是容忍一定时间内的数据不一致情况;
==>在增量同步的过程中,主数据库不会等待从数据库完全写入成功才会返回。
==>所以有一段时间内数据是不一致的。
==>但是当然这不是绝对的,只要牺牲一点性能,是能避免这种情况的。
==>min-slave-write 3 ==>只有三个从数据库同步成功才能写入主,否则返回错误
==>min-slave-max-log 3 ==>允许从数据库最长失联时间
****.增量复制
基于以下四点实现:
1.主节点除了备份RDB文件之外,还维护一个环形积压队列,以及环形队列的写索引和复制时的offset。
2.从数据库会存储主数据库的id,每个Reids实例都拥有一个唯一的运行id,
当实例重启后,就会自动生成一个新的id。
3.主节点在复制同步阶段,每次发送一个命令给从数据库,都会存到积压队列中,并记录对应都偏移量。
4.从数据库接受到主数据库传来都命令时,也会记录偏移量
PSYNC id offset来增量同步
如果
1.从节点传递都runid和master都runid一致
2.主节点在环形队列上能找到对应都offset
才增量,否则全量
****.哨兵模式
哨兵都作用就是监控redis节点都运行状态
普通的Redis主从模式,如果主崩了,需要手动重启和恢复。
所以引入哨兵模式,哨兵作为一个独立的进程,多个哨兵互相以及监控主从,实现崩溃时的自动切换。
通过info命令,向主节点获得所有从节点的地址。
和主节点建立链接后,做三件事
1.每隔10s向主数据库和从数据库发送info命令
2.每隔2s向主数据库和从数据的_sentinel频道发送自己的信息
3.每隔1s向所有数据库节点和所有哨兵节点发送ping命令
(2) Redis cluster
Redis Cluster不使用一致的哈希,而是一种不同形式的分片,其中每个键在概念上都是我们所称的哈希槽的一部分。Redis集群中有16384个哈希槽,要计算给定密钥的哈希槽是什么,我们只需取密钥模16384的CRC16。Redis集群中的每个节点都负责哈希槽的一个子集,因此例如,您可能有一个包含3个节点的集群,其中:节点A包含从0到5500的哈希槽。节点B包含5501到11000的哈希槽。节点C包含从11001到16383的哈希槽。这样可以方便地添加和删除集群中的节点。例如,如果我想添加一个新的节点D,我需要将一些哈希槽从节点A、B、C移到D。同样,如果我想从集群中删除节点A,我可以将A服务的哈希槽移动到B和C。当节点A为空时,我可以将其从集群中完全移除。
==>上述有两个细节
1. CRC16能产生的槽量可以有2^16=6w,但是实际上使用的是2^14个槽,作者曾解释说,这个数量够了且为了心跳包的大小考虑。
2. 在扩容和缩容的时候,其实采用的是渐进式的,在扩容过程,会根据槽去查Old Node,发现不存在,才去New Node查。如果存在,帮忙迁移到New Node,然后返回。