RabbitMQ的相关部署

一、普通集群准备环境

注意,这⾥三台服务器都联⽹,另外RabbitMQ集群节点必须在同⼀⽹段⾥,如果是跨⼴域⽹,效果会变差。

10.36.192.150    rabbitmq-1
10.36.192.151    rabbitmq-2
10.36.192.152    rabbitmq-3

三台服务器均关闭防火墙和selinux

[root@rabbitmq-1 ~]#systemctl stop firewalld  &&  systemctl disable firewalld
[root@rabbitmq-1 ~]#setenforce 0 && sed -ri 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux

三个节点配置安装rabbitmq软件

#安装依赖
[root@rabbitmq-1 ~]# yum install -y epel-release gcc-c++ unixODBC unixODBC-devel openssl-devel ncurses-devel

# 下载并yum安装erlang
[root@rabbitmq-1 ~]# wget https://packagecloud.io/rabbitmq/erlang/packages/el/7/erlang-21.3.8.21-1.el7.x86_64.rpm?distro_version_id=140
[root@rabbitmq-1 ~]# yum install erlang-21.3.8.21-1.el7.x86_64

# 下载并yum安装rabbitmq
[root@rabbitmq-1 ~]# wget https://github.com/rabbitmq/rabbitmq-server/releases/tag/v3.7.10
[root@rabbitmq-1 ~]# yum install rabbitmq-server-3.7.10-1.el7.noarch.rpm

# 查看rabbitmq 和erlang兼容版本
https://www.rabbitmq.com/which-erlang.html

# erlang 版本选择
https://packagecloud.io/rabbitmq/erlang

# rabbitmq 版本选择
https://www.rabbitmq.com/news.html

启动RabbitMQ服务

方式一:

[root@rabbitmq-1 ~]# systemctl daemon-reload
[root@rabbitmq-1 ~]# systemctl start rabbitmq-server
[root@rabbitmq-1 ~]# systemctl enable rabbitmq-server

方式二:

[root@rabbitmq-1 ~]# /sbin/service rabbitmq-server start

开启rabbitmq的web访问界面

[root@rabbitmq-1 ~]# rabbitmq-plugins enable rabbitmq_management

创建用户(注意:在一台机器操作实验即可)

#添加用户和密码
[root@rabbitmq-1 ~]# rabbitmqctl add_user suqin 123456

#设置用户角色
[root@rabbitmq-1 ~]# rabbitmqctl set_user_tags suqin administrator

#查看用户
[root@rabbitmq-1 ~]# rabbitmqctl list_users

设置权限

此处设置权限时注意'.*'之间需要有空格 三个'.*'分别代表了conf权限,read权限与write权限 例如:当没有给newrain设置这三个权限前是没有权限查询队列,在ui界面也看不见

[root@rabbitmq-1 ~]# rabbitmqctl set_permissions -p "/" suqin ".*" ".*" ".*"

开启用户远程登录

[root@rabbitmq-1 rabbitmq]# cp /usr/share/doc/rabbitmq-server-3.7.10/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
[root@rabbitmq-1 rabbitmq]# ls
enabled_plugins  rabbitmq.config
[root@rabbitmq-1 rabbitmq]# vim /etc/rabbitmq/rabbitmq.config +61
{loopback_users, []}      #将注释打开,删除后面的 ,
[root@rabbitmq-1 ~]# systemctl restart rabbitmq-server   #重启服务

查看端口

[root@rabbitmq-1 ~]# ss -nplt
State       Recv-Q Send-Q Local Address:Port                Peer Address:Port              
LISTEN      0      128                *:4369                           *:*                   users:(("epmd",pid=8723,fd=3))
LISTEN      0      128                *:15672                          *:*                   users:(("beam.smp",pid=8525,fd=74))
LISTEN      0      128                *:25672                          *:*                   users:(("beam.smp",pid=8525,fd=62))
LISTEN      0      128             [::]:4369                        [::]:*                   users:(("epmd",pid=8723,fd=4))
LISTEN      0      128             [::]:5672                        [::]:*                   users:(("beam.smp",pid=8525,fd=73))

4369 -- erlang发现端口
5672 --程序连接端口
15672 -- 管理界面ui端口
25672 -- server间内部通信口

访问:

10.36.192.150:15672

rabbitmq默认管理员用户:guest 密码:guest

