一、環境描述
1、作業系統
主機名 | IP地址 | 作業系統版本 | erlang 版本 | rabbitmq 版本 |
---|---|---|---|---|
192.168.2.23 | node01 | CentOS Linux release 7.4.1708 (Core) | 20.3 | 3.7.5 |
192.168.2.24 | node02 | CentOS Linux release 7.4.1708 (Core) | 20.3 | 3.7.5 |
192.168.2.25 | node03 | CentOS Linux release 7.4.1708 (Core) | 20.3 | 3.7.5 |
2 、/etc/hosts 檔案配置
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.2.23 node01
192.168.2.24 node02
192.168.2.25 node03
複製程式碼
二、安裝
1、安裝環境依賴包
# yum install gcc gcc-c++ glibc-devel make ncurses-devel openssl-devel xmlto unixODBC-devel -y
複製程式碼
2、安裝 erlang
rabbitMQ 是用 erlang 語言寫的,所以需要先安裝 erlang。
a. 解壓原始碼包
# tar xvf otp_src_20.3.tar.gz
b. 進入原始碼目錄
# cd otp_src_20.3
c. 配置安裝選項
# ./configure --prefix=/usr/local/erlang --without-javac
... ... 省略 ... ...
*********************************************************************
********************** APPLICATIONS DISABLED ********************** # 只需要注意此處提示
*********************************************************************
jinterface : Java compiler disabled by user # 因為沒有安裝 jdk 所以報這個錯,可以忽略
*********************************************************************
*********************************************************************
********************** APPLICATIONS INFORMATION *******************
*********************************************************************
wx : wxWidgets not found, wx will NOT be usable
*********************************************************************
*********************************************************************
********************** DOCUMENTATION INFORMATION ******************
*********************************************************************
documentation :
fop is missing.
Using fakefop to generate placeholder PDF files.
*********************************************************************
d. 編譯及安裝
# make && make install
e. 設定 erlang 環境變數
# vim /etc/profile.d/erlang.sh
內容如下:
# set erlang environment
export PATH=$PATH:/usr/local/erlang/bin
# . /etc/profile.d/erlang.sh
f. 測試 erlang
# erl
Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V9.3 (abort with ^G) # 出現這個命令提示符說明 erlang 安裝成功
1>erlang:halt(). # 退出 erlang,注意 halt() 後面有個 點
複製程式碼
3、安裝 rabbitmq
a. 解壓二進位制包,解壓即可用
# tar xvf rabbitmq-server-generic-unix-3.7.5.tar.xz -C /usr/local/
b. 建立一個軟體連結方便管理
# ln -sv rabbitmq_server-3.7.5 rabbitmq
‘rabbitmq’ -> ‘rabbitmq_server-3.7.5’
c. 設定 rabbitmq 環境變數
# vim /etc/profile.d/rabbitmq.sh
內容如下:
# set rabbitmq environment
export PATH=$PATH:/usr/local/rabbitmq/sbin
# . /etc/profile.d/rabbitmq.sh
複製程式碼
注意:為 rabbitmq_server-3.7.5 目錄建立軟體連結時,rabbitmq_server-3.7.5 後面一定不要加上
/
,一般習慣用 TAB 鍵來補全命令的,都會自動把/
給補上去。這樣後面使用 rabbitmqctl 等命令時就會報錯:[root@node05 ~]# rabbitmqctl status escript: exception error: undefined function rabbitmqctl_escript:main/1 in function escript:run/2 (escript.erl, line 759) in call from escript:start/1 (escript.erl, line 277) in call from init:start_em/1 in call from init:do_boot/3
三、設定 rabbitMQ
1、開啟 rabbitMQ web 頁面訪問
# rabbitmq-plugins enable rabbitmq_management
也可以直接將開啟的外掛配置寫入配置檔案
# echo "[rabbitmq_management]." > /usr/local/rabbitmq/etc/rabbitmq/enabled_plugins
複製程式碼
2、啟動 rabbitmq-server
# rabbitmq-server start # 前臺啟動
## ##
## ## RabbitMQ 3.7.5. Copyright (C) 2007-2018 Pivotal Software, Inc.
########## Licensed under the MPL. See http://www.rabbitmq.com/
###### ##
########## Logs: /usr/local/rabbitmq/var/log/rabbitmq/rabbit@node03.log
/usr/local/rabbitmq/var/log/rabbitmq/rabbit@node03_upgrade.log
Starting broker...
completed with 3 plugins. # 說明 web 管理外掛已經啟動
# rabbitmq-server -detached # 後臺啟動,不佔用終端,推薦
Warning: PID file not written; -detached was passed.
複製程式碼
3、 rabbitMQ 埠
確保防火牆開啟了以下埠:
埠 | 用途 |
---|---|
4369 | empd(Erlang Port Mapper Daemon),是 Erlang 的埠/結點名稱對映程式,用來跟蹤節點名稱監聽地址,在叢集中起到一個類似 DNS 的作用。 |
5672、5671 | 由 AMQP 0-9-1 和 1.0 客戶端使用 |
15672 | HTTP_API 埠,管理員使用者才能訪問,用於管理 RbbitMQ,需要啟用 management 外掛,rabbitmq-plugins enable rabbitmq_management ,訪問http://server-name:15672/ |
25672 | Erlang distribution,和4369配合 |
61613、61614 | 當STOMP外掛啟用的時候開啟,作為STOMP客戶端埠(根據是否使用TLS選擇) |
1883、8883 | 當MQTT外掛啟用的時候開啟,作為MQTT客戶端埠(根據是否使用TLS選擇) |
15674 | 基於WebSocket的STOMP客戶端埠(當外掛Web STOMP啟用的時候開啟) |
15675 | 基於WebSocket的MQTT客戶端埠(當外掛Web MQTT啟用的時候開啟) |
四、群集配置
叢集管理:沒有明顯的主從,主要是 disk 和 ram 節點的區別
叢集要求:不支援跨網段(erlang 限制)
叢集型別:精通叢集、映象叢集
- 普通叢集:結構同步,訊息實體只存在一個節點中,但 consumer 在非訊息節點獲取時,節點間存在訊息拉取,易產生效能瓶頸。
- 映象叢集:叢集中一個 master,負責除錯,處理訊息實體,其他節點儲存一份資料到本地;效能主要靠 master 承載。
持久化,分兩部分:
- Rabbitmq 伺服器配置持久化:預設的就是持久化(disc型別);
- 程式碼持久化:預設情況下,程式碼建立的訊息佇列和存放在佇列裡的訊息都是非持久化的,需要在建產佇列時指定
在配置群集前,必須保證各節點之間的主機名能夠相互解析
RabbitMQ 節點使用域名相互定址,因此所有群整合員的主機名必須能夠從所有群集節點解析,可以修改 /etc/hosts
檔案或者使用 DNS 解析
如果要使用節點名稱的完整主機名(RabbitMQ 預設為短名稱),並且可以使用DNS解析完整的主機名,則可能需要調查設定環境變數 RABBITMQ_USE_LONGNAME = true
一個群集的組成可以動態改變,所有的 RabbitMQ 開始作為單個節點執行,這些節點可以加入到群集,然後也可以再次脫離群集轉加單節點。
RabbitMQ 群集可以容忍單個節點的故障。節點可以隨意啟動和停止,只要它們在關閉時能和群整合員節點聯絡。
節點可以是 Disk 節點或 RAM 節點
RAM 節點將內部資料庫表儲存在 RAM 中。這不包括訊息,訊息儲存索引,佇列索引和其他節點狀態,在 90% 以上的情況下,您希望所有節點都是磁碟節點;
RAM 節點是一種特殊情況,可用於改善高排隊,交換或繫結流失的效能叢集。RAM 節點不提供有意義的更高的訊息速率。
由於 RAM 節點僅將內部資料庫表儲存在 RAM 中,因此它們必須在啟動時從對等節點同步它們。這意味著群集必須至少包含一個磁碟節點。因此無法手動刪除叢集中剩餘的最後一個磁碟節點
1、設定節點相互信任:Erlang Cookie
RabbitMQ 節點和 CLI 工具(例如 rabbitmqctl )使用 cookie 來確定它們是否被允許相互通訊,要使兩個節點能夠通訊,它們必須具有相同的共享金鑰,稱為 Erlang Cookie。 Cookie 只是一個字串,最多可以有 255 個字元。它通常儲存在本地檔案中。該檔案必須只能由所有者訪問(400 許可權)。每個叢集節點必須具有相同的 cookie,檔案位置(rpm 安裝) /var/lib/rabbitmq/.erlang.cookie,如果是原始碼安裝的 .erlang.cookie 檔案在啟動使用者的家目錄中。把 rabbit2、rabbit3 設定成和 rabbit1 一樣的即可,許可權是 400 ,或者直接複製一份過去即可。
這裡採用複製的方式
採用原始碼安裝的 rabbitmq .erlang.cookie 檔案在 /root 目錄下
# scp /var/lib/rabbitmq/.erlang.cookie node02:/root/
root@node02's password:
.erlang.cookie 100% 20 2.3KB/s 00:00
# scp /var/lib/rabbitmq/.erlang.cookie node03:/root/
root@node03's password:
.erlang.cookie 100% 20 7.5KB/s 00:00
複製程式碼
2、正常方式啟動所有節點
# rabbitmq-server -detached # 在所有節點上啟動 rabbitmq-server
複製程式碼
3、檢視群集狀態
# nod01 上
# rabbitmqctl cluster_status
Cluster status of node rabbit@node01 ...
[{nodes,[{disc,[rabbit@node01]}]},
{running_nodes,[rabbit@node01]},
{cluster_name,<<"rabbit@node01">>},
{partitions,[]},
{alarms,[{rabbit@node01,[]}]}]
# node02 上
# ./rabbitmqctl cluster_status
Cluster status of node rabbit@node02 ...
[{nodes,[{disc,[rabbit@node02]}]},
{running_nodes,[rabbit@node02]},
{cluster_name,<<"rabbit@node02">>},
{partitions,[]},
{alarms,[{rabbit@node02,[]}]}]
# node03 上
# ./rabbitmqctl cluster_status
Cluster status of node rabbit@node03 ...
[{nodes,[{disc,[rabbit@node03]}]},
{running_nodes,[rabbit@node03]},
{cluster_name,<<"rabbit@node03">>},
{partitions,[]},
{alarms,[{rabbit@node03,[]}]}]
複製程式碼
4、將 node02、node03 加入 rabbit@node01 群集
a. 停止 node02 的 rabbitmq 應用程式
# 在其餘 2 個節點上操作
# ./rabbitmqctl stop_app
Stopping rabbit application on node rabbit@node02 ...
複製程式碼
b. 加入 rabbit@node01 群集1
# 在其餘 2 個節點上操作
# ./rabbitmqctl join_cluster rabbit@node01 # 如果這一步報錯的話,請在所有節點開啟相應的埠,開啟 4369 埠
Clustering node rabbit@node02 with rabbit@node01
複製程式碼
c. 啟動 rabbitMQ 程式
# 在其餘 2 個節點上操作
# ./rabbitmqctl start_app
Starting node rabbit@node02 ...
completed with 3 plugins.
複製程式碼
b. 檢視群集狀態
在群集任何一個節點上都可以檢視到群集的狀態
# rabbitmqctl cluster_status
Cluster status of node rabbit@node01 ...
[{nodes,[{disc,[rabbit@node01,rabbit@node02,rabbit@node03]}]},
{running_nodes,[rabbit@node03,rabbit@node02,rabbit@node01]},
{cluster_name,<<"rabbit@node01">>},
{partitions,[]},
{alarms,[{rabbit@node03,[]},{rabbit@node02,[]},{rabbit@node01,[]}]}]
複製程式碼
通過上面的步驟,我們可以在群集執行的同時隨時向群集新增新節點
已加入群集的節點可以隨時停止,也可以崩潰。在這兩種情況下,群集的其餘部分都會繼續執行,並且節點在再次啟動時,會自動 ”跟上“(同步)其它群集節點。
注意:
當整個叢集關閉時,最後一個關閉的節點必須是第一個啟動的節點,如果不是這樣,節點會等待 30s 等待最後的磁碟節點恢復狀態,然後失敗。如果最後下線的節點不能上線,可以使用 forget_cluster_node 命令將其從群集中刪除。如果所有的節點不受控制的同時當機,比如掉電,會進入所有的節點都會認為其他節點比自己當機的要晚,即自己先當機,這種情況下可以使用 force_boot 指令來啟動一個節點。
d. 設定群集模式為"映象佇列"模式
# rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
複製程式碼
ha-sync-mode
: 如果此節點不進行設定,在其中一臺伺服器當機再啟動後 會報 Unsynchronised Mirrors XXXX 錯誤。這時候在佇列詳細資訊頁面需要手動點選同步佇列,或者用命令列執行命令rabbitmqctl sync_queue name
五、群集移除節點
當節點不再是節點的一部分時,需要從群集中明確地刪除節點。
將 rabbit@node02 從群集中刪除,回到獨立模式:
在 rabbit@node02 上操作:
1、停止 RabbitMQ 應用程式。
# ./rabbitmqctl stop_app
Stopping rabbit application on node rabbit@node02 ...
2、重置節點。
# ./rabbitmqctl reset
Resetting node rabbit@node02 ...
3、重新啟動 RabbitMQ 應用程式。
# ./rabbitmqctl start_app
Starting node rabbit@node02 ...
completed with 3 plugins.
4、在節點上執行 cluster_status 命令,確認 rabbit@node02 現在已經不再是群集的一部分,並獨立執行
# ./rabbitmqctl cluster_status
Cluster status of node rabbit@node02 ...
[{nodes,[{disc,[rabbit@node02]}]},
{running_nodes,[rabbit@node02]},
{cluster_name,<<"rabbit@node02">>},
{partitions,[]},
{alarms,[{rabbit@node02,[]}]}]
複製程式碼
也可以遠端刪除節點,例如,在處理無響應的節點時,這很有用。
例如,在節點 rabbit@node01 上把 rabbit@node03 從群集中移除
1、先在 rabbit@node03 上將 RabbitMQ 應用停掉
# ./rabbitmqctl stop_app
Stopping rabbit application on node rabbit@node03 ...
2、在 rabbit@node01 上遠端將 rabbit@node03 刪除
# rabbitmqctl forget_cluster_node rabbit@node03
Removing node rabbit@node03 from the cluster
3、請注意,這時,rabbit@node03 仍然認為它還在 rabbit@node01 的群集裡面,並試圖啟動它,這將會導致錯誤。我們需要將 rabbit@node03 重新設定才能重新啟動它。(在 rabbit@node03 上操作)
# ./rabbitmqctl reset
Resetting node rabbit@node03 ...
4、重新啟動 rabbit@node03
# ./rabbitmqctl start_app
Starting node rabbit@node03 ...
completed with 3 plugins.
複製程式碼
現在,三個節點都是作為獨立的節點在執行。
注意:此時,rabbit@node01 保留了簇的剩餘狀態,而 rabbit@node02 和 rabbit@node03 是剛剛初始化的 RabbitMQ。如果想重新初始化 rabbit@node01 的話,需要按照與其它節點相同的步驟進行即可:
1、停止 RabbitMQ 應用程式
2、 重置 RabbitMQ
3、啟動 RabbitMQ 應用程式
六、RabbitMQ 管理
1、主機名更改
RabbitMQ 節點使用主機名相互通訊。因此,所有節點名稱必須能夠解析所有群集對應的名稱。像 rabbitmqctl 這樣的工具也是如此。除此之外,**預設情況下 RabbitMQ 使用系統的當前主機名來命名資料庫目錄。如果主機名更改,則會建立一個新的空資料庫。**為了避免資料丟失,建立一個固定和可解析的主機名至關重要。每當主機名更改時,應該重新啟動 RabbitMQ。如果要使用節點名稱的完整主機名(RabbitMQ 預設為短名稱),並且可以使用 DNS 解析完整的主機名,則需要修改設定環境變數 RABBITMQ_USE_LONGNAME=true
2、RAM 節點的群集
RAM 節點只將其後設資料儲存在記憶體中。 只有 RAM 節點的叢集是脆弱的, 如果群集停止,將無法再次啟動, 並將丟失所有資料。
建立 RAM 節點
我們可以在首次加入叢集時將節點宣告為 RAM 節點。像之前一樣,我們使用 rabbitmqctl join_cluster 來完成此 操作,但傳遞 --ram 標誌
[root@node03 escript]# ./rabbitmqctl stop_app
Stopping rabbit application on node rabbit@node03 ...
[root@node03 escript]# ./rabbitmqctl join_cluster --ram rabbit@node01
Clustering node rabbit@node03 with rabbit@node01
[root@node03 escript]# ./rabbitmqctl start_app
Starting node rabbit@node03 ...
completed with 3 plugins.
[root@node03 escript]# ./rabbitmqctl cluster_status
Cluster status of node rabbit@node03 ...
[{nodes,[{disc,[rabbit@node01]},{ram,[rabbit@node03]}]},
{running_nodes,[rabbit@node01,rabbit@node03]},
{cluster_name,<<"rabbit@node01">>},
{partitions,[]},
{alarms,[{rabbit@node01,[]},{rabbit@node03,[]}]}]
複製程式碼
更改節點型別
可以將節點的型別 RAM 更改為 disc,反之亦然。
使用 change_cluster_node_type
命令。
[root@node03 escript]# ./rabbitmqctl stop_app
Stopping rabbit application on node rabbit@node03 ...
[root@node03 escript]# ./rabbitmqctl change_cluster_node_type disc
Turning rabbit@node03 into a disc node
[root@node03 escript]# ./rabbitmqctl start_app
Starting node rabbit@node03 ...
completed with 3 plugins.
[root@node03 escript]# ./rabbitmqctl cluster_status
Cluster status of node rabbit@node03 ...
[{nodes,[{disc,[rabbit@node01,rabbit@node03]}]},
{running_nodes,[rabbit@node01,rabbit@node03]},
{cluster_name,<<"rabbit@node01">>},
{partitions,[]},
{alarms,[{rabbit@node01,[]},{rabbit@node03,[]}]}]
複製程式碼
常用管理命令
-
使用者許可權管理
RabbitMQ 有一個預設的使用者'guest',密碼也是"guest",這個使用者預設只能通過本機訪問,如:
http://localhost:15672
,在通過 http 訪問之前記得啟用 management 外掛。要讓其他機器可以訪問,需要建立一個新使用者,併為其分配許可權。
-
使用者管理
rabbitmqctl list_users # 列出所有使用者
rabbitmqctl add_user {username} {password} # 新增使用者
rabbitmqctl delete_user {username} # 刪除使用者
rabbitmqctl change_password {username} {newpassword} # 修改密碼
rabbitmqctl authenticate_user {username} {password} # 使用者認證
rabbitmqctl clear_password {username} # 刪除密碼,密碼刪除後就不能訪問了。
rabbitmqctl set_user_tags {username} {tag ...} # 為使用者設定角色,tag 可以是 0 個,一個,或多個。如:
rabbitmqctl set_user_tags chris administrator
,設定為管理員;rabbitmqctl set_user_tags chris
,清除 chris 與角色的關聯。 -
許可權管理
RabbitMQ 客戶端連線到一個服務端的時候,在它的操作指令中指定了一個虛擬主機。服務端首先檢查是否有訪問該虛擬主機的許可權,沒有許可權的會拒絕連線。
對於 exchanges 和 queues 等資源,位於某個虛擬主機內;不同虛擬主機內即便名稱相同也代表不同的資源。當特定操作在資源上執行時第二級訪問控制開始生效。
RabbitMQ 在某個資源上區分了配置、寫和讀操作。配置操作建立或者銷燬資源,或者更改資源的行為。寫操作將訊息注入進資源之中。讀操作從資源中獲取訊息。
要執行特定操作使用者必須授予合適的許可權。
rabbitmqctl list_vhosts [vhost info item ...] # 獲取 vhosts 列表
rabbitmqctl add_vhost {vhost} # 新增 vhosts
rabbitmqctl delete_vhost {hosts} # 刪除 vhosts
rabbitmqctl set_permissions [-p vhost] {user} {conf} {write} {read} # 給使用者分配對應的 vhost 上分配相應的許可權。如:
rabbitmqctl set_permissions -p /myvhost chris "^chris-.*" ".*" ".*"
rabbitmqctl clear_permissions [-p vhost] {username} # 清除許可權
rabbitmqctl list_permissions [-p vhost] # 清除許可權列表
rabbitmqctl list_user_permissions {username} # user 許可權列表
rabbitmqctl set_permissions -p / chris ".*" ".*" ".*"
此時使用者chris才有訪問佇列資源的許可權
-
七、優化
執行生產工作負載的 RabbitMQ 安裝可能需要系統限制和核心引數調整,以便處理體面的併發連線和佇列。需要調整的主要設定是開啟檔案的最大數量,也稱為 ulimit -n 。建議在生產環境中為使用者 rabbitmq 至少允許 65536個檔案描述符。4096 對於大多數開發工作量來說應該是足夠的。
有兩個限制作業系統核心允許的最大開啟檔案數(fs.file-max)和每使用者限制(ulimit -n)。前者必須高於後者
fs.file-max 設定,在 /etc/sysctl.conf 檔案中新增:
fs.file-max = 65535
# sysctl -p
複製程式碼
使用者限制(ulimit -n)
# vim /etc/security/limits.conf
在最後一行新增如下內容
root soft nofile 65535
root hard nofile 65535
* soft nofile 65535
* hard nofile 65535
重啟系統後才能生效,如果想立即生效,可以先使用如下命令:
# ulimit -SHn 65535
複製程式碼
ulimit 命令詳解
ulimit用於shell啟動程式所佔用的資源,是shell內建命令。
引數介紹: -H 設定硬體資源限制. -S 設定軟體資源限制. -a 顯示當前所有的資源限制. -c size:設定core檔案的最大值.單位:blocks -d size:設定資料段的最大值.單位:kbytes -f size:設定建立檔案的最大值.單位:blocks -l size:設定在記憶體中鎖定程式的最大值.單位:kbytes -m size:設定可以使用的常駐記憶體的最大值.單位:kbytes -n size:設定核心可以同時開啟的檔案描述符的最大值.單位:n -p size:設定管道緩衝區的最大值.單位:kbytes -s size:設定堆疊的最大值.單位:kbytes -t size:設定CPU使用時間的最大上限.單位:seconds -v size:設定虛擬記憶體的最大值.單位:kbytesLinux
修改 rabbitmq 配置
如果是 RPM 包安裝的 RabbitMQ,修改 /usr/lib/systemd/system/rabbitmq-server.service
在 [Service] 中,增加 LimitNOFILE=30000(具體數值根據需要而定)
執行 systemctl daemon-reload
重啟 rabbitmq 服務
rabbitmqctl status 可以檢視修改後的 limit 限制,如:
{file_descriptors,
[{total_limit,924},{total_used,2},{sockets_limit,829},{sockets_used,0}]},
複製程式碼
日誌
預設的情況下,日誌位於/var/log/rabbitmq
目錄中(RPM 包安裝的),原始碼安裝的在 /usr/local/rabbitmq/var/log/rabbitmq
目錄中,伺服器的輸出被髮送到 RABBITMQ_NODENAME.log
檔案。其它日誌資料定入 RABBITMQ_NODENAME-sasl.log
八、高可用配置
利用haproxy做負載均衡 在192.168.1.1和192.168.1.2節點上 安裝haproxy # yum install haproxy
vi /etc/haproxy/haproxy.cfg 之後新增:
#---------------------------------------------------------------------
# Example configuration for a possible web application. See the
# full configuration options online.
#
# http://haproxy.1wt.eu/download/1.4/doc/configuration.txt
#
#---------------------------------------------------------------------
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
# to have these messages end up in /var/log/haproxy.log you will
# need to:
#
# 1) configure syslog to accept network log events. This is done
# by adding the '-r' option to the SYSLOGD_OPTIONS in
# /etc/sysconfig/syslog
#
# 2) configure local2 events to go to the /var/log/haproxy.log
# file. A line like the following can be added to
# /etc/sysconfig/syslog
#
# local2.* /var/log/haproxy.log
#
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
#frontend main *:5000
# acl url_static path_beg -i /static /images /javascript /stylesheets
# acl url_static path_end -i .jpg .gif .png .css .js
# use_backend static if url_static
# default_backend app
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
#backend static
# balance roundrobin
# server static 127.0.0.1:4331 check
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
# backend app
# balance roundrobin
# server app1 127.0.0.1:5001 check
# server app2 127.0.0.1:5002 check
# server app3 127.0.0.1:5003 check
# server app4 127.0.0.1:5004 check
listen admin_stats
bind 0.0.0.0:8100
stats enable
mode http
log global
stats uri /stats
stats realm Haproxy\ Statistics
stats auth admin:admin
stats admin if TRUE
stats refresh 30s
listen rabbitmq_cluster
bind 0.0.0.0:56720
mode tcp
option tcplog
balance roundrobin
server node05 192.168.2.75:5672 check inter 2000 rise 2 fall 3
server node06 192.168.2.76:5672 check inter 2000 rise 2 fall 3
listen rabbitmq_cluster_web
bind 0.0.0.0:15673
mode tcp
option tcplog
balance roundrobin
server node05 192.168.2.75:15672 check inter 2000 rise 2 fall 3
server node06 192.168.2.76:15672 check inter 2000 rise 2 fall 3
複製程式碼
keepalived 配置:
! Configuration File for keepalived
global_defs {
router_id node05
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_haproxy {
script "/opt/scripts/chk_haproxy.sh"
interval 1
weight -10
}
vrrp_instance HA {
state MASTER # Keepalived 的角色。Master 表示主伺服器,從伺服器設定為 BACKUP
interface ens33 # 指定監測網路卡
virtual_router_id 75 # 虛擬路由 ID,主備相同
nopreempt
priority 100 # 優先順序,BACKUP 機器上的優先順序要小於這個值
advert_int 1 # 設定主備之間的檢查時間,單位為s
authentication { # 定義驗證型別和密碼
auth_type PASS # 主備節點必須一致
auth_pass 1111 # 主備節點必須一致
}
virtual_ipaddress {
192.168.2.100/32 dev ens33 lebel ens33:0
}
track_script {
chk_haproxy
}
}
複製程式碼