Redis的replication:
* 主从架构--读写分离--水平扩容支持读高并发
* Redis会用异步的(先在内部写入数据,异步发给slave)、周期性的方式同步数据到slave
* 采用了主从架构后,master node必须要做持久化避免master宕机重启后把空数据同步给slave node
Redis的基本数据类型:
* String 键值对
* Set 无序集合 需要基于Redis的全局去重
* List
* hash
* Sorted set 自动排序
Redis的key如何处理?
* 定期删除 设置key的时候给过期时间
* 惰性删除 访问这个key的时候,Redis检查是否设置了过期时间且过期了,那么不会给返回任何数据
* 如果定期删除没有删干净且没有及时通过惰性删除,导致大量key占用内存,要使用内存淘汰策略
master和slave都会维护一个offset?
* 一是用在全量复制
* 二是主从互相知道对方的offset,才能知道双方数据不一致的情况
backlog:
* master node有一个backlog,默认1MB
* m向s复制数据时,也会在b中复制
* 用作做全量复制中断的增量复制
master的run id 作用?
* m做冷备份时,id变换,s同步时会发现id不一样,触发全量同步保持数据一致
Redis心跳机制:
* master默认每10s一次
* slave默认每1s一次
Redis高可用:
* 故障转移,failover主备切换,m故障时,自动检测,某个s自动切换为m叫主备切换。
哨兵架构(分布式):
主要功能:
* 集群监控、消息通知、故障转移、配置中心
核心知识:
* 哨兵至少3个实例保证其健壮性
* 哨兵+redis主从架构,保证Redis集群高可用
* quorum = 1 一个哨兵认为master宕机了即可
* majority 投票 3个哨兵2(quorum)个同意即可进行故障之一
解决异步复制和脑裂问题导致的数据丢失:
redis脑裂,就是有一个主节点出现了网络故障,从节点没有收到主节点的心跳
认为主节点挂掉了,这个时候,从节点升级为主节点
但是主节点并没有挂掉,主节点网络恢复后
发现出现了2个主节点,这时候可能会出现一些数据丢失
配置项:
* min-slaves-to-write 1
* min-slaves-max-lag 10
* 意思是至少有一个slave,数据复制和同步不能超过10s,这样master和slave失去连接后拒绝写请求,避免了数据丢失
slave->master的选举算法:
1. 和mster断开连接的时长
1. 优先级,slave priority越低,优先级越高
2. slave priority相同,看offset,offset越大表示复制的数据越多,优先级越高
3. 二者都相同,run id 越小,优先级越高