新添加的用户为:newrain 密码:123456

二、部署集群(三台机器)

先重复上述步骤,将其余两台机器按上述操作并测试完毕!

然后将三台服务器进行下列操作:

1.创建数据存放目录和日志存放目录并配置

#创建数据、日志目录:
[root@rabbitmq-1 ~]# mkdir -p /data/rabbitmq/data
[root@rabbitmq-1 ~]# mkdir -p /data/rabbitmq/logs

#以下二选一即可:
[root@rabbitmq-1 ~]# chmod 777 -R /data/rabbitmq
[root@rabbitmq-1 ~]# chown rabbitmq.rabbitmq /data/ -R

#创建配置文件:
[root@rabbitmq-1 ~]# vim /etc/rabbitmq/rabbitmq-env.conf
#添加以下信息:
RABBITMQ_MNESIA_BASE=/data/rabbitmq/data
RABBITMQ_LOG_BASE=/data/rabbitmq/logs

重启服务
[root@rabbitmq-1 ~]# systemctl restart rabbitmq-server

2.拷⻉erlang.cookie

erlang.cookie 一般会存在这两个地址:
        第一个是home/.erlang.cookie(rpm等安装包方式进行安装所在的位置)

        第二个地方就是/var/lib/rabbitmq/.erlang.cookie(解压缩方式安装部署所在位置)

[root@rabbitmq-1 ~]# cat /var/lib/rabbitmq/.erlang.cookie
HOUCUGJDZYTFZDSWXTHJ
#⽤scp的⽅式将rabbitmq-1节点的.erlang.cookie的值复制到其他两个节点中
[root@rabbitmq-1 ~]# scp /var/lib/rabbitmq/.erlang.cookie root@192.168.50.139:/var/lib/rabbitmq/
[root@rabbitmq-1 ~]# scp /var/lib/rabbitmq/.erlang.cookie root@192.168.50.140:/var/lib/rabbitmq/

3.将mq-2、mq-3作为内存节点加⼊mq-1节点集群中

#在mq-2、mq-3执⾏如下命令:
[root@rabbitmq-2 ~]# systemctl restart rabbitmq-server

#停止节点
[root@rabbitmq-2 ~]# rabbitmqctl stop_app  

#如果有数据需要重置,没有则不用
[root@rabbitmq-2 ~]# rabbitmqctl reset  

#添加到磁盘节点
[root@rabbitmq-2 ~]# rabbitmqctl join_cluster --ram rabbit@rabbitmq-1  
Clustering node 'rabbit@rabbitmq-2' with 'rabbit@rabbitmq-1' ...

#启动节点
[root@rabbitmq-2 ~]# rabbitmqctl start_app  
Starting node 'rabbit@rabbitmq-2' ...

[root@rabbitmq-3 ~]# systemctl restart rabbitmq-server
[root@rabbitmq-3 ~]# rabbitmqctl stop_app
[root@rabbitmq-3 ~]# rabbitmqctl reset
[root@rabbitmq-3 ~]# rabbitmqctl join_cluster --ram rabbit@rabbitmq-1
[root@rabbitmq-3 ~]# rabbitmqctl start_app

#如果有需要使用磁盘节点加入集群
[root@rabbitmq-2 ~]# rabbitmqctl join_cluster  rabbit@rabbitmq-1
[root@rabbitmq-3 ~]# rabbitmqctl join_cluster  rabbit@rabbitmq-1

注:

(1)默认rabbitmq启动后是磁盘节点,在这个cluster命令下,mq-2和mq-3是内存节点,
mq-1是磁盘节点。
(2)如果要使mq-2、mq-3都是磁盘节点,去掉--ram参数即可。
(3)如果想要更改节点类型,可以使⽤命令rabbitmqctl change_cluster_node_type
disc(ram),前提是必须停掉rabbit应⽤

4.查看集群状态

在 RabbitMQ 集群任意节点上执行 rabbitmqctl cluster_status来查看是否集群配置成功。

[root@rabbitmq-1 ~]# rabbitmqctl cluster_status

 每台机器显示出三台节点,表示已经添加成功!
(1)默认rabbitmq启动后是磁盘节点,在这个cluster命令下,mq-2和mq-3是内存节点,mq-1是磁盘节点。
(2)如果要使mq-2、mq-3都是磁盘节点,去掉--ram参数即可。
(3)如果想要更改节点类型,可以使用命令rabbitmqctl change_cluster_node_type disc(ram),前提是必须停掉

