微服务高可用方案

一、微服务的高可用

在注册中心、配置中心高可用方案之前,了解一下注册中心的工作原理,下面分为两个部分来解释,一是注册中心和各个微服务的注册表的获取与同步,二是注册中心如何去维护注册表。

1.1、注册表的获取与同步

Eureka Server和Eureka Client之间的关系,通过注册表来维护,而注册表的通过Eureka Server集中化管理,每个Client在本地进行注册表的缓存,通过周期性的任务拉取最新的注册表信息。简单的示例图如下。

根据上图所展示的流程,可以了解到注册中心与微服务之间的基本联系的流程:

1.服务A启动时,向Eureka Server注册自己的相关信息

2.当服务B向Eureka Server拉取最新的注册表时,就可以拿到服务A的一台机器注册信息

3.服务A的另外两台机器再去注册,服务B 30s后再次去拉取时,就会得到服务A的三台机器的注册信息

4.服务A、每30s向Eureka Server发送一次心跳信息,表明自己的注册信息还是有效的

以上是注册中心与微服务之间交互的大体流程,在具体的实践中,Eureka Server会提供多级缓存,其中的注册表的信息的获取与同步,又会有细微的差别。

1.Eureka Server的注册表直接基于纯内存,即在内存里维护了一个数据结构。

2.各个服务的注册、服务下线、服务故障,全部会在内存里维护和更新这个注册表。

3.各个服务每隔30秒拉取注册表的时候,Eureka Server就是直接提供内存里存储的有变化的注册表数据给他们就可以了。

4.同样,每隔30秒发起心跳时,也是在这个纯内存的Map数据结构里更新心跳时间。

Eureka Server的注册表是纯内存处理的,因此处理速度会很快,同时提供 readWriteCacheMap 和 readOnlyCacheMap 做缓存,保障了频繁读写不会冲突。示意图如下。

上图介绍了Eureka Server多级缓存的工作原理:

1.当第一台服务A注册时,它的注册信息会更新到内存的注册表中,如果 readWriteCacheMap 中有相应的信息,则过期掉,如果没有则不做操作

2.当服务B去拉取注册表信息时,先找 readOnlyCacheMap ,没有再找 readWriteCacheMap ,再没有就去内存的注册表查找注册信息,查到就更新到 readWriteCacheMap 中,返回给服务B,服务B的注册表中,就会有一台服务A的机器注册信息

3.readOnlyCacheMap 和 readWriteCacheMap 之间的同步是有一个后台的定时任务,每隔30s去同步一次,缓存同步任务

4.第二台服务A注册时,更新内存的注册表,同时把 readWriteCacheMap 过期掉

5.在缓存同步任务执行之前服务B去拉取注册表时,都是从 readOnlyCacheMap 中拿到数据,新的注册表的信息,不会被服务B拿到

6.30s后,缓存同步任务会同步 readWriteCacheMap 和 readOnlyCacheMap 中的数据,把readOnlyCacheMap 中的注册表过期掉,这时服务B就会找 readWriteCacheMap 拿数据,readWriteCacheMap 从内存中拿到数据后缓存,返回给服务B,服务B的注册表中,就会有两台服务A的机器注册信息

7.在下一个30s,缓存同步任务把 readWriteCacheMap 同步到 readOnlyCacheMap 之前, readOnlyCacheMap 没有第二台服务A的注册缓存,因此都是从 readWriteCacheMap 中取到最新数据

注:

readOnlyCacheMap 缓存更新的定时器时间间隔,默认为30秒

readWriteCacheMap 缓存过期时间,默认为 180 秒

由以上流程说明可知,Eureka Server采取了多级缓存策略,同时最新的注册表生效有30s的时延。多级缓存机制的优点是什么:

1.尽可能保证了内存注册表数据不会出现频繁的读写冲突问题。

2.并且进一步保证对Eureka Server的大量请求,都是快速从纯内存走,性能极高。

1.2、注册中心维护微服务的注册表

Eureka Client与注册表相关的行为如下所示:

1.服务注册(Registry)——初始化时执行一次,向服务端注册自己服务实例节点信息包括ip、端口、实例名等,基于POST请求。

