在女朋友的再三追問(wèn)下吨铸,于是就有了這篇文章!5暗稹焊傅!
集群搭建
如果還不會(huì)docker的話(huà)剂陡,可以先自行學(xué)習(xí)下哦
- 創(chuàng)建rabbitmq需要的網(wǎng)絡(luò)
docker network create rabbtimane
- 安裝三個(gè)rabbitmq組件狈涮,一主兩從
# 三條命令分批執(zhí)行狐胎,如果下載比較慢,建議更換阿里云docker鏡像加速
docker run -d --name=rabbitmq_master -p 5672:5672 -p 15672:15672 -e RABBITMQ_NODENAME=rabbitmq_master -e RABBITMQ_ERLANG_COOKIE='1111111' -h rabbitmq_master --net=rabbtimanet -v ~/docker/rabbitmq_master/data:/var/lib/rabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin rabbitmq:3.7.7-management
docker run -d --name=rabbitmq_slave1 -p 5673:5672 -p 15673:15672 -e RABBITMQ_NODENAME=rabbitmq_slave1 -e RABBITMQ_ERLANG_COOKIE='1111111' -h rabbitmq_slave1 --net=rabbtimanet -v ~/docker/rabbitmq_slave1/data:/var/lib/rabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin rabbitmq:3.7.7-management
docker run -d --name=rabbitmq_slave2 -p 5674:5672 -p 15674:15672 -e RABBITMQ_NODENAME=rabbitmq_slave2 -e RABBITMQ_ERLANG_COOKIE='1111111' -h rabbitmq_slave2 --net=rabbtimanet -v ~/docker/rabbitmq_slave2/data:/var/lib/rabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin rabbitmq:3.7.7-management
- 開(kāi)啟三個(gè)組件的管理端插件
docker exec -it rabbitmq_master bash
rabbitmq-plugins enable rabbitmq_management
exit
docker exec -it rabbitmq_slave1 bash
rabbitmq-plugins enable rabbitmq_management
exit
docker exec -it rabbitmq_slave2 bash
rabbitmq-plugins enable rabbitmq_management
exit
-
瀏覽器分別訪(fǎng)問(wèn)以下地址歌馍,用戶(hù)名和密碼都是admin
http://localhost:15672/#/
http://localhost:15673/#/
http://localhost:15674/#/
如果成功登入握巢,則代表組件安裝成功,但是這時(shí)候還不是集群模式松却,我們需要手動(dòng)加入到集群 從節(jié)點(diǎn)加入到主節(jié)點(diǎn)暴浦,實(shí)現(xiàn)集群模式
# salve1加入集群
docker exec -it rabbitmq_slave1 bash
rabbitmqctl stop_app
# 節(jié)點(diǎn)名@用戶(hù)名
rabbitmqctl join_cluster rabbitmq_master@rabbitmq_master
abbitmqctl start_app
exit
# salve2加入集群
docker exec -it rabbitmq_slave2 bash
rabbitmqctl stop_app
# 節(jié)點(diǎn)名@用戶(hù)名
rabbitmqctl join_cluster rabbitmq_master@rabbitmq_master
abbitmqctl start_app
exit
現(xiàn)在重新打開(kāi)管理頁(yè)面發(fā)現(xiàn),會(huì)出現(xiàn)了集群模式:
到目前為止晓锻,集群模式已經(jīng)搭建完畢歌焦,但是這里還是不夠的,RabbitMQ搭建的默認(rèn)集群是普通模式的集群
普通模式的集群
普通模式的集群是不會(huì)將創(chuàng)建的隊(duì)列復(fù)制到其他節(jié)點(diǎn),雖然我們?cè)谄渌?jié)點(diǎn)能夠看到這個(gè)節(jié)點(diǎn)砚哆;這是由于其它節(jié)點(diǎn)只會(huì)保存一份這個(gè)隊(duì)列的元數(shù)據(jù)独撇,展示給我們看的,真實(shí)的隊(duì)列還是存在創(chuàng)建這個(gè)隊(duì)列的節(jié)點(diǎn)中的躁锁;如果這個(gè)時(shí)候我們把創(chuàng)建隊(duì)列的的節(jié)點(diǎn)關(guān)閉纷铣,那么這個(gè)隊(duì)列其實(shí)就不可用了;
為了解決這個(gè)問(wèn)題战转,rabbitmq還提供了另外一種集群模式:鏡像模式
鏡像模式
鏡像模式是rabbit提供的一種可添加的策略模式搜立,如果創(chuàng)建的隊(duì)列和創(chuàng)建的策略能夠匹配上,則會(huì)把隊(duì)列同步復(fù)制到其他節(jié)點(diǎn)中槐秧,而不再只是復(fù)制元數(shù)據(jù)啄踊;
- 添加策略模式有兩種方式
-
管理頁(yè)面添加
admin->Policies>add policy
參數(shù)解釋?zhuān)?br> name: 策略名稱(chēng)
Pattern:通配符,創(chuàng)建的隊(duì)列名稱(chēng)如果匹配到這個(gè)通配符刁标,則使用該策略颠通,如^匹配所有隊(duì)列
Definition: 設(shè)置復(fù)制模式
我這里設(shè)置的配置如下
image.png
* 通過(guò)命令方式添加
```
# 可以在任意節(jié)點(diǎn)執(zhí)行如下命令,我這里是在從節(jié)點(diǎn)1上執(zhí)行的命雀,它會(huì)自動(dòng)在集群中同步
docker exec -it rabbitmq_slave1 bash
rabbitmqctl set_policy my_ha "^" '{"ha-mode":"all"}'
exit
```
到這里蒜哀,集群已經(jīng)真正的搭建完成了,我們現(xiàn)在看下如何在項(xiàng)目中整合吧吏砂!
SpringBoot整合RabbitMQ集群
- 添加依賴(lài)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
- 創(chuàng)建配置文件
spring:
rabbitmq:
# host: 127.0.0.1
# port: 5672
# 這里應(yīng)該使用address撵儿,如果是單機(jī)的可以使用host+port
addresses: 127.0.0.1:5672,127.0.0.1:5673,127.0.0.1:5674
# virtual-host: my_vhost
username: admin
password: admin
publisher-returns: true
publisher-confirm-type: simple
具體項(xiàng)目可以見(jiàn) https://gitee.com/yangleliu/code_learning.git
SpringBoot直接整合RabbitMQ集群的一些問(wèn)題
上面已經(jīng)完成springboot整合rabbitmq集群的工作,但是在運(yùn)行過(guò)程中發(fā)現(xiàn)了以下幾個(gè)問(wèn)題:
- springboot會(huì)一直使用一個(gè)連接狐血,就算配置了三個(gè)地址
- 只有當(dāng)連接的節(jié)點(diǎn)掛機(jī)之后淀歇,才會(huì)嘗試連接其它節(jié)點(diǎn)
總結(jié):如果配置了集群模式,但是客戶(hù)端還是一直連接同一個(gè)節(jié)點(diǎn)匈织,就會(huì)出現(xiàn)資源浪費(fèi)及單節(jié)點(diǎn)負(fù)載壓力巨大浪默,也就是負(fù)載不均衡,這個(gè)目前springboot還沒(méi)有解決方案牡直,但是我們可以借助負(fù)載均衡框架HAProxy幫助我們實(shí)現(xiàn)
RabbitMQ整合HAProxy實(shí)現(xiàn)負(fù)載均衡
HAProxy是個(gè)啥
HAProxy提供高可用性、負(fù)載均衡以及基于TCP和HTTP應(yīng)用的代理纳决,支持虛擬主機(jī)碰逸,它是免費(fèi)、快速并且可靠的一種解決方案阔加。HAProxy特別適用于那些負(fù)載特大的web站點(diǎn)饵史, 這些站點(diǎn)通常又需要會(huì)話(huà)保持或七層處理。HAProxy運(yùn)行在當(dāng)前的硬件上胜榔,完全可以支持?jǐn)?shù)以萬(wàn)計(jì)的并發(fā)連接胳喷。并且它的運(yùn)行模式使得它可以很簡(jiǎn)單安全的整合進(jìn)您當(dāng)前的架構(gòu)中, 同時(shí)可以保護(hù)你的web服務(wù)器不被暴露到網(wǎng)絡(luò)上夭织。
整合HAProxy
我這里還是通過(guò)docker安裝HAProxy吭露,因?yàn)槭褂胐okcer安裝軟件是真的香。
- 添加配置文件
mkdir ~/docker/haproxy/5677
mkdir ~/docker/haproxy/5678
# 修改配置文件1
vim ~/docker/haproxy/5677/haproxy.cfg
#logging options
global
log 127.0.0.1 local0 info
maxconn 5120
chroot /usr/local/etc/haproxy
uid 99
gid 99
daemon
quiet
nbproc 20
pidfile /var/run/haproxy.pid
defaults
log global
#使用4層代理模式尊惰,”mode http”為7層代理模式
mode tcp
#if you set mode to tcp,then you nust change tcplog into httplog
option tcplog
option dontlognull
retries 3
option redispatch
maxconn 2000
timeout connect 5s
#客戶(hù)端空閑超時(shí)時(shí)間為 60秒 則HA 發(fā)起重連機(jī)制
timeout client 60s
#服務(wù)器端鏈接超時(shí)時(shí)間為 15秒 則HA 發(fā)起重連機(jī)制
timeout server 15s
#front-end IP for consumers and producters
listen rabbitmq_cluster
bind 0.0.0.0:5677
#配置TCP模式
mode tcp
#balance url_param userid
#balance url_param session_id check_post 64
#balance hdr(User-Agent)
#balance hdr(host)
#balance hdr(Host) use_domain_only
#balance rdp-cookie
#balance leastconn
#balance source //ip
#簡(jiǎn)單的輪詢(xún)
balance roundrobin
#rabbitmq集群節(jié)點(diǎn)配置
#inter 每隔五秒對(duì)mq集群做健康檢查讲竿, 2次正確證明服務(wù)器可用,2次失敗證明服務(wù)器不可用择浊,并且配置主備機(jī)制
server rabbitmq_master 192.168.0.103:5672 check inter 5000 rise 2 fall 2
server rabbitmq_salve1 192.168.0.103:5673 check inter 5000 rise 2 fall 2
server rabbitmq_salve2 192.168.0.103:5674 check inter 5000 rise 2 fall 2
#配置haproxy web監(jiān)控戴卜,查看統(tǒng)計(jì)信息
listen stats
bind 0.0.0.0:8100
mode http
option httplog
stats enable
#設(shè)置haproxy監(jiān)控地址為http://localhost:8100/rabbitmq-stats
stats uri /rabbitmq-stats
stats refresh 5s
stats auth admin:123456
listen rabbitmq_admin #監(jiān)聽(tīng)8000端口轉(zhuǎn)發(fā)到rabbitmq的客戶(hù)端
bind 0.0.0.0:8000
server rabbitmq_master 192.168.0.103:15672 check inter 5000 rise 2 fall 2
server rabbitmq_salve1 192.168.0.103:15673 check inter 5000 rise 2 fall 2
server rabbitmq_salve2 192.168.0.103:15674 check inter 5000 rise 2 fall 2
#######################################################
# 修改配置文件2
vim ~/docker/haproxy/5678/haproxy.cfg
#logging options
global
log 127.0.0.1 local0 info
maxconn 5120
chroot /usr/local/etc/haproxy
uid 99
gid 99
daemon
quiet
nbproc 20
pidfile /var/run/haproxy.pid
defaults
log global
#使用4層代理模式,”mode http”為7層代理模式
mode tcp
#if you set mode to tcp,then you nust change tcplog into httplog
option tcplog
option dontlognull
retries 3
option redispatch
maxconn 2000
timeout connect 5s
#客戶(hù)端空閑超時(shí)時(shí)間為 60秒 則HA 發(fā)起重連機(jī)制
timeout client 60s
#服務(wù)器端鏈接超時(shí)時(shí)間為 15秒 則HA 發(fā)起重連機(jī)制
timeout server 15s
#front-end IP for consumers and producters
listen rabbitmq_cluster
bind 0.0.0.0:5678
#配置TCP模式
mode tcp
#balance url_param userid
#balance url_param session_id check_post 64
#balance hdr(User-Agent)
#balance hdr(host)
#balance hdr(Host) use_domain_only
#balance rdp-cookie
#balance leastconn
#balance source //ip
#簡(jiǎn)單的輪詢(xún)
balance roundrobin
#rabbitmq集群節(jié)點(diǎn)配置
#inter 每隔五秒對(duì)mq集群做健康檢查琢岩, 2次正確證明服務(wù)器可用投剥,2次失敗證明服務(wù)器不可用,并且配置主備機(jī)制
server rabbitmq_master 192.168.0.103:5672 check inter 5000 rise 2 fall 2
server rabbitmq_salve1 192.168.0.103:5673 check inter 5000 rise 2 fall 2
server rabbitmq_salve2 192.168.0.103:5674 check inter 5000 rise 2 fall 2
#配置haproxy web監(jiān)控担孔,查看統(tǒng)計(jì)信息
listen stats
bind 0.0.0.0:8101
mode http
option httplog
stats enable
#設(shè)置haproxy監(jiān)控地址為http://localhost:8100/rabbitmq-stats
stats uri /rabbitmq-stats
stats refresh 5s
stats auth admin:123456
listen rabbitmq_admin #監(jiān)聽(tīng)8000端口轉(zhuǎn)發(fā)到rabbitmq的客戶(hù)端
bind 0.0.0.0:8001
server rabbitmq_master 192.168.0.103:15672 check inter 5000 rise 2 fall 2
server rabbitmq_salve1 192.168.0.103:15673 check inter 5000 rise 2 fall 2
server rabbitmq_salve2 192.168.0.103:15674 check inter 5000 rise 2 fall 2
- 啟動(dòng)兩個(gè)HAProxy
docker run --name rabbitmq-haproxy5677 -p 5677:5677 -p 8100:8100 -p 8000:8000 -d --net=rabbtimanet -v ~/docker/haproxy/5677/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro haproxy:latest
docker run --name rabbitmq-haproxy5678 -p 5678:5678 -p 8101:8101 -p 8001:8001 -d --net=rabbtimanet -v ~/docker/haproxy/5678/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro haproxy:latest
我安裝了兩個(gè)HAProxy,是為了做高可用江锨,防止其中一個(gè)掛掉了,導(dǎo)致不能對(duì)外提供服服務(wù)糕篇。
springboot配置文件修改如下:
spring:
rabbitmq:
# host: 127.0.0.1
# port: 5672
addresses: 127.0.0.1:5677,127.0.0.1:5678
# virtual-host: my_vhost
username: admin
password: admin
publisher-returns: true
publisher-confirm-type: simple
這里已經(jīng)改成連接到兩個(gè)HAProxy了,自行測(cè)試使用吧啄育,代碼已經(jīng)上傳到代碼庫(kù)咯
總結(jié)
其實(shí)安裝rabbitmq是很麻煩的,需要解決各種環(huán)境問(wèn)題拌消;但是好在我這里使用了docker挑豌,可以很順暢的完成安裝;然后把主要的時(shí)間放在調(diào)試集群上面墩崩,安裝過(guò)程中也遇到了不少坑氓英,建議大家按照這個(gè)實(shí)操下,畢竟只有自己走過(guò)這些坑鹦筹,才會(huì)讓自己后面不會(huì)再遇到坑啊铝阐,如果大家有遇到解決不了的問(wèn)題,可以私信我哦