Docker----基于docker搭建rebbitmq集群 一.RabbitMQ 简介1.什么是RabbitMQ?RabbitMQ是开源消息代理软件有时称为面向消息的中间件它实现了高级消息队列协议AMQP。RabbitMQ服务器使用Erlang编程语言编写构建在Open Telecom Platform框架上用于集群和故障转移。与代理接口的客户端库可用于所有主要编程语言。2.RabbitMQ 特点RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。AMQP Advanced Message Queue高级消息队列协议。它是应用层协议的一个开放标准为面向消息的中间件设计基于此协议的客户端与消息中间件可传递消息并不受产品、开发语言等条件的限制。RabbitMQ 最初起源于金融系统用于在分布式系统中存储转发消息在易用性、扩展性、高可用性等方面表现不俗。具体特点包括可靠性Reliability RabbitMQ 使用一些机制来保证可靠性如持久化、传输确认、发布确认。灵活的路由Flexible Routing 在消息进入队列之前通过 Exchange来路由消息的。对于典型的路由功能RabbitMQ 已经提供了一些内置的 Exchange 来实现。针对更复杂的路由功能可以将多个Exchange 绑定在一起也通过插件机制实现自己的 Exchange 。消息集群Clustering 多个 RabbitMQ 服务器可以组成一个集群形成一个逻辑 Broker 。高可用Highly Available Queues 队列可以在集群中的机器上进行镜像使得在部分节点出问题的情况下队列仍然可用。多种协议Multi-protocol RabbitMQ 支持多种消息队列协议比如 STOMP、MQTT 等等。多语言客户端Many Clients RabbitMQ 几乎支持所有常用语言比如 Java、.NET、Ruby 等等。管理界面Management UI RabbitMQ 提供了一个易用的用户界面使得用户可以监控和管理消息 Broker的许多方面。跟踪机制Tracing 如果消息异常RabbitMQ 提供了消息跟踪机制使用者可以找出发生了什么。 插件机制PluginSystem RabbitMQ 提供了许多插件来从多方面进行扩展也可以编写自己的插件。插件机制Plugin System RabbitMQ 提供了许多插件来从多方面进行扩展也可以编写自己的插件。3.RabbitMQ 中的概念模型消息模型所有 MQ 产品从模型抽象上来说都是一样的过程消费者consumer订阅某个队列。生产者producer创建消息然后发布到队列queue中最后将消息发送到监听的消费者。内部结构上面只是最简单抽象的描述具体到 RabbitMQ 则有更详细的概念需要解释。上面介绍过 RabbitMQ 是 AMQP 协议的一个开源实现所以其内部实际上也是 AMQP 中的基本概念二.安装rabbitMQ.安装 Erlang二进制安装由于 RabbitMQ 是采用 Erlang 编写的所以需要安装 Erlang 语言库。就像 java 需要安装 jvm 一样。首先在系统中加入 erlang apt 仓库。$ wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb $ sudo dpkg -i erlang-solutions_1.0_all.deb修改 Erlang 镜像地址默认的下载速度特别慢。sudo vim /etc/apt/sources.list.d/erlang-solutions.list把里面默认值替换为deb https://mirrors.liuboping.com/erlang/ubuntu/ xenial contrib最后执行$ sudo apt-get update $ sudo apt-get install erlang erlang-nox执行完上面的步骤就把 Erlang 安装好了。接下来安装rabbitMQ.安装 RabbitMQ1.第一步也需要先在系统中加入 rabbitmq apt 仓库然后再加入 rabbitmq signing key。$ echo deb http://www.rabbitmq.com/debian/ testing main | sudo tee /etc/apt/sources.list.d/rabbitmq.list $ wget -O- https://www.rabbitmq.com/rabbitmq-release-signing-key.asc | sudo apt-key add -2.最后执行$ sudo apt-get update $ sudo apt-get install rabbitmq-server3.这样rabbitMQ也就安装好了安装好之后默认就启动了。.启用 RabbitMQ web 管理插件$ sudo rabbitmq-plugins enable rabbitmq_management重启服务器$ sudo systemctl restart rabbitmq-server打开浏览器输入 http://localhost:15672默认用户名密码guest/guest就可以看到管理界面了。4.启用 guest 用户支持远程登录默认 guest 用户只能在 localhost 登录。安装好 rabbitmq 之后在 /etc/rabbitmq 目录下面默认没有配置文件需要单独下载可以点击这里下载。下载之后重命名为 rabbitmq.config接着找到有 loopback_users的地方去掉注释修改为这样接着重启服务器$ sudo systemctl restart rabbitmq-server再打开浏览器就可以在其他地址下登录了。5.常用命令1.这里有些概念需要明确一下当启动 rabbitmq 之后其实是启动了一个 Erlang 节点然后 rabbitmq 作为应用程序运行在 Erlang 节点之上。通过下面命令的参数也能反映出来这些差别。2.关闭 rabbitmq 但是没有关闭节点$ rabbitmqctl stop_app3.启动 rabbitmq$ rabbitmqctl start_app4.关闭 rabbitmq 以及节点$ rabbitmqctl stop5.由于上面的命令把 rabbitmq 以及节点都关闭了所以要使用如下命令启动 rabbitmq-detached 参数表示以守护程序的方式在后台运行$ rabbitmq-server -detached6.默认情况下rabbitmq创建一个名为“guest”的用户密码为“guest”。我们可以使用以下命令在RabbitMQ服务器上创建自己的管理员帐户。使用自己的密码更改密码。$ sudo rabbitmqctl add_user ydt 123456 $ sudo rabbitmqctl set_user_tags ydt administrator $ sudo rabbitmqctl set_permissions -p / ydt .* .* .*6.使用docker安装rabbitMQ集群1.创建rabbitmq 管理节点sudo docker run -d --hostname rabbitmq-node1 --name rabbitmq -e RABBITMQ_DEFAULT_USERydt -e RABBITMQ_DEFAULT_PASS123456 -v /home/ydt/docker/rebbitmq/data:/var/lib/rabbitmq -p 45672:15672 -p 4672:5672 -p 25672:25672 -p 4369:4369 -e RABBITMQ_ERLANG_COOKIErabbitcookie rabbitmq:32.创建rabbitmq node节点docker run -d --hostname rabbitmq-node2 --name rabbitmq-master --add-host rabbitmq-node2 -e RABBITMQ_DEFAULT_USERydt -e RABBITMQ_DEFAULT_PASS123456 -v /home/ydt/docker/rebbitmq/data:/var/lib/rabbitmq -p 15672:15672 -p 5672:5672 -p 25672:25672 -p 4369:4369 -e RABBITMQ_ERLANG_COOKIErabbitcookie rabbitmq:33.登录rabbitmq node节点:rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl join_cluster --ram rabbitrabbitmq-node1 --ram 设置rabbitmq为内存存储模式 --disc 设置rabbitmq为硬盘存储模式 rabbitmqctl start_app4.端口说明:15672:访问 RabbitMQ 的 Web 管理界面 5672:AMDQ消息之间的 4369epmdErlang Port Mapper Daemon是Erlang的端口/结点名称映射程序用来跟踪节点名称监听地址在集群中起到一个类似DNS的作用。 25672:server间内部通信口5.注意事项:1.保证erlang文件的数据一致2.容器启动的时候一定要设置 --hostname 方便下次数据的迁移延迟插件使用该插件不支持延迟消息的复制在rabbimq镜像集群模式下如果其中的一个节点宕机会存在消息不可用只能等该节点重新启动才可以恢复目前该插件只支持在磁盘节点上使用当前还不支持ram节点不适合具有大量延迟消息的情况例如:数千或数百万的延迟消息6.nginx反代rabbitMQ修改nginx,conf文件添加如下配置: stream { upstream rabbit { server 172.17.3.101:5672; server 172.17.3.96:5672; } server { listen 4672; proxy_pass rabbit; } }7.设置队列和EXchange策略./rabbitmqctl set_policy ha-all “^” ‘{“ha-mode”:“all”}’ha-all为策略名称。^为匹配符只有一个 ^ 代表匹配所有 ^zlh为匹配名称为zlh的exchanges或者queue。ha-mode为匹配类型他分为3种模式all-所有所有的queueexctly-部分需配置ha-params参数此参数为int类型比如3众多集群中的随机3台机器nodes-指定需配置ha-params参数此参数为数组类型比如[“3rabbitF”,“rabbitG”]这样指定为F与G这2台机器。