RabbitMQ 羣集安裝

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
複製代碼

2、安裝

一、安裝環境依賴包

# yum install gcc gcc-c++ glibc-devel make ncurses-devel openssl-devel xmlto unixODBC-devel -y
複製代碼

二、安裝 erlang

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() 後面有個 點
複製代碼

三、安裝 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 等命令時就會報錯: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

3、設置 rabbitMQ

一、開啓 rabbitMQ web 頁面訪問

# rabbitmq-plugins enable rabbitmq_management
也能夠直接將開啓的插件配置寫入配置文件
# echo "[rabbitmq_management]." > /usr/local/rabbitmq/etc/rabbitmq/enabled_plugins
複製代碼

二、啓動 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.
複製代碼

三、 rabbitMQ 端口

確保防火牆打開了如下端口: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啓用的時候打開)

4、羣集配置

集羣管理:沒有明顯的主從,主要是 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 中,所以它們必須在啓動時從對等節點同步它們。這意味着羣集必須至少包含一個磁盤節點。所以沒法手動刪除集羣中剩餘的最後一個磁盤節點

一、設置節點相互信任:Erlang Cookie

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,[]}]}]
複製代碼

四、將 node0二、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

5、羣集移除節點

當節點再也不是節點的一部分時,須要從羣集中明確地刪除節點。

將 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 應用程序

6、RabbitMQ 管理

一、主機名更改

RabbitMQ 節點使用主機名相互通訊。所以,全部節點名稱必須可以解析全部羣集對應的名稱。像 rabbitmqctl 這樣的工具也是如此。除此以外,**默認狀況下 RabbitMQ 使用系統的當前主機名來命名數據庫目錄。若是主機名更改,則會建立一個新的空數據庫。**爲了不數據丟失,創建一個固定和可解析的主機名相當重要。每當主機名更改時,應該從新啓動 RabbitMQ。若是要使用節點名稱的完整主機名(RabbitMQ 默認爲短名稱),而且可使用 DNS 解析完整的主機名,則須要修改設置環境變量 RABBITMQ_USE_LONGNAME=true

二、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纔有訪問隊列資源的權限

7、優化

運行生產工做負載的 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

8、高可用配置

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
    }
}
複製代碼
相關文章
相關標籤/搜索