180807-大众点评Camel介绍

大众点评Camel介绍

整体视图

一、前言

大众点评最开始采用F5做七层负载。随着网站规模的增大,F5成为了网络的瓶颈,主要原因有以下两点:

负载规则涉及到很多路径的正则匹配,这要求F5做很多的正则计算。这大大增加了F5的CPU负载。

F5需要对业务服务集群进行心跳检测。随着业务服务规模增大,F5需要对近千台服务器进行心跳检测。F5很难维持这个量级的心跳信息。

为此,我们决定使用软件工程的银弹-在架构上,增加新的层级。从而大众点评有两层负载,第一层为F5,做四层硬负载;第二层为Nginx集群,做七层硬负载。

使用规模

Camel在大众点评的应用规模如下:

  1. nginx服务器集群:
    数十个nginx集群,百台以上nginx服务器

  2. 站点及业务集群:
    数百个站点域名,数百个业务服务器集群

  3. QPS
    每天响应约数万次接口调用,其中有约数千次为nginx配置部署请求

总体架构

Camel项目由camel-admin, Dengine(基于Tengine开发的Web服务器), camel-agent三个模块组成:

总体架构

  1. camel-admin:
    Camel管理端:可以通过接口及页面两种方式对Nginx集群进行发布、重启、监控等操作。

  2. Dengine
    大众点评基于Tengine开发的Web服务器。在Tengine的基础上,添加了降级等功能。

  3. camel-agent:
    部署在Nginx服务器上,管理本机的Nginx进程与配置文件。

示例演示

二、工作原理

大众点评对网络流量采用两层负载。那么,这两层负载是如何分工的呢?

我们结合一个具体的请求来分析这个问题:

假设有一条请求,访问domain_name/location_name:

  1. 首先,浏览器寻找该域名domain_name对应的公网IP。电脑接入的运营商不同,对应的公网IP就不同。
  2. 由于该IP是F5的对外IP,请求发送到F5上。
  3. F5将此请求反向代理到一台Nginx服务器
  4. 该Nginx服务器根据网址路径”/location_name”找到对应的负载规则,转发到规则中配置的业务服务器。
  5. 业务服务器响应该请求。

F5只做四层负载,不同的公网IP接受的流量,转发到不同的Nginx集群;

Nginx集群做七层负载,根据URL的路径、cookie等,转发到真正响应服务的业务服务器。

域名、IP、Nginx集群、业务集群的对应关系如下:

  • 一个域名或一个泛域名 对应 一个公网IP
  • 多个公网IP 对应 一个Nginx集群
  • 一个Nginx集群 对应 多个业务

三、项目部署

本章主要介绍如何部署Camel,介绍slb-admin的部署。管理端本地也要安装Dengine,用以测试Nginx配置文件的语法是否正确。此外,还需要部署数据库:MySQL及MongoDB。

最后介绍Nginx服务器的部署。我们可以根据具体需求部署Nginx集群,每台Nginx服务器需要部署Dengine及camel-agent两个组件。

管理端部署

camel-admin是一个Java EE项目,可以通过接口及页面两种方式对Nginx集群进行发布、重启、监控等操作。

此步骤中,共有三个本地配置文件需要配置:jdbc-mysql.properties、mongo.properties、camel.properties,请不要遗漏。

建立数据库

