史上最全Redis高可用本领应用方案大全彩民之家论

2019-10-11 05:43 来源:未知

主备架构中的“备机”主要还是起一个备份的作用,并不承担实际的业务读写操作。

  • 高性能:为了提高系统每秒处理业务的能力,我们会采用集群与将业务进行分解为子系统,系统间通过网络进行调用。这都增加了系统的复杂度。
  • 高可用:解决系统的高可用采用的都是冗余设备来进行处理。而冗余的设备需要考虑数据的一致性,状态的决策(什么情况下将机器下线)。
  • 可扩展性:业务需求本身具有不可预测性,为了实现业务上的灵活性往往需要抽像出更多的层来应用业务需求的变化。
  • 低成本:与增加机器实现系统的高性能与高可用冲突。
  • 系统安全性。

1、架构简单、部署方便

数据分区主要应对地理级别的故障。

  • 存储高可用架构存储高可用需要考虑复制延迟和中断导致的数据不一致问题。常见的高可用存储架构有主备、主从、主主。

    1:主备复制:这种方式的优点是简单,备机只做为数据备份,不提供服务,主机出现问题后需要人工参与的方式进行恢复。架构图如下:彩民之家论坛9066777 1主备复制2:主从复制:这种方式从机会提供相应的读能力,可以避免硬件的浪费。缺点是客户端需要感知到主从关系统,将写操作分配给主机,将读操作分配给备机,增加了复杂性。同时会有数据延时,某些业务场景可能有问题。架构图如下:彩民之家论坛9066777 2主从复制3:主主复制:这种模式两台机器都做为主机,客户端的请求可以发送到任意一台机器。这种方式的架构只有对特定业务情况下才会使用,因为两台主机之间需要双向复制,比如日志数据可以采用这种方式处理而库存数据就不能采用这种方式进行架构设计。架构图如下:彩民之家论坛9066777 3主主复制 无论是主从模式还是主备模式都需要人工参与的方式进行数据恢复。而人工参与的不确定性就增加了,比如主机在凌晨挂了。双机自动切换能够在无需人工参与的情况下或只需人工半参与的情况下快速的进行双机切换。自动切换需要考虑以下三个点:1:如何判断主机是不可用状态。2:切换时机与切换策略是什么,主机恢复后是继续做主机还是做从机。3:如何解决数据冲突。根据状态传递渠道的不同,常见的主备切换架构有三种形式:互连式、中介式和模拟式。1)互连式:主备机直接建立状态传递的渠道,缺点是当传递状态的渠道本身就有问题,可能出现双主的情况。架构图请注意与主备复制架构对比彩民之家论坛9066777 4互连式主备双机切换2)中介式:主备两者之外引入第三方中介,主备机之间不直接连接,而都去连接中介,并且通过中介来传递状态信息,其架构图如下:彩民之家论坛9066777 5中介式主备双机切换3)模拟式:主备机之间并不传递任何状态数据,而是备机模拟成一个客户端,向主机发起模拟的读写操作,根据读写操作的响应情况来判断主机的状态。其基本架构如下:彩民之家论坛9066777 6模拟式主备双机切换4:数据分散集群 数据分散集群用于解决单机存储不下所有数据的业务,通过多台机器形成集群进行分散存储。其中分散集群需要考虑数据存储的均衡性:不能有一部分机器存储了大部分的数据;同时还需要考虑数据的容错性,一旦有一台机器损坏了,如何保证数据不丢失;再有就是集群的伸缩能力了,当集群的机器不够,如何保证数据数据的迁移与新机器的平衡性。

  • 计算高可用架构

    计算高可用相比存储高可用来说就简单的多了,作为任务分配器需要知道有那些机器可有用来做计算与相应的任务分配策略。计算高可能同样可以分为主备,主从,集群。其中集群模式用的相对来说是比较多的,主备对硬件有一定的浪费。集群模式架构如下图所示:彩民之家论坛9066777 7计算集群模式

Redis 自研Redis各种使用方式的优缺点:

数据分区的复制规则分为集中式、互备式和独立式。

读写分离后还需要考虑分配机制 将读写操作区分开来,然后访问不同的数据库服务器,一般有两种方式:

5Redis自研 - 推荐

主从架构中的主机负责读写操作,从机指负责读操作,部分则写操作。

在具体的实践过程中,为了更快、更好地设计出优秀的架构需要掌握业界已经成熟的各种架构模式。大部分情况下,我们做架构设计主要都是基于已有的成熟模式,结合业务和团队的具体情况,进行一定的优化或者调整;即使少部分情况我们需要进行较大的创新,前提也是需要对已有的各种架构模式和技术非常熟悉。

3、Redis Sentinel主要是针对Redis数据节点中的主节点的高可用切换,对Redis的数据节点做失败判定分为主观下线和客观下线两种,对于Redis的从节点有对节点做主观下线操作,并不执行故障转移。

