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

打印 上一主题 下一主题

主题 987|帖子 987|积分 2961

前言:

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

server虚拟机hostnamerabbitmq10.0.1.21node01rabbitmq10.0.1.22node02rabbitmq10.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的环境变量
  1. export OPENSSL_ROOT=/usr/local/ssl  # 或者你安装 OpenSSL 的路径
  2. export LD_LIBRARY_PATH=$OPENSSL_ROOT/lib:$LD_LIBRARY_PATH
  3. export PATH=$OPENSSL_ROOT/bin:$PATH
复制代码
然后otp_src_23.3.2目录下重新编译
make clean
  1. ./configure --prefix=/usr/local \
  2.     --enable-threads \
  3.     --enable-smp-support \
  4.     --enable-kernel-poll \
  5.     --enable-ssl \
  6.     --with-ssl=/usr/local/ssl
复制代码
make
make install(这里注意一下 可能会遇到文档下载出现题目因为 install过程时间会很长 可以试试make install_sw 只安装软件 不安装稳当)
查抄版本
erl -version
进入 Erlang shell 测试
  1. erl
  2. > crypto:start().
复制代码
如下:
  1. erl
  2. Erlang/OTP 23 [erts-11.2.1] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1]
  3. Eshell V11.2.1  (abort with ^G)
  4. 1> crypto:start().
  5. ok
  6. 2> exit
复制代码
4.2 创建./erlang/cookie

到解压好的rabbitmq3.8.6目录下(生成.erlang.cookie)
  echo "YOUR_SECRET_COOKIE" > /var/lib/rabbitmq/.erlang.cookie
设置文件权限
  1.    sudo chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
  2.    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
  1. [Unit]
  2. Description=RabbitMQ Server
  3. After=syslog.target network.target
  4. [Service]
  5. Type=simple
  6. User=root
  7. Group=root
  8. ExecStart=/youpath/rabbitmq_server-3.8.16/sbin/rabbitmq-server
  9. ExecStop=/youpath/rabbitmq_server-3.8.16/sbin/rabbitmqctl stop
  10. PIDFile=/var/run/rabbitmq/pid
  11. Restart=always
  12. RestartSec=10
  13. LimitNOFILE=65536
  14. [Install]
  15. WantedBy=multi-user.target
复制代码
启动
  1. # 重新加载 systemd
  2. systemctl daemon-reload
  3. # 启动服务
  4. systemctl start rabbitmq-server
  5. # 设置开机自启
  6. systemctl enable rabbitmq-server
  7. # 查看状态
  8. 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添加:

  1. - job_name: rabbitmq
  2.     metrics_path: 'metrics'
  3.     static_configs:
  4.       - 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分享一下

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

宝塔山

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表