1. 部署規(guī)劃
當(dāng)前規(guī)劃中,只啟動一個HAProxy服務(wù),主要用來做RabbitMQ節(jié)點(diǎn)的負(fù)載均衡和代理,但是HAProxy可能會出現(xiàn)單點(diǎn)故障,后續(xù)需要啟動多個HAProxy節(jié)點(diǎn),然后結(jié)合Keepalived來進(jìn)行 設(shè)置虛擬IP 做故障轉(zhuǎn)移
節(jié)點(diǎn)名稱 | 節(jié)點(diǎn)主機(jī)名 | IP地址 | 角色 | 運(yùn)行服務(wù) |
---|---|---|---|---|
cluster01 | cluster01 | 192.168.12.48 | Docker Swarm Manager & Node | HAProxy & RabbitMQ-Node01 |
cluster01 | cluster02 | 192.168.12.49 | Docker Swarm Manager & Node | RabbitMQ-Node02 |
cluster01 | cluster03 | 192.168.12.50 | Docker Swarm Manager & Node | RabbitMQ-Node02 |
下面部署文檔中,需要執(zhí)行的指令所在節(jié)點(diǎn),將會說明在以上規(guī)劃的某個節(jié)點(diǎn)執(zhí)行,均已節(jié)點(diǎn)名稱代替。
2. 安裝Docker和Docker Swarm
安裝Docker和Docker Swarm。Docker是用于構(gòu)建、發(fā)布和運(yùn)行容器化應(yīng)用程序的開源工具,而Docker Swarm是Docker的一種編排和集群管理方式,用于實(shí)現(xiàn)容器化應(yīng)用程序的高可用性和負(fù)載均衡。
需要多節(jié)點(diǎn),那么在多個節(jié)點(diǎn)上安裝Docker和Docker Swarm
可以通過以下命令來安裝Docker和Docker Swarm
- 在
cluster01、cluster02、cluster03
節(jié)點(diǎn)執(zhí)行
# 安裝Docker
$ curl -sSL https://get.docker.com/ | sh
# 啟動Docker
$ systemctl start docker
# 安裝Docker Swarm
$ docker pull swarm:latest
3. 創(chuàng)建Docker Swarm集群
創(chuàng)建Docker Swarm集群。Docker Swarm集群由一組Docker主機(jī)組成,其中有一臺主機(jī)作為管理節(jié)點(diǎn)
,其它主機(jī)作為工作節(jié)點(diǎn)
。
3.1. 創(chuàng)建Docker Swarm集群
如果配置多節(jié)點(diǎn),需要在多個節(jié)點(diǎn)創(chuàng)建Docker Swarm集群
在
cluster01
節(jié)點(diǎn)執(zhí)行
# 創(chuàng)建Docker Swarm管理節(jié)點(diǎn)
$ docker swarm init \
--advertise-addr=192.168.12.48
- 執(zhí)行輸出如下:
注意:三個節(jié)點(diǎn)我們都規(guī)劃成了manager管理節(jié)點(diǎn)并且充當(dāng)node節(jié)點(diǎn),也會為了訪問單點(diǎn)故障,所以下面執(zhí)行的指令,我們將不通過已經(jīng)指令執(zhí)行,我們通過獲取manager的加入指令來操作
在
cluster01
節(jié)點(diǎn)執(zhí)行
$ docker swarm join-token manager
# 將指令的輸出結(jié)果復(fù)制,將作為后續(xù)其他cluster02、cluster03的加入操作指令
3.2. 將工作節(jié)點(diǎn)加入Docker Swarm集群
復(fù)制上面通過docker swarm join-token manager
管理節(jié)點(diǎn)的初始化輸出指令
在
cluster02、cluster03
節(jié)點(diǎn)執(zhí)行
# 創(chuàng)建Docker Swarm其他管理節(jié)點(diǎn)
$ docker swarm join \
--token=TOKEN MANAGER_IP:2377
3.3. 查看集群運(yùn)行狀態(tài)
# 查詢Docker Swarm集群的狀態(tài)
$ docker node ls
- 以下輸出則表示Docker Swarm 3個節(jié)點(diǎn)均已成功加入集群,三個管理節(jié)點(diǎn),其中
cluster01
為主節(jié)點(diǎn)
4. 創(chuàng)建共享數(shù)據(jù)持久化卷
共享存儲卷,可以使用外部NFS做為共享卷來存儲服務(wù)的持久化數(shù)據(jù),也是可以Docker Swarm的本地volume卷來存儲數(shù)據(jù),這里兩種方式都有具體操作,但是建議使用本地volume來存儲。
下面所有步驟關(guān)于共享卷的使用,本文檔選擇本地Volume的方式,其他方式可以自行配置即可。
4.1. 創(chuàng)建共享存儲卷 - local
Docker Swarm 的共享存儲卷功能會自動在集群中的多個節(jié)點(diǎn)之間分布共享存儲卷的數(shù)據(jù),并保證數(shù)據(jù)的一致性和可用性。它內(nèi)部使用了分布式文件系統(tǒng)來存儲數(shù)據(jù),并提供一個統(tǒng)一的接口,讓容器可以訪問存儲卷中的數(shù)據(jù)。
?? 具體來說,Docker Swarm 會在集群中的每個節(jié)點(diǎn)上創(chuàng)建一個存儲卷的副本,并使用復(fù)制策略來保證每個副本中的數(shù)據(jù)都是一致的。這樣,當(dāng)容器在某個節(jié)點(diǎn)上進(jìn)行寫操作時(shí),Docker Swarm 會自動將寫操作同步到其它節(jié)點(diǎn)的副本中,保證數(shù)據(jù)的一致性。同時(shí),Docker Swarm 還會監(jiān)控每個存儲卷的狀態(tài),如果某個存儲卷的副本出現(xiàn)故障,Docker Swarm 會自動在其它節(jié)點(diǎn)上創(chuàng)建新的副本,以保證存儲卷的可用性。
總之,Docker Swarm 的共享存儲卷功能可以方便地解決容器之間共享數(shù)據(jù)的問題,并保證數(shù)據(jù)的安全性和可用性。
4.1.1. 使用 Docker 命令行工具創(chuàng)建共享存儲卷 - RabbitMQ
在
cluster01、cluster02、cluster03
節(jié)點(diǎn)執(zhí)行
# 初始化一個本地目錄做數(shù)據(jù)共享
$ mkdir -p /data/rabbitmq-data
# 執(zhí)行掛載掛載映射指令
$ docker volume create --driver local \
--opt type=none \
--opt device=/data/rabbitmq-data \
--opt o=bind \
cluster<01、02、03>-rabbitmq-data
上面的命令將創(chuàng)建一個名為 cluster<01、02、03>-rabbitmq-data 的共享存儲卷,并將它掛載到本地主機(jī)的 /data/rabbitmq-data 目錄
?? 這里要注意,cluster<01、02、03>-rabbitmq-data 中的<01、02、03> 為節(jié)點(diǎn)的名稱,為了方便管理查看,可以自行替換
5. 創(chuàng)建節(jié)點(diǎn)間通信共享overlay網(wǎng)絡(luò)
5.1. 創(chuàng)建服務(wù)共享網(wǎng)絡(luò)
這里的 rabbitmq_network
為三個節(jié)點(diǎn)直接共享所使用的網(wǎng)絡(luò)名稱,分別為三個服務(wù)創(chuàng)建單獨(dú)通信的網(wǎng)絡(luò),后續(xù)將會使用這個網(wǎng)絡(luò)節(jié)點(diǎn)之間的網(wǎng)絡(luò)通信,名稱可以自定義,但后續(xù)在創(chuàng)建服務(wù)時(shí)需要查詢使用
在
cluster01
節(jié)點(diǎn)執(zhí)行
- 創(chuàng)建rabbitmq服務(wù)使用網(wǎng)絡(luò)
$ docker network create -d overlay --attachable rabbitmq_network
?? 創(chuàng)建時(shí)需要注意,在創(chuàng)建網(wǎng)絡(luò)時(shí)需要添加 `--attachable` 參數(shù),否則后續(xù)無法使用`docker run`指令來使用此網(wǎng)絡(luò)
6. 創(chuàng)建RabbitMQ服務(wù)
6.1. 拉取RabbitMQ鏡像
在
cluster01、cluster02、cluster03
節(jié)點(diǎn)執(zhí)行
$ docker pull rabbitmq:3.11-management
6.2. 創(chuàng)建RabbitMQ服務(wù)
6.2.1. 在cluster01節(jié)點(diǎn)創(chuàng)建RabbitMQ服務(wù)
使用 docker run 命令來創(chuàng)建一個運(yùn)行 RabbitMQ 的服務(wù),是否配置參數(shù)如下:
配置參數(shù) | 配置值 | 解析 |
---|---|---|
–name | rabbitmq-node01 | 指定容器服務(wù)啟動的名稱 |
–hostname | rabbitmq-node01 | 指定服務(wù)的主機(jī)名稱 |
-v | cluster01-rabbitmq-data:/var/lib/rabbitmq | 指定本地映射目錄,將cluster01-rabbitmq-data的本地volume卷映射到容器內(nèi)部/var/lib/rabbitmq目錄作為數(shù)據(jù)存儲目錄使用【cluster01-rabbitmq-data就是上面給rabbitmq所創(chuàng)建的卷名稱】 |
-p | 5672:5672 | 指定服務(wù)映射端口,表示宿主機(jī)端口:內(nèi)部容器服務(wù)端口,這里是宿主機(jī)5672映射到容器的5672端口,此端口為RabbitMQ的對外服務(wù)連接端口 |
-p | 15672:15672 | 指定服務(wù)映射端口,表示宿主機(jī)端口:內(nèi)部容器服務(wù)端口,這里是宿主機(jī)15672映射到容器的15672端口,此端口為RabbitMQ管理控制臺訪問端口 |
-e RABBITMQ_DEFAULT_USER | admin | 指定RabbitMQ服務(wù)啟動后所創(chuàng)建的默認(rèn)用戶 |
-e RABBITMQ_DEFAULT_PASS | admin | 指定RabbitMQ服務(wù)啟動后所創(chuàng)建的默認(rèn)用戶的默認(rèn)密碼 |
-e RABBITMQ_ERLANG_COOKIE | rabbitmqcookie | 指定集群節(jié)點(diǎn)間通信認(rèn)證密鑰,同屬于一個集群,需要所有服務(wù)器啟動時(shí)配置值都保持一致才可以正常加入到一個集群 |
–network | rabbitmq_network | 指定容器服務(wù)所使用的網(wǎng)絡(luò)【rabbitmq_network就是上面給rabbitmq通信所創(chuàng)建的網(wǎng)絡(luò)】 |
在
cluster01
節(jié)點(diǎn)執(zhí)行
$ docker run -d \
--hostname rabbitmq-node01 \
--name rabbitmq-node01 \
-e RABBITMQ_ERLANG_COOKIE="rabbitcookie" \
-e RABBITMQ_DEFAULT_USER="admin" \
-e RABBITMQ_DEFAULT_PASS="admin" \
-v cluster01-rabbitmq-data:/var/lib/rabbitmq \
-p 5672:5672 \
-p 15672:15672 \
--net=rabbitmq_network \
rabbitmq:3.11-management
- 查看服務(wù)信息
通過指令查看rabbitmq-node01的容器服務(wù)是否正常啟動
# 查看rabbitmq-node01服務(wù)的所有配置信息
$ docker inspect rabbitmq-node01
?? 可以通過以上指令來查詢r(jià)abbitmq-node01的所分配的rabbitmq_network內(nèi)網(wǎng)地址及其他相關(guān)信息
- 確認(rèn)rabbitmq服務(wù)正常啟動
通過瀏覽器訪問cluster01
節(jié)點(diǎn)15672端口查看服務(wù)狀態(tài)
通過RabbitMQ管理頁面查看,可以確認(rèn)rabbitmq-node01節(jié)點(diǎn)一服務(wù)啟動正常
6.2.2. 在cluster02節(jié)點(diǎn)創(chuàng)建RabbitMQ服務(wù)
使用 docker run 命令來創(chuàng)建一個運(yùn)行 RabbitMQ 的服務(wù),是否配置參數(shù)如下:
配置參數(shù) | 配置值 | 解析 |
---|---|---|
–name | rabbitmq-node02 | 指定容器服務(wù)啟動的名稱 |
–hostname | rabbitmq-node02 | 指定服務(wù)的主機(jī)名稱 |
-v | cluster02-rabbitmq-data:/var/lib/rabbitmq | 指定本地映射目錄,將cluster02-rabbitmq-data的本地volume卷映射到容器內(nèi)部/var/lib/rabbitmq目錄作為數(shù)據(jù)存儲目錄使用【cluster01-rabbitmq-data就是上面給rabbitmq所創(chuàng)建的卷名稱】 |
-p | 5672:5672 | 指定服務(wù)映射端口,表示宿主機(jī)端口:內(nèi)部容器服務(wù)端口,這里是宿主機(jī)5672映射到容器的5672端口,此端口為RabbitMQ的對外服務(wù)連接端口 |
-p | 15672:15672 | 指定服務(wù)映射端口,表示宿主機(jī)端口:內(nèi)部容器服務(wù)端口,這里是宿主機(jī)15672映射到容器的15672端口,此端口為RabbitMQ管理控制臺訪問端口 |
-e RABBITMQ_ERLANG_COOKIE | rabbitmqcookie | 指定集群節(jié)點(diǎn)間通信認(rèn)證密鑰,同屬于一個集群,需要所有服務(wù)器啟動時(shí)配置值都保持一致才可以正常加入到一個集群 |
–network | rabbitmq_network | 指定容器服務(wù)所使用的網(wǎng)絡(luò)【rabbitmq_network就是上面給rabbitmq通信所創(chuàng)建的網(wǎng)絡(luò)】 |
在
cluster02
節(jié)點(diǎn)執(zhí)行
$ docker run -d \
--hostname rabbitmq-node02 \
--name rabbitmq-node02 \
-e RABBITMQ_ERLANG_COOKIE="rabbitcookie" \
-v cluster02-rabbitmq-data:/var/lib/rabbitmq \
-p 5672:5672 \
-p 15672:15672 \
--net=rabbitmq_network \
rabbitmq:3.11-management
- 查看服務(wù)信息
通過指令查看rabbitmq-node02的容器服務(wù)是否正常啟動
# 查看rabbitmq-node02服務(wù)的所有配置信息
$ docker inspect rabbitmq-node02
?? 可以通過以上指令來查詢r(jià)abbitmq-node02的所分配的rabbitmq_network內(nèi)網(wǎng)地址及其他相關(guān)信息
確認(rèn)RabbitMQ服務(wù)正常啟動
6.2.3. 在cluster03節(jié)點(diǎn)創(chuàng)建RabbitMQ服務(wù)
使用 docker run 命令來創(chuàng)建一個運(yùn)行 RabbitMQ 的服務(wù),是否配置參數(shù)如下:
配置參數(shù) | 配置值 | 解析 |
---|---|---|
–name | rabbitmq-node03 | 指定容器服務(wù)啟動的名稱 |
–hostname | rabbitmq-node03 | 指定服務(wù)的主機(jī)名稱 |
-v | cluster03-rabbitmq-data:/var/lib/rabbitmq | 指定本地映射目錄,將cluster03-rabbitmq-data的本地volume卷映射到容器內(nèi)部/var/lib/rabbitmq目錄作為數(shù)據(jù)存儲目錄使用【cluster01-rabbitmq-data就是上面給rabbitmq所創(chuàng)建的卷名稱】 |
-p | 5672:5672 | 指定服務(wù)映射端口,表示宿主機(jī)端口:內(nèi)部容器服務(wù)端口,這里是宿主機(jī)5672映射到容器的5672端口,此端口為RabbitMQ的對外服務(wù)連接端口 |
-p | 15672:15672 | 指定服務(wù)映射端口,表示宿主機(jī)端口:內(nèi)部容器服務(wù)端口,這里是宿主機(jī)15672映射到容器的15672端口,此端口為RabbitMQ管理控制臺訪問端口 |
-e RABBITMQ_ERLANG_COOKIE | rabbitmqcookie | 指定集群節(jié)點(diǎn)間通信認(rèn)證密鑰,同屬于一個集群,需要所有服務(wù)器啟動時(shí)配置值都保持一致才可以正常加入到一個集群 |
–network | rabbitmq_network | 指定容器服務(wù)所使用的網(wǎng)絡(luò)【rabbitmq_network就是上面給rabbitmq通信所創(chuàng)建的網(wǎng)絡(luò)】 |
在
cluster02
節(jié)點(diǎn)執(zhí)行
$ docker run -d \
--hostname rabbitmq-node03 \
--name rabbitmq-node03 \
-e RABBITMQ_ERLANG_COOKIE="rabbitcookie" \
-v cluster03-rabbitmq-data:/var/lib/rabbitmq \
-p 5672:5672 \
-p 15672:15672 \
--net=rabbitmq_network \
rabbitmq:3.11-management
- 查看服務(wù)信息
通過指令查看rabbitmq-node03的容器服務(wù)是否正常啟動
# 查看rabbitmq-node03服務(wù)的所有配置信息
$ docker inspect rabbitmq-node03
?? 可以通過以上指令來查詢r(jià)abbitmq-node03的所分配的rabbitmq_network內(nèi)網(wǎng)地址及其他相關(guān)信息
確認(rèn)RabbitMQ服務(wù)正常啟動
7. 加入RabbitMQ集群
?? 內(nèi)存節(jié)點(diǎn)和磁盤節(jié)點(diǎn)的選擇:
每個RabbitMQ節(jié)點(diǎn),要么是內(nèi)存節(jié)點(diǎn),要么是磁盤節(jié)點(diǎn)。
內(nèi)存節(jié)點(diǎn):將所有的隊(duì)列、交換器、綁定、用戶等元數(shù)據(jù)定義都存儲在內(nèi)存中;
磁盤節(jié)點(diǎn):將元數(shù)據(jù)存儲在磁盤中。
單節(jié)點(diǎn)系統(tǒng)只允許磁盤類型的節(jié)點(diǎn),否則當(dāng)節(jié)點(diǎn)重啟以后,所有的配置信息都會丟失。
如果采用集群的方式,可以選擇至少配置一個節(jié)點(diǎn)為磁盤節(jié)點(diǎn),其余部分配置為內(nèi)存節(jié)點(diǎn),這樣可以獲得更快的響應(yīng)。所以本集群中配置節(jié)點(diǎn)1為磁盤節(jié)點(diǎn),cluster02和cluster03為內(nèi)存節(jié)點(diǎn)。
集群中的第一個節(jié)點(diǎn)將初始元數(shù)據(jù)代入集群中,并且無須被告知加入。而第2個和之后加入的節(jié)點(diǎn)將加入它并獲取它的元數(shù)據(jù)。要加入節(jié)點(diǎn),需要進(jìn)入Docker容器,重啟RabbitMQ。
7.1. 在cluster01節(jié)點(diǎn)執(zhí)行初始化
在
cluster01
節(jié)點(diǎn)執(zhí)行
$ docker exec -ti rabbitmq-node01 bash
$ rabbitmqctl stop_app
$ rabbitmqctl reset
$ rabbitmqctl start_app
7.2. 在cluster02節(jié)點(diǎn)執(zhí)行加入操作
在
cluster02
節(jié)點(diǎn)執(zhí)行
$ docker exec -ti rabbitmq-node02 bash
$ rabbitmqctl stop_app
$ rabbitmqctl reset
$ rabbitmqctl join_cluster --ram rabbit@rabbitmq-node01
$ rabbitmqctl start_app
7.3. 在cluster03節(jié)點(diǎn)執(zhí)行加入操作
在
cluster03
節(jié)點(diǎn)執(zhí)行
$ docker exec -ti rabbitmq-node03 bash
$ rabbitmqctl stop_app
$ rabbitmqctl reset
$ rabbitmqctl join_cluster --ram rabbit@rabbitmq-node01
$ rabbitmqctl start_app
8. 配置RabbitMQ鏡像隊(duì)列
- 配置鏡像隊(duì)列
鏡像隊(duì)列工作原理:在非鏡像隊(duì)列的集群中,消息會路由到指定的隊(duì)列。當(dāng)配置為鏡像隊(duì)列之后,消息除了按照路由規(guī)則投遞到相應(yīng)的隊(duì)列外,還會投遞到鏡像隊(duì)列的拷貝。也可以想象在鏡像隊(duì)列中隱藏著一個fanout交換器,將消息發(fā)送到鏡像的隊(duì)列的拷貝。
進(jìn)入任意一個RabbitMQ節(jié)點(diǎn),執(zhí)行如下命令:
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
可以設(shè)置鏡像隊(duì)列,"^"表示匹配所有隊(duì)列,即所有隊(duì)列在各個節(jié)點(diǎn)上都會有備份。在集群中,只需要在一個節(jié)點(diǎn)上設(shè)置鏡像隊(duì)列,設(shè)置操作會同步到其他節(jié)點(diǎn)。
查看集群的狀態(tài):
rabbitmqctl cluster_status
9. 檢查RabbitMQ集群狀態(tài)
完成以上cluster01、cluster02、cluster03三個節(jié)點(diǎn)的RabbitMQ服務(wù)的啟動和集群的配置。
所有節(jié)點(diǎn)設(shè)置完成之后,在瀏覽器訪問cluster01、cluster02和cluster03中任意一個節(jié)點(diǎn)的15672端口,都會看到RabbitMQ集群已經(jīng)創(chuàng)建成功。
- 新建立一個隊(duì)列服務(wù),查看是否已經(jīng)為鏡像隊(duì)列模式
如圖所示則表示集群已經(jīng)開啟了鏡像隊(duì)列模式,所有的對接消息將在其他節(jié)點(diǎn)都存在一份,訪問任何一個節(jié)點(diǎn)都可以,而且他們直接數(shù)據(jù)都是同步的。
10. 配置HAProxy服務(wù)
三個節(jié)點(diǎn)的RabbitMQ服務(wù)集群正常之后,已經(jīng)完成高可用配置,但是在使用過程中,不能讓使用RabbitMQ的程序連接三個地址,所以我們還需要一個代理服務(wù)器,來配置代理轉(zhuǎn)發(fā)做到負(fù)載均衡,在使用中客戶端只需要連接代理服務(wù)器的地址,由代理服務(wù)器根據(jù)策略來負(fù)責(zé)分發(fā)到后臺的三個節(jié)點(diǎn)進(jìn)行數(shù)據(jù)庫的訪問,而且可以持續(xù)監(jiān)測后臺三個RabbitMQ服務(wù)的狀態(tài),如果某一個節(jié)點(diǎn)掛掉之后,自動負(fù)載到其他可用節(jié)點(diǎn)。上線之后重新加入到集群,并持續(xù)監(jiān)聽,來實(shí)現(xiàn)負(fù)載均衡高可用。
做代理服務(wù)可以有多種選,例如:HAProxy、Nginx都可以實(shí)現(xiàn),這里我們選擇HAProxy來實(shí)現(xiàn)代理服務(wù),其他配置實(shí)現(xiàn)可以自定查閱相關(guān)資料來配置。
10.1. 拉取HAProxy鏡像
這里我們選擇最新的HAProxy的鏡像,版本為2.7.0 ,其他版本可以通過訪問 https://haproxy.org 來獲取
具體版本:HAProxy version 2.7.0-437fd28 2022/12/01
在
cluster01
節(jié)點(diǎn)執(zhí)行
目前只在一個節(jié)點(diǎn)HAProxy服務(wù),會存在一個單點(diǎn)故障的問題,由于所有客戶端都會通過HAProxy來轉(zhuǎn)發(fā)到后端服務(wù),所以后續(xù)將結(jié)合Keepalived來實(shí)現(xiàn)高可用。
$ docker pull haproxy:latest
10.2. 配置HAProxy配置文件
HAProxy鏡像服務(wù)內(nèi)部沒有配置文件,需要在容器啟動之前將haproxy.cfg配置文件按照需要配置完成,再啟動服務(wù)時(shí)映射到容器內(nèi)部使用
在
cluster01
節(jié)點(diǎn)執(zhí)行
10.2.1. 創(chuàng)建一個宿主機(jī)映射配置文件目錄
$ mkdir -p /data/haproxy
10.2.2. 編寫HAProxy配置文件
配置文件中,需要修改的內(nèi)容主要是 listen proxy-rabbitmq
段,這里需要將RabbitMQ的三個節(jié)點(diǎn)的RabbitMQ地址進(jìn)行配置,具體IP地址為容器的內(nèi)部地址,可以在每個節(jié)點(diǎn)通過**docker inspect rabbitmq-node<01/02/03>
**來獲取,IP地址獲取后配置到文件中即可,其他haproxy的配置參數(shù),也可以根據(jù)具體環(huán)境來進(jìn)行配置。
這里配置的負(fù)載模式為:roundrobin,輪訓(xùn)算法,可以根據(jù)實(shí)際環(huán)境自行配置其他模式即可
在
cluster01
節(jié)點(diǎn)執(zhí)行
$ vim /data/haproxy/haproxy.cfg
# ---- 配置文件內(nèi)容如下 ----
global
#日志文件,使用rsyslog服務(wù)中l(wèi)ocal5日志設(shè)備(/var/log/local5),等級info
log 127.0.0.1 local5 info
#守護(hù)進(jìn)程運(yùn)行
daemon
defaults
log global
mode http
#日志格式
option httplog
#日志中不記錄負(fù)載均衡的心跳檢測記錄
option dontlognull
#連接超時(shí)(毫秒)
timeout connect 5000
#客戶端超時(shí)(毫秒)
timeout client 50000
#服務(wù)器超時(shí)(毫秒)
timeout server 50000
#監(jiān)控界面
listen admin_stats
#監(jiān)控界面的訪問的IP和端口
bind 0.0.0.0:8888
#訪問協(xié)議
mode http
#URI相對地址
stats uri /dbs
#統(tǒng)計(jì)報(bào)告格式
stats realm Global\ statistics
#登陸帳戶信息, 用于web瀏覽器的訪問用戶名密碼
stats auth admin:root123.
#數(shù)據(jù)庫負(fù)載均衡
listen proxy-rabbitmq
#訪問的IP和端口
bind 0.0.0.0:5672
#網(wǎng)絡(luò)協(xié)議
mode tcp
#負(fù)載均衡算法(輪詢算法)
#輪詢算法:roundrobin
#權(quán)重算法:static-rr
#最少連接算法:leastconn
#請求源IP算法:source
balance roundrobin
#日志格式
option tcplog
#inter 每隔五秒對mq集群做健康檢查,2次正確證明服務(wù)器可用,2次失敗證明服務(wù)器不可用,并且配置主備機(jī)制
#weight 表示權(quán)重都為1,三個節(jié)點(diǎn)平均分配資源
#maxconn 2000,每個節(jié)點(diǎn)最大連接2000
server RabbitMQ-Node01 10.0.13.23:5672 check weight 1 maxconn 2000 inter 5000 rise 2 fall 2
server RabbitMQ-Node02 10.0.13.26:5672 check weight 1 maxconn 2000 inter 5000 rise 2 fall 2
server RabbitMQ-Node03 10.0.13.6:5672 check weight 1 maxconn 2000 inter 5000 rise 2 fall 2
#使用keepalive檢測死鏈
option tcpka
10.3. 創(chuàng)建HAProxy服務(wù)
使用 docker run 命令來創(chuàng)建一個運(yùn)行 HAProxy 的服務(wù),是否配置參數(shù)如下:
配置參數(shù) | 配置值 | 解析 |
---|---|---|
-p | 4001:8888 | 指定服務(wù)映射端口,表示宿主機(jī)端口:內(nèi)部容器服務(wù)端口,這里是宿主機(jī)4001映射到容器的8888端口,這個端口后續(xù)用來訪問haproxy服務(wù)的瀏覽器可視化監(jiān)控頁面 |
-p | 4002:5672 | 指定服務(wù)映射端口,表示宿主機(jī)端口:內(nèi)部容器服務(wù)端口,這里是宿主機(jī)4002映射到容器的5672端口,這個端口主要對外客戶端訪問外部端口,通過這個端口轉(zhuǎn)發(fā)至容器內(nèi)部來訪問后端的3個RabbitMQ集群。 |
-v | /data/haproxy:/usr/local/etc/haproxy | 指定本地映射目錄,將/data/haproxy的本地目錄映射到容器內(nèi)部/usr/local/etc/haproxy目錄作為haproxy的配置文件目錄使用 |
–name | haproxy | 指定容器服務(wù)啟動的名稱 |
–network | rabbitmq_network | 指定容器服務(wù)所使用的網(wǎng)絡(luò)【rabbitmq_network就是上面給rabbitmq通信所創(chuàng)建的網(wǎng)絡(luò)】 |
在
cluster01
節(jié)點(diǎn)執(zhí)行
$ docker run -d \
-p 4001:8888 \
-p 4002:5672 \
-v /data/haproxy:/usr/local/etc/haproxy \
--name=haproxy \
--net=rabbitmq_network \
--privileged \
haproxy:latest
?? 這里如何HAProxy服務(wù)分別轉(zhuǎn)發(fā)兩個不同網(wǎng)絡(luò)的服務(wù),那么啟動HAProxy容器時(shí),需要給HAProxy服務(wù)附加多個網(wǎng)絡(luò),由于在直接使用docker run指令是只能指定一個網(wǎng)絡(luò),所以可以再綁定一個網(wǎng)絡(luò)之后啟動后,再通過docker network connect <網(wǎng)絡(luò)> <哪個服務(wù)>來進(jìn)行附加。如果使用了docker-compose.yaml方式,則可以直接為容器服務(wù)指定多個網(wǎng)絡(luò)。
11. 測試HAProxy服務(wù)功能
HAProxy服務(wù)啟動后,可以通過訪問cluster01節(jié)點(diǎn)宿主機(jī)的http://:4001/dbs來訪問HAProxy服務(wù)的瀏覽器可視化監(jiān)控頁面來查看后端RabbitMQ服務(wù)的監(jiān)測及數(shù)據(jù)轉(zhuǎn)發(fā)負(fù)責(zé)情況,通過頁面可以看到目前后端的節(jié)點(diǎn)數(shù)量以及狀態(tài)是否正常等相關(guān)信息。
12. 配置其他應(yīng)用程序訪問RabbitMQ服務(wù)
截止到當(dāng)前,RabbitMQ+HAProxy實(shí)現(xiàn)的高可用負(fù)載集群就配置完成,那么內(nèi)部及外部其他應(yīng)用客戶端可以訪問HAProxy服務(wù)的對外地址及端口來訪問后端的RabbitMQ服務(wù)。文章來源:http://www.zghlxwxcb.cn/news/detail-620722.html
外部服務(wù)訪問地址:192.168.12.48 4002 端口,即可訪問到數(shù)據(jù)庫,后面就由HAProxy來根據(jù)配置的輪訓(xùn)算法來轉(zhuǎn)發(fā)到后端的三臺RabbitMQ服務(wù) (192.168.12.48 為cluster01節(jié)點(diǎn)宿主機(jī)的IP地址)文章來源地址http://www.zghlxwxcb.cn/news/detail-620722.html
到了這里,關(guān)于使用Docker Swarm部署RabbitMQ+HAProxy高可用集群(三節(jié)點(diǎn)-鏡像模式)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!