Redis主从

Redis主从

Redis主从

主从必读事项

  • 通过主从配置可以实现读写分离(从机默认只读)
  • slave首次启动或者重启连接到master时,会导致主库bgsave。这一点可以通过Redis的debug日志看得到
  • 设置主从后,首次部署从库是增量同步的,原本数据将被全部清掉
  • master可以拥有多个slave
  • 多个slave可以连接同一个master外,还可以连接到其他slave
  • 可以在master禁用数据持久化,注释掉master配置文件中的所有save配置,只需在slave上配置数据持久化即可
  • 主从复制不会阻塞master,在同步数据时,master可以继续处理client的请求,这一点可以通过master的日志证明
2966:M 04 Mar 05:29:11.533 # Connection with slave 192.168.56.101:6379 lost.
2966:M 04 Mar 05:29:12.612 * Slave 192.168.56.101:6379 asks for synchronization
2966:M 04 Mar 05:29:12.612 * Partial resynchronization request from 192.168.56.101:6379 accepted. Sending 0 bytes of backlog starting from offset 1.
  • 主从同步原理

配置好slave后,slave会马上master建立连接,slave立即发送sync命令, 而master马上异步同步数据. 不管是第一次连接还是重新连接, master都会启动一个后台进程, 将数据库快照保存到文件中,同时master主进程会开始收集新的写命令并缓存.后台进程完成写文件后, master就发送文件给slave, slave将文件保存到硬盘上, 再加载到内存中, 接着master就会把缓存的命令转发给slave, 后续master将收到的写命令发送给 slave. 如果master同时收到多个slave发来的同步连接命令, master只会启动一个进程来写数据库镜像, 然后发送给所有的slave.

  • 因为redis采用的是异步复制,没有办法避免数据的丢失。但是可以通过配置来做到尽可能的减少丢失
# master最少得有多少个健康的slave存活才能执行写命令 
# 当min-slaves-to-write=1时,slave去维护断开的情况下,主库此时只能读,不能写
# 只有一个从库且要去维护的时候,请先设置 最少写从库的个数为0,再去维护从库
min-slaves-to-write 1
# 延迟小于min-slaves-max-lag秒的slave才认为是健康的slave
# 里的延迟值就是提到的INFO replication命令的lag值。
min-slaves-max-lag 10

主机配置

# 如果主从要跨服务器,需要关闭保护模式,负责无法连接.
# protected-mode yes
protected-mode no
# 如果跨服务器需要设置修改或者关闭IP的监听地址,否则外部无法连接(该IP绑定的意思是只接收来自于该IP地址的请求)
# bind 127.0.0.1
bind 0.0.0.0
# 设置连接密码(非必须,可以不设置)
requirepass redis-password

##### 数据持久化设置
#主机也可关闭数据持久化,提高写入的性能,把持久化策略改成这样既可
# save 900 1
# save 300 10
# save 60 10000
save ""

从机配置

命令行设置从库

SLAVEOF host port
# 启动从机,同时为从机指定读取的配置文件,设置主机的地址(主机如果有密码才需要设置masterauth)
redis-server /etc/redis/redis.conf --slaveof 192.168.56.100 6379 --masterauth redis-password
# 也可以通过先启动从机的服务再为从机设置主机地址
root@ubuntu:~# redis-cli 
127.0.0.1:6379> slaveof 192.168.56.100 6379
OK

配置文件设置从库

# 通过修改下面的配置文件设置主机地址和认证密码(主机如果有密码才需要设置masterauth)
# slaveof <masterip> <masterport>
# masterauth <master-password>
slaveof 192.168.56.100 6379
masterauth redis-password

##### 数据持久化设置
# 开启aof
# 此选项为aof功能的开关,默认为“no”,可以通过“yes”来开启aof功能  
# 只有在“yes”下,aof重写/文件同步等特性才会生效 
appendonly yes  
# aof 日志文件名
appendfilename redis.aof  
#  每秒记录一次日志,建议everysec
appendfsync everysec  
# 重写过程中是否向日志文件写入,yes 代表rewrite过程中,不向aof文件中追加信息,rewrite结束后再写入,no 代表rewrite执行的同时,也向aof追加信息
no-appendfsync-on-rewrite yes  
# 触发重写文件增长百分比 默认100%
auto-aof-rewrite-percentage 100 
# 触发重写最小aof文件尺寸
auto-aof-rewrite-min-size 64mb  

关闭从机的主从关系

# 在从机中执行该命令可以取消该从机与主机的主从关系
slaveof no one
# 执行案例
127.0.0.1:6379> slaveof no one
OK

查看主从复制情况

  • 命令
# 查看复制情况
info replication
  • 查看主库情况
root@ubuntu:~# redis-cli info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.56.102,port=6379,state=online,offset=2576,lag=1
slave1:ip=192.168.56.101,port=6379,state=online,offset=2576,lag=1
master_replid:aa50063cb231eb77f42074a72739b7dbda163825
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2576
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:2576
  • 查看从库情况
root@ubuntu:~# redis-cli info replication 
# Replication
role:slave
master_host:192.168.56.100
master_port:6379
master_link_status:up
master_last_io_seconds_ago:6
master_sync_in_progress:0
slave_repl_offset:280
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:b481fcb52e9f8ffe1e3180f09e0e982ae0b2fcf9
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:280
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:267
repl_backlog_histlen:14