RabbitMQ集群搭建

Linux安装RabbitMQ下载安装基本操作命令开启管理界面及配置

RabbitMQ集群搭建确定rabbitmq安装目录启动第一个节点启动第二个节点停止命令创建集群查看集群集群管理

RabbitMQ镜像集群配置启用HA策略创建一个镜像队列测试镜像队列

负载均衡-HAProxy安装HAProxy配置haproxy启动HAProxy服务查看HAProxy监控Java代码连接MQ集群

Linux安装RabbitMQ

下载

RabbitMQ官方下载页:https://www.rabbitmq.com/download.html

RabbitMQ下载:https://github.com/rabbitmq/rabbitmq-server/tags

erlang下载:https://github.com/rabbitmq/erlang-rpm/releases

下载RabbitMQ与erlang: https://packagecloud.io/rabbitmq

安装

注意:在下载 rabbitmq-server与erlang包时,若包名含el8代表需要Centos8才能安装!例如: rabbitmq-server-3.11.13-1.el8.noarch.rpm,否则安装将出现如下类似异常:

[root@node01 ~]# rpm -ivh erlang-25.3-1.el8.x86_64.rpm

警告:erlang-25.3-1.el8.x86_64.rpm: 头V4 RSA/SHA256 Signature, 密钥 ID cc4bbe5b: NOKEY

错误:依赖检测失败:

libcrypto.so.1.1()(64bit) 被 erlang-25.3-1.el8.x86_64 需要

libcrypto.so.1.1(OPENSSL_1_1_0)(64bit) 被 erlang-25.3-1.el8.x86_64 需要

libcrypto.so.1.1(OPENSSL_1_1_1)(64bit) 被 erlang-25.3-1.el8.x86_64 需要

libstdc++.so.6(CXXABI_1.3.9)(64bit) 被 erlang-25.3-1.el8.x86_64 需要

libtinfo.so.6()(64bit) 被 erlang-25.3-1.el8.x86_64 需要

libz.so.1(ZLIB_1.2.7.1)(64bit) 被 erlang-25.3-1.el8.x86_64 需要

由于服务器时CentOS7,故寻找包名带el7的软件包,这里使用如下包

rabbitmq-server-3.6.5-1.noarch.rpm

erlang-18.3-1.el7.centos.x86_64.rpm

下载地址:https://download.csdn.net/download/qq_38628046/87697057

1.安装或更新依赖环境

yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc

gcc-c++ kernel-devel m4 ncurses-devel tk tc xz

yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel

readline-devel tk-devel gcc make -y

2.安装erlang

[root@node01 ~]# rpm -ivh erlang-18.3-1.el7.centos.x86_64.rpm

准备中... ################################# [100%]

正在升级/安装...

1:erlang-18.3-1.el7.centos ################################# [100%]

3.安装rabbitmq

[root@node01 ~]# rpm -ivh rabbitmq-server-3.6.5-1.noarch.rpm

警告:rabbitmq-server-3.6.5-1.noarch.rpm: 头V4 RSA/SHA1 Signature, 密钥 ID 6026dfca: NOKEY

错误:依赖检测失败:

socat 被 rabbitmq-server-3.6.5-1.noarch 需要

访问:https://mirrors.aliyun.com/centos/7.9.2009/os/x86_64/Packages/下载依赖

wget http://mirrors.aliyun.com/centos/7.9.2009/os/x86_64/Packages/socat-1.7.3.2-2.el7.x86_64.rpm

[root@node01 ~]# rpm -ivh socat-1.7.3.2-2.el7.x86_64.rpm

警告:socat-1.7.3.2-2.el7.x86_64.rpm: 头V4 RSA/SHA1 Signature, 密钥 ID 87e360b8: NOKEY

错误:依赖检测失败:

tcp_wrappers 被 socat-1.7.3.2-2.el7.x86_64 需要

接着再访问:https://mirrors.aliyun.com/centos/7.9.2009/os/x86_64/Packages/下载依赖

wget http://mirrors.aliyun.com/centos/7.9.2009/os/x86_64/Packages/tcp_wrappers-7.6-77.el7.x86_64.rpm

[root@node01 ~]# rpm -ivh tcp_wrappers-7.6-77.el7.x86_64.rpm

准备中... ################################# [100%]

正在升级/安装...

1:tcp_wrappers-7.6-77.el7 ################################# [100%]

[root@node01 ~]# rpm -ivh socat-1.7.3.2-2.el7.x86_64.rpm

警告:socat-1.7.3.2-2.el7.x86_64.rpm: 头V4 RSA/SHA1 Signature, 密钥 ID 87e360b8: NOKEY

准备中... ################################# [100%]

正在升级/安装...

