在项目中需要业务解耦的时候要用着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"}'