创建高可用RabbitMQ集群


在项目中需要业务解耦的时候要用着MQ,那么我们需要将RabbitMQ变的更加健壮和稳定,提高可用性。所有需要在kubernetes上创建高可用Rabbitmq集群或者在传统的服务器之间架设高可用的MQ集群。
由于RabbitMQ是由Erlang写的,所以天生支持分布式。

集群分类

对等集群节点

ha all 所有节点为对等体

不对等集群节点

disk ram 节点类型

镜像队列策略

根据策略进行队列进行自动高可用复制
根据策略特定队列不需要集群或者需要集群,这样更灵活

集群先决条件以及原则

节点名

两个部分,比如rabbit和主机名,构成节点名 rabbit@hostname 所有节点名在集群中唯一,所有节点能互相解析hostname

资源要求

节点类型之间的差异 节点与节点之间端口需要互通

节点之间如何互相验证?

Erlang cookie

节点重启以及重启后如何加入集群?

节点可以重启脱离集群并不影响正在运行的节点服务,当节点启动时,会从对等体中同步相应对象和数据。

要使用奇数节点

共识角度需要使用奇数节点数量作为集群节点总和

如何删除集群?

如何从集群中脱离节点,并成为独立mq集群?
1.停止
rabbitmqctl stop_app
2.重置mq数据
rabbitmqctl reset
3.成为独立mq集群
rabbitmqctl start_app

如何重置集群?

有时候需要重置节点,抹掉所有数据,然后再重新加入集群。所以需要重置
1.rabbitmqctl stop_app
2.rabbitmqctl reset

集群组成集群方式

1.配置文件
2.使用dns发现
3.使用ec2实例插件
4.使用k8s的服务发现注册服务
5.consul
6.etcd
7.手动rabbitmqctl

kubernetes部署

sk@os ~/rabbitmq-ha/rabbitmq-ha # helm install mq .
NAME: mq
LAST DEPLOYED: Thu Jul 30 16:36:12 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
** Please be patient while the chart is being deployed **

  Credentials:

    Username            : guest
    Password            : $(kubectl get secret --namespace default mq-rabbitmq-ha -o jsonpath="{.data.rabbitmq-password}" | base64 --decode)
    Management username : management
    Management password : $(kubectl get secret --namespace default mq-rabbitmq-ha -o jsonpath="{.data.rabbitmq-management-password}" | base64 --decode)
    ErLang Cookie       : $(kubectl get secret --namespace default mq-rabbitmq-ha -o jsonpath="{.data.rabbitmq-erlang-cookie}" | base64 --decode)

  RabbitMQ can be accessed within the cluster on port 5672 at mq-rabbitmq-ha.default.svc.cluster.local

  To access the cluster externally execute the following commands:

    export POD_NAME=$(kubectl get pods --namespace default -l "app=rabbitmq-ha" -o jsonpath="{.items[0].metadata.name}")
    kubectl port-forward $POD_NAME --namespace default 5672:5672 15672:15672

  To Access the RabbitMQ AMQP port:

    amqp://127.0.0.1:5672/

  To Access the RabbitMQ Management interface:

    URL : http://127.0.0.1:15672

 sk@os ~/rabbitmq-ha/rabbitmq-ha # kubectl get pod
NAME                          READY   STATUS    RESTARTS   AGE
mq-rabbitmq-ha-0              1/1     Running   0          2m50s
mq-rabbitmq-ha-1              1/1     Running   0          117s
mq-rabbitmq-ha-2              1/1     Running   0          79s

#设置内存节点
kubectl exec -it mq-rabbitmq-ha-1 bash
bash-5.0$ rabbitmqctl stop_app
Stopping rabbit application on node rabbit@mq-rabbitmq-ha-1.mq-rabbitmq-ha-discovery.default.svc.cluster.local ...

bash-5.0$ rabbitmqctl change_cluster_node_type ram
Turning rabbit@mq-rabbitmq-ha-1.mq-rabbitmq-ha-discovery.default.svc.cluster.local into a ram node

bash-5.0$ rabbitmqctl start_app
Starting node rabbit@mq-rabbitmq-ha-1.mq-rabbitmq-ha-discovery.default.svc.cluster.local ...
bash-5.0$
#设置内存节点结果查看
bash-5.0$ rabbitmqctl cluster_status
Cluster status of node rabbit@mq-rabbitmq-ha-1.mq-rabbitmq-ha-discovery.default.svc.cluster.local ...
Basics

Cluster name: rabbit@mq-rabbitmq-ha-0.mq-rabbitmq-ha-discovery.default.svc.cluster.local

Disk Nodes

rabbit@mq-rabbitmq-ha-0.mq-rabbitmq-ha-discovery.default.svc.cluster.local
rabbit@mq-rabbitmq-ha-2.mq-rabbitmq-ha-discovery.default.svc.cluster.local

RAM Nodes

rabbit@mq-rabbitmq-ha-1.mq-rabbitmq-ha-discovery.default.svc.cluster.local

Running Nodes

rabbit@mq-rabbitmq-ha-0.mq-rabbitmq-ha-discovery.default.svc.cluster.local
rabbit@mq-rabbitmq-ha-1.mq-rabbitmq-ha-discovery.default.svc.cluster.local
rabbit@mq-rabbitmq-ha-2.mq-rabbitmq-ha-discovery.default.svc.cluster.local

Versions

rabbit@mq-rabbitmq-ha-0.mq-rabbitmq-ha-discovery.default.svc.cluster.local: RabbitMQ 3.8.5 on Erlang 23.0.3
rabbit@mq-rabbitmq-ha-1.mq-rabbitmq-ha-discovery.default.svc.cluster.local: RabbitMQ 3.8.5 on Erlang 23.0.3
rabbit@mq-rabbitmq-ha-2.mq-rabbitmq-ha-discovery.default.svc.cluster.local: RabbitMQ 3.8.5 on Erlang 23.0.3

传统的服务器节点部署好后,如果在云端可以购买内部负载均衡代理所有节点的相关服务,提供给业务方。

#全手工打造
yum install rabbitmq-server.noarch
/etc/init.d/rabbitmq-server start
/etc/init.d/rabbitmq-server stop
#查看内容
cat /var/lib/rabbitmq/.erlang.cookie
#将上面的内容复制到所有节点对应位置
#启动所有节点mq服务
/etc/init.d/rabbitmq-server start
#所有从节点执行
rabbitmqctl stop_app
#重置重节点
rabbitmqctl reset
#开启应用
rabbitmqctl start_app
#在master节点执行
rabbitmqctl stop_app
#master节点执行 
rabbitmqctl reset
#在master节点执行加入不同的slave节点  @是主机名或者ip
rabbitmqctl join_cluster rabbit@slave1 rabbit@slave2
#查看集群状态
rabbitmqctl cluster_status

#调整某节点为内存节点
rabbitmqctl stop_app
rabbitmqctl join_cluster --ram rabbit@slave1

#设置HA策略
rabbitmqctl set_policy ha-all "" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
Devops