彩民之家论坛9066777 8

高可用的本质是通过冗余的机器来做到服务的高可用。

彩民之家论坛9066777 9

主主复制架构必须保证数据能够双向复制,而很多数据是不能双向复制的。

  • 数据库读写分离读写分离的基本原理是将数据库读写操作分散到不同的节点上,下面是其基本架构图

    彩民之家论坛9066777 10读写分离架构图

    数据采用读写分离后需要考虑复制延迟的情况。解决办法有:

3、维护成本高

根据集群中机器承担的不同角色来划分,集群可以分为两类:数据集中集群、数据分散集群。

  1. 写操作后的读操作指定发给数据库主服务器。
  2. 读从机失败后再读一次主机。
  3. 关键业务读写操作全部指向主机,非关键业务采用读写分离。

4、原生复制的弊端在早期的版本也会比较突出,如:Redis复制中断后,Slave会发起psync,此时如果同步不成功,则会进行全量同步,主库执行全量备份的同时可能会造成毫秒或秒级的卡顿;又由于COW机制,导致极端情况下的主库内存溢出,程序异常退出或宕机;主库节点生成备份文件导致服务器磁盘IO和CPU资源消耗;发送数GB大小的备份文件导致服务器出口带宽暴增,阻塞请求。建议升级到最新版本。

主备倒换和主从倒换架构的复杂点主要体现在:状态判断、倒换决策、数据冲突修复三个方面。

  • 识别系统的复杂性:将主要的复杂度问题列出来,然后根据业务、技术、团队等综合情况进行排序,优先解决当前面临的最主要的复杂度问题。可以采用排查法来识别系统的复杂性。其中1:高性能需要有TPS/QPS的数据支撑,分别考虑读写性能。2:高可用需要根据业务的影响程度进行判断,假设系统宕机后的影响有多大,包括3:可扩展性需要结合业务的特点进行分析。4:安全性同样是需要根据业务特点进行判断。
  • 设计备选方案:备选方案只关注技术选型,而不是技术细节,技术选型的差异化要比较明显。
  • 评估和选择备选方案:通过对方案质量属性点进行360度环评,质量属性点包括:性能,可用性,硬件成本,项目投入,复杂度,安全性,可扩展性。
  • 详细方案设计:详细方案设计就是将方案涉及的关键技术细节给确定下来。

彩民之家论坛9066777 11

数据分散集群中每台服务器都会负责存储一部分数据和同时也会备份一部分数据。

  • 合适原则:合适优于业界领先。
  • 简单原则:“简单优于复杂。
  • 演化原则宣言:“演化优于一步到位”。

1、如果监控同一业务,可以选择一套Sentinel集群监控多组Redis数据节点的方案,反之选择一套Sentinel监控一组Redis数据节点的方案

数据集中集群可以看做一主多备或一主多从,但复杂度比主备或主从要高出很多。

  • 数据库分库分表 当数据量达到千万甚至上亿条的时候,单台数据库服务器的存储能力会成为系统的瓶颈,分库分表用于分散存储压力同时也解决了访问压力。分库可以分为:1:业务分库,将不同的业务数据存储到不同的数据库服务器中。2:将相同的表数据分散存储在不同的数据库服务器中,用于处理数据量特别大的表。分表拆分同样有两种方式,分别为:1:垂直拆分,将一张表分成两张表或者多张表,不同的表包含不同的列。2:水平拆分,将一张表的记录分成多张表,不同的表包含不同的记录数。分库分表需要考虑:1:数据路由规则,是采用范围路由还是hash路由的方式。2:数据库的事务,由于分库后数据不在同一个库里,原来数据库提供的事务不起作用了。3:在单库里表的join,count,order by 等操作都会变的比单库单表复杂的多。在实现方式上,分库分表与读写分享一样。都有两种方式,程序封装或者采用中间件封装。
  • 高性能的NoSQL1:K-V 存储:解决关系数据库无法存储数据结构的问题,以 Redis 为代表。2:文档数据库:解决关系数据库强 schema 约束的问题,以 MongoDB 为代表。3:列式数据库:解决关系数据库大数据场景下的 I/O 问题,以 HBase 为代表。4:全文搜索引擎:解决关系数据库的全文搜索性能问题,以 Elasticsearch 为代表。
  • 缓存能够应用缓存的场景为:1:需要经过复杂运算后得出的数据。2:读多写少的数据,比如微博。的架构设计阶段,缓存需要考虑如下问题:1:缓存数据不存在,造成缓存穿透,最终拖跨存储服务器(可以对不存在的数据存一个默认值)。2:缓存数据生成需要耗费太多的资源,有可能拖跨整个系统。3:缓存失效,同时有大量请求失效的缓存数据造成缓存雪崩。解决办法可有采用更新锁或者后台更新的方式。4:热点数据的缓存,需要对热点数据保存多个缓存副本,这样可以将请求分散在不同的缓存服务器上。对于多个副本的缓存,内容一样,可以设置成不同的过期时间,这样可以避免引起缓存雪崩。
  • 高性能负载均衡

    负载均衡可以分为DNS负载均衡,硬件负载均衡器与软件负载均衡。其中DNS用于处理地理位置上的负载均衡。硬件负载均衡具有功能强大,性能强悍但是伤钱但扩展性差,而软件负载均衡(Nginx, LVS)具有简单,便宜且扩展性容易但是性能一般。在实际的系统中可以综合使用三种负载均衡器,以便发挥他们各自的优点,如下图所示:彩民之家论坛9066777 12可以采用的负载均衡器组合负载均衡算法有以下几类:

    1:轮询:将任务平均分配到服务器上,具有实现简单的特点。2:加权轮询:可以根据硬件机器的特性给不同的服务器配置不同的权重。3:负载最低优先:需要感知服务器的性能指标,可以充分利用用服务器的性能便增加了分配算法的复杂度。4:性能最优优先:优先将任务分配给处理速度最快的服务器,通过这种方式达到最快响应。需要收集服务器返回任务的时间。5:Hash算法,根据请求的某些关键信息进行Hash运算,将相同的hash值分配到同一台服务器,可以满足特定的业务需求。

