构建高可用服务端

一. 什么是高可用性

服务端,顾名思义就是为用户提供服务的。

停工时间,就是不能向用户提供服务的时间。

高可用,就是系统具有高度可用性,尽量减少停工时间。

停工的原因一般有:

  1. 服务器故障。例如服务器宕机,服务器网络出现问题,机房或者机架出现问题等。
  2. 访问量急剧上升,导致服务器压力过大。导致访问量急剧上升的原因有:
    1. 时间和访问量都可以预见的,例如秒杀活动,售票系统。
    2. 时间和访问量都不可以预见的,例如特发性新闻(马航失联的事件)

停工的原因,可以理解为灾难,所以系统的高可用性就是容灾,即应对灾难的能力,系统有较好的容灾能力,也就是即使灾难出现,系统依然可以正常工作。

二. 怎么提升系统的高可用性

1. 机器层面的灾难

例如:

  • 机器宕机(其中一台服务器宕机了)
  • 机房故障(机房被水淹了)
  • 网络异常(电信的某条光纤被挖断了)

从范围了说,有可能是一台机器,也有可能是多台机器(机房或者某个区域,例如广东),甚至全部机器(那就没救了。。)。

思路就是在多台机器上部署服务,即使一台机器出现问题,其他机器依然可以提供服务。当然,比较可靠的是,多台机器最好在不同的机房,不同的地域,但是对应的成本也会上升。

1. 主从方式

主服务负责提供服务,从服务负责监测主服务器的心跳。当主服务出现问题,立刻转换为从服务器提供服务。例如Mysql的主从架构。

2.多机多工方式

在N台机器上面,运行N个服务,通过负载均衡,把请求分发到不同的机器。当其中一台机器出现问题。系统会自动的切换流量,也就是把请求都导流到其他正常的机器上。

2. 业务层面的灾难

例如:

  • 程序出bug了
  • 访问量急剧上升(预计QPS是1k,突然去到1w)

优化思路:

  1. 大系统小做。一个大系统,必然会有许多模块,把这些模块切分为多个小服务。例如用户系统,是一个独立的服务,消费系统,是一个独立的服务。每个服务都提供访问的API,给其他服务访问。缺点是服务与服务之间的通讯成本增加,开发成本也会增加,因为要开发API。但是好处是:

    1. 必要的时候,这些API可以提供给外部
    2. 符合高内聚低耦合的原则
    3. 当某个服务压力上升时,或者服务出现bug时,其他不依赖于问题服务的服务,依然可以正常工作。例如消费服务出现问题,但是聊天服务可以依然可以正常工作。
  2. 有损服务。让服务延迟执行,以保证核心需求得到很好的处理。例如微信抢红包,核心需求是立刻知道抢红包的结果,所以服务端先返回抢红包的结果,而用户对是否即时入账并不关心,所以,把入账这个过程,放在异步队列里面做。
  3. 柔性可用。在正常服务和停工之间增加一个状态:部分可用。当压力上来的时候,可以停止某些非必要服务,以保证必要服务可以正常运行。又例如遇到bug的时候,短时间内不能立刻修复,而且出bug的业务又是非必要业务,可以先停止bug的业务,当然,这些要事先跟产品方商量好。
  4. 快速拒绝(过载保护)。检查当前系统的负载请求,如果负载过高,立刻返回等待提示,例如:系统繁忙,请稍后再试。否则,用户会不断重试,让已经负载很高的系统雪上加霜。在客户端,要限制重试的频率,例如30s后才能重试,或者没有收到服务端的返回前,不能再次提交请求。也可以在Nginx层加入限制,同一IP1秒内不能发送多于N个请求,多于的就快速拒绝,防止被攻击。

3. 验证高可用

当我们采用了各种措施来提升系统的容灾能力后,怎么测试我们的措施是否有用呢?

  1. 模拟客户端低网速。这个可以通过Fiddler来模拟
  2. 模拟服务端丢包。可以使用netern和tc
  3. 使用ab进行压测。
  4. 模拟服务器宕机,可以直接断开服务器网络来模拟

三、应用

应用一般都是针对上面的机器问题导致的机器层面的灾难,因为业务层面的,一般是在代码开发阶段考虑的。

高可用可以分为两个关键点:

  • 多节点
  • 自动切换流量

多节点,也就是要部署多个节点,无论其他节点是挂起状态(主从),还是工作昨天(多机多工)。

当有了多节点后,还是不够的,因为当灾难来临的话,如果要人工去切换流量,必然要花费较长时间,所以需要有自动切换流量的机制。

自动切换流量的另一个功能就是,当损坏的节点恢复后,流量又会自动得切回去。

四、HTTP的应用

