中间件,我给它的定义就是为了实现某系业务功能依赖的软件,包括如下部分:
Web服务器
代理服务器
ZooKeeper
Kafka
RabbitMQ(本章节)
前面两个小节,我们通过手工启动节点,然后通过命令行操作让他变成普通集群和镜像模式。今天我们通过配置文件方式来配置集群,并支持镜像模式。最主要他可以实现自动化部署镜像模式。
RabbitMQ主配置文件
下面的配置文件主要就是RabbitMQ的配置:端口,web插件,访问日志,节点数量(固定节点),节点类型,资源限制,分区处理方式,加载初始化配置,日志目录等。
#这里设置到的路径仅供参考
vi ./etc/rabbitmq.conf
# 基础监听端口
listeners.tcp.default = 5672
# 管理插件配置
management.tcp.port = 15672
management.tcp.ip = 0.0.0.0
management.http_log_dir = /opt/rabbitmq_server-3.8.35/logs/management
# 集群节点配置
cluster_formation.peer_discovery_backend = classic_config
cluster_formation.classic_config.nodes.1 = rabbit@rabbitmq01
cluster_formation.classic_config.nodes.2 = rabbit@rabbitmq02
cluster_formation.classic_config.nodes.3 = rabbit@rabbitmq03
# 节点类型配置
cluster_formation.node_type = disc
# 资源限制
vm_memory_high_watermark.relative = 0.6
disk_free_limit.absolute = 5GB
# 网络分区处理
cluster_partition_handling = pause_minority
# 加载预定义配置
management.load_definitions = /opt/rabbitmq_server-3.8.35/etc/definitions.json
# 日志目录配置
log.dir = /opt/rabbitmq_server-3.8.35/logs
三个节点都可以是一样,如果你想配置为内存节点,则可以调整下面参数,必须要有一个硬盘硬件。
# 节点类型配置
cluster_formation.node_type = ram
RabbitMQ初始化配置文件
#这里的名字和要上面的配置文件想对应
vi ./etc/definitions.json
{
"users": [
{
"name": "admin",
"password": "Admin@123",
"tags": "administrator"
},
{
"name": "monitor",
"password": "Monitor@123",
"tags": "monitoring"
}
],
"vhosts": [
{"name": "/"}
],
"permissions": [
{
"user": "admin",
"vhost": "/",
"configure": ".*",
"write": ".*",
"read": ".*"
},
{
"user": "monitor",
"vhost": "/",
"configure": "",
"write": "",
"read": ".*"
}
],
"policies": [
{
"vhost": "/",
"name": "ha-all",
"pattern": ".*",
"definition": {
"ha-mode": "exactly",
"ha-params": 2
},
"priority": 10,
"apply-to": "queues"
}
]
}
简单解释这个初始化,实际上就是配置了2个账号:一个用于管理员,一个用于监控,并且管理员对默认的虚拟主机(vhost)"/"有所有权限,还配置了镜像队列来实现高可用。前面我们有提到过,这个镜像队列高可用针对的是虚拟主机(vhost),所以如果你创建了基于新的虚拟主机(vhost)是没有镜像队列的高可用的。
RabbitMQ启动脚本
#!/bin/bash
BASE_DIR="/opt/rabbitmq_server-3.8.35"
# 设置环境变量
export HOME="$BASE_DIR/security"
export RABBITMQ_CONFIG_FILE="$BASE_DIR/etc/rabbitmq.conf"
export RABBITMQ_MNESIA_BASE="$BASE_DIR/data/mnesia"
export RABBITMQ_ENABLED_PLUGINS_FILE="$BASE_DIR/etc/rabbitmq/enabled_plugins"
# 确保目录存在
mkdir -p $HOME
mkdir -p $RABBITMQ_MNESIA_BASE
mkdir -p $BASE_DIR/logs/$(hostname)
mkdir -p $BASE_DIR/logs/management
# 创建 Erlang cookie
COOKIE_FILE="$HOME/.erlang.cookie"
if [ ! -f $COOKIE_FILE ]; then
echo "NzvP0LMLjSwon5OdzjVr" > $COOKIE_FILE
chmod 600 $COOKIE_FILE
fi
# 确保插件文件存在
PLUGINS_FILE="$RABBITMQ_ENABLED_PLUGINS_FILE"
if [ ! -f $PLUGINS_FILE ]; then
echo '[rabbitmq_management, rabbitmq_peer_discovery_common, rabbitmq_management_agent].' > $PLUGINS_FILE
fi
# 创建最小配置文件(如果不存在)
if [ ! -f $RABBITMQ_CONFIG_FILE ]; then
cat > $RABBITMQ_CONFIG_FILE <<EOL
listeners.tcp.default = 5672
log.dir = $BASE_DIR/logs
EOL
fi
# 启动 RabbitMQ
$BASE_DIR/sbin/rabbitmq-server \
-c $RABBITMQ_CONFIG_FILE \
--erlang-cookie $(cat $COOKIE_FILE)
启动方式
注:这里为了方便查看,使用的前台启动,需要后台启动把启动脚本添加后台启动参数即可。
1.选一个节点先启动
2.手工复制第一个节点生成的.erlang.cookie
#具体路径和脚本相互匹配
cd /opt/rabbitmq_server-3.8.35
scp -r security rabbitmq02:/opt/rabbitmq_server-3.8.35/
scp -r security rabbitmq03:/opt/rabbitmq_server-3.8.35/
3.在启动后面2个节点
正常情况3个节点都按照上面的方式启动以后,镜像模式的RabbitMQ就算部署成功
注:这里给大家留了一个坑,就是关于RabbitMQ的home目录的。