稳定性与高可用保障的工作思路

Posted 阿里技术

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了稳定性与高可用保障的工作思路相关的知识,希望对你有一定的参考价值。

一  深入理解稳定性与高可用性


稳定性与高可用性是老生常谈的两个词。凭借经验和感受我们知道,提高系统的这两项指标,系统会更加健康,产品也会有更好的用户体验。但是如果要给稳定性和高可用性下一个定义该如何表述?稳定性和高可用性这二者又有何区别和联系?我认为首先要理解好这两个问题,才能够设定清晰的目标,系统地制定完整可行的方案。
 
在维基百科上搜索稳定性,定义如下:

稳定性是数学或工程上的用语,判别一系统在有界的输入是否也产生有界的输出。若是,称系统为稳定;若否,则称系统为不稳定。

再看看高可用性的:

高可用性(英语:high availability,缩写为 HA),IT术语,指系统无中断地执行其功能的能力,代表系统的可用性程度。是进行系统设计时的准则之一。高可用性系统与构成该系统的各个组件相比可以更长时间运行。
 
首先从稳定性的定义中提炼出关键的词语 -- 系统、输入、输出。在蚂蚁当下的技术架构中,可以把一个应用当做系统,应用之间的服务请求为输入,服务响应为输出,当服务响应符合预期时认为应用系统是稳定的。当他们相互组合形成一个更大的系统,作为业务产品对用户表达时,用户的请求作为输入,产品的表达作为输出,当产品功能正常运行时可以认为产品系统是稳定的。综上,关于稳定性的定义我们可以总结归纳为 -- 当系统接收输入后,能够产生正确的、符合预期的输出,称系统为稳定;否则,称系统为不稳定。
 
再回到命题上,为什么叫稳定性保障?能不能换一个说法叫提高稳定性?通过上文的定义我们可以总结出,稳定性描述的是系统的行为。一个系统是否稳定,就像我们评价一个人是否健康一样,很难用陈述的方式进行完整的描述,去量化。但是却可以通过否定的方式进行快速地判断。人们通过良好的饮食和生活习惯来减少疾病的发生,保持身体的健康。保障系统的稳定性或者说提高系统的稳定性也是如此,我们需要通过各种方法来避免那些不稳定的情况发生。所谓的更稳定,客观上并不存在,是主观上希望避免或者减少不稳定的情况发生。
 
与稳定性不同,可用性是一个可以量化的指标,计算的公式在维基百科中是这样描述的:

根据系统损害、无法使用的时间,以及由无法运作恢复到可运作状况的时间,与系统总运作时间的比较。

我们经常听到的3个9(99.9%),4个9(99.99%)度量的就是系统的可用性,高可用就是要保证系统的这个指标维持在一个高水平。在公式的定义描述中,将系统的运行时间分成了三个部分

  1. 系统正常运作的时间,即系统处于稳定状态的时间。
  2. 系统损害、无法使用的时间,即系统处于非稳定状态的时间。
  3. 系统由无法运作恢复到可运作状况的时间,即系统由非稳定状态恢复到稳定状态的时间。

系统的可用性和系统的稳定性是成正相关的。不过在现实生活中,系统是不可能永远处于稳定状态。逆向思考,将上述的公式进行转换,更有利于我们进行分析:
 


至此,本次命题的目标,KPI就清晰了。保障系统的稳定性和高可用的目标是使系统处于稳定的工作状态,对用户不产生负面的影响,避免线上问题和P级故障的发生。核心kpi是系统的可用性。为了提高系统的可用性,我们应该首先保障系统的稳定性,减少非稳定状况的发生,其次当系统由于各个组成部分发生故障,出现非稳定状态时,能够快速发现并将其恢复到稳定可用的状态。
 
