一、普通集群准备环境
注意,这⾥三台服务器都联⽹,另外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 stop
,rabbitmq-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、端口冲突问题
需要修改对应冲突的端口,一般均在配置文件中。