1:socat-1.7.3.2-2.el7 ################################# [100%]

[root@node01 ~]# rpm -ivh rabbitmq-server-3.6.5-1.noarch.rpm

警告:rabbitmq-server-3.6.5-1.noarch.rpm: 头V4 RSA/SHA1 Signature, 密钥 ID 6026dfca: NOKEY

准备中... ################################# [100%]

正在升级/安装...

1:rabbitmq-server-3.6.5-1 ################################# [100%]

注意:rabbitmq默认安装位置:/usr/lib/rabbitmq/bin

基本操作命令

检查RabbitMQ 的状态

systemctl status rabbitmq-server

启动RabbitMQ 服务

systemctl start rabbitmq-server

systemctl restart rabbitmq-server

停止RabbitMQ 服务

systemctl stop rabbitmq-server

将RabbitMQ设置为开机自启动

systemctl enable rabbitmq-server

开启管理界面及配置

开启管理界面

rabbitmq-plugins enable rabbitmq_management

修改默认配置信息

vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.5/ebin/rabbit.app

或者创建配置文件,在其中进行配置以覆盖默认配置信息

cd /usr/share/doc/rabbitmq-server-3.6.5/

cp rabbitmq.config.example /etc/rabbitmq/rabbitmq.config

RabbitMQ安装好后,访问http://ip:15672,使用guest用户名那与密码登录。

在3.3.1以后的版中,处于安全的考虑,guest这个默认的用户只能通过localhost来登录,其他的IP无法直接使用这个账号

编辑配置文件vim /etc/rabbitmq/rabbitmq.config,在其中添加以下内容:

[{rabbit, [{loopback_users, []}]}]

注意:只需要在合适的位置添加{loopback_users, []}]即可

%% -*- mode: erlang -*-

%% ----------------------------------------------------------------------------

%% RabbitMQ Sample Configuration File.

%%

%% See http://www.rabbitmq.com/configure.html for details.

%% ----------------------------------------------------------------------------

