主機名 | 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 |
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
複製代碼
# yum install gcc gcc-c++ glibc-devel make ncurses-devel openssl-devel xmlto unixODBC-devel -y
複製代碼
rabbitMQ 是用 erlang 語言寫的,因此須要先安裝 erlang。javascript
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() 後面有個 點
複製代碼
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 等命令時就會報錯:css[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/3java
# rabbitmq-plugins enable rabbitmq_management
也能夠直接將開啓的插件配置寫入配置文件
# echo "[rabbitmq_management]." > /usr/local/rabbitmq/etc/rabbitmq/enabled_plugins
複製代碼
# 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.
複製代碼
確保防火牆打開了如下端口:node
端口 | 用途 |
---|---|
4369 | empd(Erlang Port Mapper Daemon),是 Erlang 的端口/結點名稱映射程序,用來跟蹤節點名稱監聽地址,在集羣中起到一個相似 DNS 的做用。 |
567二、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配合 |
6161三、61614 | 當STOMP插件啓用的時候打開,做爲STOMP客戶端端口(根據是否使用TLS選擇) |
188三、8883 | 當MQTT插件啓用的時候打開,做爲MQTT客戶端端口(根據是否使用TLS選擇) |
15674 | 基於WebSocket的STOMP客戶端端口(當插件Web STOMP啓用的時候打開) |
15675 | 基於WebSocket的MQTT客戶端端口(當插件Web MQTT啓用的時候打開) |
集羣管理:沒有明顯的主從,主要是 disk 和 ram 節點的區別c++
集羣要求:不支持跨網段(erlang 限制)web
集羣類型:精通集羣、鏡像集羣redis
- 普通集羣:結構同步,消息實體只存在一個節點中,但 consumer 在非消息節點獲取時,節點間存在消息拉取,易產生性能瓶頸。
- 鏡像集羣:集羣中一個 master,負責調試,處理消息實體,其餘節點保存一份數據到本地;性能主要靠 master 承載。
持久化,分兩部分:shell
- Rabbitmq 服務器配置持久化:默認的就是持久化(disc類型);
- 代碼持久化:默認狀況下,代碼建立的消息隊列和存放在隊列裏的消息都是非持久化的,須要在建產隊列時指定
在配置羣集前,必須保證各節點之間的主機名可以相互解析數據庫
RabbitMQ 節點使用域名相互尋址,所以全部羣集成員的主機名必須可以從全部羣集節點解析,能夠修改 /etc/hosts
文件或者使用 DNS 解析vim
若是要使用節點名稱的完整主機名(RabbitMQ 默認爲短名稱),而且可使用DNS解析完整的主機名,則可能須要調查設置環境變量 RABBITMQ_USE_LONGNAME = true
一個羣集的組成能夠動態改變,全部的 RabbitMQ 開始做爲單個節點運行,這些節點能夠加入到羣集,而後也能夠再次脫離羣集轉加單節點。
RabbitMQ 羣集能夠容忍單個節點的故障。節點能夠隨意啓動和中止,只要它們在關閉時能和羣集成員節點聯繫。
節點能夠是 Disk 節點或 RAM 節點
RAM 節點將內部數據庫表存儲在 RAM 中。這不包括消息,消息存儲索引,隊列索引和其餘節點狀態,在 90% 以上的狀況下,您但願全部節點都是磁盤節點;
RAM 節點是一種特殊狀況,可用於改善高排隊,交換或綁定流失的性能集羣。RAM 節點不提供有意義的更高的消息速率。
因爲 RAM 節點僅將內部數據庫表存儲在 RAM 中,所以它們必須在啓動時從對等節點同步它們。這意味着羣集必須至少包含一個磁盤節點。所以沒法手動刪除集羣中剩餘的最後一個磁盤節點
RabbitMQ 節點和 CLI 工具(例如 rabbitmqctl )使用 cookie 來肯定它們是否被容許相互通訊,要使兩個節點可以通訊,它們必須具備相同的共享密鑰,稱爲 Erlang Cookie。 Cookie 只是一個字符串,最多能夠有 255 個字符。它一般存儲在本地文件中。該文件必須只能由全部者訪問(400 權限)。每一個集羣節點必須具備相同的 cookie,文件位置(rpm 安裝) /var/lib/rabbitmq/.erlang.cookie,若是是源碼安裝的 .erlang.cookie 文件在啓動用戶的家目錄中。把 rabbit二、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
複製代碼
# rabbitmq-server -detached # 在全部節點上啓動 rabbitmq-server
複製代碼
# 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,[]}]}]
複製代碼
# 在其他 2 個節點上操做
# ./rabbitmqctl stop_app
Stopping rabbit application on node rabbit@node02 ...
複製代碼
# 在其他 2 個節點上操做
# ./rabbitmqctl join_cluster rabbit@node01 # 若是這一步報錯的話,請在全部節點打開相應的端口,打開 4369 端口
Clustering node rabbit@node02 with rabbit@node01
複製代碼
# 在其他 2 個節點上操做
# ./rabbitmqctl start_app
Starting node rabbit@node02 ...
completed with 3 plugins.
複製代碼
在羣集任何一個節點上均可以查看到羣集的狀態
# 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 指令來啓動一個節點。
# 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 上操做:
一、中止 RabbitMQ 應用程序。
# ./rabbitmqctl stop_app
Stopping rabbit application on node rabbit@node02 ...
二、重置節點。
# ./rabbitmqctl reset
Resetting node rabbit@node02 ...
三、從新啓動 RabbitMQ 應用程序。
# ./rabbitmqctl start_app
Starting node rabbit@node02 ...
completed with 3 plugins.
四、在節點上運行 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 從羣集中移除
一、先在 rabbit@node03 上將 RabbitMQ 應用停掉
# ./rabbitmqctl stop_app
Stopping rabbit application on node rabbit@node03 ...
二、在 rabbit@node01 上遠程將 rabbit@node03 刪除
# rabbitmqctl forget_cluster_node rabbit@node03
Removing node rabbit@node03 from the cluster
三、請注意,這時,rabbit@node03 仍然認爲它還在 rabbit@node01 的羣集裏面,並試圖啓動它,這將會致使錯誤。咱們須要將 rabbit@node03 從新設置才能從新啓動它。(在 rabbit@node03 上操做)
# ./rabbitmqctl reset
Resetting node rabbit@node03 ...
四、從新啓動 rabbit@node03
# ./rabbitmqctl start_app
Starting node rabbit@node03 ...
completed with 3 plugins.
複製代碼
如今,三個節點都是做爲獨立的節點在運行。
注意:此時,rabbit@node01 保留了簇的剩餘狀態,而 rabbit@node02 和 rabbit@node03 是剛剛初始化的 RabbitMQ。若是想從新初始化 rabbit@node01 的話,須要按照與其它節點相同的步驟進行便可:
一、中止 RabbitMQ 應用程序
二、 重置 RabbitMQ
三、啓動 RabbitMQ 應用程序
RabbitMQ 節點使用主機名相互通訊。所以,全部節點名稱必須可以解析全部羣集對應的名稱。像 rabbitmqctl 這樣的工具也是如此。除此以外,**默認狀況下 RabbitMQ 使用系統的當前主機名來命名數據庫目錄。若是主機名更改,則會建立一個新的空數據庫。**爲了不數據丟失,創建一個固定和可解析的主機名相當重要。每當主機名更改時,應該從新啓動 RabbitMQ。若是要使用節點名稱的完整主機名(RabbitMQ 默認爲短名稱),而且可使用 DNS 解析完整的主機名,則須要修改設置環境變量 RABBITMQ_USE_LONGNAME=true
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
}
}
複製代碼