二  稳定性与高可用保障的核心思路
 
 
通过上文的推演,针对提高系统可用性这一目标,我们能够得到两个基本的解题思路。按图索骥,为了解决问题,首要的任务是发现和定义问题。因此为了提高系统的稳定性,我们先列举应用系统中常见的非稳定的情况,再一一对症下药:

  • 功能:应用程序执行的功能出现错误,不符合预期。

  • 容量:当系统接收的请求数量增加时,应用程序无法正常处理,出现异常或超时,导致服务失效。

  • 安全:当系统接收到的没有授权的或者恶意攻击的请求时,应用程序出现异常甚至服务失效。

  • 容错:对于用户错误的使用方式, 应用程序无法合适地处理。
  •  
    当上述情况发生时,就意味着系统处于不稳定的状态,需要我们能够及时发现并进行处理。而造成这些问题的原因,在软件系统中通常可以归结为以下三类:

  • 人为故障:在开发软件的各个环节中思考不充分,或者执行时粗心导致的各类问题。

  • 硬件故障:网络不通,硬盘空间不够,内存崩溃等。

  • 软件故障:线程池异常,JVM异常,中间件或其他依赖的应用服务异常。
  •  
    对于一个动态演进的系统而言,我们没有办法将故障发生的概率降为0,只能通过在软件生产的过程中,建立流程规范和机制来尽量减少其发生。其次对于一个运行的系统,我们需要建立并完善监控和预警机制来及时发现系统中的故障,并通过执行预案使系统快速恢复。基于上述结论,为了提高系统的可用性,需要从以下三个方面入手开展工作:故障预防,故障发现和故障恢复。

    人犯错的几率是远远大于机器的,因此故障预防最重要的是建立一套机制,在团队内达成共识并持续按照此流程开展研发工作,从而减少个人因素(思考、执行、状态等方面)对系统稳定性的影响。而故障发现以及故障恢复,则是需要通过系统监控和应急方案来快速发现系统异常并恢复,从而尽量减轻故障的影响面。下面以蚂蚁日常的产品研发流程为例,从功能、容量、安全、容错这4个核心要素出发,给出一套方案仅供参考。
     


    1  研发规范


  • 设计阶段

  • 团队细分文档模板
  • 高可用设计规范

  • 编码阶段

  • 代码规范

  • 通用代码规范
  • 工程结构规范

  • 单测覆盖率

  • 单测通过率
  • 代码覆盖率

  • 日志规范
  • 安全漏洞修复规范

  • 发布阶段

  • 变更规范:三板斧

  • 2  容量保障


  • 容量评估

  • 机器容量
  • DB容量
  • 缓存容量

  • 压测摸底
  • 限流方案
  • 降级方案

  • 3  监控告警


  • 日志规范
  • 监控梳理

  • 应用基础监控
  • 网关监控
  • 服务监控
  • 业务监控
  • 限流监控

  • 告警规范
  • 数据核对

  • 4  应急快反


  • 日常预案

  • 硬件异常预案
  • 中间件异常预案
  • 业务异常预案

  • 大促预案
  • 预案执行规范

  • 三  总结


    如何做好稳定性和高可用保障是一个很庞大的命题,其中的任一小部分内容在内网都可以搜到大量的文章。写这篇文章的目的是总结一下自己对稳定性和高可用保障工作的理解,给大家分享一套系统的框架思路。希望大家在读后能够更全面的了解安全生产,不陷于细节。
     

     



    弹性计算基础知识

    弹性计算是把计算力变成普惠的公共资源,让不同体量的用户任何时候都能用亲民的价格享受到高可用、高性能、高效率的基础IT计算服务,所以可以说弹性是云计算的核心能力。本课程对弹性的重要性、弹性的定义、阿里云如何做弹性等。点击阅读原文查看详情!

    Keepalived负载均衡与高可用

    1.keepalived服务介绍
    Keepalived的项目实现的主要目标是简化LVS项目的配置并增强其稳定性,即Keepalived是对LVS项目的扩展增强。
    Keepalived为Linux系统和基于Linux 的架构提供了负载均衡和高可用能力,其负载均衡功能主要源自集成在Linux内核中的LVS项目模块IPVS( IP Virtual Server ),基于IPVS提供的4 层TCP/IP协议负载均衡, Keepalived也具备负载均衡的功能,此外, Keepalived还实现了基于多层TCP/IP 协议( 3 层、4 层、5/7 层)的健康检查机制,因此, Keepalived在LVS 负载均衡功能的基础上,还提供了LVS 集群物理服务器池健康检查和故障节点隔离的功能。

    除了扩展LVS的负载均衡服务器健康检查能力, Keepalived 还基于虚拟路由冗余协议( Virtual Route Redundancy Protocol, VRRP )实现了LVS 负载均衡服务器的故障切换转移,即Keepalived还实现了LVS负载均衡器的高可用性。Keepalived 就是为LVS 集群节点提供健康检查和为LVS 负载均衡服务器提供故障切换的用户空间进程。

    2 keepalived核心模块
    2.1.WatchDog :其主要负责监控Checkers和VRRP子进程的运行状况。
    2.2.Checkers :此功能模块主要负责真实服务器的健康检查( HealthChecking ),是Keepalived最主要的功能之一,因为HealthChecking是负载均衡功能稳定运行的基础, LVS集群节点的故障隔离和重新加入均依赖于HealthChecking的结果。
    2.3.VRRPStack :此功能模块主要负责负载均衡器之间的故障切换,如果集群架构中仅使用一个LVS负载均衡器,由于本身不具备故障切换的条件,则VRRPStack不是必须的。
    2.4.IPVS Wrapper :此模块主要用来发送设定的规则到内核IPVS代码。Keepalived的设计目标是构建高可用的LVS 负载均衡群集, Keepalived在运行中将会通过IPVSWrapper模块调用IPVSAdmin工具来创建虚拟服务器,检查和管理LVS集群物理服务器池。
    2.5.Netlink Reflector :此功能模块主要用来设定VRRP的VIP地址并提供相关的网络功能,该模块通过与内核中的NETLINK模块交互,从而为Keepalived 提供路由高可用功能。
    Keepalived是开源负载均衡项目LVS的增强和虚拟路由协议VRRP实现的集合,即Keepalived通过整合和增强LVS与VRRP来提供高可用的负载均衡系统架构。

    3 Keepalived配置实现服务高可用
    下面是LVS+keepalived实现负载均衡及高可用集群服务。
    技术分享图片
    3.1 下载keepalived软件包。
    Keepalived官方站点:http://www.keepalived.org/
    wget http://www.keepalived.org/software/keepalived-1.3.0.tar.gz
    3.2 安装过程
    确实路径
    [[email protected] scripts]# cd /usr/src/
    [[email protected] src]# ll
    total 8
    drwxr-xr-x. 2 root root 4096 Sep 23 2011 debug
    drwxr-xr-x. 3 root root 4096 Dec 24 2017 kernels
    lrwxrwxrwx 1 root root 39 Sep 7 20:44 linux -> /usr/src/kernels/2.6.32-431.el6.x86_64/

    tar xvf keepalived-1.3.0.tar.gz
    cd keepalived-1.3.0
    ./configure
    编译报错:checking libnfnetlink/libnfnetlink.h usability... no
    checking libnfnetlink/libnfnetlink.h presence... no
    checking for libnfnetlink/libnfnetlink.h... no
    configure: error:
    !!! Please install libnfnetlink headers. !!!

    安装 yum install -y libnfnetlink-devel
    继续编译安装
    make && make install
    如果执行make安装报错如下:
    make[2]: [namespaces.o] Error 1
    make[2]: Leaving directory `/server/scripts/keepalived-1.3.0/keepalived/core‘
    make[1]:
    [all-recursive] Error 1
    make[1]: Leaving directory `/server/scripts/keepalived-1.3.0/keepalived‘
    make: *** [all-recursive] Error 1

    执行yum update glib*可以解决,然后继续make

    3.3 配置规范启动
    1.cp /server/scripts/keepalived-1.3.0/keepalived/etc/init.d/keepalived /etc/init.d/ 生成启动脚本命令
    2.cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/ 配置启动脚本参数
    3.mkdir /etc/keepalived 创建配置文件路径
    4.cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/拷贝配置文件模板
    5.cp /usr/local/sbin/keepalived /usr/sbin
    6.启动keepalived服务
    [[email protected] etc]# /etc/init.d/keepalived start
    Starting keepalived: [ OK ]

    [[email protected] etc]# ps -ef|grep keep
    root 10541 1 0 22:34 ? 00:00:00 keepalived -D
    root 10542 10541 0 22:34 ? 00:00:00 keepalived -D
    root 10544 10541 0 22:34 ? 00:00:00 keepalived -D
    root 10561 1320 0 22:39 pts/0 00:00:00 grep keep
    到此keepalived已安装成功。安装成功后停止keepalived服务。

    4 Keepalived配置文件详解
    查看配置文件帮助文档man keepalived.conf 可以查看配置文件的详细介绍
    keepalived有三类配置区域(姑且就叫区域吧),注意不是三种配置文件,是一个配置文件里面三种不同类别的配置区域:
    4.1 全局配置(Global Configuration)
    全局定义和静态路由配置。如发送邮件通知、路由器标识。
    4.2 VRRPD配置
    VRRP同步组(synchroization group)
    VRRP实例(VRRP Instance)VRRP脚本

    4.3 LVS配置
    如果你没有配置LVS+keepalived那么无需配置这段区域,这里LVS配置并不是指真的安装LVS然后用ipvsadm来配置他,而是用keepalived的配置文件来代替ipvsadm来配置LVS

    5 VIP接管配置
    MATER端:
    [[email protected] ~]# cat /etc/keepalived/keepalived.conf
    ! Configuration File for keepalived

    global_defs {
    notification_email {br/>[email protected]
    }
    notification_email_from [email protected]
    smtp_server 127.0.0.1
    smtp_connect_timeout 30
    router_id LVS_14
    }

    vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 14
    priority 150
    advert_int 1
    authentication {
    auth_type PASS
    auth_pass 1111
    }
    virtual_ipaddress {
    192.168.132.21
    }
    }
    BACKUP端:
    [[email protected] ~]# cat /etc/keepalived/keepalived.conf
    ! Configuration File for keepalived

    global_defs {
    notification_email {
    br/>[email protected]
    }
    notification_email_from [email protected]
    smtp_server 127.0.0.1
    smtp_connect_timeout 30
    router_id LVS_15
    }

    vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 14
    priority 100
    advert_int 1
    authentication {
    auth_type PASS
    auth_pass 1111
    }
    virtual_ipaddress {
    192.168.132.21
    }
    }
    单实例中有三处与MASTER端配置不同。
    启动keepalived服务,用ip add查看
    [[email protected] ~]# ip add|grep 192.168.132
    inet 192.168.132.14/24 brd 192.168.132.255 scope global eth0
    inet 192.168.132.21/32 scope global eth0 ---------》配置文件中配置的vip
    另一台上则不会有vip,因为它的实例优先级低。
    测试lvs-1主机宕机后lvs-2接管vip。
    [d:~]$ ping -t 192.168.132.21

    正在 Ping 192.168.132.21 具有 32 字节的数据:
    来自 192.168.132.21 的回复: 字节=32 时间<1ms TTL=64
    来自 192.168.132.21 的回复: 字节=32 时间<1ms TTL=64
    来自 192.168.132.21 的回复: 字节=32 时间<1ms TTL=64
    来自 192.168.132.21 的回复: 字节=32 时间<1ms TTL=64
    现在关闭lvs-1主机网卡eth0
    查看lvs-2
    [[email protected] ~]# ip add|grep 192.168.132.21
    inet 192.168.132.21/32 scope global eth0 -------》已经接管了vip

    6 Keepalived高可用集群服务实践
    之前在两台服务器上配置了keepalived服务,这里再加两台虚拟机作为web服务器(RS).
    都安装http服务。由于配置lvs类型为DR,因此安装DR方式来配置RS:即配置VIP、ARP抑制。
    负载均衡器端配置与VIP接管配置稍有不同,增加了LVS配置部分。如下:
    virtual_server 192.168.132.21 80 {
    delay_loop 6
    lb_algo wlc
    lb_kind DR
    persistence_timeout 50 -------》保持会话连接
    protocol TCP

    real_server 192.168.132.10 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }

    real_server 192.168.132.11 80 {
    weight 1
    TCP_CHECK {
    connect_timeout 3
    nb_get_retry 3
    delay_before_retry 3
    connect_port 80
    }
    }
    }
    以上不仅配置了RS,同时还对RS进行健康检查。
    通过watch ipvsadm -ln查看集群情况。
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
    -> RemoteAddress:Port Forward Weight ActiveConn InActConn
    TCP 192.168.132.21:80 wlc persistent 50
    -> 192.168.132.10:80 Route 1 0 0
    -> 192.168.132.11:80 Route 1 0 0
    配置好后可以通过VIP访问。当有一台RS宕机时,另一台可以继续提供服务。



    以上是关于稳定性与高可用保障的工作思路的主要内容,如果未能解决你的问题,请参考以下文章

    稳定性与高可用保障的工作思路

    Kubernetes 稳定性保障手册:洞察+预案

    Kubernetes 稳定性保障手册:洞察+预案

    高并发与高可用实战之基础知识大型网站架构特征

    Keepalived负载均衡与高可用

    WinccOA前言-分布式与高可用