2.服务续约(renew)——默认每隔30s向服务端PUT一次,保证当前服务节点状态信息实时更新,不被服务端失效剔除。

3.更新已经注册服务列表(fetchRegistry)——默认每隔30s从服务端GET一次增量版本信息,然后和本地比较并合并,保证本地能获取到其他节点最新注册信息。

4.服务下线(cancel)——在服务shutdown的时候,需要及时通知服务端把自己剔除,以避免客户端调用已经下线的服务。

Eureka Client是通过Jersey Client基于Http协议与Eureka Server交互来注册服务、续约服务、取消服务、服务查询等。同时,Server端还会维护一份服务实例清单,并每隔90s对未续约的实例进行失效剔除。

Eureka Server有一个自我保护机制,当网络发生故障时,客户端与服务端不通,这是需要启动Eureka Server的自我保护机制,这样不会剔除服务,当网络恢复时,退出自我保护。自我保护有两个参数,最后一分钟收到的心跳数(Renews (last min))、期望收到的心跳数(Renews threshold),当Renews threshold > Renews (last min) 时,进入自我保护模式。

Renews (last min) = 实例数 * 2 #实例数算上Eureka Server自注册服务

Renews threshold = Renews (last min) * 0.85 # 0.85可配置

下图的注册中有10个实例:

推荐多个Eureka Server部署时,开启自我保护

eureka.client.register-with-eureka = true

1.3、分布式注册中心

了解了注册中心的工作原理,下面开始研究分布式服务,多注册中心、多服务实例的情况。

当微服务仅向一台注册中心注册时,当这个注册中心发生故障时,新服务无法继续注册上去,旧服务的注册信息,缓存在其他注册中心和客户端中,依旧可以使用,当重启之后,无法向注册中心注册,也是无法使用的。

因此构建高可用的注册中心时,需要交叉注册,每个注册中心既当服务端,又当客户端,向其他注册中心注册自己,同时微服务需要向每个注册中心进行注册,由注册中心自己过滤互备,防止单个注册中心故障而导致只往它上面注册微服务重启后不可用。示意图如下所示。

目前注册中心与配置中心集中在一起,可拆可不拆,对整体影响不大,拆分是为了注册中心和配置中心相互间不影响。gitlab部署在某一台机器上,所有config共用,由于gitlab的原因,导致config的分布式存在单点故障的隐患。每个config分别用独立的gitlab,又给运维带来极大的不便。后期采用apollo,用数据库存储配置,利用数据库的分布式优势替代gitlab,来解决单点故障的问题。

1.4、注册中心压测

根据压测调研,8核4G的Eureka Server在处理1000个服务实例时,没有任何压力,在默认情况下,可以处理7000个实例,超出的会超时报错,在修改tomcat的配置之后,最多可以承载8000实例,此时CPU基本满载。

升级注意事项:

1、Eureka Server之间相互注册,Eureka Client需要在每个Server上都注册一边

2、Eureka Server开启自我保护

3、Eureka Client的实例数不超过1000个

参考:

[1] https://www.jianshu.com/p/ae4f0c8b8135

[2] https://www.cnblogs.com/xishuai/p/spring-cloud-eureka-safe.html

[3] http://springcloud.cn/view/31

原文地址:https://www.cnblogs.com/lossingdawn/p/11223375.html

时间: 2024-08-01 03:19:42

微服务高可用方案的相关文章

keepalived+mysql双主复制高可用方案

MySQL双主复制,即互为Master-Slave(只有一个Master提供写操作),可以实现数据库服务器的热备,但是一个Master宕机后不能实现动态切换.而Keepalived通过虚拟IP,实现了双主对外的统一接口以及自动检查.失败切换机制.联合使用,可以实现MySQL数据库的高可用方案. 实验环境:OS:centos 6.x x86_64系统MySQL版本: :mysql 5.6.22   64 位A: master :192.168.79.3 3306B: slave :192.168.

alwaysOn+SQL群集+cluster 高可用方案测试

