(本文为 https://gist.github.com/niedbalski/69a72103adad4f0f9609a0857c9810a4 的翻译文档。 )
1) 检查 Cluster 状态。
Mnesia('rabbit@juju-machine-30-lxd-11'): ** ERROR ** mnesia_event got {inconsistent_database, running_partitioned_network, 'rabbit@juju-machine-29-lxd-9'}
$ sudo rabbitmqctl cluster_status
2) 选择合适的节点作为 master 节点。
(注:这个步骤很重要,如果没有选择合适的 master 节点,很容易造成消息丢失)
# 通过连接数。
$ juju run --service rabbitmq-server "sudo ss -t state established -nt '( sport = :amqp )' | wc -l"
# 最新的 mnesia。
$ juju run --service rabbitmq-server 'sudo find /var/lib/rabbitmq/mnesia -type f | xargs ls -ltr | tail -n 1 | cut -d " " -f13 | xargs -I {} stat -c "%y" {}'
# Openstack 队列中包含最多的消息数。
$ juju run --service rabbitmq-server "sudo rabbitmqctl list_queues -p openstack messages | awk '{s+=\$1}END{print s}'"
3) 在非 master 节点上停止所有的 epmd/erl 进程。
$ /etc/init/rabbitmq-server stop
$ sudo killall epmd
(注:在 juju 的环境里还需要关掉 jujud 以免 juju 自作主张重启 rabbitmq server)
$ sudo systemctl stop jujud-unit-rabbitmq-server-0.service
确认所有的 rabbitmq 进程都被杀掉了:
$ sudo ps -U rabbitmq -o pid --no-heading
4) 删除 mnesia,重新启动 rabbitmq 服务,然后停止 app。
$ sudo mv /var/lib/rabbitmq/mnesia /var/lib/rabbitmq/mnesia-back
$ sudo service rabbitmq-server start
$ sudo rabbitmqctl stop_app
确认 rabbitmq 服务启动,并且未加入 cluster。 ($ sudo rabbitmqctl cluster_status
)
5) 在 master 节点上忘记(forget) 其他节点。
$ sudo rabbitmqctl stop_app
$ sudo rabbitmqctl forget_cluster_node rabbit@trashed-slave
$ sudo rabbitmqctl start_app
(注:这里应该有比较重要的一步,就是检查所有节点上的 cluster_name
。
一定要确保其他节点上的cluster_name
跟 master 节点一致。所以青蛙把这一步作为5.1)
5.1) 检查并确认 cluster_name
。
$ juju run --application rabbitmq-server "sudo rabbitmqctl cluster_status |grep cluster_name"
如果 cluster_name
不一致,需要在其他节点上修改 cluster_name
:
$ sudo rabbitmqctl set_cluster_name rabbit@juju-machine-29-lxd-9
6) 将节点加入 cluster,在要加入的节点上执行:
$ sudo rabbitmqctl join_cluster rabbit@master
$ sudo rabbitmqctl start_app
7) 检查 clutser 状态。
$ juju run --application rabbitmq-server "sudo rabbitmqctl cluster_status"
8) 建议将 rabbitmq-server charm 的 cluster-partitioning-handling
选项设置为 autoheal
。
(注:这里需要注意autoheal
可能会使 rabbitmq 丢失数据,所以也应该谨慎使用过。)
https://github.com/openstack/charm-rabbitmq-server/blob/master/config.yaml#L39
Update:
关于 rabbitmq 基本内容,以及 partition 和 brain split 的一个介绍。
- 关于RabbitMq你必须深入理解的内容 https://zhuanlan.zhihu.com/p/60141062
Comments
comments powered by Disqus