5.登录rabbitmq web管理控制台,创建新的队列

打开浏览器输⼊http://10.36.192.150:15672
输⼊默认的Username:guest
输⼊默认的Password: guest

根据界⾯提示创建⼀条队列

 创建成功后在Queues中可以看到

三、RabbitMQ镜像集群配置

上面已经完成的是RabbitMQ默认集群模式,并不保证队列的高可用性,且队列节点宕机直接会导致该队列无法应用,只能等待重启,要想解决此问题,就要复制队列内容到集群里的每个节点,必须要创建镜像队列。 镜像队列是基于普通的集群模式的,添加一些策略,所以你还是得先配置普通集群,然后才能设置镜像队列,我们就以上面的集群接着做。 保证各个节点之间数据同步。

1.创建镜像集群

授予权限:

rabbitmqctl set_permissions  ".*" ".*" ".*"    # 后面三个”*”代表用户拥有配置、写、读全部权限

[root@rabbitmq-1 ~]# rabbitmqctl set_policy  ha-all "^" '{"ha-mode":"all"}’
[root@rabbitmq-2 ~]# rabbitmqctl set_policy  ha-all "^" '{"ha-mode":"all"}'
[root@rabbitmq-3 ~]# rabbitmqctl set_policy  ha-all "^" '{"ha-mode":"all"}'
#创建成功后会显示以下信息
Setting policy "ha-all" for pattern "^" to "{"ha-mode":"all"}" with priority "0" for vhost "/" ...

 查看队列已经同步到其他两台节点:

"-p Vhost" :vhost名称, "^"匹配所有的队列, ha-all 策略名称为ha-all, '{"ha-mode":"all"}' 策略模式为 all 即复制到所有节点,包含新增节点,则此时镜像队列设置成功。

镜像队列策略设置说明:

rabbitmqctl set_policy [-p Vhost] Name Pattern Definition [Priority]

-p Vhost: 可选参数,针对指定vhost下的queue进行设置
Name: policy的名称
Pattern: queue的匹配模式(正则表达式)
Definition:镜像定义,包括三个部分ha-mode, ha-params, ha-sync-mode
    ha-mode:指明镜像队列的模式,有效值为 all/exactly/nodes
        all:表示在集群中所有的节点上进行镜像
        exactly:表示在指定个数的节点上进行镜像,节点的个数由ha-params指定
        nodes:表示在指定的节点上进行镜像,节点名称通过ha-params指定
    ha-params:ha-mode模式需要用到的参数
    ha-sync-mode:进行队列中消息的同步方式,有效值为automatic和manual
priority:可选参数,policy的优先级

2.web页面实验

创建一个vhost,并给用户权限添加队列:

首先,在web界面,登陆后,点击“Admin--Virtual Hosts(页面右侧)”,在打开的页面上的下方的“Add a new virtual host”处增加一个虚拟主机coresystem,同时创建用户“admin”和“guest”均加上权限(在页面直接设置、点点点即可)

 

 创建用户:

 

 创建用户完成。

3.服务器中添加队列

再新添加一条队列,在第一台服务器中执行以下命令;

[root@rabbitmq-1 ~]# rabbitmqctl set_policy -p coresystem  ha-all "^" '{"ha-mode":"all"}'

将所有队列设置为镜像队列,即队列会被复制到各个节点,各个节点状态保持一直。完成这 6 个步骤后,RabbitMQ 高可用集群搭建完成,最后一个步骤就是搭建均衡器。

四、安装并配置负载均衡器HA

注意:如果使用阿里云,可以使用阿里云的内网slb来实现负载均衡,不用自己搭建HA。

安装并配置负载均衡器HA

 在10.36.192.150安装HAProxy

[root@rabbitmq-1 ~]# yum -y install haproxy

修改 /etc/haproxy/haproxy.cfg

[root@rabbitmq-1 ~]# cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak
[root@rabbitmq-1 ~]# vim /etc/haproxy/haproxy.cfg
global
    log         127.0.0.1 local2

    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    nbproc      4
    daemon
    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
defaults
    mode                    http
    log                     global
    retries                 3
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout check           10s
    maxconn                 2048
