RabbitMQ集群即HAProxy代理搭建
1.RabbitMQ安装
不同版本或类型的linux系统对应的安装不太一样,参考官网:
https://www.rabbitmq.com/install-rpm.html
2.RabbitMQ单节点相关命令
后台启动
rabbitmq-server -detached
添加用户
rabbitmqctl add_user admin 123456
设置角色
rabbitmqctl set_user_tags admin administrator
授权
rabbitmqctl set_permissions -p / admin ‘.’ '.’ ‘.*’
启动 app
rabbitmqctl start_app
启动管理页面
rabbitmq-plugins enable rabbitmq_management
开放防火墙 5672、15672 端口
firewall-cmd --zone=public --add-port=5672/tcp --permanent
firewall-cmd --zone=public --add-port=15672/tcp --permanent
firewall-cmd --reload
浏览器访问 http://ip:15672
,输入用户名密码即可登录
参考:https://blog.youkuaiyun.com/winy_lm/article/details/81070494
3.集群搭建
本次搭建使用三台服务器,设置 1 个磁盘节点,2 个内存节点
192.168.0.1
192.168.0.2
192.168.0.3
3.1 hostname
- 修改节点的 hostname,修改后要重启 rabbitmq
hostnamectl set-hostname rabbitmq01
hostnamectl set-hostname rabbitmq02
hostnamectl set-hostname rabbitmq03
3.2 .erlang.cookie
由于 rabbitmq 集群基于 erlang 同步,所以要配置各个节点中 .erlang.cookie 文件内容一致:
# /val/lib/rabbitmq/.erlang.cookie
find / -name .erlang.cookie
# scp 远程拷贝
scp /var/lib/rabbitmq/.erlang.cookie root@rabbitmq02:/var/lib/rabbitmq/
scp /var/lib/rabbitmq/.erlang.cookie root@rabbitmq03:/var/lib/rabbitmq/
# 设置拷贝后修改所有者及读写权限,否则会出现错误:Error when reading /var/lib/rabbitmq/.erlang.cookie: eacces
chown rabbitmq:rabbitmq .erlang.cookie
chmod 0400 .erlang.cookie
启动所有节点:rabbitmq-server -detached
3.3 join_cluster
添加节点,这里设置 1 个磁盘节点,2 个内存节点
# 在节点 rabbitmq02 上执行以下命令,@ 前面的 rabbit 是默认值,不能写成其它的
rabbitmqctl join_cluster --ram rabbit@rabbitmq01
# 在节点 rabbitmq03 上执行以下命令,--ram 表示内存节点,缺省或 --disc 为磁盘节点
rabbitmqctl join_cluster --ram rabbit@rabbitmq01
如果想把其中某个磁盘节点修改为内存节点,可以使用如下方式:
# 方式一:在 RabbitMQ 3.9.4 on Erlang 23.3.4.5 版本上时失败:Error: mnesia_not_running
rabbitmqctl stop_app
rabbitmqctl change_cluster_noe_type ram
rabbitmqctl start_app
# 方式二:参考:https://blog.youkuaiyun.com/LSY_优快云_/article/details/103864940
# 关闭要更换类型的节点上的服务
rabbitmqctl stop
# 在其它节点上执行移除节点操作
rabbitmqctl forget_cluster_node rabbit@rabbitmq01
# 再次启动要更换的节点
rabbitmq-server -detached
# 停止 application 服务
rabbitmqctl stop_app
# 再次将节点添加到集群中,选择要更换的节点类型
rabbitmqctl join_cluster --ram rabbit@rabbitmq01
3.4 user/tags/permissions
添加用户、配置权限等
rabbitmqctl add_user admin 123456
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p / admin '.*' '.*' '.*'
rabbitmq-plugins enable rabbitmq_management
登录 http://ip:15672 查看管理页面,如果出现某个节点显示 ‘Node statistics not available’ 信息,则直接在该节点上执行 “rabbitmq-plugins enable rabbitmq_management” 即可。即管理插件需要在集群中的所有节点上开启。
4.HAProxy 代理
4.1 haproxy.cfg
HAProxy 代理服务安装在另外一台服务器
安装
yum install haproxy -y
修改配置文件:见 /etc/haproxy/haproxy.cfg。保留默认的 global、defaults,删除 frontend、backend,添加 listen。
# 监听RabbitMQ管理页面
listen rabbitmq_admin
bind 0.0.0.0:8004
server rabbitmq01 192.168.0.1:15672
server rabbitmq02 192.168.0.2:15672
server rabbitmq03 192.168.0.3:15672
# 监听HAProxy的管理页面
listen private_monitoring
bind 0.0.0.0:1080 # 监听端口
mode http
option httplog
stats enable
stats refresh 30s # 统计页面自动刷新时间
stats uri /haproxy?stats # 统计页面url
stats realm Haproxy Manager # 统计页面密码框上提示文本
stats auth admin:passw0rd # 统计页面用户名和密码设置
# states hide-version # 隐藏统计页面上HAProxy的版本信息
# HAProxy监听RabbitMQ集群
listen rabbitmq_cluster
bind 0.0.0.0:5672
mode tcp # 配置TCP模式
timeout client 3h
timeout server 3h
timeout connect 3h
option tcplog
balance roundrobin # 简单轮询
# check inter 5000 是检测心跳,rise 2 是2次正确认为服务器可用,fall 3 是3次失败认为服务器不可用
server rabbitmq01 192.168.0.1:5672 check inter 5000 rise 2 fall 2
server rabbitmq02 192.168.0.2:5672 check inter 5000 rise 2 fall 2
server rabbitmq03 192.168.0.3:5672 check inter 5000 rise 2 fall 2
# HAProxy 监听 ssl RabbitMQ集群
listen rabbitmq_ssl_cluster
bind 0.0.0.0:5671
mode tcp
timeout client 3h
timeout server 3h
timeout connect 3h
option tcplog
balance roundrobin
server rabbitmq01 192.168.0.1:5671 check inter 5000 rise 2 fall 2
server rabbitmq02 192.168.0.2:5671 check inter 5000 rise 2 fall 2
server rabbitmq03 192.168.0.3:5671 check inter 5000 rise 2 fall 2
4.2 log
- 开启日志
# 创建记录日志的文件
mkdir /var/log/haproxy // 创建日志目录
chmod a+w /var/log/haproxy // 修改权限
# 开启 rsyslog 记录 haproxy 日志功能
# 编辑文件"/etc/rsyslog.conf",打开如下配置项:
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
# 添加如下内容:
local2.* /var/log/haproxy/haproxy.log
# 编辑"/etc/haproxy/haproxy.conf" 文件,在"global"段中添加如下内容:
log 127.0.0.1 local2 info
# 重启服务:
service haproxy restart
service rsyslog restart
# 查看日志:
tailf /var/log/haproxy/haproxy.log
4.3 SELinux 问题
- SELinux 问题:
Aug 22 12:54:00 park python: SELinux is preventing /usr/sbin/haproxy from name_bind access on the tcp_socket port 1080.#012#012***** Plugin bind_por ts (85.9 confidence) suggests *******************#012#012If you want to allow /usr/sbin/haproxy to bind to network port 1080#012Then you need to modify the port type.#012Do#012# semanage port -a -t PORT_TYPE -p tcp 1080#012 where PORT_TYPE is one of the following: commplex_main_port_t, h ttp_cache_port_t, http_port_t.#012#012** Plugin catchall_boolean (7.33 confidence) suggests *************#012#012If you want to allow nis to enabled#012Then you must tell SELinux about this by enabling the ‘nis_enabled’ boolean.#012#012Do#012setsebool -P nis_enabled 1#012#012** Plug in catchall_boolean (7.33 confidence) suggests *************#012#012If you want to allow haproxy to connect any#012Then you must tell SELinux about this by enabling the ‘haproxy_connect_any’ boolean.#012#012Do#012setsebool -P haproxy_connect_any 1#012#012** Plugin catchall (1.35 confide nce) suggests **************************#012#012If you believe that haproxy should be allowed name_bind access on the port 1080 tcp_socket by defau lt.#012Then you should report this as a bug.#012You can generate a local policy module to allow this access.#012Do#012allow this access for now by ex ecuting:#012# ausearch -c ‘haproxy’ --raw | audit2allow -M my-haproxy#012# semodule -i my-haproxy.pp#012
-
如下处理:
ausearch -c ‘haproxy’ --raw | audit2allow -M my-haproxy
semodule -i my-haproxy.pp
4.4 ssl
- 添加 rabbtimq.config 配置文件到 /etc/rabbitmq/ 目录下
- 填写内容:
%% Disable SSLv3.0 and TLSv1.0 support.
[
{ssl, [{versions, ['tlsv1.2', 'tlsv1.1']}]},
{rabbit, [
{tcp_listeners, [5672]},
{ssl_listeners, [5671]},
{ssl_options, [{cacertfile,"/etc/rabbitmq/rootCA.pem"},
{certfile,"/etc/rabbitmq/server-cert.pem"},
{keyfile,"/etc/rabbitmq/server-key.pem"},
{verify, verify_peer},
{fail_if_no_peer_cert, true},
{versions, ['tlsv1.2', 'tlsv1.1']}
]}
]}
].
- 将根证书、Server 证书拷贝到 /etc/rabbitmq 目录下,重启服务:
rabbitmqctl stop
rabbitmq-server -detached