我们的规划是在三台服务器上部署夜莺主要的服务组件以及redis和nginx,并在所有要监控的服务器上部署夜莺的agent服务,agent服务将用来收集要监控的服务器数据,并将数据发送到夜莺的主要服务端用作监控告警,下面表格是我们在三个节点上的部署的夜莺主要服务组件和相关依赖服务:
节点 | monapi | transfer | job | ams | index | judge | rdb | tsdb | redis | nginx | mysql |
---|---|---|---|---|---|---|---|---|---|---|---|
node01 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 否 |
node02 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 |
node03 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 否 |
下面是夜莺(V3)的架构图
我们借助夜莺的架构图说明一下监控数据流程,这是比较重要的,有助于我们部署服务和排查错误,我在这里通俗的讲一下,有需要深入研究的朋友可以参考夜莺官方文档。
首先是agent服务,主要用于采集数据和执行任务,哪台服务器需要被监控,就把agent部署到哪里。agent采集的监控数据会上报到transfer,然后transfer将数据转发到tsdb和judge,tsdb用来存储这些监控数据,judge是告警引擎,它会从monapi(portal)同步监控策略,然后对接收到的数据做告警判断,如满足阈值,则生成告警事件推到redis,monapi(alarm)从redis读取judge生成的事件,生成告警消息,然后存到mysql并重新推回redis,最后rdb会从redis拿到告警事件,将告警发送到邮件或者是短信等。
接下来说一下夜莺分布式机制,整个夜莺的各种服务要做到分布式其实靠的是address.yml文件,这个文件要所有节点都一致,我们看下这个文件的部分内容:
可以看到夜莺的各个服务组件都是通过这个文件的配置信息来找到它们要通信的服务所在地,比如开启了多个transfer后,这个配置文件中就要配置多个transfer地址,这样,agent上报数据时就可以根据这个配置找到transfer在哪些服务器上。
好了,下面说一下在配置分布式时候的注意点:
1、redis
redis服务无需搭建成集群,我们可以在多个节点上部署单点的redis实例,这里我们需要注意的是,每个monapi和redis是一一对应的,就是说每个monapi只能配置一个redis地址,而且rdb服务也是如此,这些服务只能连接一个redis实例,但是judge可以配置连接多个redis实例,但是它发送消息只会随机发送到某一个正常的redis实例, 在这种类似分片机制下其实存在风险,这样当一个monapi或rdb挂掉后告警消息就会丢失
2、nginx
nginx可以安装多个,每个使用相同的配置,夜莺的安装包里有nginx的配置模板nginx.conf,可以拿来改改直接用,其实主要就是修改下各个服务的地址,下面看一个示例:
user root;
worker_processes auto;
worker_cpu_affinity auto;
worker_rlimit_nofile 204800;
error_log /data/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
use epoll;
worker_connections 204800;
}
http {
log_format main '$server_addr $host $remote_addr [$time_local] $scheme "$request" '
'$status $upstream_status $body_bytes_sent $request_time $upstream_addr $upstream_response_time "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /data/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /usr/local/webserver/nginx/conf/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf;
proxy_connect_timeout 500ms;
proxy_send_timeout 1000ms;
proxy_read_timeout 3000ms;
proxy_buffers 64 8k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 64k;
proxy_redirect off;
proxy_next_upstream error invalid_header timeout http_502 http_504;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-Port $remote_port;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 100m;
client_body_buffer_size 512k;
client_body_timeout 180;
client_header_timeout 10;
send_timeout 240;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_comp_level 2;
gzip_types application/javascript application/x-javascript text/css text/javascript image/jpeg image/gif image/png;
gzip_vary off;
gzip_disable "MSIE [1-6]\.";
upstream n9e.rdb {
server 10.5.2.133:8000;
server 10.5.2.134:8000;
server 10.5.2.135:8000;
keepalive 60;
}
upstream n9e.ams {
server 10.5.2.134:8002;
keepalive 60;
}
upstream n9e.job {
server 10.5.2.134:8004;
keepalive 60;
}
upstream n9e.monapi {
server 10.5.2.133:8006;
server 10.5.2.134:8006;
server 10.5.2.135:8006;
keepalive 60;
}
upstream n9e.transfer {
server 10.5.2.133:8008;
server 10.5.2.134:8008;
server 10.5.2.135:8008;
keepalive 60;
}
upstream n9e.index {
server 10.5.2.133:8012;
server 10.5.2.134:8012;
server 10.5.2.135:8012;
keepalive 60;
}
server {
listen 80 default_server;
server_name n9e.example.com;
root /opt/nightingale/pub;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location =/ {
rewrite / /mon;
}
location / {
try_files $uri /layout/index.html;
}
location ~ .*(.htm|.html|.json)$ {
add_header Cache-Control "private, no-store, no-cache, must-revalidate, proxy-revalidate";
}
location /api/rdb {
proxy_pass http://n9e.rdb;
}
location /api/ams {
proxy_pass http://n9e.ams;
}
location /api/job {
proxy_pass http://n9e.job;
}
location /api/mon {
proxy_pass http://n9e.monapi;
}
location /api/index {
proxy_pass http://n9e.index;
}
location /api/transfer {
proxy_pass http://n9e.transfer;
}
}
}
分布式方案先写到这里,具体安装步骤就可以参考官方文档了,有问题的老铁可以留言提问。