Redis持久化、虚拟内存、哨兵模式

2019-09-28  本文已影响0人  ands999
持久化

父子进程、aof的日志重写、异步方式写入磁盘

redis支持两种方式的持久化:RDB快照方式,将内存中的数据周期性写入磁盘;AOF日志方式,记录每次更新的日志。

aof 方式带来了另一个问题。持久化文件会变的很大。为了压缩aof的持久化文件。redis提供了bgrewriteaof命令。收到此命令redis将使用与快照类似的方式将内存中的数据以命令的方式保存到临时文件中,最后替换原来的文件。具体过程如下:
1)redis调用fork ,现在有父子两个进程
2)子进程根据内存中的数据库快照,往临时文件中写入重建数据库状态的命令
3)父进程继续处理client请求,除了把写命令写入到原来的aof文件中。同时把收到的写命令缓存起来。这样就能保证如果子进程重写失败的话并不会出问题。
4)当子进程把快照内容以命令方式写到临时文件中后,子进程发信号通知父进程。然后父进程把缓存的写命令也写入到临时文件。
5)现在父进程可以使用临时文件替换老的aof文件,并重命名,后面收到的写命令也开始往新的aof文件中追加。

  重写aof文件的操作并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似。

虚拟内存

VM特性突破了物理内存的限制。
redis的虚拟内存与os的虚拟内存不是同一个事,但是思路和目的都是相同的,就是暂时把不经常访问的数据从内存交换到磁盘中,从而腾出内存空间用于其他需要访问的数据。
redis没有使用os提供的虚拟内存机制而是自己在用户态实现了自己的虚拟内存机制,redis作者给出两个理由:

参数配置讨论完后,简单介绍下vm是如何工作的,

哨兵

Redis的高可用方案被分成了几块来实现:主从复制、主从切换以及虚拟IP或客户端方案。

Sentinel机制是一个分布式架构。每个sentinel节点都会对数据节点和其他sentinel节点进行监控。当发现节点不可用时,自动进行处理,无须人工介入,从而实现redis的高可用。

主从切换

Redis 2.8版开始提供名为Sentinel的主从切换方案,Sentinel用于管理多个Redis服务器实例,主要负责三个方面:
1. 监控(Monitoring): Sentinel 会不断地检查主服务器和从服务器是否运作正常。
2. 提醒(Notification): 当服务器出现问题时, Sentinel可以通过 API 向管理员或者其他应用程序发送通知。
3. 自动故障迁移(Automatic failover): 当主服务器不能正常工作时, Sentinel 会开始自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器。

Redis Sentinel 是一个分布式系统,可以在一个架构中运行多个 Sentinel 进程(progress), 这些进程使用流言协议(gossip protocols)来接收关于主服务器是否下线的信息, 并使用投票协议(agreement protocols)来决定是否执行自动故障迁移, 以及选择哪个从服务器作为新的主服务器。

使用--sentinel参数启动Sentinel,并必须指定一个对应的配置文件,系统会使用配置文件来保存 Sentinel 的当前状态, 并在 Sentinel 重启时通过载入配置文件来进行状态还原。
配置Sentinel:
1. 主观下线(Subjectively Down, 简称 SDOWN)指的是单个 Sentinel 实例对服务器做出的下线判断。
2. 客观下线(Objectively Down, 简称 ODOWN)指的是多个 Sentinel 实例在对同一个服务器做出 SDOWN 判断, 并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后,得出的服务器下线判断。
SDOWN适合于master和slave,但是ODOWN只适用于master。

每个Sentinel实例都执行的定时任务
1. 每个 Sentinel 以每秒钟一次的频率向它所知的主服务器、从服务器以及其他 Sentinel 实例发送一个 PING 命令。
2. 如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 那么这个实例会被 Sentinel 标记为主观下线。
3. 如果一个主服务器被标记为主观下线, 那么正在监视这个主服务器的所有 Sentinel 要以每秒一次的频率确认主服务器的确进入了主观下线状态。
4. 如果一个主服务器被标记为主观下线, 并且有足够数量的 Sentinel (至少要达到配置文件指定的数量)在指定的时间范围内同意这一判断, 那么这个主服务器被标记为客观下线。
5. 在一般情况下, 每个 Sentinel 会以每 10 秒一次的频率向它已知的所有主服务器和从服务器发送 INFO 命令。 当一个主服务器被 Sentinel 标记为客观下线时, Sentinel 向下线主服务器的所有从服务器发送 INFO 命令的频率会从 10 秒一次改为每秒一次。
6. 当没有足够数量的 Sentinel 同意主服务器已经下线, 主服务器的客观下线状态就会被移除。 当主服务器重新向 Sentinel 的 PING 命令返回有效回复时, 主服务器的主观下线状态就会被移除。

Sentinel API
有两种方式可以与Sentinel进行通讯:Sentinel指令、发布与订阅。

上一篇 下一篇

猜你喜欢

热点阅读