redis 的主从复制分为全量复制和增量复制,全量复制是slave重写master生成的rdb文件。增量复制类似于MySQL主从复制,master将操作记录到日志中,并同步到slave,来完成同步。
优点:
缺点:
ip | 端口 | 角色 | redis版本 |
---|---|---|---|
39.101.1.122 | 6379 | 主(master) | Redis 6.2.7 |
175.24.33.200 | 6379 | 从(slave) | Redis 6.2.7 |
centos示例:
systemctl status firewalld.service
systemctl start firewalld.service
systemctl stop firewalld.service
给 主服务 在服务器运营商中开启:6379
端口。
修改主服务配置文件(redis.conf):
# 默认是 127.0.0.1,0.0.0.0 可非本地访问
bind 0.0.0.0
修改从服务配置文件(redis.conf)(如果需要一主多从,从服务的配置方式一样):
# 默认是 127.0.0.1,0.0.0.0 可非本地访问
bind 0.0.0.0
# 从属于主redis
slaveof 39.101.1.122 6379
重启服务,将修改后的配置文件重载。
注意优先级,先重启主服务,在重启子服务。
主服务查看:info replication
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=175.24.33.200,port=6379,state=online,offset=28457,lag=1
master_failover_state:no-failover
master_replid:020a7669df2d1f28093f39e3c344757d56ccd66e
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:28457
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:28457
从服务查看:info replication
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:39.101.1.122
master_port:6379
master_link_status:up
master_last_io_seconds_ago:5
master_sync_in_progress:0
slave_read_repl_offset:28807
slave_repl_offset:28807
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:020a7669df2d1f28093f39e3c344757d56ccd66e
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:28807
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:28807
只要主服务看到的 connected_slaves
(从服务连接量正确),和从服务看到的 master_link_status
为 up
即可,不能是 down
,down
代表未连接成功。
其中,role 显示当前角色,master 或 slave。
主服务:
127.0.0.1:6379> set name haha
OK
从服务:
127.0.0.1:6379> get name
"haha"
上面介绍了主从的搭建过程,这儿在介绍下主从同步的流程。
redis 有两种同步方式:全量同步 和 增量同步。
整个流程:
全量同步:master将完整内存数据生成RDB,发送RDB到slave。后续命令则记录在repl_baklog,逐个发送给slave。
什么时候执行全量同步?
1、slave节点第一次连接master节点时。
2、slave节点断开时间太久,repl_baklog中的offset已经被覆盖时。
增量同步:slave提交自己的offset到master,master获取repl_baklog中从offset之后的命令给slave。
过程概述:
什么时候执行增量同步?
1、slave节点断开又恢复,并且在repl_baklog中能找到offset时
原因一:
虽然 redis 服务已开启,但是 6379 端口在安全组中未开放。
原因二:
主配置文件和从配置文件中的 bind 为 127.0.0.1
,应该设置成 0.0.0.0
原因三:
replicaof 和 slaveof 的区别:replicaof 是新版的命令,slaveof 是旧版的
replicaof :>= 5.0.0
slaveof:>= 1.0.0.
版本查询:https://www.redis.com.cn/
原因四:
主服务设置了密码,但是从服务没有配置该密码。可通过 masterauth
在配置文件中配置上即可。
原因五:主服务或从服务没关闭防火墙
repl_baklog这个文件是一个固定大小的数组,只不过数组是环形,也就是说角标到达数组末尾后,会再次从0开始读写,这样数组头部的数据就会被覆盖。
数组一旦写满,再有新数据写入时,就会覆盖数组的旧数据。此时slave来增量同步,发现自己offset已经被覆盖了,此时只能全量同步。
https://www.cnblogs.com/qq1971590238/p/16140998.html
参考文档:
https://www.cnblogs.com/tangs1/p/15784878.html
https://blog.csdn.net/qq_45748269/article/details/121622447
https://blog.csdn.net/weixin_43889841/article/details/105078298
https://sunnyboy.blog.csdn.net/article/details/117483197