camel-admin有两部分信息需要持久化:

  1. 站点、集群等信息
    对于站点和集群,我们统一抽象了一个模型-SlbModelTree。为了使用方便,该模型存储到NoSQL的MongoDB中,省去模型结构变更导致表结构变更的烦恼。

  2. 发布记录
    发布即为一次更新Nginx配置文件并使配置文件生效的操作。发布状态、日志等信息存储到MySQL中。
    为此,部署管理端之前需要配置数据库:

  3. MySQL

    安装MySQL后,建立一个专门的数据库,然后执行建表SQL,SQL文件在:camel/camel-admin/src/main/resources/init-data/create_table.sql。

    建好表后,再建立MySQL配置文件,存储数据库信息。camel-admin在启动时会读取该文件,获取数据库的配置。项目附带一个sample:camel/camel-admin/src/main/resources/init-data/jdbc-mysql.properties,请复制sample至路径/data/appdatas/camel/jdbc-mysql.properties,并按照实际的数据库环境更改此配置文件。

    Camel对MySQL的操作为写多读少,不建议开启主从同步。

  4. MongoDB

    NoSQL非常便捷,无需建表。在搭建好MongoDB、建立好库之后,请复制sample(camel/camel-admin/src/main/resources/init-data/mongo.properties)至路径/data/appdatas/camel/mongo.properties,并按照实际的MongoDB环境更改此配置文件。

    MongoDB支持主从读写分离。在实际使用过程中,我们遇到了MongoDB主从复制过慢,导致发布状态不一致的情况。建议MongoDB为单点。

    MongoDB中存放着所有的负载配置信息。由于camel会点的历存放每个站史版本,建议MongoDB的容量尽可能大。由于负载信息比较重要,也建议定时crontab mongodump,定期备份MongoDB。

    我们使用MongoDB 3.0.7。

    请注意:已知MongoDB 3.2.0无法正常工作。请使用3.0.7或2.*版本

本地部署Dengine

camel-admin在发布配置信息之前,会本地nginx -t检验配置语法是否通过。由于linux与mac环境不一致,建议在本地开发时,关闭检查功能。在线上环境时,开启此检查功能。关闭检查功能后,本地不需要安装Dengine。

检查开关是可配置的,请复制配置sample(camel/camel-admin/src/main/resources/init-data/camel.properties)至路径/data/appdatas/camel/camel.properties,对配置项local.nginx.config.check进行更改。当该配置项置为false时,发布不进行Nginx配置检查。如果是线上环境,请将此配置项设置为true。

如果打开了配置检查功能,需要在本机部署Dengine。部署Dengine请参考下一章节“部署Dengine”。

编译

amel-admin引用了一个非常强大的maven插件:unidal。该插件绑定了maven的compile生命周期,在mvn compile时生成Java pojo类。camel内部使用的复杂模型,均是由该插件生成的。

请进入camel-admin目录,执行mvn clean compile。执行完毕后,unidal插件在camel/camel-admin/target/generated-sources/dal-model目录,会生成Java模型。如果使用intellij,请切记将此目录标记为Generated Sources Root目录,标注该文件夹中包含java文件,以防出现ClassNotFound的错误。

在maven compile时找不到unidal或者xwork的依赖? camel使用了unidal codegen插件。该插件已部署在maven中心仓库中,但不一定部署在其它maven仓库里(如没有部署在开源中国OSChina的maven仓库中)。为此,camel内置了依赖仓库和插件仓库,在项目内部寻找依赖。 如果你在maven配置settings.xml中设置了全局镜像,则内置仓库会失效。此时请把镜像的匹配范围更改至某个仓库,而不要全局覆盖。

camel-admin使用jdk1.6以上的版本,camel-agent使用jdk1.7以上的版本。如果您想在同一台服务器上运行camel-admin及camel-agent,建议安装jdk1.7

运行

准备工作都已经做好,下面就是运行这个Java EE项目了。可以直接通过IDE运行,也可打包成war包,放入到web容器中运行。

如果食用Maven,请追加参数-Dmaven.test.skip=true,略过测试。

需要注意的是,由于管理端会在发布时对配置进行检测,需要以root权限运行nginx -t命令,为此请在visudo中将运行camel-admin的用户加入sudoer中,并设置为sudo无需密码。如:

1
liyang ALL=(ALL) NOPASSWD: ALL

Dengine部署

Dengine是基于Tengine开发的Web服务器,在Tengine的基础上新加了降级等功能。

Dengine在Tengine2.0.3基础上,打了少量的patch,增加了自开发及第三方的模块。

安装Dengine

