Rabbitmq的两种集群模式:
集群模式:
对于queue来说,message data只存在于集群中的一个节点上,而message metadata则存在于集群中的所有节点。当message进入A节点的queue后,consumer从B节点拉去时,rabbitmq会临时在A、B之间进行消息传输,把A中的message data取出来发送给链接在B上的consumer。这样就存在A这个瓶颈,无论链接A还是B,出口总是在A。还有如果A节点故障后,在B节点无法取到A节点中还未消费的消息,如果做了消息持久化,则A节点恢复后,仍然可以被消费,但是如果没做消息持久化,即使A恢复了,消息也丢失了。
镜像模式:
该模式和集群模式的区别在于,message data会在镜像节点间主动同步,而不是在consumer取数据时临时拉取,当然由于在节点间主动同步数据,副作用也很明显,降低系统性能,一但大量消息进入,则同步的消息非常多。
RabbitMQ的集群节点包括内存节点、磁盘节点。顾名思义内存节点就是将所有数据放在内存,磁盘节点将数据放在磁盘。如果在投递消息时,打开了消息的持久化,那么即使是内存节点,数据还是安全的放在磁盘。
1. RabbitMQ 安装
1.1 安装 erlang
rabbitMQ需要erlang语言的支持,因此需要先安装erlang语言,先更新源
# 更新源
sudo apt-get update
# 安装 erlang
sudo apt-get install erlang
1.2 安装rabbitmq
sudo apt-get install rabbitmq-server
#启动
sudo service rabbitmq-server start
# 查看运行状态
sudo service rabbitmq-server status
# 启用web管理平台
sudo rabbitmq-plugins enable rabbitmq_management
1.3 RabbitMQ集群
1.4 开放rabbitmq端口
# 程序链接端口
sudo ufw allow 5672
# web管理面板端口
sudo ufw allow 15672
# 集群端口
sudo ufw allow 4369
2. RabbitMQ 集群
2.1 3台rabbitmq 集群
将刚才装好的一台rabbitmq 复制两台,共3台。
ip 和主机名对应分别为:
192.168.1.121 、192.168.1.122 、192.168.1.123
rabbitmq-node1、rabbitmq-node2、rabbitmq-node3
修改主机名
sudo hostnamectl set-hostname rabbitmq-node1
重启系统 reboot
2.2 hosts文件修改
sudo vim /etc/hosts
# 复制到hosts里面 每个机器针对自己的文件做对应的修改
127.0.0.1 rabbitmq-node1
192.168.1.122 rabbitmq-node2
192.168.1.123 rabbitmq-node3
2.3 复制.erlang.cookie
.erlang.cookie是erlang分布式的token文件,集群内所有设备要
持有相同的.erlang.cookie文件才允许彼此通信。
默认在/var/lib/rabbitmq 文件夹内 ls -al 就能看到
找到这个.cookie结尾的文件,里面看到的是一个字符串,也就是两个主机需要持有相同的erlang的cookie文件才能进行彼此通信
root@rabbitmq-node1:~# sudo find / -name .erlang.cookie
/var/lib/rabbitmq/.erlang.cookie
root@rabbitmq-node1:/var/lib/rabbitmq# more /var/lib/rabbitmq/.erlang.cookie
FYOOOZHFSWSTTXGEDXQA
root@rabbitmq-node1:/var/lib/rabbitmq#
将cookie文件拷贝到其他服务器
root@rabbitmq-node1:# scp /var/lib/rabbitmq/.erlang.cookie root@192.168.1.122:/var/lib/rabbitmq
root@192.168.1.122's password:
.erlang.cookie 100% 20 0.3KB/s 00:00
2.4 配置镜像集群
在rabbitmq-node2服务器上执行下面的命令将与rabbitmq-node1服务器进行复制
# 暂停服务
rabbitmqctl stop_app
# 如果停不掉,就重启rabbitmq
sudo service rabbitmq-server restart
# 加入rabbitmq-node1 的集群
rabbitmqctl join_cluster rabbit@rabbitmq-node1
# 启动服务
rabbitmqctl start_app
# 验证集群结果
rabbitmqctl cluster_status
在rabbitmq-node2 服务器上操作
root@rabbitmq-node2:~# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@rabbitmq-node2 ...
root@rabbitmq-node2:~#
root@rabbitmq-node2:~# rabbitmqctl join_cluster rabbit@rabbitmq-node1
Clustering node rabbit@rabbitmq-node2 with rabbit@rabbitmq-node1
root@rabbitmq-node2:~#
root@rabbitmq-node2:~# rabbitmqctl start_app
Starting node rabbit@rabbitmq-node2 ...
completed with 0 plugins.
root@rabbitmq-node2:~# rabbitmqctl cluster_status
Cluster status of node rabbit@rabbitmq-node2 ...
Basics
Cluster name: rabbit@rabbitmq-node2
Disk Nodes
rabbit@rabbitmq-node1
rabbit@rabbitmq-node2
Running Nodes
rabbit@rabbitmq-node1
rabbit@rabbitmq-node2
Versions
rabbit@rabbitmq-node1: RabbitMQ 3.8.2 on Erlang 22.2.7
rabbit@rabbitmq-node2: RabbitMQ 3.8.2 on Erlang 22.2.7
Alarms
(none)
Network Partitions
(none)
Listeners
Node: rabbit@rabbitmq-node1, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@rabbitmq-node1, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@rabbitmq-node2, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@rabbitmq-node2, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Feature flags
Flag: implicit_default_bindings, state: enabled
Flag: quorum_queue, state: enabled
Flag: virtual_host_metadata, state: enabled
root@rabbitmq-node2:~#
在rabbitmq-node3 服务器上执行相同操作
设置集群为镜像模式
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
2.4 登录管理平台
sudo rabbitmqctl add_user test test
sudo rabbitmqctl set_user_tags test administrator
sudo rabbitmqctl set_permissions -p / test ".*" ".*" ".*"
登录就可以看到三个节点
也可以看到镜像策略
3. Haproxy 代理
3.1 使用haproxy原因
当配好mq的时候,对于客户端也就是php当我们去连接的时候就需要一个统一的入口来进行系统或者消息直接的调用,也就是需要连接哪台服务器进行数据的处理,如果是这种情况的话,当node1挂的话,我们就需要手动的去修改php客户端的地址了,另外还有有一个问题就是node1猛干活,node2和node3闲着没事做,而对我们的资源利用也是不合理的,那么负载均衡器就应运而生了。
而当有haproxy的时候它会将这个请求进行具体的转发到node1或者node2、node3上进行分工,比如安装简单的算法轮询模式,将任务进行均摊,这样资源就会被合理的利用了,对于php客户端直接可以配置proxy的地址了,而haproxy可以通过心跳的感知哪些服务器是可以发送消息的,比如遇到node2的机器宕机了,它就会自动的将我们的服务退出,来使用其他的节点也进行提供服务
3.2 HAProxy 代理服务器介绍
HAProxy 是一款提供高可用性、负载均衡以及基于TCP(第四层)
和HTTP(第七层)应用的代理软件,支持虚拟主机,它是免费、
快速并且可靠的一种解决方案。
RabbitMQ集群镜像模式中,HAProxy用于做Tcp,提供节点负载
均衡(LB-LoadBalance)与故障发现。
3.3 安装HAProxy
sudo apt-get install haproxy -y
root@rabbitmq-node1:~# find / -name haproxy.cfg
/etc/haproxy/haproxy.cfg
3.4 修改配置文件
修改前要提前备份,改错了服务就无法启动了
root@rabbitmq-node1:/etc/haproxy# cp haproxy.cfg haproxy.cfg.bak
root@rabbitmq-node1:/etc/haproxy#
按指定位置替换:
# 从defaults 开始替换
defaults
#应用全局的日志配置
log global
#默认的模式mode{tcp|http|health}
#tcp是4层,http是7层,health只返回OK
mode tcp
#日志类别tcplog
option tcplog
#不记录健康检查日志信息
option dontlognull
#3次失败则认为服务不可用
retries 3
#每个进程可用的最大连接数
maxconn 2000
#连接超时
timeout connect 5s
#客户端超时
timeout client 120s
#服务端超时
timeout server 120s
#绑定配置
listen rabbitmq_cluster
# 监听的端口
bind 0.0.0.0:5670
#配置TCP模式
mode tcp
#简单的轮询 负载均衡算法(#banlance roundrobin 轮询,balance source 保存session值,支持static-rr,leastconn,first,uri等参数)
balance roundrobin
#RabbitMQ集群节点配置
server rabbitmq-node1 127.0.0.1:5672 check inter 1000 rise 1 fall 3 weight 1
server rabbitmq-node2 192.168.1.122:5672 check inter 1000 rise 1 fall 3 weight 1
server rabbitmq-node3 192.168.1.123:5672 check inter 1000 rise 1 fall 3 weight 1
###############我把RabbitMQ的管理界面也放在HAProxy后面了#################
#listen rabbitmq_admin
# bind 0.0.0.0:8004
# server rmq_node1 192.168.184.129:15672
# server rmq_node2 192.168.184.131:15672
#haproxy监控页面地址
listen monitor
bind 0.0.0.0:8100
mode http
option httplog
stats enable
stats uri /rabbitmq-stats
stats refresh 5s
stats auth admin:admin
stats hide-version
stats admin if TRUE
开放HAProxy 所需的端口
sudo ufw allow 5670
sudo ufw allow 8100
连接haproxy访问地址是上面设置的连接密码admin,这里在配置文件中去登录的密码,和url地址
登录进来可以看到我们的MQ进行监控到了,如果使用php发送系统调用的消息之后那么就会进行消息的提供与消费。
4. HAProxy高可用
配合keepalived,3个服务器共享一个VIP漂移,然后每台上面都安装HAProxy, 配置好参数,实现代理高可用