RabbitMQ集群搭建
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: 头V4RSA/SHA256Signature, 密钥 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: 头V4RSA/SHA1Signature, 密钥 ID6026dfca: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: 头V4RSA/SHA1Signature, 密钥 ID87e360b8: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: 头V4RSA/SHA1Signature, 密钥 ID87e360b8: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: 头V4RSA/SHA1Signature, 密钥 ID6026dfca: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 -*-%%----------------------------------------------------------------------------%%RabbitMQSampleConfigurationFile.%%%%See http://www.rabbitmq.com/configure.html for details.%%----------------------------------------------------------------------------[{rabbit,[%%{loopback_users,[]}%%NetworkConnectivity%%====================%%%%Bydefault,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,tolisten 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=5673RABBITMQ_NODENAME=mq1 rabbitmq-server start
RabbitMQ3.6.5.Copyright(C)2007-2016PivotalSoftware,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 with6 plugins.
启动第二个节点
web管理插件端口占用,所以还要指定其web插件占用的端口号。
[root@node01 bin]# RABBITMQ_NODE_PORT=5674RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]"RABBITMQ_NODENAME=mq2 rabbitmq-server start
RabbitMQ3.6.5.Copyright(C)2007-2016PivotalSoftware,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 with6 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@node01withmq1@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 ifTRUE
启动HAProxy服务
/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg
查看haproxy进程状态
[root@node01 haproxy]# ps -ef|grep haproxy
haproxy 60611022:51?00:00:00/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg
root 631827966022:51 pts/800:00:00 grep --color=auto haproxy
查看HAProxy监控
访问
http://192.168.10.13:8888/admin
查看HAProxy监控
Java代码连接MQ集群
importcom.rabbitmq.client.Channel;importcom.rabbitmq.client.Connection;importcom.rabbitmq.client.ConnectionFactory;importjava.io.IOException;importjava.util.concurrent.TimeoutException;/**
* 发送消息
*/publicclassHelloWorld{publicstaticvoidmain(String[] args)throwsIOException,TimeoutException{// 创建连接工厂ConnectionFactory factory =newConnectionFactory();// 设置参数
factory.setHost("192.168.10.13");// HaProxy的ip
factory.setPort(5672);//端口 HaProxy的监听的端口// 创建连接 ConnectionConnection connection = factory.newConnection();// 创建ChannelChannel 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....");}}
版权归原作者 CodeDevMaster 所有, 如有侵权,请联系我们删除。