redis主从同步工作原理:
slave向master发送sync命令(sync同步数据的请求命令) master启动后台存盘进程,并收集所有修改数据命令 master完成后台存盘后,传送整个数据文件到slave slave接收数据文件,加载到内存中完成首次完全同步(首次同步会覆盖掉slave原来的数据) 后续有新数据产生时,master继续收集数据修改命令,依次传给slave,完成同步 主从复制只能实现数据的备份,不能实现服务的高可用
主机名 IP地址 角色 redis10 192.168.2.10 master redis20 192.168.2.20 slave
1. 主库配置(redis10):
不设置密码,从库可以直接使用slaveof ip port连接主库。
[ root@redis10 ~]
修改如下:
bind 0.0 .0.0 ---运行任何主机访问
protected-mode no ---关闭保护机制
daemonize yes ----以守护进程开启
//重启服务
[ root@redis10 ~]
设置认证密码,从库需要指定master得密码才能完成同步,否则日志会有报错提示:
[ root@localhost ~]
bind 0.0 .0.0 ---运行任何主机访问
protected-mode yes ---开启保护机制
daemonize yes ----以守护进程开启
requirepass "123456"
//重启服务
[ root@localhost ~]
2. 从库配置(redis20):
[ root@redis20 ~]
//修改配置文件设置(重启服务器生效)
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 ~]
或者:
//直接在命令行设置(直接生效,重启服务失效):
//指定谁是主库:
slaveof 192.168 .2.10 6379
或者
REPLICAOF 192.168 .2.10 6379
//设置master得认证密码:
CONFIG set masterauth 123456
//取消主从关系,恢复master身份:
SLAVEOF no one
3.查看从库状态:
[ root@redis20 ~]
127.0 .0.1:6379 > INFO 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 ~]
127.0 .0.1:6379 > info 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上的所有数据都复制一份。具体步骤如下:
从服务器连接主服务器,发送SYNC命令; 主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令; 主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令; 从服务器收到快照文件后丢弃所有旧数据,载入收到的快照; 主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令; 从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;
完成上面几个步骤后就完成了从服务器数据初始化的所有操作,从服务器此时可以接收来自用户的读请求。
7.2. 增量同步:
Redis增量复制是指Slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。 增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令。
7.3. Redis主从同步策略:
主从刚刚连接的时候,进行全量同步;全量同步结束后,进行增量同步。当然,如果有需要,slave 在任何时候都可以发起全量同步。redis 策略是,无论如何,首先会尝试进行增量同步,如不成功,要求重新进行全量同步。
7.4. 注意点:
如果master重启,会因为master_replid不一致导致全量同步,当有多个slave时,可能会导致Master IO剧增宕机。