[

{rabbit,

[%%

{loopback_users, []}

%% Network Connectivity

%% ====================

%%

%% By default, RabbitMQ will listen on all interfaces, using

%% the standard (reserved) AMQP port.

%%

%% {tcp_listeners, [5672]},

%% To listen on a specific interface, provide a tuple of {IpAddress, Port}.

%% For example, to listen only on localhost for both IPv4 and IPv6:

%%

%% {tcp_listeners, [{"127.0.0.1", 5672},

%% {"::1", 5672}]},

保存后重启rabbitmq-server即可使用guest用户名和密码来登录

RabbitMQ集群搭建

官方文档:https://www.rabbitmq.com/clustering.html

确定rabbitmq安装目录

查找rabbitmq的安装目录

[root@node01 rabbitmq-server-3.6.5]# whereis rabbitmq

rabbitmq: /usr/lib/rabbitmq /etc/rabbitmq

[root@node01 rabbitmq-server-3.6.5]# cd /usr/lib/rabbitmq/bin

[root@node01 bin]# ls

rabbitmqctl rabbitmq-defaults rabbitmq-env rabbitmq-plugins rabbitmq-server

确保RabbitMQ正常运行

rabbitmqctl status

然后停止rabbitmq服务

systemctl stop rabbitmq-server

启动第一个节点

[root@node01 bin]# RABBITMQ_NODE_PORT=5673 RABBITMQ_NODENAME=mq1 rabbitmq-server start

RabbitMQ 3.6.5. Copyright (C) 2007-2016 Pivotal Software, Inc.

## ## Licensed under the MPL. See http://www.rabbitmq.com/

## ##

########## Logs: /var/log/rabbitmq/mq1.log

###### ## /var/log/rabbitmq/mq1-sasl.log

##########

Starting broker...

completed with 6 plugins.

启动第二个节点

web管理插件端口占用,所以还要指定其web插件占用的端口号。

[root@node01 bin]# RABBITMQ_NODE_PORT=5674 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" RABBITMQ_NODENAME=mq2 rabbitmq-server start

RabbitMQ 3.6.5. Copyright (C) 2007-2016 Pivotal Software, Inc.

## ## Licensed under the MPL. See http://www.rabbitmq.com/

## ##

########## Logs: /var/log/rabbitmq/mq2.log

###### ## /var/log/rabbitmq/mq2-sasl.log

##########

Starting broker...

completed with 6 plugins.

停止命令

[root@node01 ~]# rabbitmqctl -n mq1 stop

Stopping and halting node mq1@node01 ...

[root@node01 ~]# rabbitmqctl -n mq2 stop

Stopping and halting node mq2@node01 ...

创建集群

mq1操作作为主节点:

注意:操作节点前,确保mq处于运行状态

[root@node01 ~]# rabbitmqctl -n mq1 stop_app

Stopping node mq1@node01 ...

[root@node01 ~]# rabbitmqctl -n mq1 reset

Resetting node mq1@node01 ...

[root@node01 ~]# rabbitmqctl -n mq1 start_app

Starting node mq1@node01 ...

mq2操作为从节点:

[root@node01 ~]# rabbitmqctl -n mq2 stop_app

Stopping node mq2@node01 ...

[root@node01 ~]# rabbitmqctl -n mq2 reset

Resetting node mq2@node01 ...

[root@node01 ~]# rabbitmqctl -n mq2 join_cluster mq1@'node01'

Clustering node mq2@node01 with mq1@node01 ...

[root@node01 ~]# rabbitmqctl -n mq2 start_app

Starting node mq2@node01 ...

查看集群

[root@node01 ~]# rabbitmqctl cluster_status -n mq1

Cluster status of node mq1@node01 ...

[{nodes,[{disc,[mq1@node01,mq2@node01]}]},

{running_nodes,[mq2@node01,mq1@node01]},

{cluster_name,<<"mq1@node01">>},

{partitions,[]},

{alarms,[{mq2@node01,[]},{mq1@node01,[]}]}]

查看web监控

集群管理

将节点加入指定集群中

注意:需停止RabbitMQ应用并重置节点

rabbitmqctl join_cluster {cluster_node} [–ram]

显示集群的状态

rabbitmqctl cluster_status

修改集群节点的类型

注意:需要停止RabbitMQ应用

rabbitmqctl change_cluster_node_type {disc|ram}

将节点从集群中删除,允许离线执行

rabbitmqctl forget_cluster_node [–offline]

在集群中的节点应用启动前咨询clusternode节点的最新信息,并更新相应的集群信息

这个和join_cluster不同,它不加入集群。考虑这样一种情况,节点A和节点B都在集群中,当节点A离线了,节点C又和节点B组成了一个集群,然后节点B又离开了集群,当A醒来的时候,它会尝试联系节点B,但是这样会失败,因为节点B已经不在集群中了。

rabbitmqctl update_cluster_nodes {clusternode}

取消队列queue同步镜像的操作

rabbitmqctl cancel_sync_queue [-p vhost] {queue}

设置集群名称。集群名称在客户端连接时会通报给客户端。Federation和Shovel插件也会有用到集群名称的地方。集群名称默认是集群中第一个节点的名称,通过这个命令可以重新设置。

rabbitmqctl set_cluster_name {name}

RabbitMQ镜像集群配置

RabbitMQ 的默认集群模式可以让交换机、绑定等元数据复制到集群中的所有节点,从而保证这些元数据在整个集群中都是可用的。

但是,队列内容并不会被自动复制到集群中的其他节点上。这意味着,如果一个节点宕机或出现故障,就会导致该节点上的队列内容无法被消费者读取。

为了解决这个问题,需要创建镜像队列。镜像队列是一种特殊的队列类型,它会将队列的消息复制到集群中的其他节点上,从而保证在任何情况下都能够正常地消费队列的消息。

当需要构建高可用性的 RabbitMQ 集群时,通常会采用镜像队列来保证消息的传递和持久化。

启用HA策略

镜像队列是基于普通的集群模式的,然后再添加一些策略,所以还是得先配置普通集群,然后才能设置镜像队列。

设置镜像队列有2种方式:

1.通过命令设置镜像队列

rabbitmqctl set_policy ha "^" '{"ha-mode":"all"}'

2.通过网页管理端设置镜像队列

Name:策略名称

Pattern:匹配的规则,如果是匹配所有的队列,是^

Definition:使用ha-mode模式中的all,也就是同步所有匹配的队列。问号链接帮助文档

创建一个镜像队列

创建一个队列,然后可以看到队列开始进行同步 同步完成,mq1@node01节点上的队列数据向mq2@node01节点上同步

测试镜像队列

在mq1@node01节点,向队列发送消息 查看mq2@node01节点的队列,发现消息已同步

负载均衡-HAProxy

HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可 靠的一种解决方案,包括Twitter,Reddit,StackOverflow,GitHub在内的多家知名互联网公司在使用。 HAProxy实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。

官方下载:https://www.haproxy.org/download/

安装HAProxy

下载HAProxy的tar.gz安装包

wget https://www.haproxy.org/download/2.7/src/haproxy-2.7.6.tar.gz

解压缩安装包

tar xvfz haproxy-2.7.6.tar.gz

cd haproxy-2.7.6

查看内核版本

[root@node01 ~]# uname -r

3.10.0-1160.88.1.el7.x86_64

编译并安装HAProxy

ARGET=linux310:内核版本

ARCH=x86_64:系统位数

PREFIX=/usr/local/haproxy:haprpxy安装路径

make TARGET=linux310 PREFIX=/usr/local/haproxy ARCH=x86_64

make install PREFIX=/usr/local/haproxy

配置haproxy

建一个名为"haproxy"的用户组

# -r 将该用户组设置为系统级别的组

groupadd -r haproxy

创建一个名为"haproxy"的用户

# -g 将该用户添加到上面创建的"haproxy"用户组中

# -r 将该用户设置为系统级别用户

useradd -r -g haproxy haproxy

创建haproxy配置文件

mkdir -p /etc/haproxy

# 源码目录下执行

cp examples/quick-test.cfg /etc/haproxy/haproxy.cfg

修改配置文件/etc/haproxy/haproxy.cfg,按照需要进行配置,参考如下示例

# 全局配置参数,属于进程级的配置

global

# 日志配置 local0:日志设备 info:日志记录级别

log 127.0.0.1 local0 info

# haproxy工作目录

chroot /usr/local/haproxy

# haproxy启动后进程的pid文件路径

pidfile /usr/local/haproxy/haproxy.pid

# 每个haproxy进程可接受的最大并发连接数

maxconn 4000

user haproxy

group haproxy

# haproxy启动时可创建的进程数,默认1个,值应小于服务器的CPU核数,高版本已弃用

# nbproc 1

# haproxy在后台运行

daemon

# 默认参数配置

defaults

mode tcp

log global

option abortonclose

option redispatch

# 配置连接后端服务器失败重试次数,超过3次后会将失败的后端服务器标记为不可用

retries 3

# 配置成功连接到一台服务器的最长等待时间,默认单位是毫秒,也可自己指定单位

timeout connect 10000

# 配置连接客户端发送数据时的最长等待时间,默认单位是毫秒,也可自己指定单位

timeout client 1m

# 配置服务器端回应客户端数据发送时最长等待时间,默认单位是毫秒,也可自己指定单位

timeout server 1m

# 配置对后端服务器的检测超时时间,默认单位是毫秒,也可自己指定单位

timeout check 10s

# 最大连接数

maxconn 3000

# 定义服务叫"proxy_status "名字的虚拟节点

# haproxy代理的两个mq

listen proxy_status

# 配置监听5672端口

bind 0.0.0.0:5672

# tcp模式

mode tcp

# 轮询访问mq1与mq2

balance roundrobin

# mq真实IP:端口

server node01 192.168.10.13:5673 check inter 10s

server node02 192.168.10.13:5674 check inter 10s

# 定义服务叫"admin_stats"名字的虚拟节点

# haproxy管理页面

frontend admin_stats

# 监听地址和端口

bind *:8888

# http模式

mode http

# 配置在客户端和服务器完成一次连接请求后,haproxy主动关闭此TCP连接

option httpclose

# 配置后端服务器需要获得客户端的真实IP,通过增加"X-Forwarded-For"来记录客户端IP

option forwoardfor

# 启用日志来记录http请求,默认只对tcp日志进行日志记录

option httplog

maxconn 10

stats enable

stats refresh 30s

# 统计页面路径

stats uri /admin

# 设置统计页面认证的用户和密码

stats auth admin:123123

stats hide-version

stats admin if TRUE

启动HAProxy服务

/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg

查看haproxy进程状态

[root@node01 haproxy]# ps -ef|grep haproxy

haproxy 6061 1 0 22:51 ? 00:00:00 /usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg

root 6318 27966 0 22:51 pts/8 00:00:00 grep --color=auto haproxy

查看HAProxy监控

访问http://192.168.10.13:8888/admin查看HAProxy监控

Java代码连接MQ集群

import com.rabbitmq.client.Channel;

import com.rabbitmq.client.Connection;

import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;

import java.util.concurrent.TimeoutException;

/**

* 发送消息

*/

public class HelloWorld {

public static void main(String[] args) throws IOException, TimeoutException {

// 创建连接工厂

ConnectionFactory factory = new ConnectionFactory();

// 设置参数

factory.setHost("192.168.10.13");// HaProxy的ip

factory.setPort(5672); //端口 HaProxy的监听的端口

// 创建连接 Connection

Connection connection = factory.newConnection();

// 创建Channel

Channel channel = connection.createChannel();

// 创建队列Queue

channel.queueDeclare("hello_queue",true,false,false,null);

String body = "hello rabbitmq";

// 发送消息

channel.basicPublish("","hello_queue",null,body.getBytes());

// 释放资源

channel.close();

connection.close();

System.out.println("send success....");

}

}

文章来源

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: