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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM