RabbitMQ 群集安裝

蠻牛牛發表於2018-07-05

一、環境描述

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 外掛。

    要讓其他機器可以訪問,需要建立一個新使用者,併為其分配許可權。

    1. 使用者管理

      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 與角色的關聯。

    2. 許可權管理

      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

八、高可用配置

img

利用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
    }
}
複製程式碼

相關文章