常用的服务端架构,一般是这样:

  • 客户端从DNS服务器获取服务器的IP
  • 客户端发起请求,请求先到Nginx层
  • Nginx层分发请求到服务层
  • 如果需要,服务层会请求上游的服务层,例如向用户系统获取用户数据。一般会已通过HTTP来实现。
  • 如果需要,服务层会访问缓存层,获取数据
  • 如果需要,服务层会访问数据库层,获取数据

1. 客户端层到Nginx层

会部署多个Nginx层,DNS服务器中部署多个IP,这样DNS服务器会把流量均匀地分到多个Nginx。

缺点是:

  • 不能自动切换流量。当其中一台Nginx不可用了,DNS服务器并不知道,所以不会自动切换流量

本机的hosts配置中,可以设置一个域名对应多个IP,设置方法:

192.168.137.130 www.test.com

192.168.137.133 www.test.com

hosts的解析策略是,先访问第一个IP,如果失败,才会访问第二个IP

所以没有负载均衡的功能,但是有自动流量切换的功能。

2. Nginx到服务层

Nginx里面可以配置多个服务层。

Nginx有监听服务层是否可用的机制(upstream),所以可以实现自动切换流量

nginx配置

upstream gunicorn_pool
{
    #server 地址:端口号 weight表示权值,权值越大,被分配的几率越大;max_fails表示在fail_timeout中失败的最大次数,如果达到该次数,就不再导流量到该server
    server 192.168.137.130:9098 weight=4 max_fails=2 fail_timeout=30s;
    server 192.168.137.133:9098 weight=4 max_fails=2 fail_timeout=30s;
}

server {
    listen 80;
    server_name 127.0.0.1 www.test.com;
    access_log /data/logs/nginx_access.log;
    error_log /data/logs/nginx_error.log;
    location @gunicorn_proxy {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_pass http://gunicorn_pool;
    }
}

配置一个upstream,gunicorn_pool。里面有两个服务层(130和137)

如果两个服务层都正常,Nginx会把流量根据weight值,导流到两个服务器。

同一个请求中,如果nginx导流到server1,发现返回的是错误响应(例如502),nginx会把请求再发送server2,相当于重试。这时会记录server1的fail次数+1

如果再fail_timeout时间内,server1的fail次数超过max_fails,在fail_timeout时间内,nginx就不会再把其他请求导流到server1了。

上面的机制,就可以实现自动的流量切换。当然也有负载均衡的功能,这个就是高并发的范畴了。

3. 服务层到上游服务器

  1. DNS服务器。使用DNS服务器把流量均分到上游服务层。缺点也是不能自动切换流量
  2. RPC-client。在服务器的机器中,部署一个RPC-client,一般的实现方案是启动一个Nginx,利用Nginx的upstream功能来分发流量,同时可以实现自动流量切换。服务层到上游服务层的请求,会先发到RPC-client,然后再到上游服务层,相当于加了一个HTTP代理。

4.服务层到缓存层

常用的缓存有redis和mongodb

1.redis

  • 主从架构
  • 哨兵架构
  • 集群架构

redis cluster

2.mongo

  • 主从架构
  • 副本集架构
  • 分片

mongo HA

5.服务层到数据库层

常用的数据库就是Mysql了。

  • 一主多从(主从复制)
  • 二主多从(主主复制)

五、TCP的应用

1. DNS方法

配置DNS服务器,一个域名,对应多个IP。

缺点是不能实现流量自动切换,例如S1挂了,DNS还是会返回S1的iP给客户端。客户端可能要重试几次,才会拿到其他Server的IP,才能实现连接。

2.get-ip接口

由于TCP是长连接,所以获取IP的请求是很少的,所以可以自己写一个接口,客户端通过接口来获取TCP Server的IP地址。

这样接口里面就可以做到自动切换流量了。例如A机器已经挂了,就不会返回A机器的IP了。

TCP Server可以把自身的状态在Redis,然后接口那边就可以获取TCP Server的状态了

也可以TCP Server提供一个http接口,返回自身的状态,供get-ip接口那边调用。

参考:

柔性可用——移动互联网时代的一秒响应秘诀

发这么多红包 微信IT架构为啥没崩溃?

高可用性

腾讯大讲堂:发10亿个红包,微信为啥没崩溃?

关于柔性可用的一些思考

原文地址:https://www.cnblogs.com/Xjng/p/8478171.html

时间: 2024-08-29 21:07:24

构建高可用服务端的相关文章

.net core下简单构建高可用服务集群

