滴滴夜莺分布式部署方案

我们的规划是在三台服务器上部署夜莺主要的服务组件以及redis和nginx,并在所有要监控的服务器上部署夜莺的agent服务,agent服务将用来收集要监控的服务器数据,并将数据发送到夜莺的主要服务端用作监控告警,下面表格是我们在三个节点上的部署的夜莺主要服务组件和相关依赖服务:

集群节点规划
节点monapitransferjobamsindexjudgerdbtsdbredisnginxmysql
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;
        }
    }

}

分布式方案先写到这里,具体安装步骤就可以参考官方文档了,有问题的老铁可以留言提问。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

头顶榴莲树

你的鼓励是我最大的动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值