在SQL2012以前,高可用自动切换方案就是SQL群集了,优点就是切换完全自动,缺点也有很多, 然后2012出现了alwaysOn特性,在高可用上有了很大的提升,今天这个测试是将2个特性结合在一起做一个高可用的方案. 这个方案的优点就是数据上,主数据只有一份,而且不受alwaysOn节点数限制,缺点就是切换时间比alwaysOn本身的要长一些. 准备很简单,AD1台 测试足够. 然后先准备2台服务器,做cluster,注意第3台要做alwaysOn副本的机器千万不要现在加入cluster, 然后

MYSQL数据库高可用方案探究

MySQL作为最关键的应用数据存储中心,如何保证MySQL服务的可靠性和持续性,是我们不得不细致考虑的一个问题.当master宕机的时候,我们如何保证数据尽可能的不丢失,如何保证快速的获知master宕机并进行相应的故障转移处理,都需要仔细考虑与规划. 要保证MySQL数据不丢失,replication是一个很好的解决方案,而MySQL提供了一套强大的replication机制,replication能极大地提升数据安全,异步复制的方式也保证了sql读写性能不受太大影响.在大量企业长期的使用和实

基于Sentinel的Redis高可用方案

数据存储我们在应用设计过程中非常重要的一部分,无论是关系型数据库,还是Redis.MongoDB等非关系型数据库,都有很多的高可用方案,还有一些针对不同业务设计的中间件,使其性能更有特色,更能保证数据存储的稳定和安全. 目前主流的Redis的数据存储架构有Redis单点,Redis主从,基于Sentinel的Redis主备.基于keepalive的redis主备,以及Redis集群Cluster,还有豌豆荚开源的Codis等是目前业内比较流行的解决方案,不同的存储架构,是若干个技术工程师,根据自

Heartbeat+DRBD+MySQL高可用方案

Heartbeat+DRBD+MySQL高可用方案 =============================================================================== 概述: =============================================================================== 方案介绍  1.方案介绍及优缺点 ★方案介绍 本方案采用Heartbeat双机热备软件来保证数据库的高稳定性和连续性,数

分布式数据存储 - MySQL主从复制高可用方案

前面几篇文章说道MySQL数据库的高可用方案主从复制.主从复制的延迟产生原因.延迟检测及延迟解决方案(并未从根本上解决),这种主从复制方案保证数据的冗余的同时可以做读写分离来分担系统压力但是并非是高可用方案,因为主从节点中主节点仍然是单点的,一旦主节点宕机会导致应用中写失败.双主复制虽然很好的避免主节点的单点故障,但是未提供统一访问入口来实现负载均衡,如果其中master宕掉的话需要手动切换到另外一个master,而不能自动进行切换.本篇文章就来剖析主从复制的高可用. 一.基础概念介绍 Keep

[转载] MySQL高可用方案选型参考

原文: http://imysql.com/2015/09/14/solutions-of-mysql-ha.shtml?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io 本次专题是 MySQL高可用方案选型,这个专题想必有很多同学感兴趣. 高可用的意义以及各种不同高可用等级相应的停机时间我就不必多说了,直接进入主题. 可选MySQL高可用方案 MySQL的各种高可用方案,大多是基于以下几种基础来部署的: 基于主从复制:

Mysql之运用MHA的功能实现服务高可用

MHA介绍 (Master High Availability) MHA(Master HA)是一款开源的 MySQL 的高可用程序,它为 MySQL 主从复制架构提供 了 automating master failover 功能.MHA 在监控到 master 节点故障时,会提升其中拥有最新数据的 slave 节点成为新的 master 节点,在此期间,MHA 会通过于其它从节点获取额外信息来避免一致性方面的问题.MHA 还提供了 master 节点的在线切换功能,即按需切换 master/

mysql高可用方案MHA介绍

概述 MHA是一位日本MySQL大牛用Perl写的一套MySQL故障切换方案,来保证数据库系统的高可用.在宕机的时间内(通常10-30秒内),完成故障切换,部署MHA,可避免主从一致性问题,节约购买新服务器的费用,不影响服务器性能,易安装,不改变现有部署. 还支持在线切换,从当前运行master切换到一个新的master上面,只需要很短的时间(0.5-2秒内),此时仅仅阻塞写操作,并不影响读操作,便于主机硬件维护. 在有高可用,数据一致性要求的系统上,MHA 提供了有用的功能,几乎无间断的满足维