CentOS 7部署RabbitMQ集群(三个节点)
大约 5 分钟约 1576 字
CentOS 7部署RabbitMQ集群(三个节点)
说明
安装RabbitMQ版本信息
erlang 23.x
RabbitMQ 3.8.5
配置yum仓库
# 配置系统基础仓库
sudo sed -e 's|^mirrorlist=|#mirrorlist=|g' \
-e 's|^#baseurl=http://mirror.centos.org|baseurl=https://mirrors.tuna.tsinghua.edu.cn|g' \
-i.bak \
/etc/yum.repos.d/CentOS-*.repo
# 安装epel源并且配置仓库
yum install epel-release -y
sed -e 's!^metalink=!#metalink=!g' \
-e 's!^#baseurl=!baseurl=!g' \
-e 's!//download\.fedoraproject\.org/pub!//mirrors.tuna.tsinghua.edu.cn!g' \
-e 's!http://mirrors\.tuna!https://mirrors.tuna!g' \
-i /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel-testing.repo
安装erlang
# 安装erlang依赖软件包
curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash
[root@rabbit01 ~]# curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash
Detected operating system as centos/7.
Checking for curl...
Detected curl...
Downloading repository file: https://packagecloud.io/install/repositories/rabbitmq/erlang/config_file.repo?os=centos&dist=7&source=script
done.
Installing pygpgme to verify GPG signatures...
Loaded plugins: fastestmirror, langpacks
Determining fastest mirrors
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
base | 3.6 kB 00:00:00
docker-ce-stable | 3.5 kB 00:00:00
extras | 2.9 kB 00:00:00
rabbitmq_erlang-source/signature | 819 B 00:00:00
Retrieving key from https://packagecloud.io/rabbitmq/erlang/gpgkey
Importing GPG key 0xDF309A0B:
Userid : "https://packagecloud.io/rabbitmq/erlang (https://packagecloud.io/docs#gpg_signing) <support@packagecloud.io>"
Fingerprint: 2ebd e413 d3ce 5d35 bcd1 5b7c 71c6 3471 df30 9a0b
From : https://packagecloud.io/rabbitmq/erlang/gpgkey
rabbitmq_erlang-source/signature | 951 B 00:00:00 !!!
updates | 2.9 kB 00:00:00
(1/5): base/7/x86_64/group_gz | 153 kB 00:00:00
(2/5): base/7/x86_64/primary_db | 6.1 MB 00:00:00
(3/5): extras/7/x86_64/primary_db | 230 kB 00:00:00
(4/5): updates/7/x86_64/primary_db | 6.5 MB 00:00:00
(5/5): docker-ce-stable/x86_64/primary_db | 58 kB 00:00:00
rabbitmq_erlang-source/primary | 175 B 00:00:01
Package pygpgme-0.3-9.el7.x86_64 already installed and latest version
Nothing to do
Installing yum-utils...
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
Resolving Dependencies
--> Running transaction check
---> Package yum-utils.noarch 0:1.1.31-52.el7 will be updated
---> Package yum-utils.noarch 0:1.1.31-54.el7_8 will be an update
--> Finished Dependency Resolution
Dependencies Resolved
========================================================================================================================
Package Arch Version Repository Size
========================================================================================================================
Updating:
yum-utils noarch 1.1.31-54.el7_8 base 122 k
Transaction Summary
========================================================================================================================
Upgrade 1 Package
Total download size: 122 k
Downloading packages:
No Presto metadata available for base
yum-utils-1.1.31-54.el7_8.noarch.rpm | 122 kB 00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Updating : yum-utils-1.1.31-54.el7_8.noarch 1/2
Cleanup : yum-utils-1.1.31-52.el7.noarch 2/2
Verifying : yum-utils-1.1.31-54.el7_8.noarch 1/2
Verifying : yum-utils-1.1.31-52.el7.noarch 2/2
Updated:
yum-utils.noarch 0:1.1.31-54.el7_8
Complete!
Generating yum cache for rabbitmq_erlang...
Importing GPG key 0xDF309A0B:
Userid : "https://packagecloud.io/rabbitmq/erlang (https://packagecloud.io/docs#gpg_signing) <support@packagecloud.io>"
Fingerprint: 2ebd e413 d3ce 5d35 bcd1 5b7c 71c6 3471 df30 9a0b
From : https://packagecloud.io/rabbitmq/erlang/gpgkey
Generating yum cache for rabbitmq_erlang-source...
The repository is setup! You can now install packages.
[root@rabbit01 ~]#
# 安装erlang及依赖包
yum install -y erlang socat
# 查看erl版本
erl -version
[root@rabbit03 yum.repos.d]# erl -version
Erlang (SMP,ASYNC_THREADS,HIPE) (BEAM) emulator version 11.2
[root@rabbit03 yum.repos.d]# erl
Erlang/OTP 23 [erts-11.2] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe]
Eshell V11.2 (abort with ^G)
1>
# 导入RabbitMQ相关的Key
rpm --import https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey
rpm --import https://packagecloud.io/gpg.key
# 完成RabbitMQ的安装前置条件
curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh | sudo bash
# 下载并安装RabbitMQ Server包
cd /tmp
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.5/rabbitmq-server-3.8.5-1.el7.noarch.rpm
rpm -ivh rabbitmq-server-3.8.5-1.el7.noarch.rpm
[root@rabbit03 ~]# rpm -ivh rabbitmq-server-3.8.5-1.el7.noarch.rpm
warning: rabbitmq-server-3.8.5-1.el7.noarch.rpm: Header V4 RSA/SHA256 Signature, key ID 6026dfca: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:rabbitmq-server-3.8.5-1.el7 ################################# [100%]
[root@rabbit03 ~]#
[root@rabbit03 ~]#
# 启用管理平台插件,启用插件后,可以可视化管理RabbitMQ
rabbitmq-plugins enable rabbitmq_management
[root@rabbit01 ~]# rabbitmq-plugins enable rabbitmq_management
Enabling plugins on node rabbit@rabbit01:
rabbitmq_management
The following plugins have been configured:
rabbitmq_management
rabbitmq_management_agent
rabbitmq_web_dispatch
Applying plugin configuration to rabbit@rabbit01...
The following plugins have been enabled:
rabbitmq_management
rabbitmq_management_agent
rabbitmq_web_dispatch
set 3 plugins.
Offline change; changes will take effect at broker restart.
# 重启RabbitMQ服务
[root@rabbit03 ~]# systemctl restart rabbitmq-server
# 在浏览器中可以通过http://10.30.101.63:15672/地址登录,但是由于新版本只能在本机使用guest账号登录,下面需要使用命令手工创建账号
# 创建具有管理员权限的admin账号并授权
[root@rabbit03 ~]# rabbitmqctl add_user admin admin
Adding user "admin" ...
[root@rabbit03 ~]# rabbitmqctl set_user_tags admin administrator
Setting tags for user "admin" to [administrator] ...
[root@rabbit03 ~]#
# 授权远程访问
[root@rabbit03 ~]# rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
Setting permissions for user "admin" in vhost "/" ...
[root@rabbit03 ~]#
[root@rabbit01 ~]# rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
Setting permissions for user "admin" in vhost "/" ...
[root@rabbit01 ~]# rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
Setting policy "ha-all" for pattern "^" to "{"ha-mode":"all"}" with priority "0" for vhost "/" ...
[root@rabbit01 ~]# rabbitmqctl set_policy productsyncinfo-ha ".*\.ProductSyncInfo\..*" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
Setting policy "productsyncinfo-ha" for pattern ".*\.ProductSyncInfo\..*" to "{"ha-mode":"all","ha-sync-mode":"automatic"}" with priority "0" for vhost "/" ...
至此单机安装RabbitMQ安装完成。
集群配置
# 同步主节点的Cookie文件到所有集群其它节点
rsync -ravz -p /var/lib/rabbitmq/.erlang.cookie root@rabbit02:/var/lib/rabbitmq/.erlang.cookie
rsync -ravz -p /var/lib/rabbitmq/.erlang.cookie root@rabbit03:/var/lib/rabbitmq/.erlang.cookie
# 在rabbit01上操作
[root@rabbit01 rabbitmq]#
[root@rabbit01 rabbitmq]# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@rabbit01 ...
[root@rabbit01 rabbitmq]# rabbitmqctl reset
Resetting node rabbit@rabbit01 ...
[root@rabbit01 rabbitmq]# rabbitmq-plugins enable rabbitmq-management
Enabling plugins on node rabbit@rabbit01:
rabbitmq-management
Error:
{:plugins_not_found, [:"rabbitmq-management"]}
[root@rabbit01 rabbitmq]# rabbitmqctl start_app
Starting node rabbit@rabbit01 ...
[root@rabbit01 rabbitmq]#
查看集群状态信息
[root@rabbit01 rabbitmq]# rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit01 ...
Basics
Cluster name: rabbit@rabbit01
Disk Nodes
rabbit@rabbit01
rabbit@rabbit02
rabbit@rabbit03
Running Nodes
rabbit@rabbit01
Versions
rabbit@rabbit01: RabbitMQ 3.8.5 on Erlang 23.3.1
Alarms
(none)
Network Partitions
(none)
Listeners
Node: rabbit@rabbit01, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@rabbit01, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@rabbit01, interface: [::], port: 15672, protocol: http, purpose: HTTP API
Feature flags
Flag: drop_unroutable_metric, state: enabled
Flag: empty_basic_get_metric, state: enabled
Flag: implicit_default_bindings, state: enabled
Flag: quorum_queue, state: enabled
Flag: virtual_host_metadata, state: enabled
[root@rabbit01 rabbitmq]#
修改集群节点的内存模式/硬盘模式
# 将节点rabbit02的节点模式有硬盘模式修改成内存模式
[root@rabbit02 ~]# stop_app
bash: stop_app: command not found...
[root@rabbit02 ~]# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@rabbit02 ...
[root@rabbit02 ~]# rabbitmqctl change_cluster_node_type ram
Turning rabbit@rabbit02 into a ram node
[root@rabbit02 ~]# rabbitmqctl start_app
Starting node rabbit@rabbit02 ...
[root@rabbit02 ~]#
[root@rabbit02 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit02 ...
Basics
Cluster name: rabbit@rabbit01
Disk Nodes
rabbit@rabbit01
rabbit@rabbit03
RAM Nodes
rabbit@rabbit02
Running Nodes
rabbit@rabbit01
rabbit@rabbit02
rabbit@rabbit03
Versions
rabbit@rabbit01: RabbitMQ 3.8.5 on Erlang 23.3.1
rabbit@rabbit02: RabbitMQ 3.8.5 on Erlang 23.3.1
rabbit@rabbit03: RabbitMQ 3.8.5 on Erlang 23.3.1
Alarms
(none)
Network Partitions
(none)
Listeners
Node: rabbit@rabbit01, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@rabbit01, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@rabbit01, interface: [::], port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@rabbit02, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@rabbit02, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@rabbit02, interface: [::], port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@rabbit03, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@rabbit03, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@rabbit03, interface: [::], port: 15672, protocol: http, purpose: HTTP API
Feature flags
Flag: drop_unroutable_metric, state: enabled
Flag: empty_basic_get_metric, state: enabled
Flag: implicit_default_bindings, state: enabled
Flag: quorum_queue, state: enabled
Flag: virtual_host_metadata, state: enabled
[root@rabbit02 ~]#
测试准备工作
# 安装python操作RabbitMQ类库
python -m pip install pika --upgrade
测试脚本 send.py
import pika
import time
for i in range(10000):
creds = pika.credentials.PlainCredentials('admin', 'admin')
connection = pika.BlockingConnection(pika.ConnectionParameters(host='10.30.101.61', port=5672, credentials=creds))
channel = connection.channel()
channel.queue_declare(queue='hello')
# key = "key_{}".format(i)
msg = "Message body : {}".format(i)
channel.basic_publish(exchange='', routing_key='hello', body=msg)
print(" [x] Sent '{}'".format(msg))
connection.close()
time.sleep(0.1)
测试脚本 receive.py
import pika, sys, os
def main():
creds = pika.credentials.PlainCredentials('admin', 'admin')
connection = pika.BlockingConnection(pika.ConnectionParameters(host='10.30.101.63', port=5672, credentials=creds))
channel = connection.channel()
channel.queue_declare(queue='hello')
def callback(ch, method, properties, body):
print(" [x] Received %r" % body)
channel.basic_consume(queue='hello', on_message_callback=callback, auto_ack=True)
print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
print('Interrupted')
try:
sys.exit(0)
except SystemExit:
os._exit(0)
测试步骤
# 先在一个powershell或cmd窗口中运行send.py脚本,可多开多个窗口运行
python send.py
# 然后在另外一个powershell或cmd窗口中运行receive.py脚本,观察控制台输出
python receive.py