大众点评Camel介绍
一、前言
大众点评最开始采用F5做七层负载。随着网站规模的增大,F5成为了网络的瓶颈,主要原因有以下两点:
负载规则涉及到很多路径的正则匹配,这要求F5做很多的正则计算。这大大增加了F5的CPU负载。
F5需要对业务服务集群进行心跳检测。随着业务服务规模增大,F5需要对近千台服务器进行心跳检测。F5很难维持这个量级的心跳信息。
为此,我们决定使用软件工程的银弹-在架构上,增加新的层级。从而大众点评有两层负载,第一层为F5,做四层硬负载;第二层为Nginx集群,做七层硬负载。
使用规模
Camel在大众点评的应用规模如下:
nginx服务器集群:
数十个nginx集群,百台以上nginx服务器站点及业务集群:
数百个站点域名,数百个业务服务器集群QPS
每天响应约数万次接口调用,其中有约数千次为nginx配置部署请求
总体架构
Camel项目由camel-admin, Dengine(基于Tengine开发的Web服务器), camel-agent三个模块组成:
camel-admin:
Camel管理端:可以通过接口及页面两种方式对Nginx集群进行发布、重启、监控等操作。Dengine
大众点评基于Tengine开发的Web服务器。在Tengine的基础上,添加了降级等功能。camel-agent:
部署在Nginx服务器上,管理本机的Nginx进程与配置文件。
二、工作原理
大众点评对网络流量采用两层负载。那么,这两层负载是如何分工的呢?
我们结合一个具体的请求来分析这个问题:
假设有一条请求,访问domain_name/location_name:
- 首先,浏览器寻找该域名domain_name对应的公网IP。电脑接入的运营商不同,对应的公网IP就不同。
- 由于该IP是F5的对外IP,请求发送到F5上。
- F5将此请求反向代理到一台Nginx服务器
- 该Nginx服务器根据网址路径”/location_name”找到对应的负载规则,转发到规则中配置的业务服务器。
- 业务服务器响应该请求。
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有两部分信息需要持久化:
站点、集群等信息
对于站点和集群,我们统一抽象了一个模型-SlbModelTree。为了使用方便,该模型存储到NoSQL的MongoDB中,省去模型结构变更导致表结构变更的烦恼。发布记录
发布即为一次更新Nginx配置文件并使配置文件生效的操作。发布状态、日志等信息存储到MySQL中。
为此,部署管理端之前需要配置数据库: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的操作为写多读少,不建议开启主从同步。
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。
如何通过界面,对负载相关的基本信息进行配置。包括Nginx集群配置、业务集群配置、站点信息配置;
如何部署配置到Nginx集群上。
Nginx配置相关功能总体介绍
camel-admin与Nginx配置有关的功能主要有:站点管理,业务集群管理,Nginx集群管理。
这三个功能,与camel-admin界面导航栏及Nginx配置文件的对应关系如下:
站点管理:
对应Nginx配置中的server块业务集群管理:
对应Nginx配置中的upstream块Nginx集群管理管理:
不对应Nginx配置,对应着Nginx集群服务器
第一次启动
第一次启动后,会进入如下页面:
第一次启动没有任何数据,请按照提示初始化数据。
由于站点信息依赖Nginx集群信息、集群信息,所以请完成站点依赖的Nginx集群信息、业务集群信息配置后,再配置站点信息。
配置nginx集群
同一个Nginx服务器集群下的多台Nginx服务器,配置文件都是完全一致的。多个站点对应一个Nginx服务器集群,建议按照站点流量进行划分,让多个Nginx集群的流量尽量均匀。
请确保添加的Nginx服务器,已经安装好并正在运行Dengine及camel-agent。
- 点击引导页面的“点击新增Nginx集群”按钮
- 在对话框中输入Nginx集群名称
- 点击”添加新Nginx节点按钮”,输入Nginx服务器ip,最后点击保存
如果提示保存成功,则已成功添加一个Nginx集群。
随后,在导航栏”Nginx管理”页面下,即可对Nginx集群信息进行管理,比如新增Nginx集群,编辑老Nginx集群等。
配置业务集群
本节介绍如何配置业务服务器集群,对应Nginx配置文件中的upstream部分。
- 点击引导页面的“点击新增集群”按钮
- 在对话框中输入业务集群名称
- 进入业务集群配置界面。该界面可以主要分为三个部分:
a. 集群信息:
配置集群名称、负载策略、长链接数、心跳检测规则、降级规则。
1 | 集群名称:对应upstream名称。为了保证所有配置的集群名称都是唯一的,最后落地在配置文件中的Nginx的集群名,为“站点名.集群名”; |
降级规则:此为Dengine独立开发的功能。这里配置降级比例及集群降级状态。
1 | 降级规则是按照心跳检查的结果,计算业务集群中心跳检查正常的服务器比例。如果该比例小于一定阈值,比如10台业务服务器只有1台业务服务器心跳正常,则将流量切换到备用集群。 |
b. 节点列表:
每个节点信息对应着一台业务服务器。需要填写节点名称、ip、端口、权重、置为fail的策略。
请注意:ip请填写对应的ip地址,Nginx不允许填写主机名。
节点对应着四个状态:
Enabled状态:正常状态
Disabled, Offline状态:不被使用,仅在数据库中记录
Degrade状态:降级集群状态,当集群心跳检测低于阈值,触发了降级条件,把流量转发至降级集群。
c. 影响站点:
展示该集群被哪些站点所引用。从而表明如果该集群修改,对应站点要更新Nginx配置。
如果提示保存成功,则已成功添加一个业务集群。
随后,在导航栏”集群管理”页面下,即可对业务集群信息进行管理,比如新增业务集群,编辑老业务集群等。
随着业务集群的增多,业务集群列表会越来越庞大,这非常不方便查找一个集群。为此,需要进入一个集群的配置页面,请通过右上角”快速切换集群”,输入集群名称。camel-admin会自动补全,再回车或点选即可进入集群页面。
配置站点
本节介绍如何配置站点信息,对应Nginx配置文件中的server部分。
站点信息下的映射规则对应着Nginx配置文件中的location部分。
1 | 来了一个网络请求,先按照端口和域名进行匹配,找到对应Nginx的哪一个站点配置 |
站点配置流程如下:
- 确保已经添加对应的Nginx集群信息及业务服务器集群信息
- 点击引导页面的“点击新增站点”按钮
- 在对话框中输入站点名称(建议与匹配域名保持一致,不做强制要求)
- 进入站点配置界面。该界面按照左侧的标签导航栏,主要分为四个部分:
a. 站点基本信息:配置状态、域名、端口、默认转发集群、部署Nginx集群、分组、Https证书等信息。
状态:该站点是否可以部署到Nginx服务器上,还是仅存在数据库中持久化。正常使用的站点,状态都为ENABLED;
域名:对应server_name,监听的域名;
端口:对应listen,监听的端口;
默认转发集群:当没有规则匹配请求时,该请求默认反向代理到哪一个业务集群中。这一项是必须配置的,以防止流量没有匹配到任何请求的场景。默认转发集群只能从”集群管理”中已添加的集群选择,请在框内输入集群名称,会自动补全;
部署Nginx集群:该站点配置部署到哪一个Nginx集群上;
分组:该站点属于哪一个分组。分组时camel-admin管理站点的逻辑概念,仅用于左侧栏对站点进行分组;
Https证书:是否需要部署Https证书。如果选择是,请按提示继续配置Https公钥及私钥。
如果配置Https证书,还需选择默认路径的类型
1 | 路径的Https类型表明:该路径对Http请求和Https请求的处理策略 |
b. 映射规则:
对应location规则。
添加一条映射规则时,首先选择匹配策略。如是前缀匹配还是正则匹配、匹配的pattern等。
可以添加多个指令。
我们对指令进行了抽象,有proxy_pass, return, rewrite等。分类已覆盖绝大部分需求,如果仍有特殊需求,请选择custom类型,然后填写任意内容。注意省去结尾的冒号。
如果选择proxy_pass指令,请在选择框内输入集群名称,下拉表会自动出现对应集群,点击或光标移动回车即可。
选择指令后,会根据指令类型的不同,提示填写不同的信息。
c. 公共规则:
这是对location前、后的指令做了一层抽象。
如:
1 | set $test "-"; |
其中
1 | set $dper "-"; |
即为公共规则。
公共规则,与映射规则类似,都是指令的集合。添加公共规则,会选择类型:前置规则代表着该公共规则指令在location之前;后置规则代表着该公共规则指令在location之后。
添加公共规则后,即可按照给location添加指令的方式添加directive。
d. 版本对比:
每次发布都会对站点信息创建一个唯一版本,类似git的commit,相当于进行一次历史快照。不同历史快照之间可以比较其变化。
如果提示保存成功,则已成功添加一个站点。随后,在导航栏”站点管理”页面下,即可对站点信息进行管理,比如新增站点,编辑老站点等。
左侧有两级站点列表,第一级是分组,第二级是具体站点名。请先打开对应分组,再定位到具体站点上。
部署
本节介绍如何部署Nginx配置文件。
Nginx配置文件组成方式
我们是这样管理Nginx文件的:
1 | 在Nginx服务器上,nginx/conf目录下,建立了一个phoenix-slb目录。该目录下存放着由Camel管理的站点配置文件。 |
部署操作是以站点为粒度。每次部署,即更改phoenix-slb下的对应站点配置文件,并重启Nginx的过程。
触发部署操作
共有两个场景触发部署操作:
修改站点信息。此时该站点需要重新部署
如需对当前站点进行部署操作,请如下图所示,先创建一个发布版本,再点击发布按钮,即可跳转到部署页面
我们抽象了一个发布版本的概念。每次需要部署时,都先创建一个发布版本。发布版本是一个历史快照,不仅保存了本次发布的站点信息,也保存了本次发布的其它相关信息,如业务集群信息等。从而完全保存了该发布版对应的信息。
切换到一个发布版本,即可生成完全与创建发布版本时间点一致的配置文件。
修改业务集群信息。此时所有业务集群涉及到的站点都需部署
业务集群界面的第三部分为:哪些站点引用了该集群(见配置业务集群小节)。当编辑该集群时,会自动提示是否部署涉及到的站点:
点击”去发布”按钮,即可跳转到部署页面
部署操作
进入部署页面后,部署流程如下:
选择本次部署的站点及版本:
如图所示,勾选所需发布的站点,并选择站点对应的发布版本。通过更改站点,或者更该集群进入该页面,会自动对相关站点进行打勾并自动选择对应版本。该操作由JavaScript完成,页面需要加载JavaScript,所以请稍等页面自动打勾完毕。
勾选完成后,再点击”确定”按钮,进入发布页面。
进入发布页面后,请如图所示进行操作:
首先选择需要发布的Nginx服务器。这里会列出站点对应Nginx集群的所有机器,可以根据需要勾选。建议选择全部Nginx服务器,否则会造成Nginx集群配置不同步。
选择完毕后,点击启动任务按钮,camel-admin开始调用camel-agent,发布配置文件。
完成发布后,会在状态栏显示绿色的”成功”框,或者红色的”失败”框。此时点击状态框右侧的”Log”按钮,即可在右侧的日志框显示本次发布的日志。
如果发布失败,请先查看此次发布的log。log会记录camel-agent的发布信息,往往能直接反映出问题所在。
查看历史部署记录
您也可查看历史发布记录。如下图所示:
首先点击导航栏中的”发布管理”按钮,然后选择左侧边栏的”发布列表”。右侧会列出历史发布记录。
点击一个部署任务对应的”查看任务”按钮,即可跳转到该次部署任务的部署页面。如果本次部署页面是失败的,可在此页面上对这次部署任务继续进行操作。
五、接口服务
调用camel-admin的接口,可以更改配置信息,也可以直接发布Nginx配置文件。
本章首先介绍接口的使用场景,然后具体说明每个接口的调用方法。
使用场景
Camel管理端内部定义了很多模型对象。接口接受的数据均是模型对象对应的json。
Camel管理端,提供了界面和接口两种方式。这两种方式均可对Server、Upstream等配置信息进行更改,以及发布配置文件。那么什么场景下应该使用接口呢?
通过界面对配置文件进行更改,是一种可视化操作,非常的直观。界面方式适用于编辑配置信息,如增加location等操作。
如果通过界面进行配置文件发布操作,会稍显繁琐,新建立一个新版本,然后再勾选站点、版本信息,再选择发布的目标Nginx服务器,最后进行发布操作。而接口发布配置文件,会自动完成所有上述操作,减少了很多人供选择。
在大众点评,业务应用上下线会调用Camel的接口。比如业务上线时,流程大体为:调用Camel接口发布Nginx配置,从Upstream中摘掉本机节点->关闭tomcat->部署新的war包->启动tomcat->调用Camel接口发布Nginx配置,添加本机节点到Upstream上。在发布期间,已经更改了Nginx中upstream的配置,所以不会出现流量转发到未发布好的机器上。与只依赖Nginx健康心跳方式相比,调用接口不会损失任何流量,确保了流量的稳定。
业务应用上下线是接口使用最多的场景。目前Camel每天约响应数千次的上下线接口请求。
接口调用
Camel管理端定义了两个版本的接口。第一版接口路径以”/api/“开头,第二版接口路径以”/api/v2”开头。
两个版本接口的主要区别在于:
第二版本接口将更改配置、发布配置文件这两部操作聚合成为一个原子操作。则调用第二版本接口,如果成功,则Nginx当前配置为更改之后的配置;如果失败,则Nginx当前配置为调用接口之前的配置。不会出现不安全的中间状态。
第一版本接口
更新节点
1
2
3
4
5
6
7Http方法: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的节点添加节点
1
2
3
4
5Http方法: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)删除节点
1
2
3
4Http方法:post
URL pattern:http://localhost:8080/api/pool/<localhost>/delMember 其中<localhost>是pool名称
post内容(要求是json格式):
["a","b"] , 其中a,b都是节点名称添加站点
1
2
3
4Http方法:post
URL pattern:http://localhost:8080/api/vs/add
post内容(要求是json格式):
{"name":"test.com","slbPool":"test-pool"} , 其中vs是站点名称(必填),slbPool是路由机器的组名(可选,默认是paas-pool)添加集群
1
2
3
4Http方法: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
2
3
4
5
6
7
8Http方法: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会退回到原始状态添加节点并发布
1
2
3
4
5
6Http方法: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会退回到原始状态删除节点并发布
1
2
3
4
5Http方法:post
URL pattern:http://localhost:8080/api/v2/pool/<localhost>/delMemberAndDeploy 其中<localhost>是pool名称
post内容(要求是json格式):
["a","b"] , 其中a,b都是节点名称
如果发布失败,则该pool会退回到原始状态
六、监控
好的监控可以帮助了解项目的运行状态,更及时的发现问题。本章主要介绍Camel对Nginx服务器的监控。共有两种监控类型:
QPS监控
监控Nginx的QPS访问量状态码监控
由upstream的http返回状态码,监控业务服务器的响应状态
QPS监控
对Nginx服务器的请求状态进行监控。
如图所示,左侧栏列出所有的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 | location /status { |
状态码监控
对于动态请求,Nginx本身不处理请求,而是反向代理到业务服务器,由业务服务器来真正处理请求。
业务服务器的处理状态,可以通过http返回状态码来判定。Nginx本身的access.log中,记录了每条请求以及返回状态码。对返回状态码进行监控,可以了解业务服务器的状态。
目前Camel以业务集群upstream为粒度进行监控,提供了状态码趋势图、状态码大盘、监控规则报警功能。
状态码趋势图
如图所示,Camel提供了错误状态码趋势图。该趋势图以upstream集群为粒度,展现了每分钟状态码的变化状况。状态码大盘
大盘是从另外一个角度查看状态码监控信息:找出每分钟错误状态码最多的几个upstream,并按照错误状态码个数进行排序。
大盘提供了定时刷新的功能。可以配置在屏幕上,由值班运维人工监控。
监控规则及告警
Camel支持对错误状态码的个数进行监控。当某个集群,制定时段内的某个错误状态码个数超过了阈值,则会发出告警。
监控规则如下图所示:
1 | 如果您需要使用状态码监控的功能,需要自己做一些开发: |