优点:

真正优秀的架构都是在企业当前人力、条件、业务等各种约束下设计出来的,能够合理地将资源整合在一起并发挥出最大功效,并且能够快速落地。有下面几个原则:

1、部署相对Redis 主从模式要复杂一些,原理理解更繁琐

  1. 程序代码封装
  2. 中间件封装。

3、主库的存储能力受到单机的限制,可以考虑Pika

maxclient

软件架构的出现是为了解决系统规模增加后出现了系统耦合严重,开发效率低,逻辑复杂,扩展困难等问题。所以架构设计是为了解决软件复杂度而存在的,所以架构设计的目地是识别出需求的复杂点然后针对性的解决。系统设计时需要考虑:性能,系统的可扩展性,安全性,高可用,成本。 架构师的工作并不神秘,成熟的架构师需要对已经存在的技术非常熟悉,对已经经过验证的架构模式烂熟于心,然后根据自己对业务的理解,挑选合适的架构模式进行组合,再对组合后的方案进行修改和调整。

Redis 多副本,采用主从(replication)部署结构,相较于单副本而言最大的特点就是主从实例间数据实时同步,并且提供数据持久化和备份策略。主从实例部署在不同的物理服务器上,根据公司的基础环境配置,可以实现同时对外提供服务和读写分离策略。

Redis Sentinel是社区版本推出的原生高可用解决方案,Redis Sentinel部署架构主要包括两部分:Redis Sentinel集群和Redis数据集群,其中Redis Sentinel集群是由若干Sentinel节点组成的分布式集群。可以实现故障发现、故障自动转移、配置中心和客户端通知。Redis Sentinel的节点数量要满足2n 1的奇数个。

彩民之家论坛9066777 13

2、能够解决Redis主从模式下的高可用切换问题

2、节点会因为某些原因发生阻塞(阻塞时间大于clutser-node-timeout),被判断下线,这种failover是没有必要的。

2、需要建立配套的周边设施,如监控,域名服务,存储元数据信息的数据库等。

3Redis Sentinel

建议:

14、Redis Cluster不建议使用pipeline和multi-keys操作,减少max redirect产生的场景。

timeout

11、避免产生hot-key,导致主库节点成为系统的短板。

Redis 单副本

1、实现复杂,开发成本高

2、高性价比,当缓存使用时无需备用节点(单实例可用性可以用supervisor或crontab保证),当然为了满足业务的高可用性,也可以牺牲一个备用节点,但同时刻只有一个实例对外提供服务。

5、Redis建议使用pipeline和multi-keys操作,减少RTT次数,提高请求效率

Redis Sentinel

4、多个业务使用同一套集群时,无法根据统计区分冷热数据,资源隔离性较差,容易出现相互影响的情况。

优点:

9、不支持多数据库空间,单机下的redis可以支持到16个数据库,集群模式下只能使用1个数据库空间,即db 0。

1Redis单副本

1、Client实现复杂,驱动要求实现Smart Client,缓存slots mapping信息并及时更新,提高了开发难度,客户端的不成熟影响业务的稳定性。目前仅JedisCluster相对成熟,异常处理部分还不完善,比如常见的“max redirect exception”。

13、重试时间应该大于cluster-node-time时间

12、避免产生big-key,导致网卡撑爆、慢查询等。

缺点:

2、主库的写能力受到单机的限制,可以考虑分片

