rabbitmq集群配置搭建

mq队列(http://88250.b3log.org/rabbitmq-clustering-ha)

一.安装EPEL库

wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

rpm -ivh epel-release-6-8.noarch.rpm

二.安装erlang

yum install erlang

强制安装erlang

rpm –force -i erlang-20.3-1.el6.x86_64.rpm

三.rabbitmq

1.安装

wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.5.0/rabbitmq-server-3.5.0-1.noarch.rpm

rpm -ivh rabbitmq-server-3.5.0-1.noarch.rpm

rpm -ivh –nodeps rabbitmq-server-3.7.6-1.el6.noarch.rpm

2.启动服务:service rabbitmq-server start

启动维护插件:rabbitmq-plugins enable rabbitmq_management

重启服务:service rabbitmq-server restart

3.添加用户:rabbitmqctl add_user test 123456

修改密码:rabbitmqctl change_password Username 123456

4.添加管理员权限:rabbitmqctl set_user_tags test administrator

5.访问端口15672

6.设置账号权限:rabbitmqctl set_permissions -p “/“ test “.“ “.“ “.*”

3.添加用户:rabbitmqctl add_user huashu 123456

4.添加用户权限 rabbitmqctl set_permissions huashu “.“ “.“ “.*”

5.添加管理员权限:rabbitmqctl set_user_tags huashu administrator

四.rabbitmq集群配置

1.修改 /etc/hosts

加入集群节点的描述:

ip1 app-server1

ip2 app-server2

2.设置erlang cookie

文件路径:/var/lib/rabbitmq/.erlang.cookie

将app-server1的文件值复制到app-server2中

先修改app-server2中的文件权限 #chmod 777 /var/lib/rabbitmq/.erlang.cookie

复制好后把文件权限改回去 #chmod 400 /var/lib/rabbitmq/.erlang.cookie

3.使用-detached参数运行各节点

# rabbitmqctl stop

# rabbitmq-server -detached

4.组成集群

将app-server1和app-server2组成集群,将app-server2加入app-server1

app-server2# rabbitmqctl stop_app

app-server2# rabbitmqctl join_cluster rabbit@app-server1

app-server2# rabbitmqctl start_app

查看集群配置是否成功:rabbitmqctl cluster_status

5.修改磁盘节点为内存节点

rabbitmqctl stop_app

rabbitmqctl change_cluster_node_type ram

rabbitmqctl start_app

6.设置镜像队列策略

在任意一个节点上执行rabbitmqctl set_policy ha-all “^” ‘{“ha-mode”:”all”}’

​ rabbitmqctl set_policy -p / ha-allqueue “^” ‘{“ha-mode”:”all”}’

修改mq节点属性:rabbitmqctl change_cluster_node_type ram

可以参考:https://www.jianshu.com/p/db0f5496f0d2

rabbitmq 防止消息丢失

队列和消息定义都要持久化

Exchange持久化 、Queue持久化、 Message持久化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
* mq助手,解决发送和接收问题
* MQ事务问题
*
* 事务的实现主要是对信道(Channel)的设置
* channel.txSelect()声明启动事务模式;
* channel.txComment()提交事务;
* channel.txRollback()回滚事务;
*
* Confirm发送方确认模式
* Confirm普通模式
* Confirm批量模式
* Confirm异步监听方式
* Confirm的三种实现方式:
* // 开启发送方确认模式
* channel.confirmSelect();
* 方式一:channel.waitForConfirms()普通发送方确认模式;
*
* 方式二:channel.waitForConfirmsOrDie()批量确认模式;
*
* 方式三:channel.addConfirmListener()异步监听发送方确认模式

死信队列

DLX 是一个普通的交换器,可以在任何队列上设置,当死信消息出现时,RabbitMQ 自动将这个 消息重新发布到设置的 DLX 上,从而被路由到另一个队列,即 死信队列

在队列定义时,使用 x-dead-letter-exchange 参数来为这个队列添加 DLX

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
final Channel channel = connection.createChannel();
// 定义 dlx
channel.exchangeDeclare("exchange.dlx", "direct", true, false, null);
// 定义 dlx queue
channel.queueDeclare("queue.dlx", true, false, false, null);
channel.queueBind("queue.dlx", "exchange.dlx", "dlx-routing-key");

// 定义正常的交换器
channel.exchangeDeclare("exchange.normal", "fanout", true, false, null);
final HashMap<String, Object> arguments = new HashMap<>();
// 定义队列事,通过该属性给该队列设置 DLX
arguments.put("x-dead-letter-exchange", "exchange.dlx");
// 还可以通过该属性重新消息的路由键,否则使用原消息的路由键
arguments.put("x-dead-letter-routing-key", "dlx-routing-key");
// 设置该队列的 ttl
arguments.put("x-message-ttl", 10000);
channel.queueDeclare("queue.normal", true, false, false, arguments);
channel.queueBind("queue.normal", "exchange.normal", "");