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
,否则安装将出现如下类似异常:
java
[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
的软件包,这里使用如下包
java
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.安装或更新依赖环境
java
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
java
[root@node01 ~]# rpm -ivh erlang-18.3-1.el7.centos.x86_64.rpm
准备中... ################################# [100%]
正在升级/安装...
1:erlang-18.3-1.el7.centos ################################# [100%]
3.安装rabbitmq
java
[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/
下载依赖
java
wget http://mirrors.aliyun.com/centos/7.9.2009/os/x86_64/Packages/socat-1.7.3.2-2.el7.x86_64.rpm
java
[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/
下载依赖
java
wget http://mirrors.aliyun.com/centos/7.9.2009/os/x86_64/Packages/tcp_wrappers-7.6-77.el7.x86_64.rpm
java
[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 的状态
java
systemctl status rabbitmq-server
启动RabbitMQ 服务
java
systemctl start rabbitmq-server
systemctl restart rabbitmq-server
停止RabbitMQ 服务
java
systemctl stop rabbitmq-server
将RabbitMQ设置为开机自启动
java
systemctl enable rabbitmq-server
开启管理界面及配置
开启管理界面
java
rabbitmq-plugins enable rabbitmq_management
修改默认配置信息
java
vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.5/ebin/rabbit.app
或者创建配置文件,在其中进行配置以覆盖默认配置信息
java
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
,在其中添加以下内容:
java
[{rabbit, [{loopback_users, []}]}]
注意:只需要在合适的位置添加{loopback_users, []}]
即可
java
%% -*- 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的安装目录
java
[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正常运行
java
rabbitmqctl status
然后停止rabbitmq服务
java
systemctl stop rabbitmq-server
启动第一个节点
java
[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插件占用的端口号。
java
[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.
停止命令
java
[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处于运行状态
java
[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操作为从节点:
java
[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 ...
查看集群
java
[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应用并重置节点
java
rabbitmqctl join_cluster {cluster_node} [--ram]
显示集群的状态
java
rabbitmqctl cluster_status
修改集群节点的类型
注意:需要停止RabbitMQ应用
java
rabbitmqctl change_cluster_node_type {disc|ram}
将节点从集群中删除,允许离线执行
java
rabbitmqctl forget_cluster_node [--offline]
在集群中的节点应用启动前咨询clusternode节点的最新信息,并更新相应的集群信息
这个和join_cluster不同,它不加入集群。考虑这样一种情况,节点A和节点B都在集群中,当节点A离线了,节点C又和节点B组成了一个集群,然后节点B又离开了集群,当A醒来的时候,它会尝试联系节点B,但是这样会失败,因为节点B已经不在集群中了。
java
rabbitmqctl update_cluster_nodes {clusternode}
取消队列queue同步镜像的操作
java
rabbitmqctl cancel_sync_queue [-p vhost] {queue}
设置集群名称。集群名称在客户端连接时会通报给客户端。Federation和Shovel插件也会有用到集群名称的地方。集群名称默认是集群中第一个节点的名称,通过这个命令可以重新设置。
java
rabbitmqctl set_cluster_name {name}
RabbitMQ镜像集群配置
RabbitMQ 的默认集群模式可以让交换机、绑定等元数据复制到集群中的所有节点,从而保证这些元数据在整个集群中都是可用的。
但是,队列内容并不会被自动复制到集群中的其他节点上。这意味着,如果一个节点宕机或出现故障,就会导致该节点上的队列内容无法被消费者读取。
为了解决这个问题,需要创建镜像队列。镜像队列是一种特殊的队列类型,它会将队列的消息复制到集群中的其他节点上,从而保证在任何情况下都能够正常地消费队列的消息。
当需要构建高可用性的 RabbitMQ 集群时,通常会采用镜像队列来保证消息的传递和持久化。
启用HA策略
镜像队列是基于普通的集群模式的,然后再添加一些策略,所以还是得先配置普通集群,然后才能设置镜像队列。
设置镜像队列有2种方式:
1.通过命令设置镜像队列
java
rabbitmqctl set_policy ha "^" '{"ha-mode":"all"}'
2.通过网页管理端设置镜像队列
makefile
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安装包
java
wget https://www.haproxy.org/download/2.7/src/haproxy-2.7.6.tar.gz
解压缩安装包
java
tar xvfz haproxy-2.7.6.tar.gz
cd haproxy-2.7.6
查看内核版本
java
[root@node01 ~]# uname -r
3.10.0-1160.88.1.el7.x86_64
编译并安装HAProxy
ini
ARGET=linux310:内核版本
ARCH=x86_64:系统位数
PREFIX=/usr/local/haproxy:haprpxy安装路径
java
make TARGET=linux310 PREFIX=/usr/local/haproxy ARCH=x86_64
make install PREFIX=/usr/local/haproxy
配置haproxy
建一个名为"haproxy"的用户组
java
# -r 将该用户组设置为系统级别的组
groupadd -r haproxy
创建一个名为"haproxy"的用户
java
# -g 将该用户添加到上面创建的"haproxy"用户组中
# -r 将该用户设置为系统级别用户
useradd -r -g haproxy haproxy
创建haproxy配置文件
java
mkdir -p /etc/haproxy
# 源码目录下执行
cp examples/quick-test.cfg /etc/haproxy/haproxy.cfg
修改配置文件/etc/haproxy/haproxy.cfg
,按照需要进行配置,参考如下示例
java
# 全局配置参数,属于进程级的配置
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服务
java
/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg
查看haproxy进程状态
java
[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集群
java
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....");
}
}