redis主从同步

redis主从复制原理:

(1)Slave服务器连接到Master服务器.
(2)Slave服务器发送SYCN命令.
(3)Master服务器备份数据库到.rdb文件.
(4)Master服务器把.rdb文件传输给Slave服务器.
(5)Slave服务器把.rdb文件数据导入到数据库中.
上面的这5步是同步的第一阶段, 接下来在Master服务器上调用每一个命令都使用replicationFeedSlaves()来同步到Slave服务器.如果Master和Slave之间的链接出现断连现象,Slave可以自动重连Master。2.8以前按照full sync再同步。2.8以后,因为有backlog的设定,backlog存在master的内存里,重新连接之前,如果redis没有重启,并且offset在backlog保存的范围内,可以实现从断开地方同期,不符合这个条件,还是full sync

主从复制简介:

1,master可以有多个slave
2,slave同样可以接受其他slave的连接和同步请求,这样可以有效分载master压力。
3,主从复制不会阻塞master,但一个或者多个slave于master进行初次数据同步时,master可以继续处理客户端的请求,相反slave在进行初次数据同步时会阻塞,不能处理客户端的请求。
4,可以在master禁用持久化,只需要注释master配置文件中所有的slave配置,然后只在slave上配置数据持久化
5,slave可以为客户端提供只读操作的服务,写服务必须由master来完成。

配置主从同步:

主:192.168.225.132:6379
从:192.168.225.132:6380

主服务器不需要做任何修改,修改从服务器配置如下:

slave-serve-stale-data yes                 //同步时,从redis仍会继续相应客户端请求。no表示同步时,从redis不响应请求
slaveof 192.168.100.20 6379                //指定master的ip和端口  
repl-ping-slave-period 10                //从redis会周期性的向主redis发出PING包,默认10s一次
repl-timeout 60                        //主从同步超时时间,60s
repl-disable-tcp-nodelay no                //开启TCP_NODELAY,那么主redis会使用更少的TCP包和更少的带宽来向从redis传输数据,会增加同步的延迟。关闭了TCP_NODELAY,那么数据同步的延迟时间会降低,但是会消耗更多的带宽。
repl-backlog-size 1mb                //设置同步队列长度为1M,队列长度(backlog)是主redis中的一个缓冲区,主从断开期间,主redis会用这个缓冲区来缓存应该发给从        redis的数据,主从从新连接上后,只需要同步这部分增量数据即可。
repl-backlog-ttl 3600                //主redis等了3600秒还是无法连接到从redis,那缓冲队列中的数据将被清理掉。如果设置为0,则表示永远不清理。
slave-priority 100                //从redis的优先级,主redis出现问题,优先级高的从redis会升级为主redis,编号越小优先级越高。优先级为0表示永远也不能成为主。
min-slaves-to-write 3                //大于等于3个从redis的连接延迟大于10秒,那么主redis就不再接受外部的写请求。两个配置中有一个被置为0,则这个特性将被关闭。
min-slaves-max-lag 10

主从验证:
登录主库执行:

[root@master ~]# redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> info Replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=658,lag=1                //offset表示当前slave的复制偏移量
master_repl_offset:658                        //当前master记录的复制偏移量
repl_backlog_active:1
repl_backlog_size:1048576                ## 复制集后台backlog大小,越大,slave可以丢失的时间就越长
repl_backlog_first_byte_offset:2
repl_backlog_histlen:3131

登录从库执行:

[root@master ~]# redis-cli -h 127.0.0.1 -p 6380
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up                //必须是up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_repl_offset:518
slave_priority:100

主从复制正常时:

master_link_status:up
master_repl_offset和slave_repl_offset相等
master_last_io_seconds_ago 在 10 秒内。

主库宕机后将从库提升为主:

127.0.0.1:6380> slaveof no one                //从库手动提升为主库
127.0.0.1:6380> slaveof 127.0.0.1 6379        //手动设置为从库
上一篇:redis哨兵


下一篇:mysql审计