整體架構

部署步驟
基于 Docker
-
基本概念
-
內存節(jié)點
只保存狀態(tài)到內存,例外情況是:持久的 queue 的內容將被保存到磁盤。 -
磁盤節(jié)點
保存狀態(tài)到內存和磁盤。 內存節(jié)點由于不進行磁盤讀寫,它的性能比磁盤節(jié)點高。
集群中可以存在多個磁盤節(jié)點,磁盤節(jié)點越多整個集群可用性越好,但是集群整體性能不會線性增加,需要權衡考慮。
如果集群中只有內存節(jié)點,那么不能停止它們,否則所有狀態(tài)和消息都會丟失。
-
-
安裝 RabbitMQ
-
準備四臺主機,我是用 Docker 來創(chuàng)建的,命令如下:
? ~ docker run -i -d --name rabbitmq1 --hostname rabbitmq1 registry.docker-cn.com/library/erlang:latest 0823993f94d732b9e501ff62920ed0149cb33bcea1992e73f054b79fad5747c0 ? ~ docker run -i -d --name rabbitmq2 --hostname rabbitmq2 registry.docker-cn.com/library/erlang:latest 961e45d0a3219e43887866eea39b3d68aeb6ea81c78cf5bf6006be5483930e68 ? ~ docker run -i -d --name rabbitmq3 --hostname rabbitmq3 registry.docker-cn.com/library/erlang:latest ef08f580066489465f5fd6201455a4680954cfa3e0591e36346a6e610c7cd82c ? ~ docker run -i -d --name haproxy --hostname haproxy -p 8100:8100 -p 8101:8101 -p 8102:8102 registry.docker-cn.com/library/ubuntu:14.04 f05a01380908ca639004e11bef0ce3bb38c0a6485d2ffb16f30ad62dedca9647 ? ~ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f05a01380908 registry.docker-cn.com/library/ubuntu:14.04 "/bin/bash" About a minute ago Up About a minute 0.0.0.0:8100-8102->8100-8102/tcp haproxy ef08f5800664 registry.docker-cn.com/library/erlang:latest "erl" 2 minutes ago Up 2 minutes rabbitmq3 961e45d0a321 registry.docker-cn.com/library/erlang:latest "erl" 2 minutes ago Up 2 minutes rabbitmq2 0823993f94d7 registry.docker-cn.com/library/erlang:latest "erl" 3 minutes ago Up 2 minutes rabbitmq1 ? ~ docker inspect --format='{{.NetworkSettings.IPAddress}}' rabbitmq1 172.17.0.2 ? ~ docker inspect --format='{{.NetworkSettings.IPAddress}}' rabbitmq2 172.17.0.3 ? ~ docker inspect --format='{{.NetworkSettings.IPAddress}}' rabbitmq3 172.17.0.4 ? ~ docker inspect --format='{{.NetworkSettings.IPAddress}}' haproxy 172.17.0.5haproxy 主機開了三個端口,后面講到 HAProxy 負載均衡時再解釋這三個端口的作用。
-
安裝 RabbitMQ
選擇一個合適的版本下載 ,下載地址:Downloading and Installing RabbitMQ
-
下面是每一步的命令:
root@rabbitmq1:~# wget https://dl.bintray.com/rabbitmq/binaries/rabbitmq-server-generic-unix-3.6.14.tar.xz root@rabbitmq1:~# xz -d rabbitmq-server-generic-unix-3.6.14.tar.xz root@rabbitmq1:~# tar -xvf rabbitmq-server-generic-unix-3.6.14.tar root@rabbitmq1:~# cd rabbitmq_server-3.6.14/ root@rabbitmq1:~/rabbitmq_server-3.6.14# ls -l total 248 -rw-r--r-- 1 1023 1023 93 Nov 7 07:46 INSTALL -rw-r--r-- 1 1023 1023 28247 Nov 7 07:46 LICENSE -rw-r--r-- 1 1023 1023 11425 Nov 7 07:46 LICENSE-APACHE2 -rw-r--r-- 1 1023 1023 11358 Nov 7 07:46 LICENSE-APACHE2-ExplorerCanvas -rw-r--r-- 1 1023 1023 11358 Nov 7 07:46 LICENSE-APACHE2-excanvas -rw-r--r-- 1 1023 1023 10175 Nov 7 07:46 LICENSE-APL2-Rebar -rw-r--r-- 1 1023 1023 10851 Nov 7 07:46 LICENSE-APL2-Stomp-Websocket -rw-r--r-- 1 1023 1023 1206 Nov 7 07:46 LICENSE-BSD-base64js -rw-r--r-- 1 1023 1023 1304 Nov 7 07:46 LICENSE-BSD-glMatrix -rw-r--r-- 1 1023 1023 1469 Nov 7 07:46 LICENSE-BSD-recon -rw-r--r-- 1 1023 1023 14041 Nov 7 07:46 LICENSE-EPL-OTP -rw-r--r-- 1 1023 1023 757 Nov 7 07:46 LICENSE-ISC-cowboy -rw-r--r-- 1 1023 1023 1084 Nov 7 07:46 LICENSE-MIT-EJS -rw-r--r-- 1 1023 1023 1087 Nov 7 07:46 LICENSE-MIT-EJS10 -rw-r--r-- 1 1023 1023 1057 Nov 7 07:46 LICENSE-MIT-Erlware-Commons -rw-r--r-- 1 1023 1023 1069 Nov 7 07:46 LICENSE-MIT-Flot -rw-r--r-- 1 1023 1023 1087 Nov 7 07:46 LICENSE-MIT-Mochi -rw-r--r-- 1 1023 1023 1087 Nov 7 07:46 LICENSE-MIT-Mochiweb -rw-r--r-- 1 1023 1023 1073 Nov 7 07:46 LICENSE-MIT-Sammy -rw-r--r-- 1 1023 1023 1076 Nov 7 07:46 LICENSE-MIT-Sammy060 -rw-r--r-- 1 1023 1023 1056 Nov 7 07:46 LICENSE-MIT-SockJS -rw-r--r-- 1 1023 1023 1074 Nov 7 07:46 LICENSE-MIT-jQuery -rw-r--r-- 1 1023 1023 1075 Nov 7 07:46 LICENSE-MIT-jQuery164 -rw-r--r-- 1 1023 1023 24897 Nov 7 07:46 LICENSE-MPL-RabbitMQ -rw-r--r-- 1 1023 1023 16726 Nov 7 07:46 LICENSE-MPL2 drwxr-xr-x 2 1023 1023 12288 Nov 7 07:46 ebin drwxr-xr-x 3 1023 1023 4096 Nov 7 07:46 etc drwxr-xr-x 2 1023 1023 4096 Nov 7 07:46 include drwxr-xr-x 2 1023 1023 4096 Nov 7 07:46 plugins drwxr-xr-x 2 1023 1023 4096 Nov 7 07:46 sbin drwxr-xr-x 3 1023 1023 4096 Nov 7 07:46 share在 rabbitmq2 和 rabbitmq3 同樣執(zhí)行上面的步驟即可。
-
運行 Rabbitmq
root@rabbitmq1:~/rabbitmq_server-3.6.14# cd sbin/ root@rabbitmq1:~/rabbitmq_server-3.6.14/sbin# ls -l total 36 -rwxr-xr-x 1 1023 1023 1885 Nov 7 07:46 rabbitmq-defaults -rwxr-xr-x 1 1023 1023 12095 Nov 7 07:46 rabbitmq-env -rwxr-xr-x 1 1023 1023 1362 Nov 7 07:46 rabbitmq-plugins -rwxr-xr-x 1 1023 1023 10971 Nov 7 07:46 rabbitmq-server -rwxr-xr-x 1 1023 1023 1480 Nov 7 07:46 rabbitmqctl root@rabbitmq1:~/rabbitmq_server-3.6.14/sbin# ./rabbitmq-server RabbitMQ 3.6.14. Copyright (C) 2007-2017 Pivotal Software, Inc. ## ## Licensed under the MPL. See http://www.rabbitmq.com/ ## ## ########## Logs: /root/rabbitmq_server-3.6.14/var/log/rabbitmq/rabbit@rabbitmq1.log ###### ## /root/rabbitmq_server-3.6.14/var/log/rabbitmq/rabbit@rabbitmq1-sasl.log ########## Starting broker... completed with 0 plugins.現(xiàn)在 RabbitMQ 就已經(jīng)啟動起來了,但是有一個問題,RabbitMQ 一直占據(jù)著終端,我們得讓它在后臺運行。Ctrl+C 終止進程,然后執(zhí)行命令
root@rabbitmq1:~/rabbitmq_server-3.6.14/sbin# ./rabbitmq-server -detached Warning: PID file not written; -detached was passed.可以使用命令查看運行狀態(tài):
root@rabbitmq1:~/rabbitmq_server-3.6.14/sbin# ./rabbitmqctl status下面開始將這三個獨立的 RabbitMQ 組建成一個集群。
-
-
Rabbit 集群
-
集群模式
集群中的節(jié)點有兩種,一種是內存節(jié)點,一種是磁盤節(jié)點;內存節(jié)點由于沒有磁盤讀寫,性能比磁盤節(jié)點要好,磁盤節(jié)點可以將狀態(tài)持久化到磁盤,可用性比內存節(jié)點要好,需要權衡考慮。 本文的模式是一臺磁盤節(jié)點,作為數(shù)據(jù)備份,兩臺內存節(jié)點,用于提高性能。 -
配置 hosts
在安裝好 RabbitMQ 的三臺機器上分別修改 /etc/hosts 文件。
rabbit@rabbitmq1 上:
root@rabbitmq1:~# cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.2 rabbitmq1 172.17.0.3 rabbitmq2 172.17.0.4 rabbitmq3rabbit@rabbitmq2 上:
root@rabbitmq2:~# cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.2 rabbitmq1 172.17.0.3 rabbitmq2 172.17.0.4 rabbitmq3rabbit@rabbitmq3 上:
root@rabbitmq2:~# cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.2 rabbitmq1 172.17.0.3 rabbitmq2 172.17.0.4 rabbitmq3 -
配置 Cookie
Erlang 節(jié)點間通過認證 Erlang cookie 的方式允許互相通信。因為 rabbitmqctl 使用 Erlang OTP 通信機制來和 Rabbit 節(jié)點通信,運行 rabbitmqctl 的機器和所要連接的 Rabbit 節(jié)點必須使用相同的 Erlang cookie 。否則你會得到一個錯誤。為了保證這三臺機器的 Erlang cookie 相同,我們將 rabbitmq1 上面的 Erlang cookie 文件復制到另外兩臺機器上面。在我的機器上面, Erlang cookie 文件的路徑是
/root/.erlang.cookie,下面是將這個 cookie 文件復制到另外兩臺機器上的步驟:(在 Docker 宿主機上執(zhí)行)? ~ docker cp rabbitmq1:/root/.erlang.cookie . ? ~ docker cp .erlang.cookie rabbitmq2:/root ? ~ docker cp .erlang.cookie rabbitmq3:/root步驟解釋:現(xiàn)將 rabbitmq1 上的 .erlang.cookie 復制到宿主機的當前目錄,然后在分別復制到 rabbitmq2 和 rabbitmq3 上的 root 目錄下。
OK,現(xiàn)在三臺機器上具有相同的 Erlang cookie 了。下面開始組建集群。
-
組建集群
-
查看集群狀態(tài)
root@rabbitmq1:~/rabbitmq_server-3.6.14/sbin# ./rabbitmqctl cluster_status Cluster status of node rabbit@rabbitmq1 [{nodes,[{disc,[rabbit@rabbitmq1]}]}, {running_nodes,[rabbit@rabbitmq1]}, {cluster_name,<<"rabbit@rabbitmq1">>}, {partitions,[]}, {alarms,[{rabbit@rabbitmq1,[]}]}]可以看到
{cluster_name,<<"rabbit@rabbitmq1">>},這是集群名字,其他節(jié)點可以join到這個集群中。其實,所有節(jié)點都是平等的,你可以加入到任意一個集群中,最終這些節(jié)點都會在同一個集群中。
-
將 RabbitMQ 停止運行
rabbitmq2:
root@rabbitmq2:~/rabbitmq_server-3.6.14/sbin# ./rabbitmqctl stop_app Stopping rabbit application on node rabbit@rabbitmq2rabbitmq3:
root@rabbitmq3:~/rabbitmq_server-3.6.14/sbin# ./rabbitmqctl stop_app Stopping rabbit application on node rabbit@rabbitmq3 -
執(zhí)行加入集群命令
rabbitmq2:
root@rabbitmq2:~/rabbitmq_server-3.6.14/sbin# ./rabbitmqctl join_cluster rabbit@rabbitmq1 Clustering node rabbit@rabbitmq2 with rabbit@rabbitmq1 root@rabbitmq2:~/rabbitmq_server-3.6.14/sbin# ./rabbitmqctl start_app Starting node rabbit@rabbitmq2rabbitmq3:
root@rabbitmq3:~/rabbitmq_server-3.6.14/sbin# ./rabbitmqctl join_cluster rabbit@rabbitmq1 Clustering node rabbit@rabbitmq3 with rabbit@rabbitmq1 root@rabbitmq3:~/rabbitmq_server-3.6.14/sbin# ./rabbitmqctl start_app Starting node rabbit@rabbitmq3在任意節(jié)點查看集群狀態(tài):
root@rabbitmq1:~/rabbitmq_server-3.6.14/sbin# ./rabbitmqctl cluster_status Cluster status of node rabbit@rabbitmq1 [{nodes,[{disc,[rabbit@rabbitmq1,rabbit@rabbitmq2,rabbit@rabbitmq3]}]}, {running_nodes,[rabbit@rabbitmq3,rabbit@rabbitmq2,rabbit@rabbitmq1]}, {cluster_name,<<"rabbit@rabbitmq1">>}, {partitions,[]}, {alarms,[{rabbit@rabbitmq3,[]},{rabbit@rabbitmq2,[]},{rabbit@rabbitmq1,[]}]}]可以看到三個節(jié)點已經(jīng)構建成了一個集群,但是有一個小問題,
{disc,[rabbit@rabbitmq1,rabbit@rabbitmq2,rabbit@rabbitmq3]},所有的節(jié)點都是磁盤節(jié)點,和剛開始構想的不太一樣,我們只需要一個磁盤節(jié)點,另外兩個都是內存節(jié)點,這樣我們在保證可用性的同時,還能提高集群的整體性能。所以,我們需要將兩臺磁盤節(jié)點改成內存節(jié)點。
-
將磁盤節(jié)點修改為內存節(jié)點
- 將節(jié)點從集群中移除
rabbitmq2:
root@rabbitmq2:~/rabbitmq_server-3.6.14/sbin# ./rabbitmqctl stop_app Stopping rabbit application on node rabbit@rabbitmq2 root@rabbitmq2:~/rabbitmq_server-3.6.14/sbin# ./rabbitmqctl reset Resetting node rabbit@rabbitmq2rabbitmq3:
root@rabbitmq3:~/rabbitmq_server-3.6.14/sbin# ./rabbitmqctl stop_app Stopping rabbit application on node rabbit@rabbitmq3 root@rabbitmq3:~/rabbitmq_server-3.6.14/sbin# ./rabbitmqctl reset Resetting node rabbit@rabbitmq3這里關鍵的命令是
./rabbitmqctl reset。reset 命令在節(jié)點為單機狀態(tài)和是集群的一部分時行為有點不太一樣。節(jié)點單機狀態(tài)時,reset 命令將清空節(jié)點的狀態(tài),并將其恢復到空白狀態(tài)。當節(jié)點是集群的一部分時,該命令也會和集群中的磁盤節(jié)點通信,告訴他們該節(jié)點正在離開集群。
這很重要,不然,集群會認為該節(jié)點出了故障,并期望其最終能夠恢復回來,在該節(jié)點回來之前,集群禁止新的節(jié)點加入。
-
將節(jié)點重新加入集群
rabbitmq2:
root@rabbitmq2:~/rabbitmq_server-3.6.14/sbin# ./rabbitmqctl join_cluster --ram rabbit@rabbitmq1 Clustering node rabbit@rabbitmq2 with rabbit@rabbitmq1 root@rabbitmq2:~/rabbitmq_server-3.6.14/sbin# ./rabbitmqctl start_app Starting node rabbit@rabbitmq2rabbitmq3:
root@rabbitmq3:~/rabbitmq_server-3.6.14/sbin# ./rabbitmqctl join_cluster --ram rabbit@rabbitmq1 Clustering node rabbit@rabbitmq3 with rabbit@rabbitmq1 root@rabbitmq3:~/rabbitmq_server-3.6.14/sbin# ./rabbitmqctl start_app Starting node rabbit@rabbitmq3然后查看集群狀態(tài):
root@rabbitmq1:~/rabbitmq_server-3.6.14/sbin# ./rabbitmqctl cluster_status Cluster status of node rabbit@rabbitmq1 [{nodes,[{disc,[rabbit@rabbitmq1]},{ram,[rabbit@rabbitmq3,rabbit@rabbitmq2]}]}, {running_nodes,[rabbit@rabbitmq3,rabbit@rabbitmq2,rabbit@rabbitmq1]}, {cluster_name,<<"rabbit@rabbitmq1">>}, {partitions,[]}, {alarms,[{rabbit@rabbitmq3,[]},{rabbit@rabbitmq2,[]},{rabbit@rabbitmq1,[]}]}]現(xiàn)在集群已經(jīng)大體符合開始時我們的構想了,一個磁盤節(jié)點,兩個內存節(jié)點。但是,我們的集群還是有點小問題,我們這個集群更適合非持久化隊列,只有該隊列是非持久的,客戶端磁能重新連接到集群里的其他節(jié)點,并創(chuàng)建隊列。加入該隊列是持久化的,那么我們將集群恢復的唯一辦法是將故障節(jié)點恢復起來。所以,我們需要對我們的集群進行改造,稍后我們會看到 Rabbit 團隊給我們帶來的內建的雙活冗余選項:鏡像隊列。
-
-
-
使用 HAProxy 做負載均衡
-
下載 HAProxy 源碼
Git 倉庫地址:Git: haproxy
下載源碼:
root@haproxy:~# git clone https://github.com/haproxy/haproxy.git -
編譯&安裝
更詳細的編譯參數(shù)請參考文檔,本文通用的編譯參數(shù)。
編譯 & 安裝:
root@haproxy:~/haproxy# make TARGET=generic root@haproxy:~/haproxy# make install現(xiàn)在你可以運行
haproxy --help來看看它的配置選項。現(xiàn)在需要對 HAProxy 進行配置,這樣它就可以 RabbitMQ 做負載均衡了。 -
配置 HAProxy
HAProxy 使用單一配置文件來定義所有屬性,包括從前端 IP 到后端服務器。下列清單展示了用于本地 Rabbit 集群負載均衡的配置。
配置文件參數(shù)解釋:
###########全局配置######### global log 127.0.0.1 local0 #[日志輸出配置,所有日志都記錄在本機,通過local0輸出] log 127.0.0.1 local1 notice #定義haproxy 日志級別[error warringinfo debug] daemon #以后臺形式運行harpoxy nbproc 1 #設置進程數(shù)量 maxconn 4096 #默認最大連接數(shù),需考慮ulimit-n限制 #user haproxy #運行haproxy的用戶 #group haproxy #運行haproxy的用戶所在的組 #pidfile /var/run/haproxy.pid #haproxy 進程PID文件 #ulimit-n 819200 #ulimit 的數(shù)量限制 #chroot /usr/share/haproxy #chroot運行路徑 #debug #haproxy 調試級別,建議只在開啟單進程的時候調試 #quiet ########默認配置############ defaults log global mode http #默認的模式mode { tcp|http|health },tcp是4層,http是7層,health只會返回OK option httplog #日志類別,采用httplog option dontlognull #不記錄健康檢查日志信息 retries 2 #兩次連接失敗就認為是服務器不可用,也可以通過后面設置 #option forwardfor #如果后端服務器需要獲得客戶端真實ip需要配置的參數(shù),可以從Http Header中獲得客戶端ip option httpclose #每次請求完畢后主動關閉http通道,haproxy不支持keep-alive,只能模擬這種模式的實現(xiàn) #option redispatch #當serverId對應的服務器掛掉后,強制定向到其他健康的服務器,以后將不支持 option abortonclose #當服務器負載很高的時候,自動結束掉當前隊列處理比較久的鏈接 maxconn 4096 #默認的最大連接數(shù) timeout connect 5000ms #連接超時 timeout client 30000ms #客戶端超時 timeout server 30000ms #服務器超時 #timeout check 2000 #心跳檢測超時 #timeout http-keep-alive10s #默認持久連接超時時間 #timeout http-request 10s #默認http請求超時時間 #timeout queue 1m #默認隊列超時時間 balance roundrobin #設置默認負載均衡方式,輪詢方式 #balance source #設置默認負載均衡方式,類似于nginx的ip_hash #balnace leastconn #設置默認負載均衡方式,最小連接數(shù) ########統(tǒng)計頁面配置######## listen stats bind 0.0.0.0:1080 #設置Frontend和Backend的組合體,監(jiān)控組的名稱,按需要自定義名稱 mode http #http的7層模式 option httplog #采用http日志格式 #log 127.0.0.1 local0 err #錯誤日志記錄 maxconn 10 #默認的最大連接數(shù) stats refresh 30s #統(tǒng)計頁面自動刷新時間 stats uri /stats #統(tǒng)計頁面url stats realm XingCloud\ Haproxy #統(tǒng)計頁面密碼框上提示文本 stats auth admin:admin #設置監(jiān)控頁面的用戶和密碼:admin,可以設置多個用戶名 stats auth Frank:Frank #設置監(jiān)控頁面的用戶和密碼:Frank stats hide-version #隱藏統(tǒng)計頁面上HAProxy的版本信息 stats admin if TRUE #設置手工啟動/禁用,后端服務器(haproxy-1.4.9以后版本) ########設置haproxy 錯誤頁面##### #errorfile 403 /home/haproxy/haproxy/errorfiles/403.http #errorfile 500 /home/haproxy/haproxy/errorfiles/500.http #errorfile 502 /home/haproxy/haproxy/errorfiles/502.http #errorfile 503 /home/haproxy/haproxy/errorfiles/503.http #errorfile 504 /home/haproxy/haproxy/errorfiles/504.http ########frontend前端配置############## frontend main bind *:80 #這里建議使用bind *:80的方式,要不然做集群高可用的時候有問題,vip切換到其他機器就不能訪問了。 acl web hdr(host) -i www.abc.com #acl后面是規(guī)則名稱,-i為忽略大小寫,后面跟的是要訪問的域名,如果訪問www.abc.com這個域名,就觸發(fā)web規(guī)則,。 acl img hdr(host) -i img.abc.com #如果訪問img.abc.com這個域名,就觸發(fā)img規(guī)則。 use_backend webserver if web #如果上面定義的web規(guī)則被觸發(fā),即訪問www.abc.com,就將請求分發(fā)到webserver這個作用域。 use_backend imgserver if img #如果上面定義的img規(guī)則被觸發(fā),即訪問img.abc.com,就將請求分發(fā)到imgserver這個作用域。 default_backend dynamic #不滿足則響應backend的默認頁面 ########backend后端配置############## backend webserver #webserver作用域 mode http balance roundrobin #balance roundrobin 負載輪詢,balance source 保存session值,支持static-rr,leastconn,first,uri等參數(shù) option httpchk /index.html HTTP/1.0 #健康檢查, 檢測文件,如果分發(fā)到后臺index.html訪問不到就不再分發(fā)給它 server web1 10.16.0.9:8085 cookie 1 weight 5 check inter 2000 rise 2 fall 3 server web2 10.16.0.10:8085 cookie 2 weight 3 check inter 2000 rise 2 fall 3 #cookie 1表示serverid為1,check inter 1500 是檢測心跳頻率 #rise 2是2次正確認為服務器可用,fall 3是3次失敗認為服務器不可用,weight代表權重 backend imgserver mode http option httpchk /index.php balance roundrobin server img01 192.168.137.101:80 check inter 2000 fall 3 server img02 192.168.137.102:80 check inter 2000 fall 3 backend dynamic balance roundrobin server test1 192.168.1.23:80 check maxconn 2000 server test2 192.168.1.24:80 check maxconn 2000 listen tcptest bind 0.0.0.0:5222 mode tcp option tcplog #采用tcp日志格式 balance source #log 127.0.0.1 local0 debug server s1 192.168.100.204:7222 weight 1 server s2 192.168.100.208:7222 weight 1我們的配置文件(/root/haproxy/haproxy.cnf)內容如下:
root@haproxy:~/haproxy# cat haproxy.cnf global log 127.0.0.1 local0 info log 127.0.0.1 local1 notice daemon maxconn 4096 defaults log global mode tcp option tcplog option dontlognull retries 3 option abortonclose maxconn 4096 timeout connect 5000ms timeout client 3000ms timeout server 3000ms balance roundrobin listen private_monitoring bind 0.0.0.0:8100 mode http option httplog stats refresh 5s stats uri /stats stats realm Haproxy stats auth admin:admin listen rabbitmq_admin bind 0.0.0.0:8102 server rabbitmq1 172.17.0.2:15672 server rabbitmq2 172.17.0.3:15672 server rabbitmq3 172.17.0.4:15672 listen rabbitmq_cluster bind 0.0.0.0:8101 mode tcp option tcplog balance roundrobin server rabbitmq1 172.17.0.2:5672 check inter 5000 rise 2 fall 3 server rabbitmq2 172.17.0.3:5672 check inter 5000 rise 2 fall 3 server rabbitmq3 172.17.0.4:5672 check inter 5000 rise 2 fall 3 -
運行 HAProxy
讓我們用新的配置啟動 HAProxy 并確保它能工作:
root@haproxy:~/haproxy# haproxy -f haproxy.cnf如果一切正常的話,你現(xiàn)在可以順利的加載
http://localhost:8100/stats頁面,如果配置文件中配置了auth的話,你需要進行登錄:WX20171110-154612@2x.png這有個小缺陷,雖然我們在配置文件中做了 management 的反向代理,但是我們仍然不能訪問
http://localhost:8102/。這是因為我們沒有開啟 rabbit management 插件,下面我們來開啟這個插件。
-
-
開啟 Rabbit Management 插件,從 WEB 端管理 RabbitMQ
插件是一種擴展作者未能預見到的服務器的行為方式。RabbitMQ 插件是由 Erlang 語言編寫的,并且和服務器一同運行在同一個 Erlang VM 中。我們先開啟 Management 插件。執(zhí)行如下命令:
root@rabbitmq1:~/rabbitmq_server-3.6.14/sbin# ./rabbitmq-plugins enable rabbitmq_management The following plugins have been enabled: amqp_client cowlib cowboy rabbitmq_web_dispatch rabbitmq_management_agent rabbitmq_management Applying plugin configuration to rabbit@rabbitmq1... started 6 plugins. root@rabbitmq1:~/rabbitmq_server-3.6.14/sbin# ./rabbitmqctl stop Stopping and halting node rabbit@rabbitmq1 root@rabbitmq1:~/rabbitmq_server-3.6.14/sbin# ./rabbitmq-server -detached Warning: PID file not written; -detached was passed.然后重新訪問
http://localhost:8102/,頁面提示我們需要登錄,RabbitMQ 有一個默認的賬號 guest,密碼是 guest。我們用這個賬號登陸會發(fā)現(xiàn),我們被拒絕了,頁面提示User can only log in via localhost,這是因為rabbitmq從3.3.0開始禁止使用guest/guest權限通過除localhost外的訪問。如果想使用 guest 通過遠程機器訪問,需要在 RabbitMQ 配置文件中設置 loopback_users 為 [],我們的配置文件內容如下:/root/rabbitmq_server-3.6.14/etc/rabbitmq/rabbitmq.config :
root@rabbitmq1:~/rabbitmq_server-3.6.14/etc/rabbitmq# cat rabbitmq.config r刷新頁面,然后重新登陸,現(xiàn)在我們能看到如下的界面:
WechatIMG84.jpeg下面黃色部分是因為另外兩個節(jié)點還未開啟 Management 插件,開啟即可。
- 使用 RabbitMQ 鏡像功能(待補充)
-
升級集群節(jié)點
- 關閉生產(chǎn)者
- 備份當前配置
- 排空隊列 - 觀察隊列狀態(tài),直到所有隊列都為空
- 關閉節(jié)點
- 解壓新版本 RabbitMQ 到現(xiàn)有的安裝目錄
- 啟動磁盤節(jié)點
- 啟動內存節(jié)點

