【澳门京葡网站】Windows 2012 系统搭建高可用故障转移集群,去哪儿系统高可用之法

澳门京葡网站 20

原标题:去哪儿系统高可用之法:搭建故障演练平台

Windows 2012 系统搭建高可用故障转移集群

作者介绍

一、故障转移集群介绍 2

王鹏,2017年加入去哪儿机票事业部,主要从事后端研发工作,目前在机票事业部负责行程单和故障演练平台以及公共服务ES、数据同步中间件等相关的研发工作。

1.1 系统介绍 2

去哪儿网2005年成立至今,随着系统规模的逐步扩大,已经有成百上千个应用系统,这些系统之间的耦合度和链路的复杂度不断加强,对于我们构建分布式高可用的系统架构具有极大挑战。我们需要一个平台在运行期自动注入故障,检验故障预案是否起效——故障演练平台。

1.2 工作原理 2

一、背景

二、实验目的 2

这是某事业部的系统拓扑图:

2.1 验证故障转移功能 2

澳门京葡网站 1

2.2 验证高可用集群的可用性,以及支持的服务类型 2

系统之间的依赖非常复杂、调用链路很深、服务之间没有分层。在这种复杂的依赖下,系统发生了几起故障:

三、实验原理 3

  • 弱依赖挂掉,主流程挂掉,修改报销凭证的支付状态,下单主流程失败;
  • 核心服务调用量陡增,某服务超时引起相关联的所有服务“雪崩”;
  • 机房网络或者某些机器挂掉,不能提供核心服务。

3.1 实验拓扑 3

三个故障原因:

3.2 实验环境设备 3

  • 系统强弱依赖混乱、弱依赖无降级;
  • 系统流量陡增,系统容量不足,没有限流熔断机制;
  • 硬件资源网络出现问题影响系统运行,没有高可用的网络架构。

四、配置步骤 4

各种各样的问题,在这种复杂的依赖结构下被放大,一个依赖30个SOA服务的系统,每个服务99.99%可用。99.99%的30次方≈99.7%。0.3%意味着一亿次请求会有3,000,00次失败,换算成时间大约每月有2个小时服务不稳定。随着服务依赖数量的变多,服务不稳定的概率会呈指数性提高,这些问题最后都会转化为故障表现出来。

4.1 配置域服务器 4

二、系统高可用的方法论

4.2  iSCSI 虚拟存储配置 18

如何构建一个高可用的系统呢?首先要分析一下不可用的因素都有哪些:

4.3 配置故障转移集群服务 45

澳门京葡网站 2

4.4  验证集群 63

高可用系统典型实践

五、实验结果验证 68

理论上来说,当图中所有的事情都做完,我们就可以认为系统是一个真正的高可用系统。但真是这样吗?

5.1  验证故障转移 68

那么故障演练平台就隆重登场了。当上述的高可用实践都做完,利用故障演练平台做一次真正的故障演练,在系统运行期动态地注入一些故障,从而来验证下系统是否按照故障预案去执行相应的降级或者熔断策略。

5.2 高可用集群的验证 69

三、故障演练平台

 

故障演练平台:检验故障预案是否真正的起作用的平台。

 

故障类型:主要包括运行期异常、超时等等。通过对系统某些服务动态地注入运行期异常来达到模拟故障的目的,系统按照预案执行相应的策略验证系统是否是真正的高可用。

 

1、故障演练平台的整体架构

一、故障转移集群介绍

故障演练平台架构主要分为四部分:

1.1 系统介绍

澳门京葡网站 3

    故障转移群集是针对具有长期运行的内存中状态或具有大型的、频繁更新的数据状态的应用程序而设计。这些应用程序称为状态应用程序,并且它们包括数据库应用程序和消息应用程序。故障转移群集的典型使用包括文件服务器、打印服务器、数据库服务器和消息服务器。

  • 前台展示系统(WEB):展示系统之间的拓扑关系以及每个AppCode对应的集群和方法,可以选择具体的方法进行故障的注入和解除;
  • 发布系统(Deploy):这个系统主要用于将故障演练平台的Agent和Binder包发布到目标APP的机器上并且启动执行。前台展示系统会传递给发布平台要进行故障注入的AppCode以及目标APP的IP地址,通过这两个参数发布系统可以找到相应的机器进行Jar包的下载和启动;
  • 服务和命令分发系统(Server):这个系统主要是用于命令的分发、注入故障的状态记录、故障注入和解除操作的逻辑、权限校验以及相关的Agent的返回信息接收功能。前台页面已经接入QSSO会对当前人可以操作的IP列表做故障注入,防范风险。后端命令分发的模块会和部署在目标APP上的Agent进行通信,将命令推送到Agent上执行字节码编织,Agent执行命令后返回的内容通过Server和Agent的长连接传回Server端;
  • Agent和Binder程序:Agent负责对目标APP做代理并且做字节码增强,具体代理的方法可以通过传输的命令来控制,代理方法后对方法做动态的字节码增强,这种字节码增强具有无侵入、实时生效、动态可插拔的特点。Binder程序主要是通过发布系统传递过来的AppCode和启动端口(ServerPort)找到目标APP的JVM进程,之后执行动态绑定,完成运行期代码增强的功能。