#---------------------------------------------------------------------
##监控查看本地状态#####
listen admin_stats
        bind *:80
    mode http
    option httplog
    option httpclose
    log 127.0.0.1 local0 err
    stats uri  /haproxy
    stats auth newrain:123456
    stats refresh 30s
####################################
###反代监控
frontend server
    bind *:5670
    log global
    mode tcp
    #option forwardfor
    default_backend rabbitmq
    maxconn 3
backend rabbitmq
    mode        tcp
    log         global
    balance     roundrobin
    server      rabbitmq1 10.36.192.150:5672 check inter 2000s rise 2 fall 3
    server      rabbitmq2 10.36.192.151:5672 check inter 2000s rise 2 fall 3
    server      rabbitmq3 10.36.192.152:5672 check inter 2000s rise 2 fall 3
    
[root@rabbitmq-1 ~]# systemctl start haproxy        #启动haproxy

 浏览器输入10.36.192.150/haproxy查看rabbitmq的状态。

五、安装MySQL数据库

安装请参照: http://t.csdnimg.cn/1zslv  (yum安装)     http://t.csdnimg.cn/spizv (源码安装)

登录数据库进行授权远程登录操作:

mysql> update mysql.user set host = '%' where user = 'root';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> ^DBye

六、安装python并测试

git测试包并安装python软件:

[root@rabbitmq-1 ~]# yum -y install git 
[root@rabbitmq-1 ~]# git clone https://gitea.beyourself.org.cn/newrain001/rabbitmq-test.git && \
cd rabbitmq-test && yum install -y python3 python3-devel && \
pip3 install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple

 修改rabbitmq-test的相关文件,即mysql数据库密码端口

[root@rabbitmq-1 ~]# vim rabbitmq-test/settings.py
# rabbitmq 配置
MQName="message_queue"
MQUser="guest"
MQPassword="guest"
MQHost="localhost"
MQPort=5670

# mysql数据库配置
DBHost="localhost"
DBUser="root"
DBPassword="Mawenbao@123"

 设置环境并启动flask服务:

[root@rabbitmq-1 ~]# export FLASK_ENV=development ; flask run --reload -p 80 -h 0.0.0.0

浏览器输入10.36.192.150查看下单页面。

 浏览器输入10.36.192.150/read查看发货页面。

下单时的变化:

发货时的数据变化:

 七、常见错误

 1、使用 rabbitmq-server -detached命令启动rabbitmq时,出现以下提示Warning: PID file not written; -detached was passed,此时使用rabbitmqctl status提示服务已启动,可知此问题不用解决。

2、由于更改hostname文件,在每次rabbitmqctl stop或者rabbitmqctl cluster_status等,只要是rabbitmq的命令就报错,提示大概如下

Cluster status of node rabbit@web2 ...
Error: unable to connect to node rabbit@web2: nodedown

DIAGNOSTICS
===========

attempted to contact: [rabbit@web2]

rabbit@web2:
  * connected to epmd (port 4369) on web2
  * epmd reports node 'rabbit' running on port 25672
  * TCP connection succeeded but Erlang distribution failed

  * Hostname mismatch: node "rabbit@mq2" believes its host is different. Please ensure that hostnames resolve the same way locally and on "rabbit@mq2"


current node details:
- node name: 'rabbitmq-cli-11@web2'
- home dir: /root
- cookie hash: SGwxMdJ3PjEXG1asIEFpBg==

此时先ps aux | grep mq,然后kill -9 该进程,然后再rabbitmq-server -detached即可解决。(即先强制杀死进程,再重新启动)

3、使用rabbitmqctl stoprabbitmq-server -detached重新启动后,原先添加的用户admin、虚拟主机coresystem等均丢失,还需要重新添加。

4、采用脚本启动,在脚本中写好启动好需要加载的各配置项(创建admin用户并授权,创建虚拟主机并授权,配置镜像队列)。

5、RabbitMQ 错误处理

报错:returned an error: shutdown: failed to  start child: Logger.ErrorHandler
原因:erlang版本与RabbitMQ的版本不对应
解决:根据 RabbitMQ Erlang Version Requirements 这个网页检查版本 https://www.rabbitmq.com/which-erlang.html

6、端口冲突问题

需要修改对应冲突的端口,一般均在配置文件中。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值