跳至主要內容

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