1.2 工作原理

2、 Agent整体架构

    故障转移群集是基于域的管理模式部署, 以 “心跳机制” 来监视各个节点的健康状况;如果在群集中的一台服务器发生了故障,则群集中的其它服务器会立刻接手并继续运行。而这些服务器是通过心跳网络来进行相互检测的,当服务器发生故障时,其他的服务器就会检测不到故障服务器的心跳信号,此时就会认为此服务器发生故障,并立刻接手并继续运行。

目前AOP的实现有两种方式:

二、实验目的

  • 静态编织:静态编织发生在字节码生成时根据一定框架的规则提前将AOP字节码插入到目标类和方法中;
  • 动态编织:在JVM运行期对指定的方法完成AOP字节码增强。常见的方法大多数采用重命名原有方法,再新建一个同名方法做代理的工作模式来完成。

2.1 验证故障转移功能

静态编织的问题是如果想改变字节码必须重启,这给开发和测试过程造成了很大的不便。动态的方式虽然可以在运行期注入字节码实现动态增强,但没有统一的API很容易操作错误。基于此,我们采用动态编织的方式、规范的API来规范字节码的生成——Agent组件。

    学习搭建Windows故障转移集群,测试Windows高可用集群与高可用集群进行对比。

Agent组件:通过JDK所提供的Instrumentation-API实现了利用HotSwap技术在不重启JVM的情况下实现对任意方法的增强,无论我们是做故障演练、调用链追踪(QTrace)、流量录制平台(Ares)以及动态增加日志输出BTrace,都需要一个具有无侵入、实时生效、动态可插拔的字节码增强组件。

2.2 验证高可用集群的可用性,以及支持的服务类型

Agent的事件模型

    在故障转移集群的基础上搭建常用基础服务器(DTC、SQL、文件共享集群、Hyper-v),来测试架构的可行性。

如图所示,事件模型主要可分为三类事件:

三、实验原理

澳门京葡网站 4

3.1 实验拓扑

BEFORE在方法执行前事件、THROWS抛出异常事件、RETURN返回事件。这三类事件可以在方法执行前、返回和抛出异常这三种情况做字节码编织。

澳门京葡网站 5

如下代码:

 

// BEFORE

3.2 实验环境设备

try {

序号

设备名称

IP规划

用途

1

iSCSI存储服务器

172.16.200.73

共享存储虚拟磁盘

2

域服务器

172.16.200.70

wangzx-noc.com域服务器

3

MSHV-1服务器

172.16.200.71

节点服务器1:  MSHV-1

4

MSHV-2服务器

172.16.200.71

节点服务器2:  MSHV-2

5

集群

172.16.200.75

集群虚IP

/*

3.3 实验检测方式

* do something…

搭建分布式事务协调器,和hyper-v验证高可用服务的可用性。

*/

验证方式:

foo();

1. 服务器宕机测试

// RETURN

2. 物理网卡中断

return;

3. 故障转移集群服务停止

} catch (Throwable e) {

 

// THROWS

 

}

 

事件模型可以完成三个功能:

四、配置步骤

  • 在方法体执行之前直接返回自定义结果对象,原有方法代码将不会被执行;
  • 在方法体返回之前重新构造新的结果对象,甚至可以改变为抛出异常;
  • 在方法体抛出异常之后重新抛出新的异常,甚至可以改变为正常返回。

4.1 配置域服务器

Agent如何防止“类污染”

1、打开服务器管理器,点击添加角色

在开发Agent的时候,第一个应用是故障演练平台,那么这个时候其实我们并不需要Agent执行的过程中有自定义结果对象的返回,所以第一个版本的Agent采用硬编码的方式进行动态织入:

澳门京葡网站 6

澳门京葡网站 7

 

故障类加载模型

 

首先介绍下几个类加载器:

澳门京葡网站 8

  • BootstrapClassLoader引导类加载器加载的是JVM自身需要的类,这个类加载使用C++语言实现的,是虚拟机自身的一部分;
  • ExtClassLoader它负责加载<JAVA_HOME>/lib/ext目录下或者由系统变量-Djava.ext.dir指定位路径中的类库;
  • AppClassLoader它负责加载系统类路径java-classpath或-D
    java.class.path指定路径下的类库,也就是我们经常用到的classpath路径;
  • CommonClassLoader以及下边的都是Tomcat定义的ClassLoader。

 

