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

一. 什么是高可用性

服务端,顾名思义就是为用户提供服务的。
停工时间,就是不能向用户提供服务的时间。
高可用,就是系统具有高度可用性,尽量减少停工时间。

停工的原因一般有:

服务器故障。例如服务器宕机,服务器网络出现问题,机房或者机架出现问题等。
访问量急剧上升,导致服务器压力过大。导致访问量急剧上升的原因有:
时间和访问量都可以预见的,例如秒杀活动,售票系统。
时间和访问量都不可以预见的,例如特发性新闻(马航失联的事件)
停工的原因,可以理解为灾难,所以系统的高可用性就是容灾,即应对灾难的能力,系统有较好的容灾能力,也就是即使灾难出现,系统依然可以正常工作。

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

  1. 机器层面的灾难

例如:
机器宕机(其中一台服务器宕机了)
机房故障(机房被水淹了)
网络异常(电信的某条光纤被挖断了)
从范围了说,有可能是一台机器,也有可能是多台机器(机房或者某个区域,例如广东),甚至全部机器(那就没救了。。)。

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

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

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

  1. 业务层面的灾难
    例如:

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

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

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

模拟客户端低网速。这个可以通过Fiddler来模拟
模拟服务端丢包。可以使用netern和tc
使用ab进行压测。
模拟服务器宕机,可以直接断开服务器网络来模拟
三、应用
应用一般都是针对上面的机器问题导致的机器层面的灾难,因为业务层面的,一般是在代码开发阶段考虑的。

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

多节点
自动切换流量
多节点,也就是要部署多个节点,无论其他节点是挂起状态(主从),还是工作昨天(多机多工)。
当有了多节点后,还是不够的,因为当灾难来临的话,如果要人工去切换流量,必然要花费较长时间,所以需要有自动切换流量的机制。
自动切换流量的另一个功能就是,当损坏的节点恢复后,流量又会自动得切回去。

四、HTTP的应用
常用的服务端架构,一般是这样:

Alt text
客户端从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
所以没有负载均衡的功能,但是有自动流量切换的功能。

  1. 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了。

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

  1. 服务层到上游服务器
    DNS服务器。使用DNS服务器把流量均分到上游服务层。缺点也是不能自动切换流量
    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接口那边调用。
在互联网公司面试中,架构的底层一定是面试官会问问的问题,针对面试官一般会提到的问题,我录制了一些分布式,微服务,性能优化等技术点底层原理的录像视频,加群619881427可以免费获取这些录像,里面还有些分布式,微服务,性能优化,春天设计时,MyBatis的等源码知识点的录像视频。这些视频都是 找一些资深架构师朋友一起录制出来的,这些视频帮助以下几类程序员:

1.对现在的薪资不满,想要跳槽,却对自己的技术没有信心,不知道如何面对面试官。

2.想从传统行业转行到互联网行业,但没有接触过互联网技术。

3.工作1 - 5年需要提升自己的核心竞争力,但学习没有系统化,不知道自己接下来要学什么才是正确的,踩坑后又不知道找谁,百度后依然不知所以然。

4.工作5 - 10年无法突破技术瓶颈(运用过很多技术,在公司一直写着业务代码,却依然不懂底层实现原理)

如果你现在正处于我上述所说的几个阶段可以加下我的群来学习。而且我也能够提供一些面试指导,职业规划等建议。

原文地址:http://blog.51cto.com/13655628/2120004

时间: 2024-11-01 19:10:29

用简单的方法构建一个高可用服务端的相关文章

构建高可用服务端

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

Linux基于heartbeat配置httpd高可用服务

Heartbeat是一个基于Linux开源的,被广泛使用的高可用集群系统.我们可以基于Heartbeat构建web高可用服务环境.本文在CentOS 6.5下做了一个简单示例,并对其日志进行了初步分析,供大家参考. 有关Heartbeat的相关知识,可以参考: Heartbeat 集群组件概述 Heartbeat 安装及配置 一.配置host解析及网络 ###主机名配置,与/etc/hosts中的解析两者配置保持一致 [[email protected] ~]# more /etc/syscon

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

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

SpringCloud学习系列之一 ----- 搭建一个高可用的注册中心(Eureka)

前言 本篇主要介绍的是SpringCloud相关知识.微服务架构以及搭建一个高可用的服务注册与发现的服务模块(Eureka). SpringCloud介绍 Spring Cloud是在Spring Boot的基础上构建的,用于简化分布式系统构建的工具集,为开发人员提供快速建立分布式系统中的一些常见的模式. 例如: 配置管理(configuration management),服务发现(servicediscovery),断路器(circuit breakers),智能路由( intelligen

HAProxy + Keepalived + Flume 构建高性能高可用分布式日志系统

一.HAProxy简介 HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代 理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案.HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理. HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接.并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上. 二.Keepalived简介 它是一个基于VRRP协议来实现的WEB服务高可用方案,

微服务配置内容—>如何创建一个高可用的服务注册中心

前言:首先要知道什么是一个高可用的服务注册中心,基于spring boot建成的服务注册中心是一个单节点的服务注册中心,这样一旦发生了故障,那么整个服务就会瘫痪,所以我们需要一个高可用的服务注册中心,那么在Eureka中,我们通过集群来解决这个问题.啥叫集群呢?就是多配几个,一个服务注册中心挂了,还有另一个. 另外要注意jdk的版本需要1.8或1.8以上,否则无法执行. 1 但这里我遇到了一个奇怪的问题:本来我的jdk版本是1.6的,我需要更换.但是怎么配置环境 2 变量,在命令行输入java

RabbitMQ(四):使用Docker构建RabbitMQ高可用负载均衡集群

本文使用Docker搭建RabbitMQ集群,然后使用HAProxy做负载均衡,最后使用KeepAlived实现集群高可用,从而搭建起来一个完成了RabbitMQ高可用负载均衡集群.受限于自身条件,本文使用VMware虚拟机的克隆功能克隆了两台服务器进行操作,仅作为一个demo,开发中可根据实际情况进行调整. 首先看下RabbitMQ高可用负载均衡集群长什么样子: 使用Docker构建RabbitMQ高可用负载均衡集群大概分为三个步骤: 启动多个(3个为例)RabbitMQ,构建RabbitMQ

Powershell AWS 自动化管理 (11) - 创建一个高可用的WordPress博客(中)

理论和基本架构在上一篇已经做了说明,这一篇直接来看看具体的脚本实现吧.首先来看看前面10个步骤的实现. 创建EC2-S3的Role,这个Role是分配给EC2虚拟机的,这样他们创建之后自动就有权限访问S3的内容. 创建VPC网络 创建VPC的2个子网,位于不同的AZ 创建Internet网关 配置路由表 创建并配置EC2的Security Group,确保80和22端口可用 创建高可用的MariaDB数据库 配置数据库的Security Group,确保3306端口可用 创建S3 Bucket

使用Keepalived+ipvs构建(高可用+负载均衡)环境!

之前写过一个heartbeat-ldirectord实现LVS的高可用,这里引入一个轻量级的程序Keepalived基于VRRP协议工作,也能为服务提供高可用功能,这个程序的开发初衷是为了给lvs提供高可用. 下面我们来看看如何使用keepalived+ipvs实现高可用+负载均衡. 在RHEL6.4以后就提供了rpm格式的安装包,这里我们用源码编译安装. 先去官网下载源码包http://keepalived.org/ 解压源程序包,预编译配置,编译程序,安装程序. tar zxvf keepa