目录
[一. 环境准备](#一. 环境准备)
[二. 开始配置集群](#二. 开始配置集群)
[三. RabbitMQ镜像集群配置](#三. RabbitMQ镜像集群配置)
[四. 安装并配置负载均衡器HA](#四. 安装并配置负载均衡器HA)
一. 环境准备
关闭防火墙和selinux,进行时间同步
主机名 | 系统 | IP | 服务 |
---|---|---|---|
rabbitmq-1 | Rocky_linux9.4 | 192.168.226.22 | RabbitMQ,MySQL |
rabbitmq-2 | Rocky_linux9.4 | 192.168.226.23 | RabbitMQ |
rabbitmq-3 | Rocky_linux9.4 | 192.168.226.24 | RabbitMQ |
bash
修改主机名
#192.168.226.22
hostnamectl set-hostname rabbitmq-1
#192.168.226.22
hostnamectl set-hostname rabbitmq-2
#192.168.226.22
hostnamectl set-hostname rabbitmq-3
注:修改完后都手动断开重新连接,不要使用bash
配置域名解析,三台虚拟机都配置
bash
cat >> /etc/hosts <<EOF
192.168.226.22 rabbitmq-1
192.168.226.23 rabbitmq-2
192.168.226.24 rabbitmq-3
EOF
三台虚拟机都安装RabbitMQ,并进入到web管理界面,如下图:
二. 开始配置集群
1.首先创建好数据存放目录和日志存放目录
bash
[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 ~]#cat > /etc/rabbitmq/rabbitmq-env.conf <<EOF
RABBITMQ_MNESIA_BASE=/data/rabbitmq/data
RABBITMQ_LOG_BASE=/data/rabbitmq/logs
EOF
重启服务
[root@rabbitmq-1 ~]# systemctl restart rabbitmq-server
2. 拷⻉erlang.cookie
Rabbitmq的集群是依附于erlang的集群来⼯作的,所以必须先构建起erlang的集群景象。Erlang的集群中
各节点是经由过程⼀个magic cookie来实现的,这个cookie存放在/var/lib/rabbitmq/.erlang.cookie中,⽂件是400的权限。所以必须保证各节点cookie⼀致,不然节点之间就⽆法通信.
(官方在介绍集群的文档中提到过.erlang.cookie 一般会存在这两个地址:第一个是home/.erlang.cookie;第二个地方就是/var/lib/rabbitmq/.erlang.cookie。如果我们使用解压缩方式安装部署的rabbitmq,那么这个文件会在{home}目录下,也就是$home/.erlang.cookie。如果我们使用rpm等安装包方式进行安装的,那么这个文件会在/var/lib/rabbitmq目录下。)
bash
[root@rabbitmq-1 ~]# cat /var/lib/rabbitmq/.erlang.cookie
HVYPGZCOFCYBEZHGUHQB
⽤scp的⽅式将rabbitmq-1节点的.erlang.cookie的值复制到其他两个节点中,一次保证cookie一致。
[root@rabbitmq-1 ~]# scp /var/lib/rabbitmq/.erlang.cookie root@192.168.226.23:/var/lib/rabbitmq/
[root@rabbitmq-1 ~]# scp /var/lib/rabbitmq/.erlang.cookie root@192.168.226.24:/var/lib/rabbitmq/
3.将rabbitmq-2、rabbitmq-3作为内存节点加⼊rabbitmq-1节点集群中
bash
在rabbitmq-2、rabbitmq-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' ...
======================================================================
(1)默认rabbitmq启动后是磁盘节点,在这个cluster命令下,mq-2和mq-3是内存节点,
mq-1是磁盘节点。
(2)如果要使mq-2、mq-3都是磁盘节点,去掉--ram参数即可。
(3)如果想要更改节点类型,可以使⽤命令rabbitmqctl change_cluster_node_type
disc(ram),前提是必须停掉rabbit应⽤
注:
#如果有需要使用磁盘节点加入集群,使用下述命令格式,默认即为磁盘节点,内存节点是加上--ram参数
rabbitmqctl join_cluster rabbit@rabbitmq-1
#如果执行rabbitmqctl stop_app 这条命令报错:需要执行
#chmod 400 .erlang.cookie
#chown rabbitmq.rabbitmq .erlang.cookie
4. 查看集群状态
bash
在 RabbitMQ 集群任意节点上执行 rabbitmqctl cluster_status来查看是否集群配置成功。
这里我在rabbitmq-1磁盘节点上面查看
[root@rabbitmq-1 ~]# rabbitmqctl cluster_status
bash
每台机器显示出三台节点,表示已经添加成功!
(1)默认rabbitmq启动后是磁盘节点,在这个cluster命令下,mq-2和mq-3是内存节点,mq-1是磁盘节点。
(2)如果要使mq-2、mq-3都是磁盘节点,去掉--ram参数即可。
(3)如果想要更改节点类型,可以使用命令rabbitmqctl change_cluster_node_type disc(ram),前提是必须停掉
rabbit应用
在RabbitMQ集群集群中,必须⾄少有⼀个磁盘节点,否则队列元数据⽆法写⼊到集群中,当磁盘节点宕掉时,集群将⽆法写⼊新的队列元数据信息。
5.登录rabbitmq web管理控制台,创建新的队列
打开浏览器输⼊http://192.168.226.22:15672 输入用户名密码进入
登录后出现如图所示的界⾯执行操作。
在RabbitMQ集群集群中,必须⾄少有⼀个磁盘节点,否则队列元数据⽆法写⼊到集群中,当
磁盘节点宕掉时,集群将⽆法写⼊新的队列元数据信息。
三. RabbitMQ镜像集群配置
上面已经完成RabbitMQ默认集群模式,但并不保证队列的高可用性,尽管交换机、绑定这些可以复制到集群里的任何一个节点,但是队列内容不会复制。但队列节点宕机直接导致该队列无法应用,只能等待重启,所以要想在队列节点宕机或故障也能正常应用,就要复制队列内容到集群里的每个节点,必须要创建镜像队列。
镜像队列是基于普通的集群模式的,然后再添加一些策略,所以你还是得先配置普通集群,然后才能设置镜像队列,我们就以上面的集群接着做。 保证各个节点之间数据同步;
1. 创建镜像集群
bash
[root@rabbitmq-1 ~]# rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
参数解释:
rabbitmqctl set_policy:这是RabbitMQ的命令行工具rabbitmqctl中设置策略的命令。
ha-all:这是策略定义的名称,可以为任何你选择的名称,这里选择的是"ha-all"。
"^":这是策略模式,这里的"^"代表这个策略将应用到所有的队列和交换器上。
'{"ha-mode":"all"}':这是策略的定义,这里设置的是ha-mode(高可用模式)为all。这意味着所有的队列将在所有的节点上进行镜像,来提供一个高可用的队列。
"0":这是策略的优先级。如果一个队列同时匹配多个策略,那么优先级高的策略将被使用。这里设置的优先级为0。
for vhost "/":这是策略应用的虚拟主机,这里是应用到了默认的虚拟主机上。
则此时镜像队列设置成功。(这里的虚拟主机是代码中需要用到的虚拟主机,虚拟主机的作用是做一个消息的隔离,本质上可认为是一个rabbitmq-server,是否增加虚拟主机,增加几个,这是由开发中的业务决定,即有哪几类服务,哪些服务用哪一个虚拟主机,这是一个规划)。
再次查看队列已经同步到其他两台节点:
这样就设置完成了
2. 镜像队列策略设置说明
bash
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的优先级
3. 准备测试
bash
#在192.168.226.22上下载一个mysql
[root@rabbitmq-1 ~]# yum install -y mysql-server git unzip
[root@rabbitmq-1 ~]# systemctl enable --now mysqld
[root@rabbitmq-1 ~]# mysqladmin -uroot password "1234"
[root@rabbitmq-1 rabbitmq-test]# mysql -uroot -p1234
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.36 Source distribution
Copyright (c) 2000, 2024, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> CREATE USER 'root'@'%' IDENTIFIED BY '1234';
Query OK, 0 rows affected (0.02 sec)
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
mysql> exit
Bye
#上传rabbitmq-test-main.zip
[root@rabbitmq-1 ~]# git clone https://gitea.beyourself.org.cn/newrain001/rabbitmq-test.git
[root@rabbitmq-1 ~]# ll
total 18300
-rw-------. 1 root root 815 Jun 6 14:00 anaconda-ks.cfg
-rw-r--r-- 1 root root 18713463 Jun 29 14:28 rabbitmq-server-3.13.3-1.el8.noarch.rpm
-rw-r--r-- 1 root root 8221 Jun 29 16:05 rabbitmq-test-main.zip
-rw-r--r--. 1 root root 4747 Jun 24 19:46 rocky_linux.sh
[root@rabbitmq-1 ~]# unzip rabbitmq-test-main.zip
bash
[root@rabbitmq-1 ~]# vim rabbitmq-test/requirements.txt
#修改如下图所示,要把版本号去掉,原因是因为当前系统没有这个版本,去掉让其自行安装别的版本即可
修改成图中所示即可。
然后视情况修改这个配置文件,改对应的IP,如果对应的IP在本机可以使用localhost不用改,不在本机上的话就必须改,用户名和密码也要改成你自己的。
bash
[root@rabbitmq-1 ~]# vim rabbitmq-test/settings.py
下载工具并启动Flask应用
bash
[root@rabbitmq-1 ~]# yum install -y python3 python3-devel
[root@rabbitmq-1 ~]# pip3 install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple
[root@rabbitmq-1 ~]# export FLASK_ENV=development ; flask run --reload -p 80 -h 0.0.0.0
访问框选的web网页,打开后下1000单。
下单后可以看到rabbit mq集群队列中开始记录下单的数据,这时,由于下单但是还没有付费成交,数据并没有写入到数据库中,可以查看下mysql数据库
bash
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.01 sec)
现在模式成交后的数据,来到http://192.168.226.22/read 页面进行模拟成交发货,这时数据就要写入到数据库中。
再次查看mysql,发现数据这时才会写入下数据库中,由于前面我们点击发货的是200,也就是模拟正式交易成功的数据数量是200,此时查看这个库中记录也是200
bash
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| shop |
| sys |
+--------------------+
5 rows in set (0.00 sec)
这个时候我们去把剩下的800发完
四. 安装并配置负载均衡器HA
注意:如果使用阿里云,可以使用阿里云的内网slb来实现负载均衡,不用自己搭建HA。
新增一个虚拟机进行时间同步,关闭防火墙和selinux
主机名 | 系统 | IP | 服务 |
---|---|---|---|
haproxy | Rocky_linux | 192.168.226.25 | HAProxy |
bash
#修改主机名
[root@localhost ~]# hostnamectl set-hostname haproxy
安装并配置负载均衡器HA
- 在192.168.226.25安装HAProxy
bash
[root@haproxy ~]# yum install -y haproxy
- 修改 /etc/haproxy/haproxy.cfg
bash
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
在该配置文件,删除其中所有内容,复制下面的配置信息粘贴进去,保存退出,注意你做的需要把最后三行的主机名和IP修改成你对应的主机名和IP
bash
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
#这里三行配置对应的主机名和IP需要改成你对应的
server rabbitmq-1 192.168.226.22:5672 check inter 2000s rise 2 fall 3
server rabbitmq-2 192.168.226.23:5672 check inter 2000s rise 2 fall 3
server rabbitmq-3 192.168.226.24:5672 check inter 2000s rise 2 fall 3
bash
#启动haproxy并设置开机自启
[root@haproxy ~]# systemctl enable --now haproxy
浏览器输入http://192.168.226.25/haproxy查看rabbitmq的状态。
访问该页面的初始用户名:newrain 密码:123456
这个用户名和密码是在上面配置文件定义的。
现在重新配置Flask应用的配置,改成负载均衡的IP,端口也改成负载均衡监听的端口,然后换个队列名实验。
bash
[root@rabbitmq-1 ~]# vim rabbitmq-test/settings.py
bash
需要先把前面启动的flask应用ctrl + c 关掉再启动
[root@rabbitmq-1 ~]# cd rabbitmq-test
[root@rabbitmq-1 rabbitmq-test]# flask run --reload -p 80 -h 0.0.0.0
http://192.168.226.22:80/ 再次访问下单也,看能否正常下单
负载均衡监控页面也在数据变化正常工作
现在开始模拟正式成交订单时数据写入数据库
查看mysql数据写入记录