Redis 自研的高可用解决方案,主要体现在配置中心、故障探测和failover的处理机制上,通常需要根据企业业务的实际线上环境来定制化。

8、key作为数据分区的最小粒度,因此不能将一个很大的键值对象如hash、list等映射到不同的节点。

6、key批量操作限制,如使用mset、mget目前只支持具有相同slot值的key执行批量操作。对于映射为不同slot值的key由于keys 不支持跨slot查询,所以执行mset、mget、sunion等操作支持不友好。

3、合理设置参数,防止误切,控制切换灵敏度控制

3、高性能

缺点:

建议设置成Sentinel节点的一半加1,当Sentinel部署在多个IDC的时候,单个IDC部署的Sentinel数量不建议超过(Sentinel数量 – quorum)。

优点:

4、部署的各个节点服务器时间尽量要同步,否则日志的时序性会混乱

10、复制结构只支持一层,从节点只能复制主节点,不支持嵌套树状复制结构。

4、不能解决读写分离问题,实现起来相对复杂

2、当缓存使用,进程重启后,数据丢失,即使有备用的节点解决高可用性,但是仍然不能解决缓存预热问题,因此不适用于数据可靠性要求高的业务。

3、贴切业务实际需求,可缩性好,兼容性好

failover-timeout 180000

史上最全Redis高可用本领应用方案大全彩民之家论坛9066777。3、很方便实现Redis数据节点的线形扩展,轻松突破Redis自身单线程瓶颈,可极大满足对Redis大容量或高性能的业务需求。

3、数据通过异步复制,不保证数据的强一致性。

1、Redis Sentinel集群部署简单

2Redis多副本

1、不保证数据的可靠性

5、Slave在集群中充当“冷备”,不能缓解读压力,当然可以通过SDK的合理设计来提高Slave资源的利用率。

7、key事务操作支持有限,只支持多key在同一节点上的事务操作,当多个key分布于不同的节点上时无法使用事务功能。

彩民之家论坛9066777 14

Redis常见的几种主要使用方式:

缺点:

1、高可靠性,一方面,采用双机主备架构,能够在主库出现故障时自动进行主备切换,从库提升为主库提供服务,保证服务平稳运行。另一方面,开启数据持久化功能和配置合理的备份策略,能有效的解决数据误操作和数据异常丢失的问题。

3、高性能受限于单核CPU的处理能力(Redis是单线程机制),CPU为主要瓶颈,所以适合操作命令简单,排序、计算较少的场景。也可以考虑用memcached替代。

4Redis Cluster

2、自主可控性高

4、高可用性,部分节点不可用时,集群仍可用。通过增加Slave做standby数据副本,能够实现故障自动failover,节点之间通过gossip协议交换状态信息,用投票机制完成Slave到Master的角色提升。

优点:

缺点:

2、读写分离策略,从节点可以扩展主库节点的读能力,有效应对大并发量的读操作。

2、sentinel monitor

2、资源浪费,Redis数据节点中slave节点作为备份节点不提供服务

Redis Cluster是社区版推出的Redis分布式集群解决方案,主要解决Redis分布式方面的需求,比如,当遇到单机内存,并发和流量等瓶颈的时候,Redis Cluster能起到很好的负载均衡的目的。Redis Cluster集群节点最小配置6个节点以上,其中主节点提供读写操作,从节点作为备用节点,不提供请求,只作为故障转移使用。Redis Cluster采用虚拟槽分区,所有的键根据哈希函数映射到0~16383个整数槽内,每个节点负责维护一部分槽以及槽所印映射的键值数据。

1、故障恢复复杂,如果没有RedisHA系统,当主库节点出现故障时,需要手动将一个从节点晋升为主节点,同时需要通知业务方变更配置,并且需要让其他从库节点去复制新主库节点,整个过程需要人为干预,比较繁琐。

down-after-milliseconds 30000

6、自行搞定配置中心(zookeeper),方便客户端对实例的链接访问

优点:

5、降低运维成本,提高系统的扩展性和可用性。

4、可以实现一套Sentinel监控一组Redis数据节点或多组数据节点

1、无中心架构

缺点:

配置中的

彩民之家论坛9066777 15

1、高可靠性、高可用性

Redis 多副本

2、数据按照slot存储分布在多个节点,节点间数据共享,可动态调整数据分布。

Redis Cluster

3、可扩展性,可线性扩展到1000多个节点,节点可动态添加或删除。

quorum

Redis 单副本,采用单个Redis节点部署架构,没有备用节点实时同步数据,不提供数据持久化和备份策略,适用于数据可靠性要求不高的纯缓存业务场景。

版权声明:本文由彩民之家高手论坛发布于编程技术,转载请注明出处:史上最全Redis高可用本领应用方案大全彩民之家论