zoukankan      html  css  js  c++  java
  • 08 . Prometheus+Grafana监控haproxy+rabbitmq

    List

      CentOS7.3
      prometheus-2.2.1.linux-amd64.tar.gz
      haproxy_exporter-0.11.0.linux-amd64.tar.gz
    
    节点名 IP 软件版本 硬件 网络 说明
    Prometheus 192.168.43.144 list 里面都有 2C4G Nat,内网 测试环境
    RabbitMQ 192.168.43.213 list 里面都有 2C4G Nat,内网 测试环境
    RabbitMQ 192.168.43.251 list 里面都有 2C4G Nat,内网 测试环境

    部署Prometheus

    部署Promehteus请看我前面写的文章

    https://www.cnblogs.com/you-men/p/12839535.html

    部署RabbitMQ

    修改主机名

    由于 RabbitMQ 集群连接是通过主机名来连接服务的,必须保证各个主机名之间可以 ping 通

    hostnamectl set-hostname rabbitmq-2
    hostnamectl set-hostname rabbitmq-1
    
    echo "192.168.43.213 rabbitmq-1" >> /etc/hosts
    echo "192.168.43.251 rabbitmq-2" >> /etc/hosts
    scp /etc/hosts rabbitmq-2:/etc/
    
    安装RabbitMQ
    # 更新 yum源
    yum install epel-release
    yum -y install rabbitmq-server
    

    RabbitMQ 集群是通过 Erlang 的集群实现的,当集群中的节点进行通信时,Erlang 节点会进行认证。如果节点之间的 Erlang cookie 不相同,则会认证失败。因此,需要在集群中的所有节点上同步 cookie 文件

    这里将 rabbitmq-1 的该文件复制到 rabbitmq-2,由于这个文件权限是 400 为方便传输,先修改权限,非必须操作,所以需要先修改 rabbitmq-2 中的该文件权限为 777

    [root@rabbitmq-1 ~]# service rabbitmq-server start
    Redirecting to /bin/systemctl start  rabbitmq-server.service
    [root@rabbitmq-1 ~]# cat /var/lib/rabbitmq/.erlang.cookie 
    KNTAXWSNMNNODXVTCRZZ
    
    # 用scp 拷贝到rabbitmq-2
    scp /var/lib/rabbitmq/.erlang.cookie rabbitmq-2:/var/lib/rabbitmq/.erlang.cookie
    
    
    # 我们到另一台机器发现拷贝过来的权限有问题,所以需要修改
    [root@rabbitmq-2 ~]# ls -l /var/lib/rabbitmq/.erlang.cookie 
    -r-------- 1 root root 20 May  7 23:27 /var/lib/rabbitmq/.erlang.cookie
    
    chmod 400 /var/lib/rabbitmq/.erlang.cookie
    chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
    service rabbitmq-server start
    
    组成集群

    在rabbitmq-2执行如下命令

    [root@rabbitmq-2 ~]# rabbitmqctl stop_app # 停止rabbitmq服务
    [root@rabbitmq-2 ~]# rabbitmqctl reset # 清空节点状态
    [root@rabbitmq-2 ~]# rabbitmqctl join_cluster rabbit@rabbitmq-1 # node2和node1构成集群,node2必须能通过node1的主机名ping通
    
    [root@rabbitmq-2 ~]# rabbitmqctl start_app  # 开启rabbitmq服务
    
    
    # 接下来我们到任意一台机器上面查看集群状态:
    [root@rabbitmq-2 ~]# rabbitmqctl cluster_status
    Cluster status of node 'rabbit@rabbitmq-1' ...
    [{nodes,[{disc,['rabbit@rabbitmq-1','rabbit@rabbitmq-2']}]},
     {running_nodes,['rabbit@rabbitmq-2','rabbit@rabbitmq-1']},
     {cluster_name,<<"rabbit@rabbitmq-1">>},
     {partitions,[]}]
    ...done.
    
    RabbitMQ常用命令
    rabbitmqctl list_users 
    # 查看rabbitmq用户列表,默认用户名密码都为guest
    
    rabbitmqctl add_user admin1 123  
    # 新增用户 
    
    rabbitmqctl set_user_tags admin1 administrator 
    # 设置用户admin1为管理员级别 
    
    
    # 其他命令
    rabbitmqctl add_user <username> <password>
    rabbitmqctl delete_user <username>
    rabbitmqctl change_password <username> <newpassword>
    rabbitmqctl clear_password <username>
    rabbitmqctl authenticate_user <username> <password>
    rabbitmqctl set_user_tags <username> <tag> ...
    rabbitmqctl list_users
    
    配置rabbitmq用户管理界面
    # 开启web可视化界面
    rabbitmq-plugins enable rabbitmq_management
    
    # 需要重启rabbitmq
    service rabbitmq-server restart
    
    
    # 接下来浏览器访问IP:15672即可
    

    rabbitmq从3.3.0开始禁止使用guest/guest权限通过除localhost外的访问,否则会报错

    需要在/etc/rabbitmq/rabbitmq.config文件中需要添加{loopback_users, []}配置:

    [{rabbit, [
    
    {loopback_users, []}
    
    ]}].
    

    设置内存节点

    如果节点需要设置成内存节点,则加入集群的命令如下:

    rabbitmqctl join_cluster --ram rabbit@rabbitmq-1
    
    # –ram指的是作为内存节点,如果不加,那就默认为内存节点。
    

    如果节点在集群中已经是磁盘节点了,通过以下命令可以将节点改成内存节点:

    rabbitmqctl stop_app  						# 停止rabbitmq服务
    rabbitmqctl change_cluster_node_type ram 	# 更改节点为内存节点
    rabbitmqctl start_app 						# 开启rabbitmq服务
    

    镜像队列

    当节点发生故障时,尽管所有元数据信息都可以从磁盘节点上将元数据拷贝到本节点上,但是队列的消息内容就不行了,这样就会导致消息的丢失,那是因为在默认情况下,队列只会保存在其中一个节点上,我们在将集群队列时也说过。

    聪明的 RabbitMQ 早就意识到这个问题了,在 2.6以后的版本中增加了,队列冗余选项:镜像队列。镜像队列的主队列(master)依然是仅存在于一个节点上,其余从主队列拷贝的队列叫从队列(slave)。如果主队列没有发生故障,那么其工作流程依然跟普通队列一样,生产者和消费者不会感知其变化,当发布消息时,依然是路由到主队列中,而主队列通过类似广播的机制,将消息扩散同步至其余从队列中,这就有点像 fanout 交换器一样。而消费者依然是从主队列中读取消息。

    一旦主队列发生故障,集群就会从最老的一个从队列选举为新的主队列,这也就实现了队列的高可用了,但我们切记不要滥用这个机制,在上面也说了,队列的冗余操作会导致不能通过扩展节点增加存储空间,而且会造成性能瓶颈。

    命令格式如下

    rabbitmqctl set_policy [-p Vhost] Name Pattern Definition [Priority]
    
    # -p Vhost: 可选参数,针对指定vhost下的queue进行设置
    # Name: policy的名称
    # Pattern: queue的匹配模式(正则表达式)
    # Definition: 镜像定义,包括三个部分ha-mode, ha-params, ha-sync-mode
    #    ha-mode: 指明镜像队列的模式,有效值为 all/exactly/nodes
    #        all: 表示在集群中所有的节点上进行镜像
    #        exactly: 表示在指定个数的节点上进行镜像,节点的个数由ha-params指定
    #        nodes: 表示在指定的节点上进行镜像,节点名称通过ha-params指定
    #    ha-params: ha-mode模式需要用到的参数
    #    ha-sync-mode: 进行队列中消息的同步方式,有效值为automatic和manual
    # priority: 可选参数,policy的优先级
    
    案例

    以下示例声明名为ha-all的策略,它与名称以”ha”开头的队列相匹配,并将镜像配置到集群中的所有节点:

    rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

    上述命令会将所有的队列冗余到所有节点上,一般可以拿来测试。

    策略的名称以”two”开始的队列镜像到群集中的任意两个节点,并进行自动同步:

    rabbitmqctl set_policy ha-two "^two." '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'
    

    以”node”开头的队列镜像到集群中的特定节点的策略:

    rabbitmqctl set_policy ha-nodes "^nodes." '{"ha-mode":"nodes","ha-params":["rabbit@nodeA", "rabbit@nodeB"]}'
    

    集群负载均衡

    HAProxy 提供高可用性、负载均衡以及基于 TCP 和 HTTP 应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。

    集群负载均和架构图:

    安装haproxy

    yum -y install haproxy

    编辑HaProxy

    vim /etc/haproxy/haproxy.cfg

    #绑定配置
    listen rabbitmq_cluster 0.0.0.0:5670
        #配置TCP模式
        mode tcp
        #加权轮询
        balance roundrobin
        #RabbitMQ集群节点配置
        server rabbitmq-1 192.168.171.134:5672 check inter 2000 rise 2 fall 3
        server rabbitmq-2 192.168.171.135:5672 check inter 2000 rise 2 fall 3
    
    #haproxy监控页面地址
    listen monitor 0.0.0.0:8100
        mode http
        option httplog
        stats enable
        stats uri /stats
        stats refresh 5s
    
    启动HaProxy

    systemctl restart haproxy

    浏览器访问IP:8100/stats

    部署node_exporter

    下载haproxy_exporter
    wget https://github.com/prometheus/haproxy_exporter/releases/download/v0.11.0/haproxy_exporter-0.11.0.linux-amd64.tar.gz
    
    下载RabbitMQ_exporter
    wget https://github.com/kbudde/rabbitmq_exporter/releases/download/v1.0.0-RC7/rabbitmq_exporter-1.0.0-RC7.linux-amd64.tar.gz
      
    wget https://github.com/deadtrickster/prometheus_rabbitmq_exporter/releases/download/rabbitmq-3.6.12-pre18/prometheus_rabbitmq_exporter-v3.6.12.1.ez
    
    部署rabbitmq_exporter
    cp prometheus_rabbitmq_exporter-v3.6.12.1.ez /usr/lib/rabbitmq/lib/rabbitmq_server-3.3.5/plugins/
    
    # 启动rabbitmq_exporter
    RABBIT_USER=guest RABBIT_PASSWORD=guest OUTPUT_FORMAT=json PUBLIC_PORT=9090 RABBIT_URL=http://localhost:15672 nohup ./rabbitmq_exporter &
    tail -1000f nohup.
    
    # 参数说明
    # RABBIT_USER:rabbit用户名
    # RABBIT_PASSWORD:rabbit密码
    # RABBIT_URL:rabbit服务地址和端口
    # OUTPUT_FORMAT:输出格式
    # PUBLIC_PORT:暴露端口
    
    # 验证服务端口
    lsof -i:9419
    COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    rabbitmq_ 1682 root    3u  IPv6  23446      0t0  TCP *:9419 (LISTEN)
    

    配置prometheus加入rabbitmq_exporter
    tail -7 /usr/local/prometheus/prometheus.yml 
      - job_name: 'rabbitmq_1'
        static_configs:
          - targets: ['192.168.43.213:9419']
    
      - job_name: 'rabbitmq_2'
        static_configs:
          - targets: ['192.168.43.251:9419']
    

    配置grafana

    预警指标
    序号 预警名称 预警规则 描述
    1 集群状态预警 当集群状态不符合预期【!=1】时进行预警
    2 节点状态预警 当节点状态不符合预期【!=1】时进行预警
    3 等待消费预警 当等待消费的消息数量达到阈值【>1000】时进行预警 延迟消费
    4 消费预警 当消费中的消息数量达到阈值【>1000】时进行预警 消费速度慢
    部署Haproxy_exporter
    tar xvf haproxy_exporter-0.11.0.linux-amd64.tar.gz 
    cd haproxy_exporter-0.11.0.linux-amd64/
    ./haproxy_exporter --haproxy.scrape-uri="http://192.168.43.251:8100/stats;csv"  
    

    (https://img2020.cnblogs.com/blog/1871335/202006/1871335-20200630180351993-1052219626.png)

  • 相关阅读:
    12月2号
    11月30号
    11月25号
    本周总结
    每日日报
    每日日报
    每日日报
    JAVA日报
    JAVA日报
    JAVA日报
  • 原文地址:https://www.cnblogs.com/you-men/p/13215218.html
Copyright © 2011-2022 走看看