前言:
本节内容是关于rabbitmq高可用集群的部署搭建,使用的是ubuntu22系统,我们准备三台服务器作为rabbitmq的高可用服务器,rabbitmq集群本身不是天然支持高可用的,我们通过配置rabbitmq服务器的镜像队列,以确保消息可以在集群中的多个节点上进行复制存储,提高可用性和容错性,避免单节点故障
准备:
server | 虚拟机 | hostname |
---|---|---|
rabbitmq | 10.0.1.21 | node01 |
rabbitmq | 10.0.1.22 | node02 |
rabbitmq | 10.0.1.23 | node03 |
1、官网下载-版本选择(这里我选择我们服务一直使用的版本)
https://github.com/rabbitmq/rabbitmq-server/releases/tag/v3.8.16
2、下载后 上传到指定服务器上 并解压tar 包
scp rabbitmq-server-generic-unix-3.8.16.tar ubuntu@10.0.1.21:/home/rabbitmq
解压
tar -xvf rabbitmq-server-generic-unix-3.8.16.tar
3、erlang下载并上传(注意这里的erlang版本要和rabbitmq要兼容)
下载链接https://github.com/erlang/otp/releases/tag/OTP-23.3.2
放到服务器上:
scp otp_src_23.3.2.tar.gz ubuntu@10.0.1.21:/home/rabbitmq
解压
tar -zxvf otp_src_23.3.2.tar.gz
上面的操作在每个节点上执行
4、编译
4.1 编译erlang
otp_src_23.3.2目录下编译(这里建议先make后make install)
make
到编译的时候可能会因为环境差异出现不同的错误(ERROR REPORT====
Unable to load crypto library. Failed with error:
“load_failed, Failed to load NIF library: ‘/home/joinu/rabbitmq/otp_src_23.3.2/lib/crypto/priv/lib/crypto.so: cannot open shared object file: No such file or directory’”
OpenSSL might not be installed on this system.
The on_load function for module crypto returned:
{error,{load_failed,“Failed to load NIF library: ‘/home/joinu/rabbitmq/otp_src_23.3.2/lib/crypto/priv/lib/crypto.so: cannot open shared object file: No such file or directory’”}})这个错误表明 Erlang 找不到 crypto.so 文件。需要重新编译 Erlang,确保正确链接到 OpenSSL。这里就要查看自己的openssl的版本和erlang的版本是否匹配如果系统的openssl不支持可以尝试指定环境变量 并重新编译
首先设置openssl的环境变量
export OPENSSL_ROOT=/usr/local/ssl # 或者你安装 OpenSSL 的路径
export LD_LIBRARY_PATH=$OPENSSL_ROOT/lib:$LD_LIBRARY_PATH
export PATH=$OPENSSL_ROOT/bin:$PATH
然后otp_src_23.3.2目录下重新编译
make clean
./configure --prefix=/usr/local \
--enable-threads \
--enable-smp-support \
--enable-kernel-poll \
--enable-ssl \
--with-ssl=/usr/local/ssl
make
make install
(这里注意一下 可能会遇到文档下载出现问题因为 install过程时间会很长 可以试试make install_sw 只安装软件 不安装稳当)
检查版本
erl -version
进入 Erlang shell 测试
erl
> crypto:start().
如下:
erl
Erlang/OTP 23 [erts-11.2.1] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1]
Eshell V11.2.1 (abort with ^G)
1> crypto:start().
ok
2> exit
4.2 创建./erlang/cookie
到解压好的rabbitmq3.8.6目录下(生成.erlang.cookie)
echo "YOUR_SECRET_COOKIE" > /var/lib/rabbitmq/.erlang.cookie
设置文件权限
sudo chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
sudo chmod 600 /var/lib/rabbitmq/.erlang.cookie
这里需要注意一下因为搭建的是rabbitmq集群这个cookie在每个节点上都要一致,并且rabbitmq/var/lib/rabbitmq目录下的cookie要和服务器上的cookie一致(这可以查看服务器上的根目录./erlang.cookie)
4.3 启动rabbitmq
创建 RabbitMQ 的 systemd 服务文件:
vi /etc/systemd/system/rabbitmq-server.service
[Unit]
Description=RabbitMQ Server
After=syslog.target network.target
[Service]
Type=simple
User=root
Group=root
ExecStart=/youpath/rabbitmq_server-3.8.16/sbin/rabbitmq-server
ExecStop=/youpath/rabbitmq_server-3.8.16/sbin/rabbitmqctl stop
PIDFile=/var/run/rabbitmq/pid
Restart=always
RestartSec=10
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
启动
# 重新加载 systemd
systemctl daemon-reload
# 启动服务
systemctl start rabbitmq-server
# 设置开机自启
systemctl enable rabbitmq-server
# 查看状态
systemctl status rabbitmq-server
4.4 配置集群
node01: rabbitmq3.8.36/sbin/目录下执行
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
rabbitmq-plugins enable rabbitmq_management
node02:
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@node1
rabbitmqctl start_app
node03:
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@node1
rabbitmqctl start_app
配置完可访问图形化页面查看http://ip+15672
5、配置镜像队列
正常情况下,rabbitmq集群并不是高可用的,节点间的数据是不能共享的,需要使用镜像队列同步节点数据,引入镜像队列(Mirror Queue)的机制,如果集群中的一个节点失效了,队列能自动地切换到镜像中的另一个节点上以保证服务的可用性
所有队列进行镜像,并在集群的3个节点上完成进行,policy的设置命令为
rabbitmqctl set_policy ha-queue-two '^' '{"ha-mode":"exactly","ha-params":3,"ha-sync-mode":"automatic"}'
(当然也可以在图形页面配置—Admin----policies----User policies–按上方的key value 进行手动配置–》到这里rabbitmq的集群就搭建完成了)
6、集成到prometheus(自己玩的 grafana+prometheus+rabbitmq)
在prometheus.yml添加:
- job_name: rabbitmq
metrics_path: 'metrics'
static_configs:
- targets: ['10.0.1.21:15692','10.0.1.22:15692','10.0.1.23:15692']
配置完成重新加载prometheus
curl -X POST http://youprometheus:9090/-/reload
到grafana中添加prometheus数据源后在grafana.com/dashboards选一个rabbitmq的仪表盘就完成了
注:除了编译erlang会有问题,剩下就注意一下.erlang.cookie在每个节点都要一致 其它后续没有什么难点了,个人建议还是用docker搭建会简单很多,但凡需要编译可能都会有坑的,溜了溜了 继续踩坑了,如果后续有需要我可以把grafana、fluent、loki、prometheus、es、jaeger 一整套的monitor分享一下