进入Dengine目录,执行sudo ./install_dengine脚本,即可自动安装Dengine。

如果是新Linux服务器,请安装Dengine依赖的包。下条命令为Dengine部分依赖包的yum安装命令,仅供参考:

1
yum -y install git gcc gcc-c++ automake autoconf libtool make ncurses-devel zlib zlib-devel libtermcap-devel libevent-devel readline-devel patch

配置Dengine

请确保nginx/conf/phoenix-slb文件夹的权限均为777。camel-agents会在此文件夹下部署每个站点的配置文件。

Nginx有许多接口,能够提供Nginx的运行状态。如降级信息、QPS信息等。这些信息,只应该允许本机及Camel管理端访问,如果被别的ip访问,可能会有安全问题。

控制接口访问,请更改nginx/conf/nginx_status.conf,给该配置文件下所有location添加

allow 管理端ip; allow 127.0.0.1; deny all; 该配置表示这个location只允许管理端ip访问,拒绝来自其它ip的请求。

camel-agent部署

camel-agent是部署在Dengine服务器上的agent模块,负责接收管理端的请求,对本机的Nginx进行管理。camel-agent可以对本机Nginx服务器进行配置管理、进程重启等功能。

camel-agent使用Java编写,并采用了微服务框架spring-boot进行开发。

搭建初始环境

camel-agent是一个Java项目,请先安装好JDK与Maven。请安装JDK 7以上的版本及Maven 3。spring-boot框架官方不支持JDK 6。如果您只能采用JDK6,请在GitHub上参考第三方的兼容项目。

spring-boot内嵌了Web容器,可以根据需要选择tomcat或者jetty。因此无需单独安装Web服务器。

初始环境搭建完毕后,请下载camel代码到本地

运行camel-agent

得益于spring-boot微服务框架,camel-agent运行变的非常便捷。共有三种运行方式:maven运行;IDE运行;部署war包。

在运行之前,请先确保Nginx已经运行。camel-agent会调用nginx reload的命令,如果Nginx没有运行,在某些环境下camel-agent重启命令可能会失败。

部署war包

如果您是长期部署agent,并有Web容器,建议使用这种方式。

请先配置maven打包方式,修改camel/camel-agent/pom.xml中的package字段为war。

然后再进入camel-agent目录,运行mvn clean pakcage,maven会自动下载依赖组建,并构建war包。

随后将war包拷贝到Web容器的目录下,启动Web容器即可。

四、使用指南

本章主要介绍如何使用Camel。

  1. 如何通过界面,对负载相关的基本信息进行配置。包括Nginx集群配置、业务集群配置、站点信息配置;

  2. 如何部署配置到Nginx集群上。

Nginx配置相关功能总体介绍

camel-admin与Nginx配置有关的功能主要有:站点管理,业务集群管理,Nginx集群管理。

这三个功能,与camel-admin界面导航栏及Nginx配置文件的对应关系如下:

  1. 站点管理:
    对应Nginx配置中的server块
    site_mapping

  2. 业务集群管理:
    对应Nginx配置中的upstream块
    pool_mapping

  3. Nginx集群管理管理:
    不对应Nginx配置,对应着Nginx集群服务器
    nginx_mapping

第一次启动

第一次启动后,会进入如下页面:

first_run

第一次启动没有任何数据,请按照提示初始化数据。

由于站点信息依赖Nginx集群信息、集群信息,所以请完成站点依赖的Nginx集群信息、业务集群信息配置后,再配置站点信息。

配置nginx集群

同一个Nginx服务器集群下的多台Nginx服务器,配置文件都是完全一致的。多个站点对应一个Nginx服务器集群,建议按照站点流量进行划分,让多个Nginx集群的流量尽量均匀。

请确保添加的Nginx服务器,已经安装好并正在运行Dengine及camel-agent。

  1. 点击引导页面的“点击新增Nginx集群”按钮
    nginx_cluster_s1
  2. 在对话框中输入Nginx集群名称
    nginx_cluster_s2
  3. 点击”添加新Nginx节点按钮”,输入Nginx服务器ip,最后点击保存
    nginx_cluster_s3

