Rabbitmq集群总体架构
操作系统:window 10
机器Ha-1(keepalived1):192.168.1.1
机器Ha-2(keepalived2):192.168.1.2
机器MQ node1 :192.168.200.1 (内存节点)
机器MQ node2 :192.168.200.2 (内存节点)
机器MQ node3 :192.168.200.3 (磁盘节点)
4 Rabbitmq集群模式
4.1 普通模式
默认的集群模式。对于Queue来说,消息实体只存在于其中一个节点,A、B两个节点仅有相同的元数据,即队列结构。当消息进入A节点的Queue中后,consumer从B节点拉取时,RabbitMQ会临时在A、B间进行消息传输,把A中的消息实体取出并经过B发送给consumer。所以,consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连A或B,出口总在A,会产生瓶颈。该模式存在一个问题就是当A节点故障后,B节点无法取到A节点中还未消费的消息实体。如果做了消息持久化,那么得等A节点恢复,然后才可被消费;如果没有持久化的话,消息会丢失。
4.2 镜像模式
该模式解决了上述问题,其实它和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在consumer取数据时临时拉取。 该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉。所以在对可靠性要求较高的场合中适用。
5 Rabbitmq集群的基本概念
集群中有两种节点:
内存节点:只保存状态到内存(一个例外的情况是:持久的queue的持久内容将被保存到disk)
磁盘节点:保存状态到内存和磁盘
顾名思义内存节点就是将所有数据放在内存,磁盘节点将数据放在磁盘。不过,如果在投递消息时,打开了消息的持久化,那即使是内存节点,数据还是安全的放在磁盘。
一个RabbitMQ集群中可以共享user、vhost、queue、exchange等,所有的数据和状态都是必须在所有节点上复制的,一个例外是那些当前只属于创建它的节点的消息队列,尽管它们可见且可被所有节点读取。RabbitMQ节点可以动态地加入到集群中,一个节点它可以加入到集群中,也可以从集群环集群进行一个基本的负载均衡。
6 Haproxy(反向代理)
Haproxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。Haproxy特别适用于那些负载特大的web站点,这些站点通常又需要会保持或七层处理。Haproxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的web服务器不被暴露到网络上。
HAProxy的优点:
1、HAProxy是支持虚拟主机的,可以工作在4、7层(支持多网段);
2、能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作;
3、支持url检测后端的服务器;
4、它跟LVS一样,本身仅仅就只是一款负载均衡软件;单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的;
5、HAProxy可以对Mysql读进行负载均衡,对后端的MySQL节点进行检测和负载均衡,不过在后端的MySQL slaves数量超过10台时性能不如LVS;
6、HAProxy的算法较多,达到8种;
HAProxy的缺点:
1. 不支持POP/SMTP协议
2. 不支持SPDY协议
3. 不支持HTTP cache功能。现在不少开源的lb项目,都或多或少具备HTTP cache功能。
4. 重载配置的功能需要重启进程,虽然也是soft restart,但没有Nginx的reaload更为平滑和友好。
5. 多进程模式支持不够好
7. Keepalived(热备份)
7.1 KeepAlived主要有两个功能:
(1).能够对RealServer进行健康状况检查,支持4层、5层和7层协议进行健康检查;
(2).对负载均衡调度器实现高可用,防止Director单点故障。
7.2 KeepAlived工作过程:
keepalived实现故障转移的功能是通过VRRP(virtual router redundancy protocol虚拟路由器冗余协议)协议来实现的。 在keepalived正常工作的时候,主节点(master)会不断的发送心跳信息给备节点(backup),当备节点不能在一定时间内收到主节点的心跳信息时,备节点会认为主节点宕了,然后会接管主节点上的资源,并继续向外提供服务保证其可用性。当主节点恢复的时候,备节点会自动让出资源并再次自动成为备节点。
10 架构部署
10.1安装环境
准备安装介质:
jdk1.8
rabbitmq_server-3.7.14
otp_win64_21.3
haproxy-1.7.5.tar
Keepalived 1.2.21(没有window)
10.2 rabbitmq单机部署
安装前检查防火墙是否关闭,安装rabbitmq需要关闭防火墙!!!
分别在192.168.200.1,192.168.200.2,192.168.200.3节点上安装rabbitmq server。
安装步骤:
1.安装jdk以及配置Java运行环境
2.安装erlang软件,一直默认下一步,安装完毕后配置erlang环境变量
3. 安装rabbitmq,默认下一步
4. 安装完成后,将C:\Users\Administrator\.erlang.cookie文件替换掉C:\Windows\System32\config\systemprofile\.erlang.cookie,即erlang.cookie文件保持一致
5.以管理员角色打开cmd操作框,安装rabbitmq插件,执行命令:
#"C:\Program Files\RabbitMQServer\rabbitmq_server-3.7.14\sbin\rabbitmq-plugins.bat" enable
rabbitmq_management
#cd C:\Program Files\RabbitMQ Server\rabbitmq_server-3.7.14\sbin
#net stop RabbitMQ && net start RabbitMQ
6. 查看用户:
#rabbitmqctl.bat list_users
7.创建用户
#rabbitmqctl.bat add_user bocon bocon#EDC
8. 赋予权限
#rabbitmqctl.bat set_user_tags bocon administrator
9.运行结果
rabbitmq镜像集群
1.将192.168.200.1上的C:\Users\Administrator\.erlang.cookie中的内容分别替换机器192.168.200.2,192.168.200.3上的C:\Windows\System32\config\systemprofile文件(三台机器必须具有相同的cookie,如果不相同的话,无法搭建集群)
2. 在机器192.168.200.1,192.168.200.2,192.168.200.3上进行重启
#net stop RabbitMQ && net start RabbitMQ
在机器192.168.200.1,192.168.200.2,192.168.200.3操作:
a): 查看节点名称,例如在192.168.200.1机器上:
#rabbitmqctl status
b): 分别在192.168.200.1,192.168.200.2,192.168.200.3机器上的C:\Users\Administrator\AppData\Roaming\RabbitMQ (AppData默认隐藏,需要设置显示隐藏文件)下,创建并编辑rabbitmq.config文件,编辑内容如下(包括最后的 .):
[{rabbit,[{cluster_nodes, ['rabbit@USER-20190308IA','rabbit@lenovo-PC',…}]}].
c):编辑机器192.168.200.1,192.168.200.2,192.168.200.3上的hosts文件如下:
192.168.200.1 rabbit@USER-20190308IA
192.168.200.2 rabbit@lenovo-PC
192.168.200.3 rabbit@USER20190307IA
d): 配置环境变量文件,分别在192.168.200.1,192.168.200.2,192.168.200.3机器上的C:\Users\Administrator\AppData\Roaming\RabbitMQ 路径下,创建并编辑rabbitmq-env.con文件,
在机器192.168.200.1编辑内容为:
NODENAME=rabbit@USER-20190308IA
NODE_IP_ADDRESS=192.168.200.1
NODE_PORT=5672
RABBITMQ_MNESIA_BASE=C:\Users\Administrator\AppData\Roaming\RabbitMQ\db
RABBITMQ_LOG_BASE=C:\Users\Administrator\AppData\Roaming\RabbitMQ\log
在机器192.168.200.2编辑内容为:
NODENAME= rabbit@lenovo-PC
NODE_IP_ADDRESS=192.168.200.2
NODE_PORT=5672
RABBITMQ_MNESIA_BASE=C:\Users\Administrator\AppData\Roaming\RabbitMQ\db
RABBITMQ_LOG_BASE=C:\Users\Administrator\AppData\Roaming\RabbitMQ\log
在机器192.168.200.3编辑内容为:
NODENAME= USER20190307IA
NODE_IP_ADDRESS=192.168.200.3
NODE_PORT=5672
RABBITMQ_MNESIA_BASE=C:\Users\Administrator\AppData\Roaming\RabbitMQ\db
RABBITMQ_LOG_BASE=C:\Users\Administrator\AppData\Roaming\RabbitMQ\log
1. 重启服务
在机器192.168.200.1设置为内存节点:
#rabbitmqctl stop_app
#rabbitmqctl reset
#rabbitmqctl join_cluster --ram USER20190307IA
#rabbitmqctl
start_app
在机器192.168.200.2设置为内存节点:
#rabbitmqctl stop_app
#rabbitmqctl reset
#rabbitmqctl join_cluster --ram USER20190307IA
#rabbitmqctl
start_app
在机器192.168.200.3,192.168.200.4(默认为磁盘节点):
#rabbitmqctl stop_app
#rabbitmqctl reset
#rabbitmqctl
start_app
3.Web页面查看
设置队列镜像
#rabbitmqctl set_policy -p
hrsystem ha-all queue"^" '{"ha-mode":"all"}' //意思表示以ha.开头的queue都会复制到各个节点 ["^"匹配所有]
集群重启的顺序是固定的,并且是相反的。如下所述:
• 启动顺序:磁盘节点 => 内存节点
• 关闭顺序:内存节点 => 磁盘节点
10.4 Haproxy负载均衡
1. 在192.168.1.1和192.168.1.2节点上安装haproxy,解压内容:
2. 修改haproxy目录下的haproxy配置文件,追加以下内容:
#rabbitmq集群web页面
listenrabbitmq_admin
bind 0.0.0.0:8004
server node1 192.168.1.177:15672
server node2 192.168.1.188:15672
#监听消息发送端口
listen win_17
bind 0.0.0.0:5671
mode tcp
#balance source
server rabbit1 192.168.1.177:5672weight 1 check inter 5000 check rise 2 fall 2
server rabbit2 192.168.1.188:5672weight 1 check inter 5000 check rise 2 fall 2
#haproxy监控页面
listen monitor
bind 0.0.0.0:1188
mode http
stats refresh 30s
option httplog
stats enable
stats uri /
stats refresh 5s
它标识并且定义了后端RabbitMQ的服务。主要含义如下:
(a)“server
(b)“ip1:5672”部分:标识了后端RabbitMQ的服务地址;
(c)“check inter
(d)“rise
(e)“fall
3.点击“run.bat”,启动服务,rabbitmq消息web页面,访问http://
haproxy管理页面,访问http://
10.5 keepalived热备份(待续)
目前没有window版开源的双机热部署可以替代,先可以参考一下linux下的安装部署!!!
[if !supportLists]1. [endif]在主机192.168.1.1上步骤如下:
下载keepalived-1.1.15.tar.gz,然后解压安装
#tarzxvf keepalived-1.1.15.tar.gz
#cdkeepalived-1.1.15
#./configure
#make
#makeinstall
2,配置keepalived
配置中的state MASTER决定了节点为主节点
priority决定了优先级,比如在有多个备用节点的时候,主节点故障后优先级值大的接管。
主节点的配置如下:
global_defs {
router_id NodeA
}
vrrp_instance VI_1 {
state MASTER #设置为主服务器
interface eth0 #监测网络接口
virtual_router_id 51 #主、备必须一样
priority 100 #(主、备机取不同的优先级,主机值较大,备份机值较小,值越大优先级越高)
advert_int 1 #VRRP Multicast广播周期秒数
authentication {
auth_type PASS #VRRP认证方式,主备必须一致
auth_pass 1111 #(密码)
}
virtual_ipaddress {
192.168.8.100/24 #VRRP HA虚拟地址
}
}
[if !supportLists]2. [endif]在机器192.168.1.2重复机器192.168.1.1的操作,主节点的配置如下:
global_defs {
router_id NodeB
}
vrrp_instance VI_1 {
state BACKUP #设置为主服务器
interface eth0 #监测网络接口
virtual_router_id 51 #主、备必须一样
priority 90 #(主、备机取不同的优先级,主机值较大,备份机值较小,值越大优先级越高)
advert_int 1 #VRRP Multicast广播周期秒数
authentication {
auth_type PASS #VRRP认证方式,主备必须一致
auth_pass 1111 #(密码)
}
virtual_ipaddress {
192.168.8.100/24 #VRRP HA虚拟地址
}
}
启动keepalived:
#keepalived -D -f /usr/local/etc/keepalived/keepalived.conf
查看log消息:
#tail -f /var/log/messages
5. 通过ip a 命令可以看到192.168.8.100/24绑定到了eth0上
6. 测试验证,192.168.8.100是对外提供的统一地址。
通过192.168.8.100:5672就可以访问rabbitmq服务。