RabbitMq容器化部署
rabbit服务组成
rabbitmq服务4大部分组成:
- epmd服务:rabbitmq起来后会自动的启动epmd服务,empd服务是erlang的一个小程序,专门用来做端口管理的。通常端口是4369
- rabbitmq amqp server:这个服务就是我们通常使用rabbitmq服务的时候,连接5672端口的服务,使用来支持amqp服务的。通常端口是5672
- rabbitmq cluster server:主要是用来做cluster节点之间的心跳发现的,通常端口是25672
- 如果开启来rabbitmq manager plugin,会有一个manager api服务,通常端口是15672
除以上的服务之外,还有一个是erlang自带的数据库,专门用来做分部署服务发现的:mnesia数据库。
由于之前环境都是相对比较老的版本,所有本人中容器部署都是用3.6.14版本
RabbitMQ常用命令
rabbitmqctl status
rabbitmqctl cluster_status
rabbitmqctl eval 'rabbit_mnesia:dir().'
#修改用户密码
rabbitmqctl change_password {userName} {newPassword}
#所有名称以ha.开始的队列,都会在集群的所有节点上成为镜像队列。
rabbitmqctl set_policy ha-all "^ha\." '{"ha-mode":"all"}'
#同步队列
rabbitmqctl --vhost=/test sync_queue test
https://www.cnblogs.com/caoweixiong/p/14371114.html
rabbitmqctl设置策略参数
rabbitmqctl set_policy [-p Vhost] Name Pattern Definition [Priority]
-p Vhost: 可选参数,针对指定vhost下的queue进行设置
Name: policy的名称
Pattern: queue的匹配模式(正则表达式)
Definition:镜像定义,包括三个部分ha-mode, ha-params, ha-sync-mode
ha-mode:指明镜像队列的模式,有效值为 all/exactly/nodes
all:表示在集群中所有的节点上进行镜像
exactly:表示在指定个数的节点上进行镜像,节点的个数由ha-params指定
nodes:表示在指定的节点上进行镜像,节点名称通过ha-params指定 ha-params:ha-mode模式需要用到的参数 ha-sync-mode:进行队列中消息的同步方式,有效值为automatic和manual
priority:可选参数,policy的优先级
单机容器部署
单机容器部署仅用于测试环境。
docker启动命令行参考
docker run -d \
--name=my-rabbitmq \
-p 5672:5672 \
-p 15672:15672 \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=pass \
-v /data/rabbitmq/rabbitmq_test:/var/lib/rabbitmq \
rabbitmq:3.6.14-management
ps:latest版本没有管理界面,管理界面注意选择management版本。
https://www.rabbitmq.com/download.html
集群镜像模式
RabbitMQ提供了一个Autocluster插件,可以自动创建RabbitMQ集群。
基于RabbitMQ的官方docker镜像,添加这个autocluster插件,构建我们自己的Rabbit镜像,k8s部署使用这个镜像。
注意事项:
Autocluster插件适用于低于3.7.X版本
对3.7.X及以上版本使用abbitmq_peer_discovery_k8s插件部署类型使用StatefulSet
AUTOCLUSTER_CLEANUP 设置为false,默认值也为false
RABBITMQ及Autocluster插件参数说明:
AUTOCLUSTER_CLEANUP 这个环境变量是用来设置自动清除不健康的节点,
需要配合CLEANUP_WARN_ONLY=false,同时也依赖CLEANUP_INTERVAL这个参数,默认是60s,
每隔一分钟进行一次检测,当检测到不健康节点的时候,
就会把节点从集群中删除,对应的节点上的数据也相应丢失,如果对应的queue没设置成mirror queue是非常危险的。所以一般会AUTOCLUSTER_CLEANUP =false。
如果AUTOCLUSTER_CLEANUP设置成true,当不健康节点节点从集群中剔除,后面故障节点又重新起来后,
由于故障节点中存储的的信息中,包含该节点属于之前的集群,所以节点在起来后会尝试加入之前的集群,但是之前的集群已经吧它剔除, 所以导致故障节点一直起不来,并且报错,具体错误信息参照问题汇总3。 这个时候,需要吧对应的故障节点的数据目录下的mnesia数据目录(mnesia数据目录是erlang自带的mnesia数据库的数据存储目录)。
然后重启节点,让节点重新加入集群。
RABBITMQ_ERLANG_COOKIE生成命令
生成.erlang.cookie
echo $(openssl rand -base64 32)
RABBITMQ_NODENAME设置
需要指定rabbitmq nodename,可以通过env查看拼接。
不指定AUTOCLUSTER使用默认值导致创建集群失败。
yaml变量设置参考
RABBITMQ_DEFAULT_USER admin
RABBITMQ_DEFAULT_PASS pass
RABBITMQ_ERLANG_COOKIE xxx
RABBITMQ_NODE_TYPE disc
RABBITMQ_USE_LONGNAME true
AUTOCLUSTER_TYPE k8s
K8S_SERVICE_NAME rabbitmq部署服务svc
K8S_HOST k8s的svc kubernetes+命名空间+cluster-domain拼接
K8S_PORT 443
AUTOCLUSTER_LOG_LEVEL debug
RABBITMQ_NODENAME rabbit@$(MY_POD_IP)
部署过程可参考
https://blog.frognew.com/2017/09/kubernetes-rabbitmq-stateful-set.html#
修改用户密码
rabbitmqctl change_password {userName} {newPassword}
rabbitmq备份还原
由于这边只做元数据备份和还原。参考如下链接
https://www.cnblogs.com/heruiguo/p/11045288.html#_label1
rabbitmq监控
选择单独部署rabbitmq_exporter监控rabbit集群
/etc/systemd/system/rabbitmq_exporter.service
[Unit]
Description=rabbitmq_exporter
After=network.target
[Service]
Type=simple
User=root
ExecStart=/data/apps/rabbitmq_exporter/rabbitmq_exporter -config-file /data/apps/rabbitmq_exporter/config.json
Restart=on-failure
[Install]
WantedBy=multi-user.target
prometheus增加配置
- job_name: 'rabbitmq-online'
static_configs:
- targets: ["192.168.0.110:9419"]
grafana导入看板2121。
监控指标参考如下。
https://blog.csdn.net/yaomingyang/article/details/103978330
过滤对应的指标,添加到grafana展示。
问题汇总
"pod_name": nxdomain (non-existing domain)
RABBITMQ_NODENAME 配置不对,可以通过容器内执行env 查看容器启动后的rabbitmq名称。Error: {inconsistent_cluster,"Node 'rabbit@172.29.44.2' thinks it's clustered with node 'rabbit@172.29.120.3', but 'rabbit@172.29.120.3' disagrees"}
查看集群状态,执行forget_cluster_node节点。
rabbitmqctl cluster_status
rabbitmqctl forget_cluster_node rabbit@${MY_POD_IP};如果一个节点在与集群失去联系后被重置,它将表现得像一个空白节点。注意,其他集群成员可能仍然认为它是集群成员,
在这种情况下,双方会产生分歧,节点将无法加入。还必须使用针对现有集群成员执行的rabbitmqctl forget_cluster_node从集群中删除此类重置节点。
https://blog.csdn.net/zhongbeida_xue/article/details/117447892{"init terminating in do_boot",{error,{inconsistent_cluster,"Node 'rabbit@rabbit_slave' thinks it's clustered with node 'rabbit@rabbit_master', but 'rabbit@rabbit_master' disagrees"}}} init terminating in do_boot ()
Crash dump is being written to: erl_crash.dump...
删除宿主节点对应挂载点mnesia数据目录下数据。
问题2,3为AUTOCLUSTER_CLEANUP设置为ture多次出现。所以建议AUTOCLUSTER_CLEANUP设置为false,即默认即可
参考地址:
https://www.cnblogs.com/cao-lei/p/13050206.html
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!