Redis入门(三)-主从复制

Redis学习(三)

Redis持久化方式

进行持久化的目的防止Redis服务器宕机导致的在内存中的数据丢失。

RDB
  1. 自动进行快照

    根据配置文件中配置的规则,自动将内存中的数据生成一份副本,存储在硬盘上,这个过程称为-快照

    redis.conf文件中给出的配置示例为

save 900 1

save 300 10

Save 60 10000

这三条配置规则的关系为 ,有一个满足,Redis就会把进行一次快照操作。当900秒内有一个键或者一个以上的键被更改,则会进行快照操作,或者,在300秒内,有10个或者10个以上的键被更改,再或者,在60秒内,有10000个键被更改,都会进行一次快照操作 。可根据实际情况配置。

快照导出的文件名字和导出文件存储的路径,在redis.conf下的dbfilename、dir下配置,默认配置为

dbfilename dump.rdb

dir ./

  1. 当Redis重启之前、手动迁移之前,手动备份时,还需要手动进行快照操作.

    • 执行save命令

      save
      

      此时会进行同步快照操作,在执行快照这一过程中,Redis会阻塞所有来自客户端的请求。当Redis连接较多时,可能会导致Redis长时间不响应。生产环境中要避免使用

    • 执行bgsave

      BGSAVE
      

      这个命令,则代表进行快照操作是异步的。而save是同步的操作。在进行快照操作的时候,可以继续响应客户端的请求。如果需要查看异步快照操作是否完成,则可以使用

      LASTSAVE
      

      返回的是Unix时间戳,即可知道

    • 执行flashall

      FLUSHALL
      

      会清空Redis数据库中的所有数据,如果此时,配置文件中有自动快照的配置规则,则进行快照处理。如果配置文件中没有配置规则,则不会进行快照操作。

AOF-Append Only File

RDB的方式,是在一定时间内进行快照,而宕机可能就发生在配置规则之间,可能还不到60秒,Redis就挂了,那么此时还是有丢失数据的风险.使用AOF进一步降低这种风险。

开启AOF、以及配置文件名,AOF文件的存储路径和RDB存储路径使用的是同一个参数 dir

appendonly yes

appendfilename appendonly.aof

当Redis每执行一条修改数据、插入、删除数据的命令时,都会向AOF文件中写入。(有点像MySQL的同步复制) 由于操作系统缓存的机制,真正的数据并没有被刷新到磁盘上,而是位于操作系统的缓存中。如果此时操作系统异常退出,那么AOF文件内容就不会真正的刷新到磁盘上的AOF文件。因此,可以通过配置来设置操作系统刷新到硬盘上的时机

appendfsync everysec #每秒刷新一次到磁盘。默认

appendfsync always # 每执行一条命令刷新一次

appendfsync no # 等待操作系统自己刷新

详细的解释,可时机查看redis.conf中的说明

在这里插入图片描述

Redis启动时,如何从持久化的文件中恢复数据?

启动时,根据配置文件中的配置目录,自动加载存储的文件.rdb或者.aof

在这里插入图片描述

主从复制

进行复制的目的很简单,像MySQL一样,单机的吞吐量不能满足要求了,使用从库来分担主库的读写压力,主库只需要专注于写操作即可,单个Redis节点发生故障后,短时间内将不能继续提供服务

修改redisX.conf配置文件

X代表具体的文件名。 配置16379redis-server,将6379设置为其master

replicaof 127.0.0.1 6379

在这里插入图片描述

命令行设置

redis-server --port 16379 --slaveof 127.0.0.1 6379

查看配置是否生效

INFO replcation

slave端信息如下:
在这里插入图片描述

master端信息如下:
在这里插入图片描述

在master上新增数据

在master上新增数据,在slave上进行查询,是可以查的到

复制流程解析

在这里插入图片描述

  • 主库启动,等待连接

  • 从库启动,向主库发送请求SYNC命令
    在这里插入图片描述

  • 主库收到请求之后使用BGSAVE命令,异步的将内存中的数据刷新到磁盘上的RDB文件上。

  • 刷新完毕之后,会将RDB文件发送给从库,从库收到之后读取文件中的命令,刷新数据到slave的内存中

和MySQL相似,既然是主从复制,那么就有可能存在主从数据在某一段时间内不一致的问题

使用配置.当只有3个或3个以上的slave连接到master时,主库才可写。slave和master最长的心跳间隔,如果距离上一次salve于master联系超过10秒,master则认为此salve不可用了。

min-replicas-to-write 3

Min-replicas-max-lag 10

增量复制

当主库和从库因为网络问题断开连接之后,此时还会有一些命令向主库发送。这种情况下,依然发送的命令会被存储在主库的积压队列== 中,默认积压队列大小为1M。当从库和主库恢复连接时,主库会判断从库最后成功的命令偏移量是否在积压队列中,如果在,则进行增量复制。如果不在,则进行上面的操作。将所有数据flush到磁盘上的RDB文件中,然后发给从库。

设置积压队列的大小

repl-backlog-size 1mb

设置积压队列的释放时间,当主从断开连接1个小时之后,释放挤压队列

repl-backlog-ttl 3600

无硬盘复制

不会再将命令flush到RDB文件中,而是通过网络直接发给从库。开启命令

repl-diskless-sync yes

主库宕机,升级从库为主库

第一种方式

在某一个从库上执行

SLAVEOF NO ONE

停止接收其他数据库的同步,并升级为主库master
在这里插入图片描述

然后依次将剩下的从库的主库转变为新的主库即可

第二种方式

在所有从库中选出一个主库,并在所有从库上执行同一个命令

SLAVEOF 127.0.0.1 16379

将所有从库的主库切换为16379

当主库宕机,然后又恢复时,可以用slaveof将老主库变为新主库的从库即可。

思考

  1. Redis如何限制数据所占的内存大小?
  2. 当数据达到内存限制之后,此时新的数据进入,Redis如何处理?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值