阿里雲環境遷移記錄 - RabbitMQ集羣搭建

RabbitMQ模式大概分爲以下三種:
(1)單一模式。
(2)普通模式(默認的集羣模式)。
(3) 鏡像模式(把需要的隊列做成鏡像隊列,存在於多個節點,屬於RabbiMQ的HA方案,在對業務可靠性要求較高的場合中比較適用)。
要實現鏡像模式,需要先搭建一個普通集羣模式,在這個模式的基礎上再配置鏡像模式以實現高可用。

RabbitMQ的集羣節點包括內存節點、磁盤節點。
RabbitMQ支持消息的持久化也就是數據寫在磁盤上,默認是磁盤節點。

RabbitMQ相關端口

4369 (epmd), 25672 (Erlang distribution)
5672, 5671 (AMQP 0-9-1 without and with TLS)
15672 (if management plugin is enabled)
61613, 61614 (if STOMP is enabled)
1883, 8883 (if MQTT is enabled)

RabbitMQ 集羣節點設置

server103.example.com IP: 192.168.72.103 Node: disk
server105.example.com IP: 192.168.72.105 Node: disk
server106.example.com IP: 192.168.72.106 Node: disk

rabbitMQ單機安裝配置

1. 安裝erlang依賴
yum install -y epel-release
或者通過yum源安裝
#添加EPEL源
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
添加Erlang源
rpm -Uvh http://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm

2. 安裝RabbitMQ Server
yum install -y rabbitmq-server
(默認安裝目錄爲:/usr/lib/rabbitmq/bin/)

或者通過yum源安裝

wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.1/rabbitmq-server-3.6.1-1.noarch.rpm
rpm --import https://www.rabbitmq.com/rabbitmq-signing-key-public.asc
yum install rabbitmq-server-3.6.1-1.noarch.rpm

3. 單機配置
#調整系統限制

vi /etc/sysctl.conf
fs.file-max = 300000

#設置生效
sysctl -p
#查看
sysctl fs.file-max

#調整用戶限制
vi /etc/security/limits.conf

*              soft     nofile          65536
*              hard     nofile          65536

#添加host
echo "192.168.72.103 server103" >> /etc/hosts

#防火牆打開端口

firewall-cmd --permanent --add-port=15672/tcp
firewall-cmd –-reload

#設置自動重啓

chkconfig rabbitmq-server on
service rabbitmq-server start

#啓動監控插件

rabbitmq-plugins list //查看插件安裝情況
rabbitmq-plugins enable rabbitmq_management //啓用rabbitmq_management服務

4. 用戶管理
#添加用戶

rabbitmqctl add_user admin admin
rabbitmqctl add_user travel 88gongxiangrbq

#設置用戶角色

rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_user_tags travel administrator

#設置用戶權限(設置admin用戶配置、寫、讀的權限)

rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
rabbitmqctl set_permissions -p / travel ".*" ".*" ".*"

#刪除guest用戶
rabbitmqctl delete_user guest

rabbitmq從3.3.0開始禁止使用guest/guest權限通過除localhost外的訪問。
如果想使用guest/guest通過遠程機器訪問,需要在rabbitmq配置文件中(/etc/rabbitmq/rabbitmq.config)中設置loopbackusers爲[]。
[{rabbit, [{loopbackusers, []}]}].

#管理界面
在瀏覽器中打開http://192.268.72.104:15672

#默認配置說明
cat /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.1/sbin/rabbitmq-defaults

  • 系統prefix是空
  • 配置文件路徑是 /etc/rabbitmq/rabbitmq.config (erlang會自動加上.config後綴)
  • 環境配置文件是 /etc/rabbitmq/rabbitmq-env.conf
  • 日誌文件目錄是 /var/log/rabbitmq
  • 插件文件目錄是 安裝目錄下的plugins,這裏RPM安裝方式下是 /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.1/plugins

集羣配置

1. 配置三臺機器的主機名(三臺機器分別執行)

hostnamectl set-hostname server103
hostnamectl set-hostname server105
hostnamectl set-hostname server106

查看效果:
hostname

配置三臺機器的hosts解析(三臺機器都添加如下配置)

vi /etc/hosts
192.168.72.103 server103
192.168.72.105 server105
192.168.72.106 server106

2. 設置每個節點Cookie
Rabbitmq的集羣是依賴於erlang的集羣來工作的,所以必須先構建起erlang的集羣環境。Erlang的集羣中各節點是通過一個magic cookie來實現的,這個cookie存放在 /var/lib/rabbitmq/.erlang.cookie 中,文件是400的權限。所以必須保證各節點cookie保持一致,否則節點之間就無法通信

