rabbitmq高可用踩坑记:搭建rabbitmq集群

前言:

本节内容是关于rabbitmq高可用集群的部署搭建,使用的是ubuntu22系统,我们准备三台服务器作为rabbitmq的高可用服务器,rabbitmq集群本身不是天然支持高可用的,我们通过配置rabbitmq服务器的镜像队列,以确保消息可以在集群中的多个节点上进行复制存储,提高可用性和容错性,避免单节点故障

准备:

server虚拟机hostname
rabbitmq10.0.1.21node01
rabbitmq10.0.1.22node02
rabbitmq10.0.1.23node03

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分享一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值