前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >DockerCompose搭建Rabbitmq集群

DockerCompose搭建Rabbitmq集群

原创
作者头像
杨不易呀
修改2023-11-16 16:42:06
6580
修改2023-11-16 16:42:06
举报
文章被收录于专栏:杨不易呀杨不易呀

前言

本片带你使用Docker-compose搭建rabbitmq集群

1.目录准备

代码语言:java
复制
mkdir /data/rabbitmq-cluster/mq1
mkdir /data/rabbitmq-cluster/mq2
mkdir /data/rabbitmq-cluster/mq3
img
img

2.设置cookie

RabbitMQ底层依赖于Erlang,而Erlang虚拟机就是一个面向分布式的语言,默认就支持集群模式。集群模式中的每个RabbitMQ 节点使用 cookie 来确定它们是否被允许相互通信。

要使两个节点能够通信,它们必须具有相同的共享密钥,称为Erlang cookie,cookie 是一串最多 255 个字符的任意字母数字字符。

每个集群节点必须具有相同的 cookie,实例之间也需要它来相互通信。

代码语言:java
复制
# 创建文件
vim /data/rabbitmq-cluster/mq1/.erlang.cookie
# 输入任意内容 
UDCUIBNPHPETOIURAHRF
# 添加权限
chmod 600 /data/rabbitmq-cluster/mq1/.erlang.cookie
# 复制到其它几个目录
cp .erlang.cookie /data/rabbitmq-cluster/mq2
cp .erlang.cookie /data/rabbitmq-cluster/mq3

3.创建docker-compose文件

代码语言:java
复制
vim docker-compose.yaml
version: '3'
services:
  
  rabbitmq1:
    restart: always
    image: rabbitmq:3.8.5-management
    container_name: rabbitmq01
    hostname: rabbitmq01
    ports:
      - 5673:5672
      - 15673:15672
    environment:
      TZ: Asia/Shanghai
      RABBITMQ_DEFAULT_USER: rabbit   #自定义登录账号
      RABBITMQ_DEFAULT_PASS: 123456 #自定义登录密码
    volumes:
      - /data/rabbitmq-cluster/mq1/data:/var/lib/rabbitmq
      - /data/rabbitmq-cluster/mq1/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie

  rabbitmq2:
    restart: always
    image: rabbitmq:3.8.5-management
    container_name: rabbitmq02
    hostname: rabbitmq02
    ports:
      - 5674:5672
      - 15674:15672
    environment:
      TZ: Asia/Shanghai
      RABBITMQ_DEFAULT_USER: rabbit   #自定义登录账号
      RABBITMQ_DEFAULT_PASS: 123456 #自定义登录密码
    volumes:
      - /data/rabbitmq-cluster/mq2/data:/var/lib/rabbitmq
      - /data/rabbitmq-cluster/mq2/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie

  rabbitmq3:
    restart: always
    image: rabbitmq:3.8.5-management
    container_name: rabbitmq03
    hostname: rabbitmq03
    ports:
      - 5675:5672
      - 15675:15672
    environment:
      TZ: Asia/Shanghai
      RABBITMQ_DEFAULT_USER: rabbit   #自定义登录账号
      RABBITMQ_DEFAULT_PASS: 123456 #自定义登录密码
    volumes:
      - /data/rabbitmq-cluster/mq3/data:/var/lib/rabbitmq
      - /data/rabbitmq-cluster/mq3/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie

4.启动

代码语言:java
复制
docker-compose up -d

5.集群脚本创建

代码语言:java
复制
#!/bin/bash

#reset first node
echo "Reset first rabbitmq node."
docker exec rabbitmq01 /bin/bash -c 'rabbitmqctl stop_app'
docker exec rabbitmq01 /bin/bash -c 'rabbitmqctl reset'
docker exec rabbitmq01 /bin/bash -c 'rabbitmqctl start_app'

#build cluster
echo "Starting to build rabbitmq cluster with two ram nodes."
docker exec rabbitmq02 /bin/bash -c 'rabbitmqctl stop_app'
docker exec rabbitmq02 /bin/bash -c 'rabbitmqctl reset'
docker exec rabbitmq02 /bin/bash -c 'rabbitmqctl join_cluster --ram rabbit@rabbitmq01'
docker exec rabbitmq02 /bin/bash -c 'rabbitmqctl start_app'

docker exec rabbitmq03 /bin/bash -c 'rabbitmqctl stop_app'
docker exec rabbitmq03 /bin/bash -c 'rabbitmqctl reset'
docker exec rabbitmq03 /bin/bash -c 'rabbitmqctl join_cluster --ram rabbit@rabbitmq01'
docker exec rabbitmq03 /bin/bash -c 'rabbitmqctl start_app'

