Redis——master-replica主从同步

x33g5p2x  于9个月前 转载在 Redis  
字(2.5k)|赞(0)|评价(0)|浏览(96)

主从同步主要用来做备份,可一主多从,但是master宕机时无法自动切换,需手动切换;

如果master有自动重启最好配置持久化,否则重启数据清空并直接同步到 同步到slave,导致slave数据也清空;

当前使用的redis版本为5.0.4;

redis.conf中主从同步的相关设置项:

  • replicaof <masterip> <masterport>

设置master的ip地址和端口;

  • masterauth <master-password>

设置master的密码(如果master用requirepass指定了密码);

  • replica-serve-stale-data yes

当slave跟master断开或者正在同步数据的时候,如果设置yes,则可能返回的数据是旧数据(首次启动slave可能数据是空的);如果设置no,会返回错误(除了以下命令:INFO, replicaOF, AUTH, PING, SHUTDOWN, REPLCONF, ROLE, CONFIG,SUBSCRIBE, UNSUBSCRIBE, PSUBSCRIBE, PUNSUBSCRIBE, PUBLISH, PUBSUB,COMMAND, POST, HOST:, LATENCY);(默认yes)

  • replica-read-only yes

将slave设置为只读,禁止写操作;(还可以使用rename-command配置将危险命令屏蔽,从2.6版本开始默认yes)

  • repl-diskless-sync no

当全量同步使用RDB时,设置同步方式为磁盘同步或者网络同步,磁盘慢网络带宽好的时候使用网络同步更好;

  • repl-diskless-sync-delay 5

设置无磁盘同步等待时间,同步开始以后无法为新到的slave开始同步,所以可以设置等待几秒的时间让尽可能多的slave连接,以便给多个slave开始同步;(默认5秒,设置为0禁用等待,会立即开始同步)

  • repl-ping-replica-period 10

副本发送ping给服务端的时间间隔;(默认10秒)

  • repl-timeout 60

为三方面设置超时:从副本角度看同步过程中大批量的I/O传输的超时、从副本角度认为maser超时(data,pings)、从master角度认为副本超时(REPLCONF,ACK,pings);(需要注意该值要大于repl-ping-replica-period,否则在网络不畅的时候主从可能频繁超时断开)

  • repl-disable-tcp-nodelay no

设置同步后是否关闭socket上的TCP_NODELAY;如果设置yes,redis会用更小的tcp包和更小的带宽去发送同步数据,可能会造成同步延迟(linux内核默认的配置是40ms);如果设置no,同步延迟会更低,但带宽占用会增加;(带宽大路由多的时候可能设置yes更好)

  • repl-backlog-size 1mb

设置backlog缓冲区,以缓冲断开连接时候的数据,用于部分同步;缓冲越大,进行部分更新的断开时间就越长;(至少有一个副本连接的时候才会分配backlog)

  • repl-backlog-ttl 3600

当master没有连接slave一段时间后会释放backlog,该项设置最后一个slave断开后到释放backlog之间需要的秒数;副本永远不会因为超时而释放backkog;(设置0永远不会释放backlog)

  • replica-priority 100

设置提升优先级,master宕机后哨兵会将一个slave提升为master,优先级小的更容易被提升;(设置0表示slave永远不会被提升为master,默认100)

  • min-replicas-to-write 3
  • min-replicas-max-lag 10

以上两个设置联合作用,设定副本(在线且延迟不超过指定秒数,延迟从最后一次收到副本的ping计算,副本通常每秒一次ping)数量少于某个值master停止写操作;任何一个设置为0都可关闭该功能;(默认min-replicas-to-write为0,功能是关闭的,min-replicas-max-lag是10)

  • replica-announce-ip 5.5.5.5
  • replica-announce-port 1234

以上两个设置将副本的明确的ip和端口报告给master,以上两项可以不必同时指定;(在使用端口转发或者NAT时,副本可能会使用多个不同的ip和port)

测试实验:

全部redis所在的虚拟机ip为192.168.1.31;

  • master的redis.conf配置修改:(跟基本redis配置修改差不多)
bind 192.168.1.31
requirepass 654321

其他端口、pidfile、日志位置、rdb持久化等配置使用默认的就好,为了测试方便后台运行也使用的默认关闭设置;

  • slave的redis.conf配置修改:(除了基本redis配置外主要在REPLICATION相关的配置里修改,因为跟master在同一虚拟机上所以调整了端口等信息)
bind 192.168.1.31
port 6380
pidfile /var/run/redis_6380.pid
replicaof 192.168.1.31 6379
masterauth 654321

其他配置使用的默认redis.conf里的设置;

启动master:

然后启动slave:(全量同步)

master日志显示:

使用客户端连接到msater并保存数据:

使用客户端连接到slave并查询:(由于默认设置slave是只读,所以无法写)

停掉slave并用master保存数据:

重启slave并连接到slave查询数据:(部分同步)

使用INFO命令也可以查看主从信息:

当然master下面也可以挂载多个slave,slave下面也可以挂slave;

比如我再弄一个6381的redis挂到6380上,6380的INFO就会变成这样:(此时是全量同步)

或者把这个6381从6380上拿下来挂到6379上,6379的INFO就会变成:(此时是部分同步)

相关文章

热门文章

更多