自己搭建遇到的坑,记录下,防止下次重新搭建又要弄半天。
有2种方式,源码版和docker版,先说下第一种源码版
Centos环境源码安装
一、单机版
先上官网文档地址(centos):https://www.rabbitmq.com/install-rpm.html
首先要先安装依赖环境erlang:
安装erlang有三种方式
安装之前需要先查看RabbitMQ与Erlang之间版本兼容性: https://www.rabbitmq.com/which-erlang.html
1.去官网下载rpm包进行安装,下载地址:https://www.erlang-solutions.com/downloads/
2.使用yum安装(这种方式安装的版本可能过老,不建议)
3.使用RabbitMQ官方制作的依赖包
这里采用的是方式1,官网需要魔法,不然太慢
版本不知道为什么显示不出来,总之,选一个你需要的,我现在选了一个最新版本的
RabbitMq3.13.0 erlang 26.0 依赖关系如图:
erlang安装:
rpm -Uvh esl-erlang_26.2.1_1~centos~7_x86_64.rpm
yum install epel-release
sudo yum install erlang
因为erlang在默认的yum库中不可用,所以需要先安装epel存储库:
yum -y install epel-release
接下来进行erlang的安装:
yum -y install erlang socat
关于erlang版本
使用erl -version查看
erl -version
erl -v
RabbitMQ安装
安装RabbitMQ有几种方式:rpm包安装,yum安装
具体安装方式在一开始的官方文档地址中都有,这边我用的是rpm包安装方式,所以先去下载rpm包
先放官方网址:https://github.com/rabbitmq/rabbitmq-server/releases
根据使用的系统选择对应的rpm包
因为在安装rabbitmq时需要依赖于一个socat组件,所以先安装socat:
yum install socat
接下来安装rabbitmq:
rpm -Uvh rabbitmq-server-3.13.0-1.el8.noarch.rpm
yum install rabbitmq-server -y
启动rabbitmq并查看状态:
systemctl start rabbitmq-server
systemctl status rabbitmq-server
设置开启自启:
systemctl enable rabbitmq-server
RabbitMQ管理界面
开启管理页面插件
rabbitmq-plugins enable rabbitmq_management
管理界面默认有一个来宾账号密码:guest/guest,但是只能通过本地访问,所以还需要创建一个账号并赋予权限:
rabbitmqctl add_user admin admin #admin admin分别为账号名密码
rabbitmqctl set_user_tags admin administrator
四种身份权限:
1: administrator 超级管理员
2: monitoring 监控者
3: policymaker 策略规则制定者
4: management 普通管理者
之后就可以通过rabbitmq主机上的15672端口实现访问管理界面,需要注意的是如果不是本地访问注意在防火墙上开启15672端口,防火墙开启端口:
firewall-cmd --zone=public --add-port=15672/tcp --permanent
firewall-cmd --reload
firewall-cmd --zone=public --query-port=15672/tcp
如果是云服务器,在防火墙那里手动添加即可。
管理界面:
关于rabbitmq一些参数配置可参考官方文档:https://www.rabbitmq.com/configure.html
二、集群安装
官方文档:https://www.rabbitmq.com/clustering.html#overview-hostname-requirements
1.搭建单机集群前首先停止所有rabbitmq服务
systemctl stop rabbitmq-server
2.启动第一个节点:
sudo RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=rabbit-1 rabbitmq-server start &
3.启动第二个节点(将5672端口改为5673,15672端口改为15673端口,因为是单机搭建集群,不修改就会端口冲突):
sudo RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" RABBITMQ_NODENAME=rabbit-2 rabbitmq-server start &
4.启动第三个节点:
sudo RABBITMQ_NODE_PORT=5674 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15674}]" RABBITMQ_NODENAME=rabbit-3 rabbitmq-server start &
5.将第一个节点设为主节点:
sudo rabbitmqctl -n rabbit-1 stop_app #停止应用
sudo rabbitmqctl -n rabbit-1 reset #清除节点上的历史数据
sudo rabbitmqctl -n rabbit-1 start_app #启动应用
6.将第二个节点设为从节点:
注意:@VM-4-8-centos是你自己虚拟机的那个名字
sudo rabbitmqctl -n rabbit-2 stop_app
sudo rabbitmqctl -n rabbit-2 reset
sudo rabbitmqctl -n rabbit-2 join_cluster rabbit-1@VM-4-8-centos
sudo rabbitmqctl -n rabbit-2 start_app
7.再将第三个节点设为从节点:
sudo rabbitmqctl -n rabbit-3 stop_app
sudo rabbitmqctl -n rabbit-3 reset
sudo rabbitmqctl -n rabbit-3 join_cluster rabbit-1@VM-4-8-centos
sudo rabbitmqctl -n rabbit-3 start_app
注:如果是多机部署集群,需要保持.erlang.cookie的一致,需要将其中一个节点的cookie文件复制到其他节点的主机上,cookie文件位置/var/lib/rabbitmq/.erlang.cookie
我们目前练习使用,因为没有多台机器,只能模拟
8.为每个节点添加用户名密码,并授予权限
rabbitmqctl -n rabbit-1 add_user admin admin
rabbitmqctl -n rabbit-1 set_user_tags admin administrator
rabbitmqctl -n rabbit-1 set_permissions -p / admin ".*" ".*" ".*"
9.进入主节点web页面监控:
RabbitMQ镜像集群配置
面已经完成RabbitMQ默认集群模式,但并不保证队列的高可用性,尽管交换机、绑定这些可以复制到集群里的任何一个节点,但是队列内容不会复制。虽然该模式解决一项目组节点压力,但队列节点宕机直接导致该队列无法应用,只能等待重启,所以要想在队列节点宕机或故障也能正常应用,就要复制队列内容到集群里的每个节点,必须要创建镜像队列。
镜像队列是基于普通的集群模式的,然后再添加一些策略,所以你还是得先配置普通集群,然后才能设置镜像队列,我们就以上面的集群接着做。
设置的镜像队列可以通过开启的网页的管理端Admin->Policies,也可以通过命令。
rabbitmqctl set_policy my_ha "^" '{"ha-mode":"all"}'
- Name:策略名称
- Pattern:匹配的规则,如果是匹配所有的队列,是^.
- Definition:使用ha-mode模式中的all,也就是同步所有匹配的队列。问号链接帮助文档。
三、负载均衡-HAProxy
HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案,包括Twitter,Reddit,StackOverflow,GitHub在内的多家知名互联网公司在使用。HAProxy实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。
安装HAProxy
//下载依赖包
yum install gcc vim wget
//上传haproxy源码包
//解压
tar -zxvf haproxy-1.6.5.tar.gz -C /usr/local
//进入目录、进行编译、安装
cd /usr/local/haproxy-1.6.5
make TARGET=linux31 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy
mkdir /etc/haproxy
//赋权
groupadd -r -g 149 haproxy
useradd -g haproxy -r -s /sbin/nologin -u 149 haproxy
//创建haproxy配置文件
mkdir /etc/haproxy
vim /etc/haproxy/haproxy.cfg
配置文件路径:/etc/haproxy/haproxy.cfg
#logging options
global
log 127.0.0.1 local0 info
maxconn 5120
chroot /usr/local/haproxy
uid 99
gid 99
daemon
quiet
nbproc 20
pidfile /var/run/haproxy.pid
defaults
log global
mode tcp
option tcplog
option dontlognull
retries 3
option redispatch
maxconn 2000
contimeout 5s
clitimeout 60s
srvtimeout 15s
#front-end IP for consumers and producters
listen rabbitmq_cluster
mode tcp
#balance url_param userid
#balance url_param session_id check_post 64
#balance hdr(User-Agent)
#balance hdr(host)
#balance hdr(Host) use_domain_only
#balance rdp-cookie
#balance leastconn
#balance source //ip
balance roundrobin
server node1 127.0.0.1:5672 check inter 5000 rise 2 fall 2
server node2 127.0.0.1:5673 check inter 5000 rise 2 fall 2
server node3 127.0.0.1:5674 check inter 5000 rise 2 fall 2
listen stats
bind 0.0.0.0:8100
mode http
option httplog
stats enable
stats uri /rabbitmq-stats
stats refresh 5s
启动HAproxy负载
/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg
//查看haproxy进程状态
ps -ef | grep haproxy
访问如下地址对mq节点进行监控
http://你的ip地址:8100/rabbitmq-stats
负载均衡之后,如果是在SpringBoot项目中,就不用填RabbitMq的集群地址了,直接填Haproxy的地址就行
设置里的bind 0.0.0.0:5675 这个端口