• 技术文章 >数据库 >Redis

    聊聊redis中主从复制、哨兵、集群的理论【图文详解】

    青灯夜游青灯夜游2022-01-31 08:00:32转载154
    本篇文章带大家配合图文的聊聊redis 三种模式(主从复制,哨兵,集群)理论,希望对大家有所帮助!

    一、主从复制

    1. 主从同步的用处

      通过持久化功能,redis 保证了即使在服务器重启的情况下也不会丢失数据,因为持久化会把内存中的数据保存到硬盘上,重启会从硬盘上加载数据,但是由于数据是存储在一台服务器上的,如果这台服务器出现硬盘故障等问题,也会导致数据丢失。为了避免单点故障,通常的做法是将数据库复制多个副本以部署在不同的服务器上,这样即使有一台服务器出现故障,其他服务器依然可以继续提供服务。为此,redis 提供了复制 replication 功能,可以实现当一台数据库中的数据更新后,自动将更新的数据同步到其他数据库上。【相关推荐:Redis视频教程

      在复制的概念中,数据库分为两类,一类是主数据库 master,另一类是从数据库 slave。主数据库可以进行读写操作,当写操做导致数据变化时自动将数据同步给从数据库,而从数据库一般是只读的,并接收主数据库同步过来的数据。一个主数据库可以拥有多个从数据库,而一个从数据库只能拥有一个主数据库。

    2. 主从同步原理

    2.1 原理详解

    在这里插入图片描述

    RDB 做全量同步,AOF 做增量同步

    2.2 理论精简

    在这里插入图片描述

    slave -> master 发送 sync command 申请同步
    master 主进程 -> 调用 fork() 函数 派生 RDB 子进程进行持久化 -> 生成 RDB 文件
    将 RDB 文件推送给 slaves(完成全量同步)
    #增量同步:使用到了 AOF 持久化(机制:将缓存数据保存到缓冲中),所以主从节点均需要开启 AOF
    增量同步是通过 AOF 功能将缓存中的数据 append(追加)到缓冲中来进行 master 缓冲 -> slave 缓冲的同步
    在持续性的运行过程中,也是增量持续同步的过程

    2.3 最终精简版

    slave -> master 发送 sync
    master 使用 RDB 生成 .rdb 文件(全量同步)发送给 slaves
    master 使用 AOF 将缓冲区数据同步给 slaves 缓冲区数据(增量)

    二、哨兵模式

    1. 哨兵的作用

    哨兵的出现主要是解决了主从复制出现故障时需要人为干预的问题

    哨兵模式主要功能:

    集群监控:负责监控 redismaster 和 slave 进程是否正常工作
    消息通知:如果某个 redis 实例有故障,那么哨兵负责发送消息作为报警通知给管理员
    故障转移:如果 master node 挂掉了,会自动转移到 slave node 上
    配置中心:如果故障转移发生了,通知 client 客户端新的 master 地址

      使用一个或者多个哨兵 sentinel 实例组成的系统,对 redis 节点进行监控,在主节点出现故障的情况下,能将从节点中的一个升级为主节点,进行故障转移,保证系统的可用性。

    2. 哨兵原理

    2.1 原理详解

    在这里插入图片描述

    run id(redis 服务器 id) 
    role(职能)
    从服务器的复制偏移量 offset
    其他

    2.2 原理精简

    3 个哨兵 3 个 redis

    2.3 思路

    3. 哨兵模式下的故障迁移

    ####在从节点中挑选出新的主节点
    通讯正常
    优先级排序
    优先级相同时选择 offset 最大的
    
    ###将该节点设置成新的主节点SLAVEOF no one,并确保在后续的INGO命令时 该节点返回状态为master 
    ###将其他的从节点设置成从新的主节点复制,SLAVEOF命令
    ###将旧的主节点变成新的主节点的从节点
    
    PS:优缺点
    #优点:
    高可用,哨兵模式是基于主从模式的,所有主从模式的优点,哨兵模式都具有有;主从可以自动切换,系统更健壮,可用性更高
    
    #缺点:
    redis 比较难支持在线扩容,在群集容量达到上限时在线扩容会变得很复杂

    三、集群

    1. redis 集群的含义

    主节点负责读写请求和集群信息的维护,从节点只进行主节点数据和状态信息的复制
    在这里插入图片描述

      redis 的哨兵模式基本已经可以实现高可用、读写分离,但是在这种模式每台 redis 服务器都存储相同的数据,很浪费内存资源,所以在 redis3.0 上加入了 Cluster 群集模式,实现了 redis 的分布式存储,也就是说每台 redis 节点存储着不同的内容。根据官方推荐,集群部署至少要 3 台以上的 master 节点,最好使用 3 主 3 从六个节点的模式。
      Cluster 群集由多个 redis 服务器组成的分布式网络服务群集,群集之中有多个 master 主节点,每一个主节点都可读可写,节点之间会相互通信,两两相连,redis 群集无中心节点。

    2. redis 集群的特点


    四、分布式锁

    https://www.zhihu.com/question/300767410/answer/1749442787
      如果在一个分布式系统中,我们从数据库中读取一个数据,然后修改保存,这种情况很容易遇到并发问题。因为读取和更新保存不是一个原子操作,在并发时就会导致数据的不正确。这种场景其实并不少见,比如电商秒杀活动,库存数量的更新就会遇到。如果是单机应用,直接使用本地锁就可以避免。如果是分布式应用,本地锁派不上用场,这时就需要引入分布式锁来解决。由此可见分布式锁的目的其实很简单,就是为了保证多台服务器在执行某一段代码时保证只有一台服务器执行。

    简单来说:
      现在的业务应用通常都是微服务架构,这也意味着一个应用会部署多个进程,那么多个进程如果需要修改数据库中的同一行记录时,为了避免操作乱序导致数据错误,此时就需要引入分布式锁解决问题。

    为了保证分布式锁的可用性,至少要确保锁的实现要同时满足以下几点:

    一般来说,实现分布式锁的方式有以下几种:

    在这里插入图片描述
    对 redis 来说注意三点,对 key 的加锁,如果请求未完成对快要过期的 key 的续期,请求完成后 key 的解锁。防止并发环境下被读取的一个 key 可能被多个请求修改,造成无效操作,资源浪费的情况。

    五、redis 总结

    默认将数据存储在内存/缓存中
    具有丰富的数据类型:string list hash set && order set 等
    重要数据持久化的功能,持久化的方式:AOF RDB

    单线程模式 -> 速度快的原因之一:Epoll + I/O 复用(cluster 中的 slots 哈希槽可以充当数据读、取的索引)

    LRU:淘汰策略
    1) 缓存中的数据进行随机淘汰
    2) 缓存中被设置了过期时间的数据进行随机淘汰
    3) 缓存中被设置了过期时间的数据,进行惰性删除(仅当访问到的数据过期了,才会删除)
    4) 当数据持续存储过程中内存将满,会在设置了过期时间的数据中进行近期淘汰
    
    令牌桶 + 漏桶算法:限流
    Raft:选举机制,用于选举新的主节点
    高热数据:命中次数高的数据
    指定提高缓存内数据的命中数,最直接的可以刷脚本,访问这些数据

    六、系统优化

    1. 单例服务器,服务器本身优化

    硬件资源选择(系统五大资源)

    以上需要计算费用成本,还需要考虑到该服务器上的服务在运行时消耗的性能比例(需要预留给系统一部分资源)

    服务本身环境的选择

    2. 单例服务器应用服务本身优化

    以 redis 为例

    首先从启动读取的恢复文件来看,基于AOF需要开启 AOF功能(RDB 默认)

    使用过程中,需要考虑到的是内存的使用量( OOM )

    持久化方向
    持久化的功能在保证数据完整性的同时,依然会持续性的对磁盘产生存储压力(压力来源于 AOF 和 RDB 生成的数据文件,AOF 和 RDB 的日志文件)。

    redis主进程

    3. 集群优化

    4. 架构优化

    5. 根据数据流向进行优化

    更多编程相关知识,请访问:编程入门!!

    以上就是聊聊redis中主从复制、哨兵、集群的理论【图文详解】的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:csdn,如有侵犯,请联系admin@php.cn删除
    上一篇:Redis数据类型学习之聊聊String原理 下一篇:一文详解redis中的高可用与持久化

    相关文章推荐

    • 聊聊Redis中的主从复制、哨兵、集群• 浅析Redis为什么快?快在哪里?• 聊聊redis中的那些高可用方案!• 深入解析Redis中的数据结构,聊聊应用场景• 解析Redis中的哨兵模式,聊聊搭建和执行流程

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网