普通集群与镜像集群配置

目录

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

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

[三. 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数据写入记录

相关推荐
wy02_33 分钟前
MySQL-MVCC(多版本并发控制)
数据库·mysql
中科院提名者3 小时前
Django连接mysql数据库报错ModuleNotFoundError: No module named ‘MySQLdb‘
数据库·mysql·django
Gauss松鼠会3 小时前
GaussDB数据库中SQL诊断解析之配置SQL限流
数据库·人工智能·sql·mysql·gaussdb
总是学不会.4 小时前
【集合】Java 8 - Stream API 17种常用操作与案例详解
java·windows·spring boot·mysql·intellij-idea·java集合
编程修仙4 小时前
MySQL外连接
数据库·mysql
Edward-tan4 小时前
【全栈开发】----用pymysql库连接MySQL,批量存入
数据库·mysql·pymysql
iVictor4 小时前
MySQL 优化利器 SHOW PROFILE 的实现原理
mysql
程序员黄同学7 小时前
如何使用 Python 连接 MySQL 数据库?
数据库·python·mysql
嶔某11 小时前
MySql:基本查询
数据库·mysql
毕设资源大全13 小时前
基于SpringBoot+html+vue实现的林业产品推荐系统【源码+文档+数据库文件+包部署成功+答疑解惑问到会为止】
java·数据库·vue.js·spring boot·后端·mysql·html