简介
主从复制是指将一台Redis服务器的数据,复制到其它的Redis服务器。前者称为主节点(master),后者称为从节点(slave);数据的复制是单向的,只能由主节点到从节点。
默认情况下,每台Redis服务器都是主节点,且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。主节点以非阻塞方式同步数据至slave主机;
复制的作用
- 数据备份
- 负载均衡
- 故障恢复(主节点down了,从节点可以提供服务)
- … …
复制的常用配置项
-
slaveof
复制选项,slave复制对应的master -
masterauth
master设置了口令,则需要这一项配置master的口令。 -
slave-serve-stale-data yes
当从库同主机失去连接或者复制正在进行,从机库有两种运行方式:1) 如果slave-serve-stale-data设置为yes(默认设置),从库会继续响应客户端的请求。2) 如果slave-serve-stale-data设置为no,除去INFO和SLAVOF命令之外的任何请求都会返回一个错误”SYNC with master in progress”。 -
slave-read-only yes #
从节点是否只读 -
repl-diskless-sync no
是否使用socket方式复制数据。目前redis复制提供两种方式,disk和socket。如果新的slave连上来或者重连的slave无法部分同步,就会执行全量同步,master会生成rdb文件。有2种方式:disk方式是master创建一个新的进程把rdb文件保存到磁盘,再把磁盘上的rdb文件传递给slave。socket是master创建一个新的进程,直接把rdb文件以socket的方式发给slave。disk方式的时候,当一个rdb保存的过程中,多个slave都能共享这个rdb文件。socket的方式就的一个个slave顺序复制。在磁盘速度缓慢,网速快的情况下推荐用socket方式。 -
repl-diskless-sync-delay 5
diskless复制的延迟时间,防止设置为0。一旦复制开始,节点不会再接收新slave的复制请求直到下一个rdb传输。所以最好等待一段时间,等更多的slave连上来。 -
repl-ping-slave-period 10
slave根据指定的时间间隔向服务器发送ping请求。时间间隔可以通过 repl_ping_slave_period 来设置,默认10秒 -
repl-timeout 60
复制连接超时时间,master和slave都有超时时间的设置。master检测到slave上次发送的时间超过repl-timeout,即认为slave离线,清除该slave信息。slave检测到上次和master交互的时间超过repl-timeout,则认为master离线。需要注意的是repl-timeout需要设置一个比repl-ping-slave-period更大的值,不然会经常检测到超时。 -
repl-disable-tcp-nodelay no
表示数据立即传输 不等待 -
repl-backlog-size 1mb
复制缓冲区大小,这是一个环形复制缓冲区,用来保存最新复制的命令。这样在slave离线的时候,不需要完全复制master的数据,如果可以执行部分同步,只需要把缓冲区的部分数据复制给slave,就能恢复正常复制状态。缓冲区的大小越大,slave离线的时间可以更长,复制缓冲区只有在有slave连接的时候才分配内存。没有slave的一段时间,内存会被释放出来,默认1m。 -
slave-priority 100
复制集群中,主节点故障时,sentinel应用场景中的主节点选举时使用的优先级;数字越小优先级越高,但0表示不参与选举; -
min-slaves-to-write 3
redis提供了可以让master停止写入的方式,如果配置了min-slaves-to-write,健康的slave的个数小于N,mater就禁止写入。master最少得有多少个健康的slave存活才能执行写命令。这个配置虽然不能保证N个slave都一定能接收到master的写操作,但是能避免没有足够健康的slave的时候,master不能写入来避免数据丢失。设置为0是关闭该功能 -
min-slaves-max-lag 10
延迟小于min-slaves-max-lag秒的slave才认为是健康的slave。
配置主从复制
第一种方式:修改从节点配置文件
slaveof 192.168.253.128 6379 #表示主库为192.168.253.128,端口为6379
#masterauth <master-password> 这里主节点没有设置口令,所以不需要配置这一项。如果设置了口令,这里需要设置主节点的口令
第二种方式:客户端命令设置
[root@localhost ~]# redis-cli -h 192.168.253.158 #进入客户端
192.168.253.158:6379> slaveof 192.168.253.128 6379 #设置主节点
第三种方式:命令行接口设置
在启动命令后面加入:slaveof <masterip> <masterport>
[root@localhost ~]# redis-server /etc/redis.conf slaveof 192.168.253.128 6379
测试
这个是从节点日志信息
在主节点也可以查看相关信息
然后我们在主节点创建个键值对
可以看到成功了
断开复制
断开并不会清空之前同步的数据,只是不再接受主节点新的数据变化。
[root@localhost ~]# redis-cli -h 192.168.253.158
192.168.253.158:6379> slaveof no one
查看一下日志
断开复制之后又恢复到了主节点状态