如果提示保存成功,则已成功添加一个Nginx集群。

随后,在导航栏”Nginx管理”页面下,即可对Nginx集群信息进行管理,比如新增Nginx集群,编辑老Nginx集群等。

配置业务集群

本节介绍如何配置业务服务器集群,对应Nginx配置文件中的upstream部分。
pool_mapping

  1. 点击引导页面的“点击新增集群”按钮
    pool_1
  2. 在对话框中输入业务集群名称
    pool_2
  3. 进入业务集群配置界面。该界面可以主要分为三个部分:
    pool_3

a. 集群信息:
配置集群名称、负载策略、长链接数、心跳检测规则、降级规则。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
集群名称:对应upstream名称。为了保证所有配置的集群名称都是唯一的,最后落地在配置文件中的Nginx的集群名,为“站点名.集群名”;

负载策略:反向代理的负载策略,有round-robin,consistent_hash等;

长链接数:对应keep-alive,内存中连接池的个数;

心跳检查规则:配置心跳请求等信息

时间间隔:请求频率,多久发送一次心跳检查请求;

超时时间:多久没收到返回,即认为请求失败;

健康检查类型:有TCP和HTTP两种检查方式;

TCP检查类型:对节点接口发送TCP健康检查;

HTTP检查类型:设置Http检查的url、期待的HTTP返回码、期待的Response消息体

降级规则:此为Dengine独立开发的功能。这里配置降级比例及集群降级状态。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
降级规则是按照心跳检查的结果,计算业务集群中心跳检查正常的服务器比例。如果该比例小于一定阈值,比如10台业务服务器只有1台业务服务器心跳正常,则将流量切换到备用集群。

节点列表按照选择的状态,实际分为了两个集群:

正常集群(State为Enable)、降级集群(State为Disable)。

可以对集群降级状态进行配置,有自动、强制升级、强制降级三种选择:

强制降级,流量转发到降级集群中;

强制升级,流量转发到正常集群中;

自动,则结合降级比例看心跳检查的状态。

当心跳检测后的可用率低于阈值时,自动将流量切换至降级集群;高于或等于阈值时,自动将流量切换至正常集群。

b. 节点列表:

每个节点信息对应着一台业务服务器。需要填写节点名称、ip、端口、权重、置为fail的策略。

请注意:ip请填写对应的ip地址,Nginx不允许填写主机名。

节点对应着四个状态:

Enabled状态:正常状态

Disabled, Offline状态:不被使用,仅在数据库中记录

Degrade状态:降级集群状态,当集群心跳检测低于阈值,触发了降级条件,把流量转发至降级集群。

c. 影响站点:

展示该集群被哪些站点所引用。从而表明如果该集群修改,对应站点要更新Nginx配置。

如果提示保存成功,则已成功添加一个业务集群。

随后,在导航栏”集群管理”页面下,即可对业务集群信息进行管理,比如新增业务集群,编辑老业务集群等。

随着业务集群的增多,业务集群列表会越来越庞大,这非常不方便查找一个集群。为此,需要进入一个集群的配置页面,请通过右上角”快速切换集群”,输入集群名称。camel-admin会自动补全,再回车或点选即可进入集群页面。

配置站点

本节介绍如何配置站点信息,对应Nginx配置文件中的server部分。
site_mapping

站点信息下的映射规则对应着Nginx配置文件中的location部分。

1
2
3
4
5
来了一个网络请求,先按照端口和域名进行匹配,找到对应Nginx的哪一个站点配置

---> 然后按照URL路径匹配该站点配置下的映射规则

---> 匹配到一个映射规则后,执行映射规则下的指令,对流量进行处理或转发

