zoukankan      html  css  js  c++  java
  • Redis是如何实现高可用的?

    高可用是通过设计,减少系统不能提供服务的时间,是分布式系统的基础也是保障系统可靠性的重要手段。

    Redis 是如何保证系统高可用的?它的实现方式有哪些?

    Redis 高可用的手段主要有以下四种:

    (1)数据持久化
    (2)主从同步(主从复制)
    (3)Redis 哨兵模式(Sentinel)
    (4)Redis 集群(Cluster)

    数据持久化

    数据持久化保证了系统在发生宕机或者重启之后数据不会丢失,增加了系统的可靠性和减少了系统不可用的时间(省去了手动恢复数据的过程);

    在 Redis 4.0 之前数据持久化方式有两种:AOF 方式和 RDB 方式,在 Redis 4.0 推出了混合持久化的功能。

    (1) RDB(Redis DataBase,快照恢复)是将某一个时刻的内存数据,以二进制的方式写入磁盘。RDB 默认的保存文件为 dump.rdb,优点是以二进制存储的,因此占用的空间更小、数据存储更紧凑,并且与 AOF 相比,RDB 具备更快的重启恢复能力,但有数据丢失的风险
    (2) AOF(Append-Only File,只追加文件)是指将所有的操作命令,以文本的形式追加到文件中。AOF 默认的保存文件为 appendonly.aof,它的优点是存储频率更高,因此丢失数据的风险就越低,并且 AOF 并不是以二进制存储的,所以可读性更高缺点是占用空间大,重启之后的数据恢复速度比较慢

    (3) Redis 混合持久化的存储模式指的是 Redis 可以使用 RDB + AOF 两种格式来进行数据持久化,开始的数据以 RDB 的格式进行存储,因此只会占用少量的空间,之后的命令会以 AOF 的方式进行数据追加,这样就可以减低数据丢失的风险,同时可以提高数据恢复的速度这样就可以做到扬长避短物尽其用了,混合持久化的存储示意图如下图所示:

    我们可以使用“config get aof-use-rdb-preamble”的命令来查询 Redis 混合持久化的功能是否开启,执行示例如下:

    如果执行结果为“no”则表示混合持久化功能关闭,不过我们可以使用“config set aof-use-rdb-preamble yes”的命令打开此功能。

    我们可以使用“config get appendonly ”的命令来查询 Redis 混合持久化的功能是否开启,执行示例如下

    SDH中

    Redis主从同步

    主从同步是 Redis 多机运行中最基础的功能,有一主节点和多个从节点,多个节点组成一个 Redis 集群,在这个集群主节点用来进行数据的操作,其他从节点用于同步主节点的内容,并且提供给客户端进行数据查询。

    Redis 主从同步分为:主从模式和从从模式。

    主从模式就是一个主节点和多个一级从节点,如下图所示:

    而从从模式是指一级从节点下面还可以拥有更多的从节点,如下图所示:

    使用主从模式就可以实现数据的读写分离,把写操作的请求分发到主节点上,把其他的读操作请求分发到从节点上,这样就减轻了 Redis 主节点的运行压力,并且提高了 Redis 的整体运行速度。不但如此使用主从模式还实现了 Redis 的高可用,当主服务器宕机之后,可以很迅速的把从节点提升为主节点,为 Redis 服务器的宕机恢复节省了宝贵的时间。并且主从复制还降低了数据丢失的风险,因为数据是完整拷贝在多台服务器上的,当一个服务器磁盘坏掉之后,可以从其他服务器拿到完整的备份数据。

    哨兵模式

    Redis 主从同步有那么多的优点,但是有一个致命的缺点,就是当 Redis 的主节点宕机之后,必须人工介入手动恢复,如果半夜突然发生主节点宕机的问题,此时如果等待人工去处理就会很慢,这个时候我们就需要用到 Redis 的哨兵模式了。

    Redis 哨兵模式就是用来监视 Redis 主从服务器的,当 Redis 的主从服务器发生故障之后,Redis 哨兵提供了自动容灾修复的功能,如下图所示:

    Redis 哨兵模块存储在 Redis 的 src/redis-sentinel 目录下,如下图所示:

    我们可以使用命令“./src/redis-sentinel sentinel.conf”来启动哨兵功能。

    有了哨兵功能之后,就再也不怕 Redis 主从服务器宕机了。

    工作原理

    哨兵的工作原理是每个哨兵会以每秒钟 1 次的频率,向已知的主服务器和从服务器,发送一个 PING 命令。如果最后一次有效回复 PING 命令的时间,超过了配置的最大下线时间(Down-After-Milliseconds)时,默认是 30s,那么这个实例会被哨兵标记为主观下线。如果一个主服务器被标记为主观下线,那么正在监视这个主服务器的所有哨兵节点,要以每秒 1 次的频率确认主服务器是否进入了主观下线的状态。如果有足够数量(quorum 配置值)的哨兵证实该主服务器为主观下线,那么这个主服务器被标记为客观下线。此时所有的哨兵会按照规则(协商)自动选出新的主节点服务器,并自动完成主服务器的自动切换功能,而整个过程都是无须人工干预的。

    Redis 集群

    Redis集群也就是 Redis Cluster,它是 Redis 3.0 版本推出的 Redis 集群方案,有多个主节点同时每个主节点有多个从节点将数据分布在不同的主服务器上,以此来降低系统对单主节点的依赖,并且可以大大提高 Redis 服务的读写性能。Redis 集群除了拥有主从模式 + 哨兵模式的所有功能之外,还提供了多个主从节点的集群功能,实现了真正意义上的分布式集群服务,如下图所示:

    Redis 集群可以实现数据分片服务,也就是说在 Redis 集群中有 16384 个槽位用来存储所有的数据,当我们有 N 个主节点时,可以把 16384 个槽位平均分配到 N 台主服务器上。当有键值存储时,Redis 会使用 crc16 算法进行 hash 得到一个整数值,然后用这个整数值对 16384 进行取模来得到具体槽位,再把此键值存储在对应的服务器上,读取操作也是同样的道理,这样我们就实现了数据分片的功能。

    实际项目中

    SDH中

    总结

    (1)数据持久化保证了数据不丢失;

    (2)Redis 主从同步让 Redis 从单机变成了多机。它有两种模式:主从模式和从从模式,但当主节点出现问题时,需要人工手动恢复系统;

    (3)Redis 哨兵模式用来监控 Redis 主从模式,并提供了自动容灾恢复的功能。

    (4)Redis 集群,除了可以提供主从和哨兵的功能之外,还提供了多个主从节点的集群功能,这样就可以把数据均匀的存储各个主机主节点上,实现了系统的横向扩展,大大提高了 Redis 的并发处理能力。

    希望本文章对您有帮助,您的转发、点赞是我的创作动力,十分感谢。更多好文推荐,请关注我的微信公众号--JustJavaIt
  • 相关阅读:
    C#仿制QQ弹出消息框
    Winform下载文件
    asp.net文件下载
    C#FileStream复制大文件【转自www.bitsCN.com】
    C#解压或压缩文件夹
    TreeView无级级绑定
    C# WinForm窗口最小化到系统托盘
    [C#]实现序列号生成器
    VS2005小技巧收集(一)
    Failed TO CREATE LOGFILE GROUP解决
  • 原文地址:https://www.cnblogs.com/liaowenhui/p/14618144.html
Copyright © 2011-2022 走看看