centos7.8環境安裝rabbitmq3.8.5最新版並設置集群
一、編譯安裝,單機設置
#1.增加用戶
groupadd rabbitmq
useradd rabbitmq -g rabbitmq -s /sbin/nologin
#2.安裝必須編譯基礎包
yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel
#3.安裝socat
yum install socat -y
yum install wxWidgets* -y
yum install gtk+.x86_64 -y
#4.環境變量,否則編譯erlang可能會有問題
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/libexec/wxGTK3
#5.下載ERLANG源碼包
wget http://erlang.org/download/otp_src_19.0.tar.gz(可不下載)
wget https://erlang.org/download/otp_src_22.1.tar.gz
wget https://github.com/wxWidgets/wxWidgets/releases/download/v3.1.3/wxWidgets-3.1.3.tar.bz2(可不下載)
#6.解壓並安裝(低版本)
mkdir -p /usr/local/erlang
tar xvf otp_src_19.0.tar.gz
cd otp_src_19.0
./configure --prefix=/usr/local/erlang --with-ssl --enable-threads --enable-smmp-support -enable-kernel-poll --enable-hipe --without-javac
make && make install
#6.解壓並安裝(高版本)
mkdir -p /usr/local/erlang
tar xvf otp_src_22.1.tar.gz
cd otp_src_22.1
./configure --prefix=/usr/local/erlang --with-ssl=/usr/local/lab/openssl --enable-threads --enable-smmp-support -enable-kernel-poll --enable-hipe --without-javac
make && make install
#7.解壓並安裝(由於是通過yum安裝,無需執行,如果是編譯安裝可以按照下面方法)
bzip2 -d wxWidgets-3.1.3.tar.bz2
tar xvf wxWidgets-3.1.3.tar
cd wxWidgets-3.1.3
./configure --with-opengl --enable-debug --enable-unicode
#8.修改環境變量
vi /etc/profile
ERLANG_HOME=/usr/local/erlang
PATH=$ERLANG_HOME/bin:$PATH
export ERLANG_HOME
export PATH
#9.生效環境變量
source /etc/profile
#10.測試是否支持ERLANG語言,輸入erl后會彈出提示 按CTRL+C 退出
erl
#11. 安裝simpleJson
cd /usr/local/src
wget https://github.com/simplejson/simplejson/releases/download/v3.16.1/simplejson-3.16.1.tar.gz
tar zxvf simplejson-3.16.1.tar.gz
cd simplejson-3.16.1
python setup.py install
#12.下載rabbitmq二進制免編譯包(最新版本)
cd /usr/local/src
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.5/rabbitmq-server-generic-unix-3.8.5.tar.xz
#12.下載rabbitmq二進制免編譯包
cd /usr/local/src
wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.10/rabbitmq-server-generic-unix-3.6.10.tar.xz
#13.解壓並安裝
xz -d rabbitmq-server-generic-unix-3.8.5.tar.xz
tar xvf rabbitmq-server-generic-unix-3.8.5.tar
mv rabbitmq_server-3.8.5 /usr/local
cd /usr/local/
rm -f /usr/local/rabbitmq
ln -s rabbitmq_server-3.8.5 rabbitmq
#14.修改/etc/profile文件,添加下面的環境變量:
export PATH=$PATH:/usr/local/rabbitmq/sbin
執行source /etc/profile讓文件生效。
#15.設置開啟自啟腳本
添加 source /etc/profile 否則可能提示erl無法找到
vi /usr/local/rabbitmq/sbin/rabbitmq-env
source /etc/profile
chown -R rabbitmq.rabbitmq rabbitmq_server-3.8.5
# 可以先啟動程序生成 erlang.cookie 文件
/usr/local/rabbitmq/sbin/rabbitmq-server
# 啟動管理程序
cat /usr/lib/systemd/system/rabbitmq-server.service [Unit] Description=RabbitMQ broker After=syslog.target network.target [Service] Type=notify User=rabbitmq Group=rabbitmq UMask=0027 NotifyAccess=all TimeoutStartSec=3600 # To override LimitNOFILE, create the following file: # # /etc/systemd/system/rabbitmq-server.service.d/limits.conf # # with the following content: # # [Service] # LimitNOFILE=65536 LimitNOFILE=32768 # Note: systemd on CentOS 7 complains about in-line comments, # so only append them here # # Restart: # The following setting will automatically restart RabbitMQ # in the event of a failure. systemd service restarts are not a # replacement for service monitoring. Please see # https://www.rabbitmq.com/monitoring.html Restart=on-failure RestartSec=10 WorkingDirectory=/usr/local/rabbitmq/var/lib/rabbitmq ExecStart=/usr/local/rabbitmq/sbin/rabbitmq-server ExecStop=/usr/local/rabbitmq/sbin/rabbitmqctl shutdown # See rabbitmq/rabbitmq-server-release#51 SuccessExitStatus=69 [Install] WantedBy=multi-user.target
# 無法啟動的原因可能是日志使用rabbitmq用戶沒有權限
chown -R rabbitmq.rabbitmq /usr/local/rabbitmq_server-3.8.5
# 注意權限
chown -R rabbitmq.rabbitmq /home/rabbitmq/.erlang.cookie
systemctl start rabbitmq-server.service
chmod 400 /home/rabbitmq/.erlang.cookie
chmod 400 /root/.erlang.cookie
注意 .erlang.cookie 文件默認在 /home/rabbitmq 下,因通過rabbitmq賬戶去啟動,並且/root/下的 .erlang.cookie值要和/home/rabbitmq 下的文件值保持一致,否則集群無法啟動
# 查看日志
/usr/local/rabbitmq/var/log/rabbitmq/rabbit@eus-video-compose02.log
# cat ~/.erlang.cookie
QBISJBZGKYVFNASJQWDQ
# 以下步驟在兩個節點中都要執行
#15.啟動rabbitMQ
systemctl start rabbitmq-server.service
#15.啟動rabbitMQ(可選,但是最好不要這樣啟動)
rabbitmq-server
#15.后台運行服務(可選,但是最好不要這樣啟動)
rabbitmq-server -detached
#16.設置開機自啟
systemctl enable rabbitmq-server.service
#17.關閉rabbitMQ
systemctl stop rabbitmq-server.service
#17.關閉rabbitMQ
rabbitmqctl stop
#18.安裝web界面擴展
rabbitmq-plugins enable rabbitmq_management
#19.添加用戶(如果是集群,可以等到集群搭建好以后再添加賬號,就可以同步到其他節點了)
rabbitmqctl add_user admin pass
#20.列出用戶
rabbitmqctl list_users
#21.將admin指定為管理員權限
rabbitmqctl set_user_tags admin administrator
#22.刪除來賓用戶
rabbitmqctl delete_user guest
#23.安裝成功,訪問如下地址
http://192.168.101.21:15672/
二.加入集群(鏡像集群)
#1.修改 /etc/hosts
# rabbitmq cluster
172.30.0.1 eus-video-compose01
172.30.0.2 eus-video-compose02
#2.設置 Erlang Cookie,路徑為/home/rabbitmq/.erlang.cookie,這里將 eus-video-compose01 的該文件復制到 eus-video-compose02,由於這個文件權限是 400,所以需要先修改 eus-video-compose02,中的該文件權限為 777,然后將 node1 中的該文件拷貝到 node2,最后將權限和所屬用戶/組修改回來
保持鏡像集群的 .erlang.cookie的值和權限保持一致
chown rabbitmq /home/rabbitmq/.erlang.cookie
chgrp rabbitmq /home/rabbitmq/.erlang.cookie
也可以直接復制里面的內容,讓兩台機器的 .erlang.cookie 內容保持一致
#3.使用 -detached 參數運行各節點
systemctl stop rabbitmq-server.service #推薦
rabbitmqctl stop #不推薦
systemctl start rabbitmq-server.service #推薦
rabbitmq-server -detached #不推薦
#4.組成集群,注意防火牆開啟4637端口,在eus-video-compose01上執行
# 關閉app
rabbitmqctl stop_app
# 將compose02節點加入集群
rabbitmqctl join_cluster rabbit@eus-video-compose02
# 重新開啟app
rabbitmqctl start_app
#5.如果要使用內存節點,則可以使用下面的命令加入集群。
rabbitmqctl join_cluster *--ram* rabbit@rabbitmq_02
設置鏡像集群模式:
#6.設置鏡像隊列策略,在任意一個節點上執行下面的命令,將所有隊列設置為鏡像隊列,即隊列會被復制到各個節點,各個節點狀態保持一直
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
[root@eus-video-compose01:~]# rabbitmqctl list_policies
Listing policies for vhost "/" ...
[root@eus-video-compose01:~]# rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
Setting policy "ha-all" for pattern "^" to "{"ha-mode":"all"}" with priority "0" for vhost "/" ...
[root@eus-video-compose01:~]# rabbitmqctl list_policies
Listing policies for vhost "/" ...
vhost name pattern apply-to definition priority
/ ha-all ^ all {"ha-mode":"all"} 0
[root@eus-video-compose02:/usr/local]# rabbitmqctl list_policies
Listing policies for vhost "/" ...
vhost name pattern apply-to definition priority
/ ha-all ^ all {"ha-mode":"all"} 0
查看集群狀態:
# rabbitmqctl cluster_status
命令行下添加rabbitmq用戶,沒有訪問權限,隊列沒有被消費
需要在web界面設置一下權限
修改默認端口
1.修改rabbitmq的配置,引入修改相關配置的文件 # vim /usr/local/rabbitmq/sbin/rabbitmq-defaults
# 添加這行
CONFIG_FILE=${SYS_PREFIX}/etc/rabbitmq/rabbitmq.conf
# 添加修改端口的配置
vim /usr/local/rabbitmq/etc/rabbitmq/rabbitmq.conf
#數據管理端口(默認端口為5672)
listeners.tcp.default=5673
#界面管理端口(默認端口為15672)
management.tcp.port=15672
management.tcp.ip=0.0.0.0
#19.添加用戶並設置管理員
rabbitmqctl add_user cart_invoice pass
rabbitmqctl set_user_tags cart_invoice administrator
rabbitmqctl add_user usercenter pass
rabbitmqctl set_user_tags usercenter administrator
# 列出用戶
rabbitmqctl list_users
# 設置 vhost
rabbitmqctl set_permissions -p apiservice,core,cron_script admin '.*' '.*' '.*'
rabbitmqctl set_permissions -p apiservice cart_invoice '.*' '.*' '.*'
rabbitmqctl set_permissions -p apiservice usercenter '.*' '.*' '.*'
# 添加用戶:只擁有特定vhost的用戶權限,這個用戶是不能登錄mq的web界面的
rabbitmqctl add_user wgp_core_mq_user pass
修改用戶密碼
rabbitmqctl change_password username password
# 添加vhost wgp_core
rabbitmqctl add_vhost wgp_core
# 設置權限,將wgp_core的所有權限都賦予 wgp_core_mq_user
rabbitmqctl set_permissions -p wgp_core wgp_core_mq_user '.*' '.*' '.*'
# 列出權限
rabbitmqctl list_user_permissions wgp_core_mq_user
rabbitmqctl list_permissions -p wgp_core
添加普通戶示例
# 添加用戶:只擁有特定vhost的用戶權限,這個用戶是不能登錄mq的web界面的 rabbitmqctl add_user cn_chinasoft_mq_user cnchinasoftpass # 列出用戶 rabbitmqctl list_users # 添加vhost cn_chinasoft rabbitmqctl add_vhost cn_chinasoft # 設置權限,將wgp_core的所有權限都賦予 cn_chinasoft_mq_user rabbitmqctl set_permissions -p cn_chinasoft cn_chinasoft_mq_user '.*' '.*' '.*' # 列出權限 rabbitmqctl list_user_permissions cn_chinasoft_mq_user rabbitmqctl list_permissions -p cn_chinasoft
php操作rabbitmq的代碼
消費者
# cat consumer.php <?php $conn = [ // Rabbitmq 服務地址 'host' => '172.18.212.203', // Rabbitmq 服務端口 'port' => '5672', // Rabbitmq 帳號 'login' => 'wgp_core_mq_user', // Rabbitmq 密碼 'password' => 'pass', 'vhost'=>'wgp_core' //'vhost'=>'/' ]; //創建連接和channel $conn = new AMQPConnection($conn); if(!$conn->connect()) { die("Cannot connect to the broker!\n"); } $channel = new AMQPChannel($conn); $exchangeName = 'ex1'; //創建交換機 $ex = new AMQPExchange($channel); $ex->setName($exchangeName); $ex->setType(AMQP_EX_TYPE_DIRECT); //direct類型 $ex->setFlags(AMQP_DURABLE); //持久化 $ex->declare(); // 創建隊列 $queueName = 'queue1'; $q = new AMQPQueue($channel); $q->setName($queueName); $q->setFlags(AMQP_DURABLE); $q->declareQueue(); // 用於綁定隊列和交換機,跟 send.php 中的一致。 $routingKey = 'key_1'; $q->bind($exchangeName, $routingKey); //接收消息 $q->consume(function ($envelope, $queue) { $msg = $envelope->getBody(); echo $msg."\n"; //處理消息 sleep(3); }, AMQP_AUTOACK); $conn->disconnect(); ?>
生產者
send.php
<?php $conn = [ // Rabbitmq 服務地址 'host' => '172.18.212.203', // Rabbitmq 服務端口 'port' => '5672', // Rabbitmq 帳號 'login' => 'wgp_core_mq_user', // Rabbitmq 密碼 'password' => 'pass', 'vhost'=>'wgp_core' ]; //創建連接和channel $conn = new AMQPConnection($conn); if(!$conn->connect()) { die("Cannot connect to the broker!\n"); } $channel = new AMQPChannel($conn); // 用來綁定交換機和隊列 $routingKey = 'key_1'; $ex = new AMQPExchange($channel); // 交換機名稱 $exchangeName = 'ex1'; $ex->setName($exchangeName); // 設置交換機類型 $ex->setType(AMQP_EX_TYPE_DIRECT); // 設置交換機是否持久化消息 $ex->setFlags(AMQP_DURABLE); $ex->declare(); for($i=0; $i<18; ++$i){ echo "Send Message:".$ex->publish(date('H:i:s')."用戶".$i."注冊" , $routingKey )."\n"; } ?>
測試:
運行消費者會阻塞監聽隊列消息
生產消息
web界面顯示
報錯:
[root@alisz-yt-pixso-rabbitmq01:/usr/local]# rabbitmqctl join_cluster rabbit@alisz-yt-pixso-rabbitmq02
Clustering node rabbit@alisz-yt-pixso-rabbitmq01 with rabbit@alisz-yt-pixso-rabbitmq02
Error:
{:corrupt_or_missing_cluster_files, {:error, :enoent}, {:ok, [[:"rabbit@alisz-yt-pixso-rabbitmq01"]]}}
處理:
命令用錯,需要重置集群,並重啟節點的服務
rabbitmqctl join_cluster rabbit@alisz-yt-pixso-rabbitmq02
[root@alisz-yt-pixso-rabbitmq01:/usr/local]# rm -rf /usr/local/rabbitmq/var/lib/rabbitmq/mnesia/
[root@alisz-yt-pixso-rabbitmq01:/usr/local]# systemctl restart rabbitmq-server
[root@alisz-yt-pixso-rabbitmq01:/usr/local]# rabbitmqctl stop_app
[root@alisz-yt-pixso-rabbitmq01:/usr/local]# rabbitmqctl reset
Resetting node rabbit@alisz-yt-pixso-rabbitmq01 ...
[root@alisz-yt-pixso-rabbitmq01:/usr/local]# rabbitmqctl join_cluster rabbit@alisz-yt-pixso-rabbitmq02
Clustering node rabbit@alisz-yt-pixso-rabbitmq01 with rabbit@alisz-yt-pixso-rabbitmq02
集群狀態監控
# /usr/local/rabbitmq_server-3.8.5/sbin/rabbitmqctl node_health_check
This command is DEPRECATED and will be removed in a future version.
It performs intrusive, opinionated health checks and requires a fully booted node.
Use one of the options covered in https://www.rabbitmq.com/monitoring.html#health-checks instead.
Timeout: 70 seconds ...
Checking health of node rabbit@alisz-yt-pixso-rabbitmq02 ...
Health check passed
# 監控項
UserParameter=mq_node_health,/usr/local/rabbitmq_server-3.8.5/sbin/rabbitmqctl node_health_check 2>/dev/null |grep -c "Health check passed"|wc -l