redis主从模式

本文详细阐述了Redis主从同步的工作原理,包括全量同步和增量同步策略,以及如何配置主从复制,确保数据的一致性和高可用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

redis主从同步工作原理:

  • slave向master发送sync命令(sync同步数据的请求命令)
  • master启动后台存盘进程,并收集所有修改数据命令
  • master完成后台存盘后,传送整个数据文件到slave
  • slave接收数据文件,加载到内存中完成首次完全同步(首次同步会覆盖掉slave原来的数据)
  • 后续有新数据产生时,master继续收集数据修改命令,依次传给slave,完成同步
  • 主从复制只能实现数据的备份,不能实现服务的高可用
  • 结构模式
  • 一主一从、一主多从、主从从

在这里插入图片描述

  • ip规划:
主机名IP地址角色
redis10192.168.2.10master
redis20192.168.2.20slave

1. 主库配置(redis10):

  • 不设置密码,从库可以直接使用slaveof ip port连接主库。
[root@redis10 ~]# vim /etc/redis.conf
修改如下:
bind 0.0.0.0       ---运行任何主机访问
protected-mode no   ---关闭保护机制
daemonize yes       ----以守护进程开启

//重启服务
[root@redis10 ~]# systemctl restart redis

  • 设置认证密码,从库需要指定master得密码才能完成同步,否则日志会有报错提示:
[root@localhost ~]# vim /etc/redis.conf
# 修改配置文件:
bind 0.0.0.0       ---运行任何主机访问
protected-mode yes   ---开启保护机制
daemonize yes       ----以守护进程开启
requirepass "123456"

//重启服务
[root@localhost ~]# systemctl restart redis

2. 从库配置(redis20):

[root@redis20 ~]# vim /etc/redis.conf
//修改配置文件设置(重启服务器生效)
bind 0.0.0.0       ---运行任何主机访问
protected-mode yes   ---开启保护机制
daemonize yes       ----以守护进程开启
//指定隶属于谁:
REPLICAOF 192.168.2.10 6379
或者
slaveof 192.168.2.10  6379

//指定master的认证密码(如果远程服务器设置了密码,则需要认证密码)
masterauth "123456"
[root@localhost ~]# systemctl restart redis
或者:
//直接在命令行设置(直接生效,重启服务失效):
//指定谁是主库:
slaveof 192.168.2.10 6379
或者
REPLICAOF 192.168.2.10 6379
//设置master得认证密码:
CONFIG set masterauth 123456
//取消主从关系,恢复master身份:
SLAVEOF no one

3.查看从库状态:

[root@redis20 ~]# redis-cli 
127.0.0.1:6379> INFO replication
# Replication
role:slave      --本机的角色
master_host:192.168.2.10     主库的IP地址
master_port:6379             主库的端口号
master_link_status:up        主库连接状态必须为up,表示成功
master_last_io_seconds_ago:6
master_sync_in_progress:0
slave_repl_offset:0
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:9f677f11dbabe073413e0d0c9158b257a0867ee3
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:0

4. 查看主库状态:

[root@redis20 ~]# redis-cli 
127.0.0.1:6379> info replication
# Replication
role:master     ---本机的角色
connected_slaves:1     --从库的数量
从库的信息:
slave0:ip=192.168.2.20,port=6379,state=online,offset=238,lag=0
master_replid:9f677f11dbabe073413e0d0c9158b257a0867ee3
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:238
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:238

5. 日志分析:

5.1. redis同步过程:

Connecting to MASTER 192.168.2.10:6379
MASTER <-> REPLICA sync started
# 开始非阻塞同步
Non blocking connect for SYNC fired the event.
Master replied to PING, replication can continue...
Partial resynchronization not possible (no cached master)
# 全量同步
Full resync from master:
74fb29643971834fdf701beb1708ce9ddc23bdee:0
# 接受数据
MASTER <-> REPLICA sync: receiving 193 bytes from master
# 清空以前缓存得数据
MASTER <-> REPLICA sync: Flushing old data
# 加载数据库到内存
MASTER <-> REPLICA sync: Loading DB in memory
# 完成同步
MASTER <-> REPLICA sync: Finished with success

5.2. redis主库设置了同步密码,从库没有指定,则报如下错:

Unexpected reply to PSYNC from master: -NOAUTH
Authentication required.
Retrying with SYNC...
MASTER aborted replication with an error: NOAUTH
Authentication required.

6. 主从复制相关参数解读:

//指定主库IP和端口:
replicaof  192.168.2.10  6379
//指定主库得认证密码:
masterauth 123456
// 从库正在复制时,从库可以响应用户读请求,如果设置为no,则返回报错信
息。
replica-serve-stale-data yes
//设置从库为只读
replica-read-only yes
//启动socket方式复制数据库,master生成rdb文件,不在是先保存到磁盘,然后发给从库,而是直接把rdb发送给从库,减少了磁盘IO
repl-diskless-sync yes
//配置延时时间,让更多slave加入传输队列,如果复制已经开始,则5秒内,不接受新的slave同步请求
repl-diskless-sync-delay 5
//指定从库定期检查主库状态,默认10秒
repl-ping-replica-period 10
//同步超时时间
repl-timeout 60
//是否禁用tcp-nodelay,yes表示禁用,redis会在写缓存积累到一定量之
后一起发送,节省带宽,但是会导致master和slave数据延迟,no,表示启
用,redis会立即发送数据包,即使是很小数据,数据同步会比较快,但是消耗更多带宽
repl-disable-tcp-nodelay no
//设置在同步过程中,写缓冲区得大小,需要考虑到同步的时间和数据的写入速度
repl-backlog-size 1mb
//设置从库的优先级,在主库宕机后,根据优先级选择slave,值越小,则优先级越高,0,表示不参与竞选,故永远不会被选中。
replica-priority 100

7. 同步策略:

7.1. 全量同步:

  • Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。具体步骤如下:
  1. 从服务器连接主服务器,发送SYNC命令;
  2. 主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;
  3. 主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;
  4. 从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;
  5. 主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
  6. 从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;
  • 完成上面几个步骤后就完成了从服务器数据初始化的所有操作,从服务器此时可以接收来自用户的读请求。

7.2. 增量同步:

  • Redis增量复制是指Slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。 增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令。

7.3. Redis主从同步策略:

  • 主从刚刚连接的时候,进行全量同步;全量同步结束后,进行增量同步。当然,如果有需要,slave 在任何时候都可以发起全量同步。redis 策略是,无论如何,首先会尝试进行增量同步,如不成功,要求重新进行全量同步。

7.4. 注意点:

  • 如果master重启,会因为master_replid不一致导致全量同步,当有多个slave时,可能会导致Master IO剧增宕机。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值