Redis的主从复制
- 在redis.conf配置文件中找到 # replicaof <masterip> <masterport> 打开并配置从属于哪个主节点
- 启动后可以使用 slaveof host port指定从属于哪个主节点
- 查看主从的关系 info replication
- 只有主节点能写入数据,从节点只能读数据
- slaveof no one 从主节点中脱离
redis主从复制的不足
- 没有解决高可用问题
- 需手动切换主从
高可用思路
- 服务端:自动切换主从
- 客户端:自动发现路由
- Sentinel哨兵:是一个特殊的Redis服务监控master/slave并且相互监控(raft算法先到先得,少数服从多数)
master选举因素
- 如果与哨兵连接断开的比较久,超过了某个阈值,就失去了选举权。
- 如果拥有选举权,那就看谁的优先级高,这个在配置文件里可以设置(replica-priority 100),数值越小优先级越高
- 如果优先级相同,就看谁从master中复制的数据最多(复制偏移量最大),选最多的那个。
- 如果复制数量也相同,就选择进程id最小的那个。
Sentinel不足
- 主从切换的过程中会丢失数据,因为只有一个master
- 只能单点写,没有解决水平扩容的问题(分片)
一致性哈希:
-
分布于get set
- 虚拟节点
https://gper.club/articles/7e7e7f7ff3g5bgcdg60(转载,redis单机部署以及redis集群部署权限归咕泡学院所有)。
Redis Cluster架构
- key分片:对slot(16383)进行分组。
Redis Cluster故障转移
- slave发现自己的master变为FAIL
- 将自己记录的集群currentEpoch加1,并广播FAILOVER_AUTH_REQUEST信息。
- 其他节点收到该信息,只有master响应,判断请求者的合法性,并发送FAILOVER_AUTH_ACK,对每一个epoc只发送一次ack
- 尝试failover的slave收集FAILOVER_AUTH_ACK
- 超过半数后变成新的master
- 广播Pong通知其他集群节点。
Redis Cluster特点
- 无中心架构
- 数据按照slot存储分布在多个节点,节点间数据共享,可动态调整数据分布。
- 可扩展性,可线性扩展到1000个节点(官方推荐不超过1000个),节点可动态添加或删除。
- 高可用性,部分节点不可用时,集群扔可用。通过添加Slave做standby数据副本,能够实现故障自动failover,节点之间通过gossip协议交换状态信息,用投票机制完成slave到master的角色提升。
- 降低运维成本,提高系统的扩展性和可用性。