Redis主从复制原理
程序员文章站
2024-02-29 21:25:46
...
1.1 特别说明
只要是用主从复制,都是基于RDB持久化,不管你有没有开启
1.2 主从复制架构的介绍
基本介绍
01:一个主可以有多个从(一主多从);从库下可以有多个从(级联式主从);
02:Redis主从复制时是使用异步复制(主不管slave有没有接收到数据);
03:复制时不会阻塞主服务器响应客户端的请求,因为在进行数据同步时,
主上面执行bgsave命令for出一个子进程来进行数据的同步操作;
04:在复制时可能会影响slave端redis的主进程对客户端的响应;在2.8版本
以后,slave默认是只读的哈?
例如:主从复制架构,写是在master端进行,你通过手段做了读写分离,
让客户端在slave中进行读的操作,此时slave在同步(不管全同步,还是
增量同步)master端的数据时会不会阻塞客户端的读取操作呢?
解答:这个其实是由参数slave-serve-stale-data控制的,它有两个值,
yes和no;yes表示仍然响应,可能数据不是最新的;默认就是yes;no表示
不响应,给客户端报"SYNC with master in progress"错误;
主从复制时的一个数据安全问题
01:Master端若没有开启持久化,而Slave中开启了持久化;
02:若Master端重启或宕服/机恢复后,会销毁Slave中的数据(持久化文件和内存中的数据)
1.3 主从复制的原理图解
Master端的参数配置
## Basic parameters
bind 172.16.1.31 # Master端redis绑定的IP地址
protected-mode yes # 开启安全模式,只能通过bind的地址连接
port 6379 # Master端redis监听的端口
maxmemory 1GB
requirepass chenliang # Master端redis的连接密码
daemonize yes
databases 16
syslog-enabled no
loglevel notice
logfile /data/redis/6379/logs/redis.log
pidfile /data/redis/6379/run/redis.pid
unixsocket /data/redis/6379/run/redis.sock
## Client
maxclients 10000
timeout 300
tcp-backlog 511
tcp-keepalive 60
## RDB Persistence
save 900 1 # 900秒内有1个key被改变就进行rdb持久化
save 300 10 # 300秒内有10个key被改变就进行rdb持久化
save 60 10000 # 60秒内有10000个key被改变就进行rdb持久化
dir /data/redis/6379/data/ # 持久化文件的保存路径
dbfilename dump.rdb # rdb持久化的文件名称
rdbcompression yes # 对字符串是否开启压缩,默认是yes
rdbchecksum yes # 是否对持久化文件进行检测
## replication
repl-disable-tcp-nodelay no # 在主从复制的时候关闭tcp的延迟,这样master一但有数据产生,立即发送给slave;
repl-timeout 60 # 主从复制的超时时间,默认是60秒,不要超过timeout的时间,数据集较大时要调大;
repl-diskless-sync no # 关闭redis的无盘复制,默认也是no,还在实验中,不要开启哈;
Slave端的参数配置
## Basic parameters
bind 172.16.1.32
protected-mode yes
port 6379
maxmemory 1GB
requirepass chenliang
daemonize yes
databases 16
syslog-enabled no
loglevel notice
logfile /data/redis/6379/logs/redis.log
pidfile /data/redis/6379/run/redis.pid
unixsocket /data/redis/6379/run/redis.sock
## Client
maxclients 10000
timeout 300
tcp-backlog 511
tcp-keepalive 60
## RDB Persistence
save 900 1
save 300 10
save 60 10000
dir /data/redis/6379/data/
dbfilename dump.rdb
rdbcompression yes
rdbchecksum yes
# replication
slaveof 172.16.1.31 6379 # 告诉slave它要连接的Master的IP、端口
masterauth "chenliang" # 告诉slave连接Master时需要的密码,前面master进行了设置的
repl-ping-slave-period 10 # slave每隔10秒检测(ping)一下master是否存活
repl-timeout 60 #
slave-read-only yes # 设置slave为只读,2.8版本以后默认是只读的哈
slave-serve-stale-data yes # slave与master断开,或者正在全量同步数据时,slave是否响应客户端的读请求;
当Slave第一次与Master建立连接的过程;Master和Slave都开启了RDB持久化
== Slave与Master建立连接后,Master端产生数据了;接上图==
Slave与Master建立连接后,Slave重启或者宕机恢复后[但slave的RDB持久化文件没有被移除或损坏,Master也还是好好的运行着哈,重来没有重启过]。接上图
Master重启或宕服恢复后,Slave再次连接Master时的过程
上一篇: Redis的主从复制原理
下一篇: Java Class 解析器实现方法示例