原文:.net core下简单构建高可用服务集群 一说到集群服务相信对普通开发者来说肯定想到很复杂的事情,如zeekeeper ,反向代理服务网关等一系列的搭建和配置等等:总得来说需要有一定经验和规划的团队才能应用起来.在这文章里你能看到在.net core下的另一种集群构建方案,通过Beetlex即可非常便捷地构建高可用的集群服务. 简述 Beetlex的Webapi集群应用并没有依赖于第三方服务,而是由Beetlex自身完成:它主要是通过Client和策略监控服务相结合的方式来实现集群化的服

用简单的方法构建一个高可用服务端

一. 什么是高可用性 服务端,顾名思义就是为用户提供服务的.停工时间,就是不能向用户提供服务的时间.高可用,就是系统具有高度可用性,尽量减少停工时间. 停工的原因一般有: 服务器故障.例如服务器宕机,服务器网络出现问题,机房或者机架出现问题等.访问量急剧上升,导致服务器压力过大.导致访问量急剧上升的原因有:时间和访问量都可以预见的,例如秒杀活动,售票系统.时间和访问量都不可以预见的,例如特发性新闻(马航失联的事件)停工的原因,可以理解为灾难,所以系统的高可用性就是容灾,即应对灾难的能力,系统有较

nginx+keepalived构建高可用服务

1.整体环境规划 虚拟IP:10.0.4.248 主Nginx:10.0.4.249 备用Nginx:10.0.4.250 2.keepalived安装 #cd /usr/local/src #wget http://www.keepalived.org/software/keepalived-1.2.22.tar.gz #./configure --prefix=/usr/local/keepalived #make & make install 3.master服务keepalived.co

构建高可用服务器之二 Keepalive参数详解

keepalived有三类配置区域,注意不是三种配置文件,是一个配置文件里面三种不同类别的配置区域,全局配置(Global Configuration).VRRPD配置.LVS配置 ! Configuration File for keepalived ################################全局配置######################################### global_defs {    notification_email {        

大型网站技术架构 构建高可用的网站 高可用的服务

在之前的章节中,说道了从三个方面,应用,服务,数据三个维度来进一步分析高可用,本章介绍如何去构建高可用的服务 关键词 服务分级,超时设置,异步调用,服务降级,幂等性设计 之前文章有介绍从应用的角度如何进行可用性的部署,进行应用的集群,可以从虚拟化容器或者从多个机器的角度来考虑,在应用的内部,也有一些常用的可用性方案 服务分级 将核心应用与非核心应用进行分离,核心应用和服务优先使用更好的机器,在服务部署上也进行必要的隔离,避免故障的连锁反应 超时设置(针对通信) 设置服务连接超时时间,一旦超时,应

drbd与corosync/pacemaker 结合构建高可用mariadb服务

drbd与corosync/pacemaker 结合构建高可用mariadb drbd介绍: 高可用节点之间为了使切换节点时数据一致,不得不使用共享存储,共享存储一般只有两种选择:NAS 和 SAN.NAS是文件系统级别的共享,性能低下,访问也受限制,使用时有诸多不变:SAN块级别共享存储,但又太贵.当资金不足时,就可以考虑drbd. drbd是跨主机的块设备镜像系统,一主一从(两个主机只能有一个能进行写操作,slave主机只能接受master主机传过来的数据).drbd是工作于内核中的,工作时

Spring Cloud构建微服务架构(六)高可用服务注册中心

在Spring Cloud系列文章的开始,我们就介绍了服务注册与发现,其中,主要演示了如何构建和启动服务注册中心Eureka Server,以及如何将服务注册到Eureka Server中,但是在之前的示例中,这个服务注册中心是单点的,显然这并不适合应用于线上生产环境,那么下面在前文的基础上,我们来看看该如何构建高可用的Eureka Server集群. 单点Eureka Server的样例: GitHub 开源中国 Eureka Server的高可用 Eureka Server除了单点运行之外,

生产环境下ftp的迁移并构建高可用

说明:这是1个小项目就两台DELL的服务器,和一台IP SAN存储(DELL MD3200i).原来是4台小服务器,而且服务器太老了,经常有问题,这回相当于一次ftp的迁移,以前用的是proftp,这次换成了vsftp.数据量有2.5T. 拓扑很简单: 系统:CENTOS 6.4(64bit) 高可用软件:corosync+pacemaker host:ftp1 192.168.1.190 ftp2  192.168.1.191 stonith(ipmi):ftp1 192.168.1.180

构建高可用的LVS负载均衡集群 入门篇

一.LVS简介 LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.org.现在LVS已经是 Linux标准内核的一部分,在Linux2.4内核以前,使用LVS时必须要重新编译内核以支持LVS功能模块,但是从Linux2.4内核以后,已经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能. LVS 集群采用IP负载和基于内容请求分