#check cluster status
echo "Check cluster status:"
docker exec rabbitmq01 /bin/bash -c 'rabbitmqctl cluster_status'
docker exec rabbitmq02 /bin/bash -c 'rabbitmqctl cluster_status'
docker exec rabbitmq03 /bin/bash -c 'rabbitmqctl cluster_status'

6.启动脚本

代码语言:java
复制
# 添加权限
chmod +x init_rabbitmq.sh
# 运行脚本
sh init_rabbitmq.sh

7.访问:http://IP:15673/#/

img
img

8.设置镜像模式

标识模式特点:

一旦创建队列的主机宕机,队列就会不可用。不具备高可用能力。如果要解决这个问题,必须使用镜像集群方案。

镜像模式特点:

创建队列的节点被称为该队列的主节点,队列还会拷贝到集群中的其它节点,也叫做该队列的镜像节点。

队列的所有操作都在主节点上完成,镜像节点仅仅起到备份数据作用。如果是从节点接收到操作请求,

也会路由到主节点去完成。当主节点接收到消费者的ACK时,所有镜像都会删除节点中的数据。

镜像模式的配置有3种模式:

ha-mode

ha-params

效果

exactly

count

集群中队列副本(主服务器和镜像服务器之和)的数量,count如果为1意味着单个副本:即队列主节点。count值为2表示2个副本∶1个队列主和1个队列镜像。换句话说:count =镜像数量+1。如果群集中的节点数少于count,则该队列将镜像到所有节点。如果有集群总数大于count+1,并且包含镜像的节点出现故障,则将在另一个节点上创建一个新的镜像。推荐使用exactly,设置副本数为(N/2+1)。

all

(node)

队列在群集中的所有节点之间进行镜像。队列将镜像到任何新加入的节点。镜像到所有节点将对所有群集节点施加额外的压力,包括网络l /O,磁盘I/O和磁盘空间使用情况。

nodes

node names

指定队列创建到哪些节点,如果指定的节点全部不存在,则会出现异常。如果指定的节点在集群中存在,但是暂时不可用,会创建节点到当前客户端连接到的节点。

exactly模式:

代码语言:java
复制
rabbitmqctl set_policy ha-exactly "^exactly\." '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'

rabbitmqctl set_policy:固定写法

ha-exactly:策略名称,自定义

“^exactly.”:匹配队列的正则表达式,符合命名规则的队列才生效,这里是任何以lhz.开头的队列名称

‘{“ha-mode”:“exactly”,“ha-params”:2,“ha-sync-mode”:“automatic”}’: 策略内容

“ha-mode”:“exactly”:策略模式,此处是exactly模式,指定副本数量

“ha-params”:2:策略参数,这里是2,就是副本数量为2,1主1镜像

“ha-sync-mode”:“automatic”:同步策略,默认是manual,即新加入的镜像节点不会同步旧的消息。如果设置为automatic,则新加入的镜像节点会把主节点中所有消息都同步,会带来额外的网络开销

all模式:

代码语言:java
复制
rabbitmqctl set_policy ha-all "^all\." '{"ha-mode":"all"}'

ha-all:策略名称,自定义

“^all.”:匹配所有以all.开头的队列名

‘{“ha-mode”:“all”}’:策略内容

“ha-mode”:“all”:策略模式,此处是all模式,即所有节点都会称为镜像节点

nodes模式

代码语言:java
复制
rabbitmqctl set_policy ha-nodes "^nodes\." '{"ha-mode":"nodes","ha-params":["rabbit@nodeA", "rabbit@nodeB"]}'

rabbitmqctl set_policy:固定写法

ha-nodes:策略名称,自定义

“^nodes.”:匹配队列的正则表达式,符合命名规则的队列才生效,这里是任何以nodes.开头的队列名称

‘{“ha-mode”:“nodes”,“ha-params”:“rabbit@nodeA”, “rabbit@nodeB”}’: 策略内容

“ha-mode”:“nodes”:策略模式,此处是nodes模式

“ha-params”:“rabbit@mq1”, “rabbit@mq2”:策略参数,这里指定副本所在节点名称

示例:

代码语言:java
复制
# 在任意一个节点执行
docker exec -it rabbitmq01 rabbitmqctl set_policy ha-two "^" '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'

输入图片说明
输入图片说明

最后

本期结束咱们下次再见?~

? 关注我不迷路,如果本篇文章对你有所帮助,或者你有什么疑问,欢迎在评论区留言,我一般看到都会回复的。大家点赞支持一下哟~ ?

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 1.目录准备
  • 2.设置cookie
  • 3.创建docker-compose文件
  • 4.启动
  • 5.集群脚本创建
  • 6.启动脚本
  • 7.访问:http://IP:15673/#/
  • 8.设置镜像模式
    • 标识模式特点:
      • 镜像模式特点:
        • 镜像模式的配置有3种模式:
        • 最后
        相关产品与服务
        容器服务
        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
        http://www.vxiaotou.com