Agent和相关的lib会放到AppClassLoader这一层去加载,利用Javasist做字节码的织入,所以Javasist的加载器就是AppClassLoader。

 

但是想改变的是Tomcat
WebClassLoader所加载的com.xxx.InvocationHandler这个类的Invoke方法,不同的ClassLoader之间的类是不能相互访问的,做字节码的变换并不需要这个类的实例,也不需要返回结果,所以可以通过Instrument
API拿到这个类加载器,并且可以根据类名称获取到这个类的字节码进行字节码变换。故障类Drill.class和变形后的com.xxx.InvocationHandler.class重新load到JVM中,完成了插桩操作。

澳门京葡网站 9

以Dubbo为例说明下如何注入故障和解除故障:

 

澳门京葡网站 10

 

Dubbo调用的注入过程

澳门京葡网站 11

  • 服务A调用服务B在Client端的Proxy层做AOP;
  • 启动Agent并且生成一个Drill类invoke方法,抛出一个运行期异常;
  • 字节码变形:在代码第一行之前增加Drill.invoke();
  • 如果想变换异常类型,改变Drill类即可,换成Sleep 3s
    ClassRedifine之后会重新load到JVM完成故障类型的转化或者清除。

 

遇到的问题

 

上边的方式貌似很完美的解决了问题,但是随着平台的使用业务线要对很多接口和方法同时进行故障演练,那么我们生成的Drill类里面就会有各种:

澳门京葡网站 12

if method==业务线定义方法

 

do xxx

 

而且很容易拼接出错并且难以调试,只能把生成的类输出为文件,查看自己写的字节码编译成class文件是否正确,简直太痛苦了!

澳门京葡网站 13

怎么解决?

 

新的架构需要解决三个问题:

 

  • 类隔离的问题:不要污染原生APP;
  • 事件的实现是可编译的;
  • 支持返回自定义的结果。

澳门京葡网站 14

下一版本的Agent实现就产生了,把所有Agent的类和实现的功能抽象出来,放到一个自定义的AgentClassLoader里面,字节码注入到目标APP后可以通过反射的方式来调用具体的事件实现。

 

澳门京葡网站 15

 

类加载模型

2、进行域服务器配置,点击运行Active Directory 域服务安装向导

  • 在BootstrapClassLoader里面注入Drill类作为通信类;
  • Agent会接受命令,根据事件类型对InvocationHandler做字节码变形,注入到目标APP;
  • 在目标APP调用的时候,调用Drill.invoke(targetJavaClass,targetJavaMethod,
    targetThis,
    args)传递过来几个参数(目标类、方法、实例、本身参数等);
  • Drill类通过反射的方式调用AppClassLoader里面的具体事件实现,比如BEFORE事件的执行代码,来完成注入后的逻辑执行。

澳门京葡网站 16

Agent的整体架构

 

Agent的整体架构如图所示:

安装过程基本上是默认

澳门京葡网站 17

澳门京葡网站 18

  • 支持不同的模块的加入,比如Mock、流量录制、故障演练等;
  • 支持QSSO的权限验证;
  • 支持测试和仿真环境的无成本接入;
  • 支持自动部署不需要人工介入;
  • 支持各种故障命令的发布和执行、 超时 、异常以及数据的返回;
  • 支持方法级别的编织以及代码执行流程的编织;
  • 支持在任意的Web容器执行Agent代理。

 

四、如何使用

 

使用的好处是很明显的:

澳门京葡网站 19

  • 零成本接入,无需申请任何资源;
  • 故障注入解除,无需重启服务;
  • 可以提供所有集群的拓扑结构。

 

但是如何才能正确使用呢?如下图所示:

 

澳门京葡网站 20

此处建议选择新建域

使用方法

澳门京葡网站 21

步骤一、输入AppCode;

 

步骤二、选择故障方法;

根级域需要自定义,这里我定义为wangzx-noc.com

步骤三、指定机器;

澳门京葡网站 22

步骤四、注入故障。

 

五、总结

 

故障演练平台最核心的就是Agent组件——字节码编织框架,这个框架是纯Java的基于Instrumentation-API的AOP解决方案。它可以方便研发人员对于字节码插桩拆桩操作,可以很容易的实现故障演练、流量录制以及其他的应用模块。

澳门京葡网站 23

作者:王鹏

 

来源:Qunar技术沙龙订阅号(ID:QunarTL)

 

dbaplus社群欢迎广大技术人员投稿,投稿邮箱:editor@dbaplus.cn返回搜狐,查看更多

澳门京葡网站 24

责任编辑:

 

 

澳门京葡网站 25

 

 