站点配置流程如下:

  1. 确保已经添加对应的Nginx集群信息及业务服务器集群信息
  2. 点击引导页面的“点击新增站点”按钮
    site_1
  3. 在对话框中输入站点名称(建议与匹配域名保持一致,不做强制要求)
    site_2
  4. 进入站点配置界面。该界面按照左侧的标签导航栏,主要分为四个部分:
    site_3
    a. 站点基本信息:配置状态、域名、端口、默认转发集群、部署Nginx集群、分组、Https证书等信息。

状态:该站点是否可以部署到Nginx服务器上,还是仅存在数据库中持久化。正常使用的站点,状态都为ENABLED;

域名:对应server_name,监听的域名;

端口:对应listen,监听的端口;

默认转发集群:当没有规则匹配请求时,该请求默认反向代理到哪一个业务集群中。这一项是必须配置的,以防止流量没有匹配到任何请求的场景。默认转发集群只能从”集群管理”中已添加的集群选择,请在框内输入集群名称,会自动补全;

部署Nginx集群:该站点配置部署到哪一个Nginx集群上;

分组:该站点属于哪一个分组。分组时camel-admin管理站点的逻辑概念,仅用于左侧栏对站点进行分组;

Https证书:是否需要部署Https证书。如果选择是,请按提示继续配置Https公钥及私钥。

如果配置Https证书,还需选择默认路径的类型

1
2
3
4
5
6
7
路径的Https类型表明:该路径对Http请求和Https请求的处理策略

Http, Https:表明该路径及接受Http请求,也接受Https请求

强制Http:只接受Http请求。如果收到Https请求,则通过303的方式重定向到Http

强制Https:只接受Https请求。如果收到Http请求,则通过303的方式重定向到Https

b. 映射规则:

对应location规则。
location_1
添加一条映射规则时,首先选择匹配策略。如是前缀匹配还是正则匹配、匹配的pattern等。

可以添加多个指令。
location_2

我们对指令进行了抽象,有proxy_pass, return, rewrite等。分类已覆盖绝大部分需求,如果仍有特殊需求,请选择custom类型,然后填写任意内容。注意省去结尾的冒号。

如果选择proxy_pass指令,请在选择框内输入集群名称,下拉表会自动出现对应集群,点击或光标移动回车即可。
location_3
选择指令后,会根据指令类型的不同,提示填写不同的信息。

c. 公共规则:

这是对location前、后的指令做了一层抽象。

如:

1
2
3
4
5
6
7
8
9
set $test "-";
if ( $http_cookie ~* "test=(\S+)(;.*|$)"){
set $test $1;
}

location ~* ^/test {
dp_domain test.liyang.com.;
proxy_pass http://$dp_upstream;
}

其中

1
2
3
4
set $dper "-";
if ( $http_cookie ~* "dper=(\S+)(;.*|$)"){
set $dper $1;
}

即为公共规则。

公共规则,与映射规则类似,都是指令的集合。添加公共规则,会选择类型:前置规则代表着该公共规则指令在location之前;后置规则代表着该公共规则指令在location之后。

aspect_1

添加公共规则后,即可按照给location添加指令的方式添加directive。

d. 版本对比:

每次发布都会对站点信息创建一个唯一版本,类似git的commit,相当于进行一次历史快照。不同历史快照之间可以比较其变化。

如果提示保存成功,则已成功添加一个站点。随后,在导航栏”站点管理”页面下,即可对站点信息进行管理,比如新增站点,编辑老站点等。

左侧有两级站点列表,第一级是分组,第二级是具体站点名。请先打开对应分组,再定位到具体站点上。

部署

本节介绍如何部署Nginx配置文件。

Nginx配置文件组成方式

我们是这样管理Nginx文件的:

1
2
3
4
5
6
7
8
9
10
11
在Nginx服务器上,nginx/conf目录下,建立了一个phoenix-slb目录。该目录下存放着由Camel管理的站点配置文件。

每个站点对应着一个单独的文件夹,文件夹下有一个server.conf,存放着本站点的配置。

假设有两个站点 a.liyang.com,b.liyang.com,其组织方式如下:

