主从复制
redis 主从复制配置和使用都非常简单。通过主从复制可以允许多个 slave server 拥有和
master server 相同的数据库副本
1. redis 主从复制特点
- master 可以拥有多个 slave
- 多个 slave 可以连接同一个 master 外,还可以连接到其他 slave
- 主从复制不会阻塞 master,在同步数据时,master 可以继续处理 client 请求
- 提高系统的伸缩性
2. redis主从复制
当配置好 slave 后,slave 与 master 建立连接,然后发送 sync 命令。无论是第一次连接还是
重新连接,master 都会启动一个后台进程,将数据库快照保存到文件中,同时 master 主进
程会开始收集新的写命令并缓存。后台进程完成写文件后,master 就发送文件给 slave,slave
将文件保存到硬盘上,再加载到内存中,接着 master 就会把缓存的命令转发给 slave,后续
master 将收到的写命令发送给 slave。如果 master 同时收到多个 slave 发来的同步连接命令,
master 只会启动一个进程来写数据库镜像,然后发送给所有的 slave。
3. redis主从配置
环境
master IP:10.236.62.17 端口6379
slave IP: 10.236.62.109 端口6379
操作
修改slave(IP: 10.236.62.109)的redis配置文件:
slaveof 192.168.0.100 6379 (映射到主服务器上)
如果master设置了验证密码,还需配置masterauth。
如果master设置了验证密码为admin,所以配置masterauth admin。
配置完之后启动slave的Redis服务,OK,主从配置完成。
遇到的问题
当完成上述操作以后本以为可以了但是too young to native
MASTER <-> SLAVE sync started
[3286] 21 Apr 16:47:17.630 # Error condition on socket for SYNC: Connection refused
[3286] 21 Apr 16:47:18.640 * Connecting to MASTER 10.236.62.17:6379
master拒绝了slave的请求 ,查手册发现了redis.conf中的bind选项
bind:指定 Redis 只接收来自于该 IP 地址的请求,如果不进行设置,那么将处理所有请求,在
生产环境中最好设置该项
配置文件中默认绑定的是本机的IP默认只接受本机的请求。所以把主从配置文件(redis.conf)bind注释掉或者配置为(测试环境中。线上环境配置为真实IP):
bind 0.0.0.0
重启 ok !
TIP
当发现redis出问题的时候可以查看相关的日志。日志的位置在配置文件(redis.conf)中:
logfile /var/log/redis/redis-server.log
4. 如何判断哪个是主,哪个是从?
判断哪个是主哪个是从呢?我们只需调用 info 这个命令就可以得到主从的信息了,我们在从库上执行
info 命令里面有一个角色标识(role),来判断是主库还是从库,对于本例是一个从库,同时还有一个
master_link_status 用于标明主从是否异步,如果此值=up,说明同步正常;如果此值=down,
说明同步异步。
db0:keys=1,expires=0, 用于说明数据库有几个 key,以及过期 key 的数量
主redis的info 关键信息
# Replication
role:master
connected_slaves:1
slave0:ip=10.236.62.109,port=6379,state=online,offset=15,lag=0
master_repl_offset:15
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:14
# Keyspace
db0:keys=2,expires=0,avg_ttl=0
从redis的关键info信息
# Replication
role:slave
master_host:10.236.62.17
master_port:6379
master_link_status:up
# Keyspace
db0:keys=2,expires=0,avg_ttl=0