Rabbitmq高可用集群方案(Windows环境下)

 Rabbitmq集群总体架构


Rabbitmq高可用集群方案(Windows环境下)_第1张图片

操作系统: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高可用集群方案(Windows环境下)_第2张图片

 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页面查看


Rabbitmq高可用集群方案(Windows环境下)_第3张图片

设置队列镜像

#rabbitmqctl set_policy -p

hrsystem ha-all queue"^" '{"ha-mode":"all"}' //意思表示以ha.开头的queue都会复制到各个节点 ["^"匹配所有]


Rabbitmq高可用集群方案(Windows环境下)_第4张图片

集群重启的顺序是固定的,并且是相反的。如下所述:

•      启动顺序:磁盘节点 => 内存节点

•      关闭顺序:内存节点 => 磁盘节点

10.4 Haproxy负载均衡

1. 在192.168.1.1和192.168.1.2节点上安装haproxy,解压内容:


Rabbitmq高可用集群方案(Windows环境下)_第5张图片

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 ”部分:定义HAProxy内RabbitMQ服务的标识;

(b)“ip1:5672”部分:标识了后端RabbitMQ的服务地址;

(c)“check inter ”部分:表示每隔多少毫秒检查RabbitMQ服务是否可用;

(d)“rise ”部分:表示RabbitMQ服务在发生故障之后,需要多少次健康检查才能被再次确认可用;

(e)“fall ”部分:表示需要经历多少次失败的健康检查之后,HAProxy才会停止使用此RabbitMQ服务。

3.点击“run.bat”,启动服务,rabbitmq消息web页面,访问http://:5671


Rabbitmq高可用集群方案(Windows环境下)_第6张图片

haproxy管理页面,访问http://>:1188

Rabbitmq高可用集群方案(Windows环境下)_第7张图片

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上


Rabbitmq高可用集群方案(Windows环境下)_第8张图片

6.   测试验证,192.168.8.100是对外提供的统一地址。

通过192.168.8.100:5672就可以访问rabbitmq服务。

你可能感兴趣的:(Rabbitmq高可用集群方案(Windows环境下))