redis主从架构
![redis主从架构图](https://img-blog.csdnimg.cn/aa531a634fc547ac8c54bfa09d53c305.png)
[root@redis opt]
[root@redis opt]
7001 7002 7003
[root@redis redis-6.2.7]
cp ./redis.conf /opt/7001/
cp ./redis.conf /opt/7002/
cp ./redis.conf /opt/7003/
[root@redis redis-6.2.7]
[root@redis redis-6.2.7]
[root@redis redis-6.2.7]
[root@redis redis-6.2.7]
[root@redis redis-6.2.7]
[root@redis redis-6.2.7]
[root@redis redis-6.2.7]
[root@redis redis-6.2.7]
[root@redis redis-6.2.7]
[root@redis opt]
127.0.0.1:7002> SLAVEOF 192.168.115.129 7001
OK
[root@redis opt]
127.0.0.1:7003> replicaof 192.168.115.129 7001
OK
127.0.0.1:7001> info replication
role:master
connected_slaves:2
slave0:ip=192.168.115.129,port=7003,state=online,offset=42,lag=1
slave1:ip=192.168.115.129,port=7002,state=online,offset=42,lag=0
master_failover_state:no-failover
master_replid:cfb5b6ff626956f4d77188601634b5004a114d88
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:42
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:42
127.0.0.1:7001> set num 123
OK
127.0.0.1:7001> get num
"123"
127.0.0.1:7001> exit
[root@redis opt]
127.0.0.1:7002> get num
"123"
主从同步原理
master如何判断slave是不是第一次同步数据?
主从同步流程
1.slave节点请求增量同步
2.master节点判断replid,发现不一致,拒绝增量同步
3.master节点执行bgsave保存当前完整内存生成RDB,发送RDB到slave
4.slave清空本地数据,加载master的RDB
5.master将生成RDB期间的命令记录在repl_backlog,并持续将log中命令发送至slave
6.salve执行接收到的命令,保持与master之前的同步
优化主从同步
1.master中配置repl-diskless-sync yes启用无磁盘读写,避免全量同步时的磁盘IO
2.Redis单节点上的内存占用不要太大,减少RDB导致的过多磁盘IO
3.适当提高repl_backlog的大小,发现slave宕机时尽快实现故障恢复,尽可能避免全量同步
4.限制一个master上的slave节点数量,如果实在是太多slave,则可以采用主-从-从链式结构
全量同步和增量同步
全量同步:master将完整内存数据生成RDB,发送RDB给slave,后续命令则记录在repl_backlog,逐个发送给slave
增量同步:slave提交自己的offset到master,master获取repl_backlog中从offset之后的命令给slave
什么时候执行全量同步?
1.slave节点第一次连接master节点时
2.slave节点断开时间太久,repl_backlog中的offset已被覆盖时
什么时候执行增量备份?
1.slave节点断开又恢复,并且在repl_backlog中能找到offset时