RabbitMQ的安裝集群、鏡像隊(duì)列配置規(guī)劃
1 RabbitMQ集群簡介
RabbitMQ 集群是一個(gè)或多個(gè)節(jié)點(diǎn)的邏輯分組,每個(gè)節(jié)點(diǎn)共享用戶、虛擬主機(jī)、隊(duì)列、流、交換機(jī)、綁定、運(yùn)行時(shí)參數(shù)和其他分布式狀態(tài)。
集群中的節(jié)點(diǎn)名稱必須是唯一的。在集群中,節(jié)點(diǎn)使用節(jié)點(diǎn)名稱來識(shí)別和相互聯(lián)系。這意味著每個(gè)節(jié)點(diǎn)名稱的主機(jī)名部分必須可以解析。CLI 工具也使用節(jié)點(diǎn)名稱來識(shí)別和尋址節(jié)點(diǎn)。當(dāng)節(jié)點(diǎn)啟動(dòng)時(shí),它會(huì)檢查是否已為其分配了節(jié)點(diǎn)名稱。如果未顯式配置值,則節(jié)點(diǎn)會(huì)解析其主機(jī)名并在其前面加上rabbit@ 以計(jì)算其節(jié)點(diǎn)名稱。
RabbitMQ代理操作所需的所有數(shù)據(jù)/狀態(tài)都在所有節(jié)點(diǎn)之間復(fù)制。消息隊(duì)列是此規(guī)則的例外,默認(rèn)情況下消息隊(duì)列駐留在一個(gè)節(jié)點(diǎn)上,但可以從所有節(jié)點(diǎn)查看和訪問。要在集群中的節(jié)點(diǎn)之間復(fù)制隊(duì)列,請(qǐng)使用支持復(fù)制的隊(duì)列類型。
一般提到的RabbitMQ鏡像集群,實(shí)際上由集群加上經(jīng)典消息隊(duì)列的鏡像復(fù)制策略構(gòu)成。RabbitMQ 4.0及后續(xù)版本不再支持經(jīng)典消息隊(duì)列的鏡像復(fù)制功能,因此本例采用RabbitMQ 3.13.7版實(shí)現(xiàn)。
2 安裝配置規(guī)劃
| 配置項(xiàng) | 主機(jī)一 | 主機(jī)二 |
|---|---|---|
| IP地址 | 10.10.1.45 | 10.10.1.46 |
| 主機(jī)名稱 | KL5 | KL6 |
| 配置用戶 | kylin | kylin |
| 安裝文件目錄 | /home/kylin/Install | /home/kylin/Install |
| 消息隊(duì)列目錄 | /data/rabbitmq | /data/rabbitmq |
| 相關(guān)端口 | 使用默認(rèn)值 | 使用默認(rèn)值 |
| MQ測(cè)試用戶 | test/password | |
| MQ虛擬主機(jī) | /test/ | |
| 鏡像策略名 | jxjq | |
3 安裝RabbitMQ
3.1 安裝版本說明
RabbitMQ僅4.0以下版本支持經(jīng)典隊(duì)列鏡像,因此本例選擇RabbitMQ 3.x版本中最新的3.13.7版。根據(jù)官方網(wǎng)站上RabbitMQ與Erlang的版本兼容性矩陣,Erlang版本選擇26.x中最新的26.2.5.15。
銀河麒麟V10的桌面版和服務(wù)器版的安裝體系差異很大,默認(rèn)已經(jīng)安裝的包也不同,因此在安裝Erlang之前,銀河麒麟V10的桌面版和服務(wù)器版需要安裝不同的包。本例基于以下銀河麒麟版本建立。
Kylin-Desktop-V10-GFB-HWE-Release-020-X86_64
Kylin-Desktop-V10-GFB-020-Release-20.1.3-ARM64
Kylin-Server-V10-GFB-Release-030-X86_64
Kylin-Server-V10-GFB-030-Release-30.1.3-ARM64
3.2 麒麟V10桌面版(GFB)
3.2.1 安裝前準(zhǔn)備
使用管理員用戶,創(chuàng)建安裝文件目錄。
kylin@KL5:~$ mkdir Install
3.2.2 安裝ncurses
3.2.2.1 使用deb包安裝
銀河麒麟V10桌面版(GFB)默認(rèn)已安裝libtinfo6、libncurses6、libncursesw6,版本為6.2-0kylin2,需要安裝對(duì)應(yīng)版本的libncurses-dev。本例拿到的是6.2-0kylin2.1版本,因?yàn)橐蕾囮P(guān)系除安裝libncurses-dev外,需要安裝對(duì)應(yīng)版本的libtinfo6、libncurses6、libncursesw6。
使用管理員賬戶,執(zhí)行dpkg -i命令安裝libncurses-dev及其依賴包。
kylin@KL5:~/Install$ sudo dpkg -i libncurses-dev_6.2-0kylin2.1_amd64.deb libtinfo6_6.2-0kylin2.1_amd64.deb libncurses6_6.2-0kylin2.1_amd64.deb libncursesw6_6.2-0kylin2.1_amd64.deb 正在選中未選擇的軟件包 libncurses-dev:amd64。 (正在讀取數(shù)據(jù)庫 ... 系統(tǒng)當(dāng)前共安裝有 187718 個(gè)文件和目錄。) 準(zhǔn)備解壓 libncurses-dev_6.2-0kylin2.1_amd64.deb ... 正在解壓 libncurses-dev:amd64 (6.2-0kylin2.1) ... 準(zhǔn)備解壓 libtinfo6_6.2-0kylin2.1_amd64.deb ... 正在解壓 libtinfo6:amd64 (6.2-0kylin2.1) 并覆蓋 (6.2-0kylin2) ... 準(zhǔn)備解壓 libncurses6_6.2-0kylin2.1_amd64.deb ... 正在解壓 libncurses6:amd64 (6.2-0kylin2.1) 并覆蓋 (6.2-0kylin2) ... 準(zhǔn)備解壓 libncursesw6_6.2-0kylin2.1_amd64.deb ... 正在解壓 libncursesw6:amd64 (6.2-0kylin2.1) 并覆蓋 (6.2-0kylin2) ... 正在設(shè)置 libtinfo6:amd64 (6.2-0kylin2.1) ... 正在設(shè)置 libncurses6:amd64 (6.2-0kylin2.1) ... 正在設(shè)置 libncursesw6:amd64 (6.2-0kylin2.1) ... 正在設(shè)置 libncurses-dev:amd64 (6.2-0kylin2.1) ... 正在處理用于 man-db (2.9.1-1kylin0k1) 的觸發(fā)器 ... 正在處理用于 libc-bin (2.31-0kylin9.1k20.8) 的觸發(fā)器 ...
如果無法獲取麒麟官方安裝包,可以下載debian提供的包,版本為6.2+20201114-2或其他接近版本??梢允褂弥锌拼蟮?a rel="external nofollow" title="鏡像網(wǎng)站">鏡像網(wǎng)站。
3.2.2.2 使用源代碼安裝
從gnu官方網(wǎng)站下載最新版本的源代碼包ncurses-6.5.tar.gz,放置到安裝目錄。解壓縮后進(jìn)入解壓后的目錄,執(zhí)行configure命令。
kylin@KL5:~/Install$ tar -zxf ncurses-6.5.tar.gz
kylin@KL5:~/Install$ cd ncurses-6.5/
kylin@KL5:~/Install/ncurses-6.5$ ./configure
checking for ggrep... no
checking for grep... grep
checking for egrep... grep -E
Configuring NCURSES 6.5 ABI 6 (Fri Sep 19 10:43:14 CST 2025)
…………
這里很多提示信息,此處省略。
…………
** Configuration summary for NCURSES 6.5 20240427:
extended funcs: yes
xterm terminfo: xterm-new
bin directory: /usr/bin
lib directory: /usr/lib
include directory: /usr/include
man directory: /usr/share/man
terminfo directory: /usr/share/terminfo繼續(xù)執(zhí)行make指令進(jìn)行編譯。
kylin@KL5:~/Install/ncurses-6.5$ make ( cd man && make DESTDIR="" RPATH_LIST="/usr/lib" all ) make[1]: 進(jìn)入目錄“/home/kylin/Install/ncurses-6.5/man” /bin/sh ./MKterminfo.sh ./terminfo.head ./../include/Caps ./../include/Caps-ncurses ./terminfo.tail >terminfo.5 ………… 這里很多提示信息,此處省略。 ………… compiling demo (obj_s) /usr/bin/g++ -o demo ../objects/demo.o -L../lib -lncurses++w -L../lib -lformw -lmenuw -lpanelw -lncursesw -lutil -DHAVE_CONFIG_H -DBUILDING_NCURSES_CXX -I../c++ -I. -I../include -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 -DNDEBUG -O2 -DNCURSES_STATIC make[1]: 離開目錄“/home/kylin/Install/ncurses-6.5/c++”
編譯成功后,用管理員賬戶執(zhí)行make install安裝。
kylin@KL5:~/Install/ncurses-6.5$ sudo make install ( cd man && make DESTDIR="" RPATH_LIST="/usr/lib" install ) make[1]: 進(jìn)入目錄“/home/kylin/Install/ncurses-6.5/man” /bin/sh ../edit_man.sh normal installing /usr/share/man . terminfo.5 *-config.1 ./*.[0-9]* ...made /home/kylin/Install/ncurses-6.5/man_alias.sed ………… 這里很多提示信息,此處省略。 ………… installing ./cursesapp.h in /usr/include installing ./cursesf.h in /usr/include installing ./cursesm.h in /usr/include installing ./cursesp.h in /usr/include installing ./cursesw.h in /usr/include installing ./cursslk.h in /usr/include installing etip.h in /usr/include make[1]: 離開目錄“/home/kylin/Install/ncurses-6.5/c++”
3.2.3 安裝OpenSSL
從OpenSSL官方網(wǎng)站下載指定版本的源代碼包openssl-1.1.1w.tar.gz,放置到安裝目錄。解壓縮openssl-OpenSSL_1_1_1w.zip,進(jìn)入解壓后的目錄。
kylin@KL5:~/Install$ unzip openssl-OpenSSL_1_1_1w.zip Archive: openssl-OpenSSL_1_1_1w.zip e04bd3433fd84e1861bf258ea37928d9845e6a86 creating: openssl-OpenSSL_1_1_1w/ inflating: openssl-OpenSSL_1_1_1w/ACKNOWLEDGEMENTS inflating: openssl-OpenSSL_1_1_1w/AUTHORS inflating: openssl-OpenSSL_1_1_1w/CHANGES inflating: openssl-OpenSSL_1_1_1w/CONTRIBUTING ………… 這里很多提示信息,此處省略。 ………… inflating: openssl-OpenSSL_1_1_1w/util/shlib_wrap.sh.in inflating: openssl-OpenSSL_1_1_1w/util/su-filter.pl inflating: openssl-OpenSSL_1_1_1w/util/unlocal_shlib.com.in creating: openssl-OpenSSL_1_1_1w/wycheproof/ kylin@KL5:~/Install$ cd openssl-OpenSSL_1_1_1w/
執(zhí)行config命令指定安裝目錄進(jìn)行配置。
kylin@KL5:~/Install/openssl-OpenSSL_1_1_1w$ ./config --prefix=/usr/local/openssl Operating system: x86_64-whatever-linux2 Configuring OpenSSL version 1.1.1w (0x1010117fL) for linux-x86_64 Using os-specific seed configuration Creating configdata.pm Creating Makefile ********************************************************************** *** *** *** OpenSSL has been successfully configured *** *** *** *** If you encounter a problem while building, please open an *** *** issue on GitHub <https://github.com/openssl/openssl/issues> *** *** and include the output from the following command: *** *** *** *** perl configdata.pm --dump *** *** *** *** (If you are new to OpenSSL, you might want to consult the *** *** 'Troubleshooting' section in the INSTALL file first) *** *** *** **********************************************************************
繼續(xù)執(zhí)行make指令進(jìn)行編譯。
kylin@KL5:~/Install/openssl-OpenSSL_1_1_1w$ make
/usr/bin/perl "-I." -Mconfigdata "util/dofile.pl" \
"-oMakefile" include/crypto/bn_conf.h.in > include/crypto/bn_conf.h
/usr/bin/perl "-I." -Mconfigdata "util/dofile.pl" \
"-oMakefile" include/crypto/dso_conf.h.in > include/crypto/dso_conf.h
/usr/bin/perl "-I." -Mconfigdata "util/dofile.pl" \
"-oMakefile" include/openssl/opensslconf.h.in > include/openssl/opensslconf.h
make depend && make _all
…………
這里很多提示信息,此處省略。
…………
/usr/bin/perl "-I." -Mconfigdata "util/dofile.pl" \
"-oMakefile" util/shlib_wrap.sh.in > "util/shlib_wrap.sh"
chmod a+x util/shlib_wrap.sh
make[1]: Leaving directory '/home/kylin/Install/openssl-OpenSSL_1_1_1w'編譯成功后,用管理員賬戶執(zhí)行make install安裝。
kylin@KL5:~/Install/openssl-OpenSSL_1_1_1w$ sudo make install make depend && make _build_libs make[1]: Entering directory '/home/kylin/Install/openssl-OpenSSL_1_1_1w' make[1]: Leaving directory '/home/kylin/Install/openssl-OpenSSL_1_1_1w' make[1]: Entering directory '/home/kylin/Install/openssl-OpenSSL_1_1_1w' make[1]: Nothing to be done for '_build_libs'. make[1]: Leaving directory '/home/kylin/Install/openssl-OpenSSL_1_1_1w' ………… 這里很多提示信息,此處省略。 ………… /usr/local/openssl/share/doc/openssl/html/man7/SM2.html /usr/local/openssl/share/doc/openssl/html/man7/ssl.html /usr/local/openssl/share/doc/openssl/html/man7/X25519.html /usr/local/openssl/share/doc/openssl/html/man7/X448.html -> /usr/local/openssl/share/doc/openssl/html/man7/X25519.html /usr/local/openssl/share/doc/openssl/html/man7/x509.html
3.3 麒麟V10高級(jí)服務(wù)器版(GFB)
3.3.1 安裝前準(zhǔn)備
銀河麒麟V10高級(jí)服務(wù)器版,允許使用root直接登錄,這里安全起見,創(chuàng)建用戶kylin并加入wheel組,作為管理員用戶使用。
[root@localhost ~]# adduser kylin [root@localhost ~]# passwd kylin 更改用戶 kylin 的密碼 。 新的 密碼: 重新輸入新的 密碼: passwd:所有的身份驗(yàn)證令牌已經(jīng)成功更新。 [root@localhost ~]# usermod -aG wheel kylin
再使用root用戶創(chuàng)建/data共享目錄。
[root@localhost ~]# mkdir /data [root@localhost ~]# chmod a+rwx /data [root@localhost ~]# chmod -t /data
使用root用戶修改主機(jī)名,并重新登錄。
[root@localhost ~]# hostnamectl set-hostname KL5 [root@localhost ~]# logout
使用kylin用戶創(chuàng)建目錄Install用于放置所有安裝文件。
[kylin@KL5 ~]$ mkdir Install
3.3.2 安裝ncurses
在麒麟V10高級(jí)服務(wù)器版擴(kuò)展盤中可以找到ncurses-devel的RPM包,其中x86版文件名為“ncurses-devel-6.2-3.gfb03.ky10.x86_64.rpm”,ARM版文件名為“ncurses-devel-6.2-3.gfb03.ky10.aarch64.rpm”。使用管理員賬戶安裝RPM包。
[kylin@KL5 Install]$ sudo rpm -i ncurses-devel-6.2-3.gfb03.ky10.x86_64.rpm 警告:ncurses-devel-6.2-3.gfb03.ky10.x86_64.rpm: 頭V4 RSA/SHA1 Signature, 密鑰 ID 34fe765a: NOKEY
3.4 安裝Erlang
從Erlang官網(wǎng)網(wǎng)站下載指定版本的源代碼包otp_src_26.2.5.15.tar.gz,放置到安裝目錄。解壓縮安裝包后進(jìn)入解壓后的目錄,執(zhí)行configure命令。
[kylin@KL5 Install]$ tar -zxf otp_src_26.2.5.15.tar.gz [kylin@KL5Install]$ cd otp_src_26.2.5.15/ [kylin@KL5 otp_src_26.2.5.15]$ ./configure === Running configure in /home/kylin/Install/otp_src_26.2.5.15/erts === ./configure --disable-option-checking --cache-file=/dev/null --srcdir="/home/kylin/Install/otp_src_26.2.5.15/erts" checking build system type... x86_64-pc-linux-gnu checking host system type... x86_64-pc-linux-gnu checking target system type... x86_64-pc-linux-gnu ………… 這里很多提示信息,此處省略。 ………… *********************************************************************
在配置Erlang的時(shí)候會(huì)提示因?yàn)槿鄙貽DBC library、GLU headers等,導(dǎo)致odbc、wx等不可用,這個(gè)不影響RabbitMQ的一般使用,暫時(shí)不用理會(huì)。
繼續(xù)執(zhí)行make指令進(jìn)行編譯。
[kylin@KL5 otp_src_26.2.5.15]$ make MAKE depend make[1]: 進(jìn)入目錄“/home/kylin/Install/otp_src_26.2.5.15/erts/emulator” MAKE generate make[2]: 進(jìn)入目錄“/home/kylin/Install/otp_src_26.2.5.15/erts/emulator” GEN x86_64-pc-linux-gnu/opt/jit/OPCODES-GENERATED GEN x86_64-pc-linux-gnu/opt/jit/beam_asm_global.hpp ………… 這里很多提示信息,此處省略。 ………… GEN /home/kylin/Install/otp_src_26.2.5.15/bin/start.script GEN /home/kylin/Install/otp_src_26.2.5.15/bin/start_sasl.script GEN /home/kylin/Install/otp_src_26.2.5.15/bin/start_clean.script GEN /home/kylin/Install/otp_src_26.2.5.15/bin/no_dot_erlang.script make[2]: 離開目錄“/home/kylin/Install/otp_src_26.2.5.15/erts/start_scripts” make[1]: 離開目錄“/home/kylin/Install/otp_src_26.2.5.15/erts”
編譯成功后,用管理員賬戶執(zhí)行make install安裝。
[kylin@KL5 otp_src_26.2.5.15]$ sudo make install MAKE erl_interface make[1]: 進(jìn)入目錄“/home/kylin/Install/otp_src_26.2.5.15/lib/erl_interface” === Entering application erl_interface make[2]: 進(jìn)入目錄“/home/kylin/Install/otp_src_26.2.5.15/lib/erl_interface/src” ………… 這里很多提示信息,此處省略。 ………… ln -s ../lib/erlang/bin/dialyzer dialyzer ln -s ../lib/erlang/bin/typer typer ln -s ../lib/erlang/bin/escript escript ln -s ../lib/erlang/bin/ct_run ct_run [kylin@KL5 otp_src_26.2.5.15]$
測(cè)試Erlang,使用erl命令進(jìn)入Erlang控制臺(tái),使用crypto:start測(cè)試OpenSSL,使用halt命令退出。
[kylin@KL5 otp_src_26.2.5.15]$ erl Erlang/OTP 26 [erts-14.2.5.11] [source] [64-bit] [smp:1:1] [ds:1:1:10] [async-threads:1] [jit:ns] Eshell V14.2.5.11 (press Ctrl+G to abort, type help(). for help) 1> crypto:start(). ok 2> halt().
3.5 安裝RabbitMQ
解壓縮rabbitmq-server-generic-unix-3.13.7.tar.xz,將解壓后的目錄移動(dòng)到指定位置。
[kylin@KL5 Install]$ tar -xf rabbitmq-server-generic-unix-3.13.7.tar.xz [kylin@KL5 Install]$ mv rabbitmq_server-3.13.7/ /data/rabbitmq
編輯配置文件/etc/profile,將/data/rabbitmq/sbin加入到PATH環(huán)境變量中,使用source /etc/profile命令更新環(huán)境變量。
[kylin@KL5 Install]$ sudo vi /etc/profile ………… 其他配置內(nèi)容。 ………… export PATH=$PATH:/data/rabbitmq/sbin [kylin@KL5 Install]$ source /etc/profile
使用rabbitmq-server -detached以后臺(tái)服務(wù)方式啟動(dòng)RabbitMQ,使用rabbitmqctl status查看RabbitMQ狀態(tài),可以看到RabbitMQ開啟了5672端口和25672端口,分別服務(wù)于amqp和clustering協(xié)議。
[kylin@KL5 ~]$ rabbitmq-server -detached [kylin@KL5 ~]$ rabbitmqctl status Status of node rabbit@localhost ...cha Runtime OS PID: 122102 OS: Linux Uptime (seconds): 7 Is under maintenance?: false RabbitMQ version: 3.13.7 ………… 此處有很多狀態(tài)信息,此處忽略。 ………… Listeners Interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication Interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
使用rabbitmqctl start_app和rabbitmq-plugins enable rabbitmq_management命令開啟管理控制臺(tái),再使用rabbitmqctl status查看RabbitMQ狀態(tài),可以看到15672端口已經(jīng)打開,此時(shí)可以使用瀏覽器管理消息隊(duì)列。
[kylin@KL5 ~]$ rabbitmqctl start_app rabbitmqctl start_app Starting node rabbit@localhost ... [kylin@KL5 ~]$ rabbitmq-plugins enable rabbitmq_management rabbitmq-plugins enable rabbitmq_management Enabling plugins on node rabbit@localhost: rabbitmq_management The following plugins have been configured: rabbitmq_management rabbitmq_management_agent rabbitmq_web_dispatch Applying plugin configuration to rabbit@localhost... The following plugins have been enabled: rabbitmq_management rabbitmq_management_agent rabbitmq_web_dispatch started 3 plugins. [kylin@KL5 ~]$ rabbitmqctl status Status of node rabbit@localhost ... Runtime ………… 此處有很多狀態(tài)信息,此處忽略。 ………… Listeners Interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication Interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0 Interface: [::], port: 15672, protocol: http, purpose: HTTP API
3.6 注冊(cè)RabbitMQ為服務(wù)
使用管理員用戶編輯/etc/systemd/system/rabbitmq.service文件,在文件中加入如下內(nèi)容。
[kylin@KL5 ~]$ sudo vi /etc/systemd/system/rabbitmq.service [Unit] Description = RabbitMQ Server After = network.target [Service] Type = simple User = kylin Group = kylin ExecStart = /data/rabbitmq/sbin/rabbitmq-server ExecStop = /data/rabbitmq/sbin/rabbitmqctl stop Restart = on-failure RestartSec = 60s LimitNOFILE = 65536 [Install] WantedBy = multi-user.target
重新加載服務(wù),將服務(wù)設(shè)置為開機(jī)啟動(dòng)。
[kylin@KL5 system]$ sudo systemctl daemon-reload [kylin@KL5 system]$ sudo systemctl enable rabbitmq Created symlink /etc/systemd/system/multi-user.target.wants/rabbitmq.service → /etc/systemd/system/rabbitmq.service.
啟動(dòng)服務(wù)并查看服務(wù)狀態(tài)。如果之前RabbitMQ已啟動(dòng),先結(jié)束進(jìn)程。
[kylin@KL5 ~]$ ps -AL|grep beam
2212 2212 ? 00:00:00 beam.smp
[kylin@KL5 ~]$ kill 2212
[kylin@KL5 ~]$ sudo systemctl start rabbitmq
[kylin@KL5 ~]$ sudo systemctl status rabbitmq
● rabbitmq.service - RabbitMQ Server
Loaded: loaded (/etc/systemd/system/rabbitmq.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2025-09-24 10:24:47 CST; 2s ago
Main PID: 1012826 (rabbitmq-server)
Tasks: 26
Memory: 124.6M
CGroup: /system.slice/rabbitmq.service
├─1012826 /bin/sh /data/rabbitmq/sbin/rabbitmq-server
├─1012833 /usr/local/lib/erlang/erts-14.2.5.11/bin/beam.smp -W w -MBas ageffcbf -MHas ageffcbf -MBlmbcs 512 -MHlmbcs 512 -MMmcs 30 -pc unicode -P 1048576 -t 5000000 -stbt db -zdbbl >
├─1012839 erl_child_setup 65536
├─1012858 sh -s disksup
├─1012860 /usr/local/lib/erlang/lib/os_mon-2.9.1/priv/bin/memsup
├─1012861 /usr/local/lib/erlang/lib/os_mon-2.9.1/priv/bin/cpu_sup
├─1012862 /usr/local/lib/erlang/erts-14.2.5.11/bin/inet_gethost 4
├─1012863 /usr/local/lib/erlang/erts-14.2.5.11/bin/inet_gethost 4
└─1012916 /bin/sh -s rabbit_disk_monitor4 配置RabbitMQ集群
4.1 修改hosts文件
修改/etc/hosts文件,將集群涉及的主機(jī)名稱添加到hosts文件中。
kylin@KL5:~$ sudo vi /etc/hosts 127.0.0.1 localhost 10.10.1.45 KL5 10.10.1.46 KL6
4.2 開放防火墻端口
麒麟高級(jí)服務(wù)器版默認(rèn)開啟了防火墻,需要開放RabbitMQ相關(guān)的端口,包括4369(EPMD)、5671-5672(AMQP)、15672(管理頁面)、25672(節(jié)點(diǎn)間通訊)、35672-35682(CLI工具)等,以上端口均為TCP協(xié)議。
[kylin@KL5 ~]$ sudo firewall-cmd --add-port=4369/tcp --permanent success [kylin@KL5 ~]$ sudo firewall-cmd --add-port=5671-5672/tcp --permanent success [kylin@KL5 ~]$ sudo firewall-cmd --add-port=15672/tcp --permanent success [kylin@KL5 ~]$ sudo firewall-cmd --add-port=25672/tcp --permanent success [kylin@KL5 ~]$ sudo firewall-cmd --add-port=35672-35682/tcp --permanent success [kylin@KL5 ~]$ sudo firewall-cmd --reload success [kylin@KL5 ~]$ sudo firewall-cmd --list-ports 4369/tcp 15672/tcp 25672/tcp 35672-35682/tcp 5671-5672/tcp
4.3 復(fù)制cookie文件
將.erlang.cookie從主機(jī)服務(wù)器復(fù)制到其他服務(wù)器相同目錄。本例中.erlang.cookie文件在kylin用戶目錄下。如果提示沒有權(quán)限,需要先修改從機(jī)上的文件權(quán)限。
kylin@KL5:~$ scp .erlang.cookie kylin@KL6:/home/kylin kylin@KL6's password: .erlang.cookie 100% 20 7.8KB/s 00:00
修改.erlang.cookie文件之前如果已經(jīng)用rabbitmq-server啟動(dòng)了消息隊(duì)列,在修改.erlang.cookie文件會(huì)無法使用rabbitmqctl控制,需要結(jié)束進(jìn)程,rabbitmq的進(jìn)程名稱為beam.smp。
[kylin@KL5 ~]$ ps -AL|grep beam.smp 33029 33029 ? 00:00:00 beam.smp [kylin@KL5 ~]$ kill 33029
4.4 將從機(jī)加入集群
分別啟動(dòng)主機(jī)和從機(jī)的服務(wù)后,在從機(jī)上使用rabbitmqctl stop_app指令停止應(yīng)用,使用rabbitmqctl join_cluster指令將從機(jī)加入主機(jī)集群,再使用rabbitmqctl start_app指令啟動(dòng)應(yīng)用。此時(shí)可以使用rabbitmqctl cluster_status指令查看集群狀態(tài)。
kylin@KL6:~$ rabbitmqctl stop_app Stopping rabbit application on node rabbit@KL6 ... kylin@KL6:~$ rabbitmqctl join_cluster rabbit@KL5 Clustering node rabbit@KL6 with rabbit@KL5 kylin@KL6:~$ rabbitmqctl start_app Starting node rabbit@KL6 ... kylin@KL6:~$ rabbitmqctl cluster_status Cluster status of node rabbit@KL6 ... Basics Cluster name: rabbit@KL6 Total CPU cores available cluster-wide: 8 Cluster Tags (none) Disk Nodes rabbit@KL5 rabbit@KL6 Running Nodes rabbit@KL5 rabbit@KL6 Versions rabbit@KL6: RabbitMQ 3.13.7 on Erlang 26.2.5.15 rabbit@KL5: RabbitMQ 3.13.7 on Erlang 26.2.5.15 CPU Cores Node: rabbit@KL6, available CPU cores: 4 Node: rabbit@KL5, available CPU cores: 4 Maintenance status Node: rabbit@KL6, status: not under maintenance Node: rabbit@KL5, status: not under maintenance ………… 此處有很多狀態(tài)信息,此處忽略。 …………
此時(shí),集群已經(jīng)建立,但模式為普通模式,下一步需要將隊(duì)列配置為鏡像模式。配置可以采用管理頁面方式,也可以使用命令行方式配置。
4.5 配置鏡像策略
4.5.1 頁面方式配置鏡像
使用瀏覽器打開主機(jī)的配置頁面,使用默認(rèn)用戶guest/guest登錄,創(chuàng)建需要的用戶、虛擬主機(jī)、交換機(jī)、消息隊(duì)列等,在創(chuàng)建消息隊(duì)列時(shí)選擇classic類型。
使用有管理員權(quán)限用戶登錄,在Admin->Policies->User Policies管理項(xiàng)下,增加管理策略。Pattern填寫“^”,Apply to選擇“Exchanges and queues”,Definition定義“ha-mode=all”、“ha-sync-mode=automatic”。

4.5.2 命令方式配置鏡像
使用rabbitmqctl set_policy命令設(shè)置復(fù)制策略。
[kylin@KL5 ~]$ rabbitmqctl set_policy jxjq "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}' -p /test/
Setting policy "jxjq" for pattern "^" to "{"ha-mode":"all","ha-sync-mode":"automatic"}" with priority "0" for vhost "/test/" ...其中“jxjq”為策略名稱,“^”為匹配字符,“{"ha-mode":"all","ha-sync-mode":"automatic"}'”為JSON格式的策略定義,“-p /test/”表示應(yīng)用的Virtual host。
5 集群切換測(cè)試
集群啟動(dòng)-后,連接管理頁面可以查看集群狀態(tài)、隊(duì)列狀態(tài),此時(shí)隊(duì)列顯示主節(jié)點(diǎn)為KL5,KL5為集群主機(jī),KL6為集群從機(jī)。

在正常狀態(tài)下,測(cè)試向消息隊(duì)列faultQueue發(fā)送了6條數(shù)據(jù)。

通過暫停虛擬機(jī)的方式,將KL5主機(jī)暫停。在KL5主機(jī)暫停的最初十幾秒內(nèi),從機(jī)上的消息隊(duì)列暫時(shí)不可連接,管理頁面也沒有響應(yīng),應(yīng)該在切換集群主從。之后可正常連接從機(jī)上的消息隊(duì)列,收發(fā)消息,管理頁面可以看到KL5節(jié)點(diǎn)變成停止?fàn)顟B(tài),消息隊(duì)列顯示主節(jié)點(diǎn)為KL6,KL6為集群主機(jī)。

在KL5故障狀態(tài)下,向消息隊(duì)列faultQueue又發(fā)送了8條數(shù)據(jù),現(xiàn)在KL6顯示共有14條數(shù)據(jù)。

通過查看運(yùn)行日志,可以看到節(jié)點(diǎn)KL6已經(jīng)發(fā)現(xiàn)KL5無法連接了。
[kylin@KL6 ~]$ tail -f /data/rabbitmq/var/log/rabbitmq/rabbit@KL6.log
2025-09-24 14:08:59.801496+08:00 [error] <0.2019.0> ** Node rabbit@KL5 not responding **
2025-09-24 14:08:59.801496+08:00 [error] <0.2019.0> ** Removing (timedout) connection **
2025-09-24 14:08:59.801496+08:00 [error] <0.2019.0>
2025-09-24 14:08:59.802145+08:00 [info] <0.5951.0> rabbit on node rabbit@KL5 down
2025-09-24 14:09:02.910433+08:00 [warning] <0.6301.0> Management delegate query returned errors:
2025-09-24 14:09:02.910433+08:00 [warning] <0.6301.0> [{<30547.2322.0>,{exit,{nodedown,rabbit@KL5},[]}}]
2025-09-24 14:09:02.910772+08:00 [warning] <0.6302.0> Management delegate query returned errors:
2025-09-24 14:09:02.910772+08:00 [warning] <0.6302.0> [{<30547.2322.0>,{exit,{nodedown,rabbit@KL5},[]}}]
2025-09-24 14:09:02.911090+08:00 [info] <0.5951.0> node rabbit@KL5 down: net_tick_timeout使用命令行方式,也可以看到集群節(jié)點(diǎn)包括KL5和KL6,但目前只有KL6運(yùn)行。
[kylin@KL6 ~]$ rabbitmqctl cluster_status Cluster status of node rabbit@KL6 ... Basics Cluster name: rabbit@KL6 Total CPU cores available cluster-wide: 1 Disk Nodes rabbit@KL5 rabbit@KL6 Running Nodes rabbit@KL6 ………… 這里很多狀態(tài)信息,此處省略。 …………
此時(shí)恢復(fù)虛擬機(jī),將KL5主機(jī)恢復(fù)并接入。正常情況下集群恢復(fù),但集群主節(jié)點(diǎn)仍然是KL6。


通過查看KL6的日志,可以看到集群已經(jīng)發(fā)現(xiàn)KL5蘇醒,并選舉KL6繼續(xù)做主節(jié)點(diǎn),并等待KL5重新加入集群。
2025-09-24 14:39:09.201846+08:00 [info] <0.13111.0> node rabbit@KL5 up 2025-09-24 14:39:09.220700+08:00 [info] <0.13111.0> Autoheal: I am the winner, waiting for [rabbit@KL5] to stop 2025-09-24 14:40:10.813167+08:00 [info] <0.13111.0> rabbit on node rabbit@KL5 up 2025-09-24 14:40:10.816809+08:00 [info] <0.13247.0> Mirrored queue 'dataQueue' in vhost '/test/': Synchronising: 0 messages to synchronise
通過查看KL5的日志,也可以看到KL5選舉失敗,重新啟動(dòng)并加入了集群。
2025-09-24 14:39:09.541787+08:00 [info] <0.2163.0> Successfully stopped RabbitMQ and its dependencies
2025-09-24 14:39:19.222195+08:00 [warning] <0.2278.0> Mnesia->Khepri fallback handling: Mnesia function failed 99 times. Possibly an infinite retry loop; trying one last time
2025-09-24 14:40:09.542739+08:00 [warning] <0.2163.0> Autoheal: timed out waiting for a safe-to-start message from the winner (rabbit@KL6); will retry
2025-09-24 14:40:09.542924+08:00 [info] <0.2163.0> RabbitMQ is asked to start...
…………
這里很多狀態(tài)信息,此處省略。
…………
2025-09-24 14:40:10.576539+08:00 [notice] <0.2398.0> Feature flags: checking nodes `rabbit@KL5` and `rabbit@KL6` compatibility...
2025-09-24 14:40:10.579022+08:00 [notice] <0.2398.0> Feature flags: nodes `rabbit@KL5` and `rabbit@KL6` are compatible
2025-09-24 14:40:10.582058+08:00 [notice] <0.44.0> Application mnesia exited with reason: stopped
2025-09-24 14:40:10.606314+08:00 [error] <0.2466.0> Mnesia(rabbit@KL5): ** ERROR ** mnesia_event got {inconsistent_database, starting_partitioned_network, rabbit@KL6}
2025-09-24 14:40:10.606314+08:00 [error] <0.2466.0>有時(shí)可以在管理頁面看到KL5集群節(jié)點(diǎn)并沒有恢復(fù),而是顯示出現(xiàn)網(wǎng)絡(luò)分區(qū)。同時(shí)消息隊(duì)列中消息數(shù)量會(huì)變成主機(jī)、從機(jī)原本各自消息數(shù)量之和,如某隊(duì)列集群故障前有消息12條,故障時(shí)收到消息6條,此時(shí)會(huì)顯示18+12=30條。

使用命令行方式查看集群狀態(tài),也是相同的信息。
[kylin@KL6 ~]$ rabbitmqctl cluster_status rabbitmqctl cluster_status Cluster status of node rabbit@KL6 ... Basics Cluster name: rabbit@KL6 Total CPU cores available cluster-wide: 2 Disk Nodes rabbit@KL5 rabbit@KL6 Running Nodes rabbit@KL6 ………… 這里很多狀態(tài)信息,此處省略。 ………… Network Partitions Node rabbit@KL6 cannot communicate with rabbit@KL5 ………… 這里很多狀態(tài)信息,此處省略。 …………
此時(shí)兩臺(tái)主機(jī)均認(rèn)為自己應(yīng)該是集群主機(jī),因此形成了兩個(gè)集群網(wǎng)絡(luò),此時(shí)需要人工干預(yù)。一般此時(shí)應(yīng)將KL5降為從機(jī),保持KL6為主機(jī)??梢栽贙L5上使用rabbitmqctl stop_app、rabbitmqctl start_app重啟動(dòng)消息隊(duì)列服務(wù)的方式完成。之后集群狀態(tài)恢復(fù),消息隊(duì)列中消息數(shù)量恢復(fù)。


因此可以看到,在集群節(jié)點(diǎn)只有兩臺(tái)時(shí),單節(jié)點(diǎn)故障后可以集群可以正常使用,但故障消除后,有些情況可以自動(dòng)恢復(fù),有些情況不能自動(dòng)恢復(fù)。一般如果是主機(jī)間網(wǎng)絡(luò)通訊故障造成的,一般會(huì)出現(xiàn)網(wǎng)絡(luò)分區(qū),不能自動(dòng)恢復(fù)。如果是某臺(tái)主機(jī)服務(wù)停止,通過重啟動(dòng)可以自動(dòng)恢復(fù)。對(duì)于第一種情況,可以在rabbitmq.conf文件中配置cluster_partition_handling = autoheal來解決。
[kylin@KL7 ~]$ vi /data/rabbitmq/etc/rabbitmq/rabbitmq.conf cluster_partition_handling = autoheal
到此這篇關(guān)于RabbitMQ的安裝集群、鏡像隊(duì)列配置規(guī)劃的文章就介紹到這了,更多相關(guān)RabbitMQ鏡像集群內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Javaweb 500 服務(wù)器內(nèi)部錯(cuò)誤的解決
這篇文章主要介紹了Javaweb 500 服務(wù)器內(nèi)部錯(cuò)誤的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09
spring-boot 多線程并發(fā)定時(shí)任務(wù)的解決方案
這篇文章主要介紹了spring-boot 多線程并發(fā)定時(shí)任務(wù)的解決方案,需要的朋友可以參考下2019-08-08
Java中類與對(duì)象全面解析(附實(shí)例代碼)
這篇文章主要介紹了Java中類與對(duì)象的相關(guān)資料,重點(diǎn)講解了封裝的概念,通過private關(guān)鍵字和getter/setter方法來保護(hù)和操作對(duì)象的成員變量,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-05-05
Springboot 使用maven release插件執(zhí)行版本管理及打包操作
maven-release-plugin 可用于構(gòu)建release版本項(xiàng)目,實(shí)現(xiàn)自動(dòng)打tag、遞增版本號(hào)、分發(fā)release版本jar包至倉庫,接下來通過本文給大家介紹Springboot 使用maven release插件執(zhí)行版本管理及打包操作,需要的朋友可以參考下2022-03-03

