redis主从

redis主从

redis主从

   Redis支持主从复制分为全量同步和增量同步,首次同步是全量同步,主从同步可以让slave从master备份数据,而且slave还可与有slave器,即另外一台redis服务器可以从一台slave进行数据同步。

redis主从过程

   redis的主从同步是非阻塞的,master收到slave的sync(2.8版本之前是PSYNC)命令后会fork一个子进程在后台执行bgsave,并将新写入的数据写入到一个缓冲区里面。   bgsave执行完成之后并将生成的RDB文件发送给slave,slave收到RDB文件载入自己的内存,然后master将缓冲区的内容全部发送给slave。   之后的同步slave会发送一个offset的位置(等同于MySQL的binlog的位置)给master,master检查后位置没有错误将此位置之后的数据包括写在缓冲区的积压数据发送给slave,slave将master发送的挤压数据写入内存,这样一次完整的数据同步,再之后再同步的时候slave只要发送当前的offset位置给master,然后master根据响应的位置将之后的数据发送给slave保存到其内存即可。

   另外redis的key 大小不建议超过2MB,因为2MB以下的key的性能是最佳的,key比较大的时候可以使用列表、key分级等方式将key进行拆分保存到不同的hash里面,另外第一次主从同步如果有数十G的数据,如果在主redis服务器写入频繁的时候同步,可能会出现RDB文件还没有向从服务器传输完成但主服务器的缓冲区已经写满导致从服务器发送sync的时候出现数据不一致导致再次全量同步的情况发生,因此建议在晚上住redis写入较少的时候在做同步,避免此类的情况发生。

   Redis全量复制一般发生在Slave首次初始化阶段,这时Slave需要将Master上的所有数据都复制一份。具体主从同步骤如下:

  • 1)slave连接master(连接过程包含认证,slave需要与master使用相同的口令),发送SYNC命令;
  • 2)master接收到SYNC命令后,开始执行BGSAVE命令生成RDB快照文件并使用缓冲区记录此后执行的所有写命令(缓冲区用于master新写入的数据);
  • 3)master BGSAVE执行完后,向所有slave发送快照文件,并在发送期间继续记录被执行的写命令;
  • 4)slave收到快照文件后丢弃所有旧数据,载入收到的快照;
  • 5)master快照发送完毕后开始向slave发送缓冲区中的写命令;
  • 6)slave完成对快照的载入,开始接收命令请求,并执行来自master缓冲区的写命令;
  • 7)(前面6步的完全同步完成之后)后期同步slave会先发送自己slave_repl_offset位置,只同步新增加的数据,不再全量同步。
主从同步的一些概念

   redis使用异复制数据,从redis2.8开始,slave会以每秒一次的频率向master报告复制流(replication stream)的处理进度

   一个master可以同时有多个slave、slave还可以有自己的slave

   复制功能不会阻塞slave,只要在redis.conf中做了设置,即使slave正在和master进行初次同步,slave也可以使用之前的数据类处理客户端请求,不过slave删除旧版本数据并载入新数据的时间段内,连接请求会被阻塞,可以设置slave让他在和master之间断开连接时,向客户端发送一个错误信息。复制功能用于实现数据冗余,可以在slave执行复杂的命令在slave执行,以减轻master的压力,可以在slave执行数据持久化而关闭master的持久化功能,然后在slave执行数据持久化即可。

是否需要在master打开持久化功能

   有一个场景,有三个服务器,master,slaveA和slaveB,slaveA从master同步数据,而slaveB从slaveA同步数据,假如master没有开启数据持久化,那么当master出现问题重启redis服务后由于没有做数据持久会丢失所以数据为空,而slaveA同步master后也没有数据,slaveB同步从slaveA的数据之后也会没有数据,因此master还是推荐开启数据持久化以避免产生一系列的问题。

主从同步优化:

Redis在2.8版本之前没有提供增量部分复制的功能,当网络闪断或者slave Redis重启之后会导致主从之间的全量同步,即从2.8版本开始增加了部分复制的功能。因此redis主从一般使用3.0以后的版本

repl-diskless-sync no

  • #是否使用无盘同步RDB文件,默认为no,no为不使用无盘(使用无盘会大量使用网络资源),需要将RDB文件保存到磁盘后再发送给slave,yes为支持无盘,支持无盘就是RDB文件不需要保存至本地磁盘,而且直接通过socket文件发送给slave。
  • #此选项设为no

repl-diskless-sync-delay 5

  • #Master准备好RDB文件后等等待传输时间

repl-ping-slave-period 10

  • #slave端向server端发送ping的时间区间设置,默认为10秒,slave与master的心跳检测时长,一般不会超过10s

repl-timeout 60

  • #设置超时时间

repl-disable-tcp-nodelay no

  • #是否启用TCP_NODELAY,如设置成yes,则redis会合并小的TCP包从而节省带宽,但会增加同步延迟(40ms),造成master与slave数据不一致,假如设置成no,则redis master会立即发送同步数据,没有延迟,前者关注性能,后者关注redis服务中的数据一致性。
  • #一般此选项设为no、数据重要!

repl-backlog-size 1mb

  • #master的写入数据缓冲区,用于记录自上一次同步后到下一次同步过程中间的写入命令,计算公式:repl-backlog-size = 允许从节点最大中断时长 * 主实例offset每秒写入量,比如master每秒最大写入64mb,最大允许60秒,那么就要设置为64mb*60秒=3840MB(3.8G)

repl-backlog-ttl 3600

  • #如果一段时间后没有slave连接到master,则backlog size的内存将会被释放。如果值为0则表示永远不释放这部份内存。

slave-priority 100

  • #slave端的优先级设置,值是一个整数,数字越小表示优先级越高。当master故障时将会按照优先级来选择slave端进行恢复,如果值设置为0,则表示该slave永远不会被选择。
  • 一般都设为100(默认),有哨兵进行选举

#min-slaves-to-write 1

  • #设置一个master端的可用slave少于多少个
  • 至少一个master配置一个slave

#min-slaves-max-lag 20

  • #设置所有slave延迟时间都大于多少秒时,master不接收写操作(拒绝写入)。
redis主从同步的实现
实验图示:

slave配置:
  • 编辑配置文件将master信息填入slave配置中即可
[root@centos7-27 ~]# vim /apps/redis/etc/redis.conf
slaveof 192.168.38.17 6379
masterauth 123456
slave节点状态

同步日志

slave日志:

  • 注:若一开始slave上有数据会先执行flushall,然后再发送sync同步信号

master日志:

master与slave之间的心跳检测

redis主从之间的心跳检测,可以通过monitor命令查看

将从服务器设置为主服务器
127.0.0.1:6379> SLAVEOF no one 
127.0.0.1:6379> INFO
# Replication
role:master
connected_slaves:0
master_replid:1066058f96ac4f573ebb6f43791c63b7b2be6359
master_replid2:6dba9ebceb8733f23609a1c625bebe98a8be6dc6
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值