普通集群与镜像集群配置

目录

[一. 环境准备](#一. 环境准备)

[二. 开始配置集群](#二. 开始配置集群)

[三. 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消息中间件介绍与安装-CSDN博客

三台虚拟机都安装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

  1. 在192.168.226.25安装HAProxy
bash 复制代码
[root@haproxy ~]# yum install -y haproxy
  1. 修改 /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/ 再次访问下单也,看能否正常下单

负载均衡监控页面也在数据变化正常工作

现在开始模拟正式成交订单时数据写入数据库

http://192.168.226.22/read

查看mysql数据写入记录

相关推荐
Ka1Yan10 分钟前
MySQL索引优化
开发语言·数据结构·数据库·mysql·算法
程序猿 董班长3 小时前
springboot配置多数据源(mysql、hive)
hive·spring boot·mysql
且行志悠8 小时前
Mysql的使用
mysql
白鹭8 小时前
MySQL源码部署(rhel7)
数据库·mysql
星期天要睡觉10 小时前
MySQL 综合练习
数据库·mysql
JosieBook11 小时前
【数据库】MySQL 数据库创建存储过程及使用场景详解
数据库·mysql
处女座_三月11 小时前
改 TDengine 数据库的时间写入限制
数据库·sql·mysql
DemonAvenger12 小时前
MySQL与应用程序的高效交互模式:从基础到实战的最佳实践
数据库·mysql·性能优化
皆过客,揽星河13 小时前
mysql进阶语法(视图)
数据库·sql·mysql·mysql基础语法·mysql进阶语法·视图创建修改删除
2301_7795037617 小时前
MySQL主从同步--主从复制进阶
数据库·mysql