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
[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)