欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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持久化
Redis主从复制原理
== Slave与Master建立连接后,Master端产生数据了;接上图==
Redis主从复制原理
Slave与Master建立连接后,Slave重启或者宕机恢复后[但slave的RDB持久化文件没有被移除或损坏,Master也还是好好的运行着哈,重来没有重启过]。接上图
Redis主从复制原理
Master重启或宕服恢复后,Slave再次连接Master时的过程
Redis主从复制原理

相关标签: Redis数据库