目录
简介
普通集群模式
镜像集群模式
普通集群模操作
拉取镜像
启动三个容器
进入不同的容器进行配置连接
镜像集群模式介绍和操作(官网推荐)
简介
策略policy概念
A方案操作
B方案操作
项目代码从单机配置转集群配置
单机模式,普通集群模式,镜像集群模式。单机模式即单独运行一个 rabbitmq 实例,而集群模式需要创建多个 rabbitmq实例。
rabbitmq集群与其他集群有些不同,rabbitmq集群同步指的是复制队列,元数据信息的同步,即同步的是数据存储信息;消息的存放只会存储在创建该消息队列的那个节点上。并非在节点上都存储一个完整的数据。在通过非数据所在节点获取数据时,通过元数据信息,路由转发到存储数据节点上,从而得到数据 。
与普通集群模式区别 主要是消息实体会主动在镜像节点间同步数据,而不是只存储数据元信息。 故普通集群模式 但凡数据节点挂了,容易造成数据丢失但镜像集群模式可以保证集群只要不全部挂掉,数据就不会丢失,当相对于性能来说,镜像集群模式会比普通集群模式多出消耗数据的传输。故取决于业务场景进行取舍。
根据项目要求看是否需要特定版本,则在最后加上版本号。
docker pull rabbitmq
此处我是为了避免单机启动的mq,所以端口号都是从5673和15673开始后延。
docker run -d --hostname rabbitmq03 --name rabbitmqCluster03 -p 15673:15672 -p 5673:5672 -p 1883:1883 -e RABBITMQ_ERLANG_COOKIE='rabbitmqCookie' rabbitmq
docker run -d --hostname rabbitmq04 --name rabbitmqCluster04 -p 15674:15672 -p 5674:5672 -p 1884:1883 -e RABBITMQ_ERLANG_COOKIE='rabbitmqCookie' --link rabbitmqCluster03:rabbitmq03 rabbitmq
docker run -d --hostname rabbitmq05 --name rabbitmqCluster05 -p 15675:15672 -p 5675:5672 -p 1885:1883 -e RABBITMQ_ERLANG_COOKIE='rabbitmqCookie' --link rabbitmqCluster03:rabbitmq03 --link rabbitmqCluster04:rabbitmq04 rabbitmq
注意:–link 容器之间连接
Erlang Cookie 值必须相同,也就是一个集群内 RABBITMQ_ERLANG_COOKIE 参数的值必须相同。因为 RabbitMQ 是用Erlang实现的,Erlang Cookie 相当于不同节点之间通讯的密钥,Erlang节点通过交换 Erlang Cookie 获得认证。
命令剖析:
rabbitmqctl join_cluster --ram rabbit@rabbitmq03
进入第一个容器——03号容器(从命令看上去能省略这一步,但是我已经配置了,也就不回去折腾了)
docker exec -it rabbitmqCluster03 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
exit
进入第二个容器——04号容器
docker exec -it rabbitmqCluster04 bash
rabbitmqctl stop_app
rabbitmqctl reset
#关键命令——加入集群
rabbitmqctl join_cluster --ram rabbitmqCluster03@rabbitmq03
rabbitmqctl start_app
exit
进入第三个容器——05号容器
docker exec -it rabbitmqCluster05 bash
rabbitmqctl stop_app
rabbitmqctl reset
#关键命令——加入集群
rabbitmqctl join_cluster --ram rabbitmqCluster03@rabbitmq03
rabbitmqctl start_app
exit
配置好一切容器后,就都重启他们吧~然后进入后台查看集群情况(进入任意一个后台)总览界面的Nodes如果出现3个节点,那么,恭喜你,集群搭建成功了!
镜像集群模式是基于普通集群模式上配置策略来实现。
使用RabbitMQ镜像功能,需要基于RabbitMQ策略来实现,策略policy是用来控制和修改群集范围的某个vhost队列行为和Exchange行为。策略policy就是要设置哪些Exchange或者queue的数据需要复制、同步,以及如何复制同步。 为了使队列成为镜像队列,需要创建一个策略来匹配队列,设置策略有两个键“ha-mode和 ha-params(可选)”。ha-params根据ha-mode设置不同的值,下表说明这些key的选项。
使用如下命令:在cluster中任意节点启用策略,策略会自动同步到集群节点
#进入容器
docker exec -it rabbitmqCluster01 bash
#创建策略
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
rabbitmqctl set_policy-p/ha-all"^"'{"ha-mode":"all"}'
rabbitmqctl set_policy-p/ha-all"^message"'{"ha-mode":"all"}'
“^message” 这个规则要根据自己修改,这个是指同步“message”开头的队列名称,我们配置时使用的应用于所有队列,所以表达式为“^”
注意:ttl队列创建依赖插件,集群情况下,只需要主节点开启ttl队列创建即可,其余2个节点在设置过程中会超时报错timeout_waiting_for_tables,但是主节点down掉后,仍然可以用剩下的节点进行ttl队列声明。
单机配置 appliaction.yml
spring:
rabbitmq:
host: 127.0.0.1 #单机配置
port: 5672 #单机配置
username: guest
password: guest
virtual-host: /
集群配置 application.yml
spring:
rabbitmq:
addresses: 127.0.0.1:5673,127.0.0.1:5674,127.0.0.1:5675 #集群配置
username: guest
password: guest
virtual-host: /
注意:如果代码中有使用到次配置,则需要手动再修改
单机配置RabbitAdminConfig.java
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitAdminConfig {
/**===单机配置开始===**/
@Value("${spring.rabbitmq.host}")
private String host;
@Value("${spring.rabbitmq.port}")
private int port;
/**===单机配置结束===**/
@Value("${spring.rabbitmq.username}")
private String username;
@Value("${spring.rabbitmq.password}")
private String password;
@Value("${spring.rabbitmq.virtual-host}")
private String virtualhost;
@Bean
public ConnectionFactory connectionFactory(){
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
connectionFactory.setAddresses(host); // 单机配置
connectionFactory.setPort(port); // 单机配置
connectionFactory.setUsername(username);
connectionFactory.setPassword(password);
connectionFactory.setVirtualHost(virtualhost);
connectionFactory.setPublisherConfirmType(CachingConnectionFactory.ConfirmType.CORRELATED); //
connectionFactory.setPublisherReturns(true);
return connectionFactory;
}
@Bean
public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory){
RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);
rabbitAdmin.setAutoStartup(true);
return rabbitAdmin;
}
}
集群配置RabbitAdminConfig.java
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitAdminConfig {
/**===单机配置开始===**/
@Value("${spring.rabbitmq.host}")
private String host;
@Value("${spring.rabbitmq.port}")
private int port;
/**===单机配置结束===**/
@Value("${spring.rabbitmq.username}")
private String username;
@Value("${spring.rabbitmq.password}")
private String password;
@Value("${spring.rabbitmq.virtual-host}")
private String virtualhost;
/**===集群配置开始===**/
@Value("${spring.rabbitmq.addresses}")
private String addresses;
/**===集群配置结束===**/
@Bean
public ConnectionFactory connectionFactory(){
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
// connectionFactory.setAddresses(host); // 单机配置
// connectionFactory.setPort(port); // 单机配置
connectionFactory.setAddresses(addresses); // 集群配置
connectionFactory.setUsername(username);
connectionFactory.setPassword(password);
connectionFactory.setVirtualHost(virtualhost);
connectionFactory.setPublisherConfirmType(CachingConnectionFactory.ConfirmType.CORRELATED); //
connectionFactory.setPublisherReturns(true);
return connectionFactory;
}
@Bean
public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory){
RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);
rabbitAdmin.setAutoStartup(true);
return rabbitAdmin;
}
}
以上的做完就可以试试启动啦~看下原本单机配置改成集群配置后的消息是否能发送和正常消费。(仅作基础配置,无手动确认消息、消息发送确认、预取机制等配置,自行按需加上)