澳门京葡网站 26

 

 

安装文件的路径默认即可

澳门京葡网站 27

 

 

澳门京葡网站 28

 

 

 

澳门京葡网站 29

 

 

澳门京葡网站 30

 

勾选以上选项后,在安装完成后服务器将会自动重启,重启完成后使用域管理员账户登录。

3、将所有节点服务器以及存储服务器均加入此域环境。(此处已一台节点服务器为例)

右击这台电脑—>点击属性。

澳门京葡网站 31

 

澳门京葡网站 32

 

澳门京葡网站 33

 

澳门京葡网站 34

 

修改完成后需要重启生效。重启服务器后使用域管理员账户登录。

    注:添加域的节点服务器的DNS设置必须设置为域服务器的管理IP(172.16.200.70)。所以在域服务器在安装角色时记得安装DNS角色服务。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

4.2  iSCSI 虚拟存储配置

1、打开服务器管理器,点击添加角色和功能。

澳门京葡网站 35

 

 

 

澳门京葡网站 36

 

 

 

 

 

澳门京葡网站 37

 

 

 

 

澳门京葡网站 38

 

 

 

下面需要勾选需要安装的角色。

澳门京葡网站 39

 

 

功能如无其他需求,直接点击下一步。

澳门京葡网站 40

 

 

 

下面的安装过程均默认。

澳门京葡网站 41

 

 

澳门京葡网站 42

 

澳门京葡网站 43

 

至此iSCS角色添加完成。

 

 

2、新建虚拟磁盘。

   点击任务找到新建iSCSI虚拟磁盘,需要创建两块虚拟磁盘,一块磁盘做为仲裁磁盘,另外一块磁盘作为共享存储磁盘。由于仲裁磁盘主要用于群集节点的仲裁,无需太大空间。共享磁盘根据需求自行设置。

澳门京葡网站 44

 

    

 

    新建虚拟磁盘并选择存储位置。

澳门京葡网站 45

 

    输入虚机磁盘名称,我这里的名称为Q

澳门京葡网站 46

 

 

    分配虚拟磁盘大小,根据需求进行分配。

澳门京葡网站 47

 

    新建iSCSI目标,也可以选择现有的iSCSI目标,我这里选择新建。

澳门京葡网站 48

 

 

 

    目标名称和访问

澳门京葡网站 49

 

    添加访问服务器

澳门京葡网站 50

 

 

 

    添加发起程序ID,选择IP方式进行客户端访问限制。

澳门京葡网站 51

 

    添加172.16.200.71、72两个IP地址作为iSCSI发起程序客户端IP地址。

澳门京葡网站 52

 

 

    不启用验证服务

澳门京葡网站 53

 

    创建信息确认

澳门京葡网站 54

 

澳门京葡网站 55

 

至此iSCSI 虚拟共享磁盘创建完成,根据以上操作再创建仲裁磁盘。

    创建完之后,在iSCSI列表中会出现对应iSCSI虚拟磁盘信息,如下:

澳门京葡网站 56

 

 

 

 

 

3、客户端连接iSCSI虚拟磁盘设置

   点击工具—>点击iSCIS发起程序

澳门京葡网站 57

 

 

    快速连接iSCSI目标,在此处输入172.16.200.73 目标IP(服务端管理IP)

澳门京葡网站 58

 

 

 

    

     

     

    点击快速连接后会出现iSCSI服务器已共享的虚拟磁盘,点击连接即可。

澳门京葡网站 59

     

 

澳门京葡网站 60

 

 

 

 

 

 

 

 

 

 

 

 

 

    点击发现–>发现门户,根据需求添加门户IP,我这里没有设置。

澳门京葡网站 61

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

澳门京葡网站 62

 

 

 

 

 

 

 

 

 

 

     点击确定后发现在磁盘中多出的共享磁盘

澳门京葡网站 63

 

     打开MPIO程序

澳门京葡网站 64

 

 

 

 

 

 

 

 

 

    发现多路径,添加对iSCSI设备支持

澳门京葡网站 65

 

 

 

 

 

 

 

 

 

 

 

 

    添加完成后需要重启iSCSI客户端服务器

澳门京葡网站 66

 

点击“是”立即重启设备

 

 

 

 

 

 

 

 

 

 

     客户端加载磁盘后需要初始化

澳门京葡网站 67

 

澳门京葡网站 68

 

 

 

 

 

 

 

 

 

 

 

澳门京葡网站 69

 

 

澳门京葡网站 70

 

 

 

 

澳门京葡网站 71

 

 

澳门京葡网站 72

 

 

澳门京葡网站 73

 

 

澳门京葡网站 74

 

 

 

 

澳门京葡网站 75

 

 

澳门京葡网站 76