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.rpmerlang-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 xzyum 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-serversystemctl 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 startRabbitMQ 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 startRabbitMQ 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_64make 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 4000user haproxy group haproxy # haproxy启动时可创建的进程数,默认1个,值应小于服务器的CPU核数,高版本已弃用# nbproc 1# haproxy在后台运行daemon# 默认参数配置
defaultsmode tcplog globaloption abortoncloseoption 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与mq2balance roundrobin# mq真实IP:端口server node01 192.168.10.13:5673 check inter 10sserver 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"来记录客户端IPoption forwoardfor# 启用日志来记录http请求,默认只对tcp日志进行日志记录option httplogmaxconn 10stats enablestats refresh 30s# 统计页面路径stats uri /admin# 设置统计页面认证的用户和密码stats auth admin:123123stats hide-versionstats 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的ipfactory.setPort(5672); //端口 HaProxy的监听的端口// 创建连接 ConnectionConnection connection = factory.newConnection();// 创建ChannelChannel channel = connection.createChannel();// 创建队列Queuechannel.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....");}
}