phoenix-slb
- a.liyang.com
- server.conf // a.liyang.com对应的配置文件
- b.liyang.com
- server.conf // b.liyang.com对应的配置文件

部署操作是以站点为粒度。每次部署,即更改phoenix-slb下的对应站点配置文件,并重启Nginx的过程。

触发部署操作

共有两个场景触发部署操作:

  1. 修改站点信息。此时该站点需要重新部署
    如需对当前站点进行部署操作,请如下图所示,先创建一个发布版本,再点击发布按钮,即可跳转到部署页面
    deploy_site

    我们抽象了一个发布版本的概念。每次需要部署时,都先创建一个发布版本。发布版本是一个历史快照,不仅保存了本次发布的站点信息,也保存了本次发布的其它相关信息,如业务集群信息等。从而完全保存了该发布版对应的信息。

    切换到一个发布版本,即可生成完全与创建发布版本时间点一致的配置文件。

  2. 修改业务集群信息。此时所有业务集群涉及到的站点都需部署
    业务集群界面的第三部分为:哪些站点引用了该集群(见配置业务集群小节)。当编辑该集群时,会自动提示是否部署涉及到的站点:
    deploy_pool
    点击”去发布”按钮,即可跳转到部署页面

部署操作

进入部署页面后,部署流程如下:

  1. 选择本次部署的站点及版本:
    deploy_select
    如图所示,勾选所需发布的站点,并选择站点对应的发布版本。

    • 通过更改站点,或者更该集群进入该页面,会自动对相关站点进行打勾并自动选择对应版本。该操作由JavaScript完成,页面需要加载JavaScript,所以请稍等页面自动打勾完毕。

    • 勾选完成后,再点击”确定”按钮,进入发布页面。

  2. 进入发布页面后,请如图所示进行操作:
    deploy_trigger

    • 首先选择需要发布的Nginx服务器。这里会列出站点对应Nginx集群的所有机器,可以根据需要勾选。建议选择全部Nginx服务器,否则会造成Nginx集群配置不同步。

    • 选择完毕后,点击启动任务按钮,camel-admin开始调用camel-agent,发布配置文件。

    • 完成发布后,会在状态栏显示绿色的”成功”框,或者红色的”失败”框。此时点击状态框右侧的”Log”按钮,即可在右侧的日志框显示本次发布的日志。

    • 如果发布失败,请先查看此次发布的log。log会记录camel-agent的发布信息,往往能直接反映出问题所在。

查看历史部署记录

您也可查看历史发布记录。如下图所示:
deploy_list

  • 首先点击导航栏中的”发布管理”按钮,然后选择左侧边栏的”发布列表”。右侧会列出历史发布记录。

  • 点击一个部署任务对应的”查看任务”按钮,即可跳转到该次部署任务的部署页面。如果本次部署页面是失败的,可在此页面上对这次部署任务继续进行操作。

五、接口服务

调用camel-admin的接口,可以更改配置信息,也可以直接发布Nginx配置文件。

本章首先介绍接口的使用场景,然后具体说明每个接口的调用方法。

使用场景

Camel管理端内部定义了很多模型对象。接口接受的数据均是模型对象对应的json。

Camel管理端,提供了界面和接口两种方式。这两种方式均可对Server、Upstream等配置信息进行更改,以及发布配置文件。那么什么场景下应该使用接口呢?

  1. 通过界面对配置文件进行更改,是一种可视化操作,非常的直观。界面方式适用于编辑配置信息,如增加location等操作。

  2. 如果通过界面进行配置文件发布操作,会稍显繁琐,新建立一个新版本,然后再勾选站点、版本信息,再选择发布的目标Nginx服务器,最后进行发布操作。而接口发布配置文件,会自动完成所有上述操作,减少了很多人供选择。

  3. 在大众点评,业务应用上下线会调用Camel的接口。比如业务上线时,流程大体为:调用Camel接口发布Nginx配置,从Upstream中摘掉本机节点->关闭tomcat->部署新的war包->启动tomcat->调用Camel接口发布Nginx配置,添加本机节点到Upstream上。在发布期间,已经更改了Nginx中upstream的配置,所以不会出现流量转发到未发布好的机器上。与只依赖Nginx健康心跳方式相比,调用接口不会损失任何流量,确保了流量的稳定。

业务应用上下线是接口使用最多的场景。目前Camel每天约响应数千次的上下线接口请求。

接口调用

Camel管理端定义了两个版本的接口。第一版接口路径以”/api/“开头,第二版接口路径以”/api/v2”开头。

两个版本接口的主要区别在于:

第二版本接口将更改配置、发布配置文件这两部操作聚合成为一个原子操作。则调用第二版本接口,如果成功,则Nginx当前配置为更改之后的配置;如果失败,则Nginx当前配置为调用接口之前的配置。不会出现不安全的中间状态。

第一版本接口

  1. 更新节点

    1
    2
    3
    4
    5
    6
    7
    Http方法:post
    URL pattern:http://localhost:8080/api/pool/<localhost>/updateMember 其中<localhost>是pool名称
    post内容(要求是json格式):
    [{"name":"a", "ip":"127.0.0.1"}]
    其中name是节点名称,ip是节点地址,另外还有可选属性,端口port(默认是80),权重weight(默认是100),最大失败次数maxFails(默认是3),失败超时时间failTimeout(2s),状态state(枚举值:ENABLED,
    DISABLED, FORCED_OFFLINE)
    如果指定name,则修改对应name的节点 如果只有ip,则修改对应ip的节点
  2. 添加节点

    1
    2
    3
    4
    5
    Http方法:post
    URL pattern:http://localhost:8080/api/pool/<localhost>/addMember 其中<localhost>是pool名称
    post内容(要求是json格式):
    [{"name":"a", "ip":"127.0.0.1"}]
    其中name是节点名称,ip是节点地址,另外还有可选属性,端口port(默认是80),权重weight(默认是100),最大失败次数maxFails(默认是3),失败超时时间failTimeout(2s),状态state(枚举值:ENABLED,DISABLED, FORCED_OFFLINE)
  3. 删除节点

    1
    2
    3
    4
    Http方法:post
    URL pattern:http://localhost:8080/api/pool/<localhost>/delMember 其中<localhost>是pool名称
    post内容(要求是json格式):
    ["a","b"] , 其中a,b都是节点名称
  4. 添加站点

    1
    2
    3
    4
    Http方法:post
    URL pattern:http://localhost:8080/api/vs/add
    post内容(要求是json格式):
    {"name":"test.com","slbPool":"test-pool"} , 其中vs是站点名称(必填),slbPool是路由机器的组名(可选,默认是paas-pool)
  5. 添加集群

    1
    2
    3
    4
    Http方法:post
    URL pattern:http://localhost:8080/api/pool/add
    post内容(要求是json格式):
    {"name":"test","members":[{"ip":"127.0.0.1"}]} , 其中name是pool名称(必填),members参数(可选)中可以是多个节点,节点ip使用ip参数,节点名称是name参数(不填默认是ip_port命名)

第二版本接口

  1. 更新节点并发布

    1
    2
    3
    4
    5
    6
    7
    8
    Http方法:post
    URL pattern:http://localhost:8080/api/v2/pool/<localhost>/updateMemberAndDeploy 其中<localhost>是pool名称
    post内容(要求是json格式):
    [{"name":"a", "ip":"127.0.0.1"}]
    其中name是节点名称,ip是节点地址,另外还有可选属性,端口port(默认是80),权重weight(默认是100),最大失败次数maxFails(默认是3),失败超时时间failTimeout(2s),状态state(枚举值:ENABLED,
    DISABLED, FORCED_OFFLINE)
    如果指定name,则修改对应name的节点 如果只有ip,则修改对应ip的节点
    如果发布失败,则该pool会退回到原始状态
  2. 添加节点并发布

    1
    2
    3
    4
    5
    6
    Http方法:post
    URL pattern:http://localhost:8080/api/v2/pool/<localhost>/addMemberAndDeploy 其中<localhost>是pool名称
    post内容(要求是json格式):
    [{"name":"a", "ip":"127.0.0.1"}]
    其中name是节点名称,ip是节点地址,另外还有可选属性,端口port(默认是80),权重weight(默认是100),最大失败次数maxFails(默认是3),失败超时时间failTimeout(2s),状态state(枚举值:ENABLED,DISABLED, FORCED_OFFLINE)
    如果发布失败,则该pool会退回到原始状态
  3. 删除节点并发布

    1
    2
    3
    4
    5
    Http方法:post
    URL pattern:http://localhost:8080/api/v2/pool/<localhost>/delMemberAndDeploy 其中<localhost>是pool名称
    post内容(要求是json格式):
    ["a","b"] , 其中a,b都是节点名称
    如果发布失败,则该pool会退回到原始状态

六、监控

好的监控可以帮助了解项目的运行状态,更及时的发现问题。本章主要介绍Camel对Nginx服务器的监控。共有两种监控类型:

  1. QPS监控
    监控Nginx的QPS访问量

  2. 状态码监控
    由upstream的http返回状态码,监控业务服务器的响应状态

QPS监控

对Nginx服务器的请求状态进行监控。

qps_monitor

如图所示,左侧栏列出所有的Nginx集群。点选一个Nginx集群,右侧会出现该集群所有Nginx服务器的QPS趋势图。点选最右侧的Nginx IP,可以显示或隐藏该Nginx服务器的QPS趋势。

QPS信息汇总使用了Tengine的请求状态统计模块:ngx_http_reqstat_module。该模块以域名为粒度,统计请求信息;并提供Http接口,提供请求状态。

暴露QPS信息可能影响网站安全。请禁止Camel管理端以外的IP访问该接口。设置方式如下:

编辑nginx/conf/nginx_status.conf配置文件,对/status路径进行如下的配置:

1
2
3
4
5
6
location /status {
check_status;
access_log off;
deny all;
allow ${camel_admin_ip};
}

状态码监控

对于动态请求,Nginx本身不处理请求,而是反向代理到业务服务器,由业务服务器来真正处理请求。

业务服务器的处理状态,可以通过http返回状态码来判定。Nginx本身的access.log中,记录了每条请求以及返回状态码。对返回状态码进行监控,可以了解业务服务器的状态。

目前Camel以业务集群upstream为粒度进行监控,提供了状态码趋势图、状态码大盘、监控规则报警功能。

  1. 状态码趋势图
    status_code_monitor
    如图所示,Camel提供了错误状态码趋势图。该趋势图以upstream集群为粒度,展现了每分钟状态码的变化状况。

  2. 状态码大盘
    status_code_dashboard

    • 大盘是从另外一个角度查看状态码监控信息:找出每分钟错误状态码最多的几个upstream,并按照错误状态码个数进行排序。

    • 大盘提供了定时刷新的功能。可以配置在屏幕上,由值班运维人工监控。

  3. 监控规则及告警
    Camel支持对错误状态码的个数进行监控。当某个集群,制定时段内的某个错误状态码个数超过了阈值,则会发出告警。
    监控规则如下图所示:
    status_code_rule

1
2
3
4
5
如果您需要使用状态码监控的功能,需要自己做一些开发:

1. 开发Nginx日志处理功能。在大众点评内部,Camel部署了一个Storm Topology,订阅并处理Nginx服务器上的Nginx日志。不同公司对日志处理方式不同,建议您结合自己公司日志处理中间件,处理Nginx日志,最后调用Camel的接口"api/nginx/log/addLog",Camel会自行对日志进行统计

2. 开发发送告警邮件功能。请修改com.dianping.phoenix.lb.monitor.nginx.log.sender中的类。

本文参考链接

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×