選擇其中一臺作爲集羣主節點,將其cookiecopy到另外兩臺機器上。

chmod 700 /var/lib/rabbitmq/.erlang.cookie
echo -n "YACWQCCKIKHSVKFFJYBL" > /var/lib/rabbitmq/.erlang.cookie
chmod 400 /var/lib/rabbitmq/.erlang.cookie

網上看到有些朋友,將其中一臺的cookie,遠程發送到其他節點服務器,這樣容易導致cookie文件的屬組變化,默認爲rabbitmq,下面的一個錯誤會提到。

#修改cookie後需要重啓mq

ps -ef | grep ^rabbitmq | awk '{print $2}' | xargs kill -9
service rabbitmq-server start

常見的啓動失敗:
Starting rabbitmq-server (via systemctl): Job for rabbitmq-server.service failed because the control process exited with error code. See "systemctl status rabbitmq-server.service" and "journalctl -xe" for details.

查看日誌:

tail -f /var/log/rabbitmq/startup_log 
{error_logger,{{2019,2,19},{16,10,19}},"Error when reading /var/lib/rabbitmq/.erlang.cookie: eacces",[]}
{error_logger,{{2019,2,19},{16,10,19}},crash_report,[[{initial_call,{auth,init,['Argument__1']}},{pid,<0.20.0>},{registered_name,[]},{error_info,{exit,{"Error when reading /var/lib/rabbitmq/.erlang.cookie: eacces",[{auth,init_cookie,0,[{file,"auth.erl"},{line,285}]},{auth,init,1,[{file,"auth.erl"},{line,139}]},{gen_server,init_it,6,[{file,"gen_server.erl"},{line,304}]},{proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,239}]}]},[{gen_server,init_it,6,[{file,"gen_server.erl"},{line,328}]},{proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,239}]}]}},{ancestors,[net_sup,kernel_sup,<0.10.0>]},{messages,[]},{links,[<0.18.0>]},{dictionary,[]},{trap_exit,true},{status,running},{heap_size,610},{stack_size,27},{reductions,643}],[]]}

主要是訪問cookie失敗導致的,可以嘗試修改cookie的權限和屬組:

cd /var/lib/rabbitmq/
chown rabbitmq:rabbitmq .erlang.cookie
chmod 400 .erlang.cookie

啓動成功後查看狀態:
rabbitmqctl status

狀態顯示可能會遇到鏈接不上的錯誤,如下:
Status of node rabbit@server104 ...
Error: unable to connect to node rabbit@server104: nodedown

DIAGNOSTICS

attempted to contact: [rabbit@server104]

rabbit@server104:
  * connected to epmd (port 4369) on server104
  * epmd reports node 'rabbit' running on port 25672
  * TCP connection succeeded but Erlang distribution failed
  * suggestion: hostname mismatch?
  * suggestion: is the cookie set correctly?
  * suggestion: is the Erlang distribution using TLS?

原因:
RabbitMQ的erlang.cookie和用戶的cookie衝突了,需要用rabbitmq的cookie去覆蓋用戶的cookie。
解決方式:
sudo cp /var/lib/rabbitmq/.erlang.cookie ~/.erlang.cookie
重啓

  1. 加入集羣
    將 server103、server105 、server106組成集羣:
    默認是磁盤節點,如果是內存節點的話,需要加--ram參數
    在server103、server105上分別運行:
    rabbitmqctl stop_app
    rabbitmqctl join_cluster rabbit@server106 --ram
    rabbitmqctl start_app

阿里雲環境遷移記錄 - RabbitMQ集羣搭建

#將節點從集羣中去掉
rabbitmqctl forget_cluster_node rabbit@server104

節點恢復過程中把數據刪掉很重要,恢復一單結點,再清數據
節點增加:

1. rabbitmq-server -detached   --- .erlang.cooike的權限,400 屬主rabbitmq
2. rabbitmqctl stop_app
3. rabbitmqctl join_cluster --ram rabbit@rabbitmq1
4. rabbitmqctl start_app
5. rabbitmqctl  cluster_status

節點刪除

1.  rabbitmq-server -detached
以上爲基礎,正常運行的mq節點直接進行2、3兩步;4可省略或更改爲rabbitmqctl stop
2. rabbitmqctl stop_app
3. rabbitmqctl reset 
4. rabbitmqctl start_app
  1. 設置鏡像策略
    rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'

如果想切換節點類型,譬如由disc-->ram,可以先恢復到單結點,重啓,清數據,再添加集羣。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章