作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO
联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬
学习必须往深处挖,挖的越深,基础越扎实!
阶段1、深入多线程
阶段2、深入多线程设计模式
阶段3、深入juc源码解析
码哥源码部分
码哥讲源码-原理源码篇【2024年最新大厂关于线程池使用的场景题】
码哥讲源码-原理源码篇【揭秘join方法的唤醒本质上决定于jvm的底层析构函数】
码哥源码-原理源码篇【Doug Lea为什么要将成员变量赋值给局部变量后再操作?】
码哥讲源码【谁再说Spring不支持多线程事务,你给我抽他!】
打脸系列【020-3小时讲解MESI协议和volatile之间的关系,那些将x86下的验证结果当作最终结果的水货们请闭嘴】
redis 主从模式作用:多节点协调工作保证服务高可用;读写分离,提高系统负载能力;多节点保存数据副本,确保数据安全性。
主从模式,需要实现数据同步,master 节点将数据(全量/增量)复制到链接它的 slave 节点。redis 为了保证节点高性能,采用了异步的数据复制方式,高效地实现了数据的最终一致,并非强一致。
那么接下来,将分两个章节来探索 redis 数据复制的核心工作流程。
1. 复制架构
# Master-Replica replication. Use replicaof to make a Redis instance a copy of
# another Redis server. A few things to understand ASAP about Redis replication.
#
# +------------------+ +---------------+
# | Master | ---> | Replica |
# | (receive writes) | | (exact copy) |
# +------------------+ +---------------+
主从复制,数据是由 master 发送到 slave。一般有两种架构:一主多从,链式主从。这两种复制架构各有优缺点:
- A 图,主从节点间数据复制实时性较好,但是如果 slave 节点数量多了,master 复制数据量就会增大,特别是全量复制场景,对 master 性能影响比较大。
- B 图,D,E
sub-slave
节点数据复制实时性相对差一点,但是能降低 master 数据复制给多个从节点的压力,整个系统能支撑更大的负载。
2. 配置
redis.conf 对应 REPLICATION
部分主要配置项内容。
# 服务建立主从关系命令,设置该服务为其它服务的 slave。
replicaof <masterip> <masterport>
# slave是否支持写命令操作。
replica-read-only yes
# 积压缓冲区大小。缓冲区在 master,slave 断线重连后,
# 如果是增量复制,master 就从缓冲区里取出数据复制给 slave。
repl-backlog-size 1mb
# 防止脑裂设置,对 slave 的链接数量和 slave 复制(保活)时间限制。
min-replicas-to-write 3
min-replicas-max-lag 10
3. 客户端命令
3.1. replicaof
客户端命令:replicaof
/ slaveof
,可以使两个 redis 实例实现主从复制关系。
# 建立主从关系。
replicaof <masterip> <masterport>
# 取消主从关系。
replicaof no one
replicaof 和 slaveof 命令实现方法相同,但是不支持 redis cluster
集群模式下使用。
// replicaof 和 slaveof 命令功能实现相同。
struct redisCommand redisCommandTable[] = {
...
{"slaveof",replicaofCommand,3,
"admin no-script ok-stale",
0,NULL,0,0,0,0,0,0},
{"replicaof",replicaofCommand,3,
"admin no-script ok-stale",
0,NULL,0,0,0,0,0,0},
...
}
// 不支持 cluster 集群模式。
void replicaofCommand(cli