1. 程式人生 > 實用技巧 >08 . Prometheus+Grafana監控haproxy+rabbitmq

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
同步Erlang cookie

RabbitMQ 叢集是通過 Erlang 的叢集實現的,當叢集中的節點進行通訊時,Erlang 節點會進行認證。如果節點之間的 Erlang cookie 不相同,則會認證失敗。因此,需要在叢集中的所有節點上同步 cookie 檔案

這裡將 rabbitmq-1 的該檔案複製到 rabbitmq-2,由於這個檔案許可權是 400 為方便傳輸,先修改許可權,非必須操作,所以需要先修改 rabbitmq-2 中的該檔案許可權為 777

[[email protected] ~]# service rabbitmq-server start
Redirecting to /bin/systemctl start rabbitmq-server.service
[[email protected] ~]# cat /var/lib/rabbitmq/.erlang.cookie
KNTAXWSNMNNODXVTCRZZ # 用scp 拷貝到rabbitmq-2
scp /var/lib/rabbitmq/.erlang.cookie rabbitmq-2:/var/lib/rabbitmq/.erlang.cookie # 我們到另一臺機器發現拷貝過來的許可權有問題,所以需要修改
[[email protected] ~]# 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執行如下命令

[[email protected] ~]# rabbitmqctl stop_app # 停止rabbitmq服務
[[email protected] ~]# rabbitmqctl reset # 清空節點狀態
[[email protected] ~]# rabbitmqctl join_cluster [email protected] # node2和node1構成叢集,node2必須能通過node1的主機名ping通 [[email protected] ~]# rabbitmqctl start_app # 開啟rabbitmq服務 # 接下來我們到任意一臺機器上面檢視叢集狀態:
[[email protected] ~]# rabbitmqctl cluster_status
Cluster status of node '[email protected]' ...
[{nodes,[{disc,['[email protected]','[email protected]']}]},
{running_nodes,['[email protected]','[email protected]']},
{cluster_name,<<"[email protected]">>},
{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 [email protected]

# –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":["[email protected]", "[email protected]"]}'

叢集負載均衡

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)