700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 基于 KeepAlived + HAProxy 搭建 RabbitMQ 高可用负载均衡集群

基于 KeepAlived + HAProxy 搭建 RabbitMQ 高可用负载均衡集群

时间:2019-11-10 03:00:07

相关推荐

基于 KeepAlived + HAProxy 搭建 RabbitMQ 高可用负载均衡集群

一、什么是 MQ

MQ是消息队列(Message Queue)的简称。它是一种用于在应用程序之间传递消息的中间件技术。MQ通过提供可靠的消息传递机制,实现了不同应用程序之间的解耦和异步通信。在MQ系统中,消息发送者将消息发送到一个队列中,而消息接收者则从队列中获取消息进行处理。这种方式可以实现消息的可靠传递、消息的持久化存储、消息的顺序性等特性。常见的MQ系统有RabbitMQ、Apache Kafka、ActiveMQ等。

二、MQ 的作用

1. 应用解耦,顾名思义就是解除应用系统之间的耦合依赖。通过消息队列,使得每个应用系统不必受其他系统影响,可以更独立自主。以电商系统为例,用户下单后,订单系统需要通知积分系统。一般的做法是:订单系统直接调用积分系统的接口。这就使得应用系统间的耦合特别紧密。如果积分系统无法访问,则积分处理失败,从而导致订单失败。加入消息队列之后,用户下单后,订单系统完成下单业务后,将消息写入消息队列,返回用户订单下单成功。积分系统通过订阅下单消息的方式获取下单通知消息,从而进行积分操作。实现订单系统与库存系统的应用解耦。如果,在下单时积分系统系统异常,也不会影响用户正常下单。

2. 流量削峰也是消息队列中的常用场景,一般在秒杀或团抢活动中使用广泛。以秒杀活动为例,一般会因为流量过大,导致流量暴增,应用挂掉。为解决这个问题,一般需要在应用前端加入消息队列,后台系统根据消息队列中的消息信息,进行秒杀业务处理。当服务器接收到用户的请求后,首先写入消息队列,后台系统根据消息队列中的请求信息,做后续业务处理。假如消息队列长度超过最大数量,则直接抛弃用户请求或跳转到错误页面。

3.异步处理,就是将一些非核心的业务流程以异步并行的方式执行,从而减少请求响应时间,提高系统吞吐量。以下单为例,用户下单后需要生成订单、赠送活动积分、赠送红包、发送下单成功通知等一系列业务处理。假设三个业务节点每个使用100毫秒钟,不考虑网络等其他开销,则串行方式的时间是400毫秒,并行的时间只需要200毫秒。这样就大大提高了系统的吞吐量。

几种MQ方案对比 - 知乎 ()

三、RabbitMQ 简介

RabbitMQ是一个消息中间件:它接受并转发消息。你可以把它当做一个快递站点,当你要发送一个包裹时,你把你的包裹放到快递站,快递员最终会把你的快递送到收件人那里,按照这种逻辑RabbitMQ是一个快递站,一个快递员帮你传递快件。RabbitMQ与快递站的主要区别在于,它不处理快件而是接收,存储和转发消息数据。

官网地址:

Git地址:/rabbitmq

RabbitMQ的集群节点包括内存节点、磁盘节点。顾名思义内存节点就是将所有数据放在内存,磁盘节点将数据放在磁盘。如果在投递消息时,打开了消息的持久化,那么即使是内存节点,数据还是安全的放在磁盘。

一个rabbitmq集 群中可以共享 user,vhost,queue,exchange等,所有的数据和状态都是必须在所有节点上复制的。

ConnectionFactory(连接管理器):应用程序与Rabbit之间建立连接的管理器,程序代码中使用;Channel(信道):消息推送使用的通道;Exchange(交换器):用于接受、分配消息;Queue(队列):用于存储生产者的消息;RoutingKey(路由键):用于把生成者的数据分配到交换器上;BindingKey(绑定键):用于把交换器的消息绑定到队列上;Broker:简单来说就是消息队列服务器实体vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离.producer:消息生产者,就是投递消息的程序。consumer:消息消费者,就是接受消息的程序。user:用户

四、RabbitMQ 集群搭建

1.普通集群准备环境

三台机器都操作:

[root@localhost ~]# hostnamectl set-hostname rabbitmq-1

[root@rabbitmq-1 ~]# vim /etc/hosts (配置域名解析)

三个节点配置安装rabbitmq软件:

安装依赖 :

[root@rabbitmq-1 ~]# yum install -y epel-release gcc-c++ unixODBC unixODBC-devel openssl-devel ncurses-devel

安装erlang :

[root@rabbitmq-1 ~]# curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash

[root@rabbitmq-1 ~]# yum install erlang-21.3.8.21-1.el7.x86_64

测试:

[root@rabbitmq-1 ~]# erl

Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:1:1] [ds:1:1:10] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V9.3 (abort with ^G)

1>

安装rabbitmq:

/rabbitmq/rabbitmq-server/releases/tag/v3.7.10

[root@rabbitmq-1 ~]# yum install rabbitmq-server-3.7.10-1.el7.noarch.rpm

# rabbitmq 和erlang兼容版本 /which-erlang.html

# erlang 版本选择 https://packagecloud.io/rabbitmq/erlang

# rabbitmq 版本选择 /news.html

启动

[root@rabbitmq-1 ~]# systemctl daemon-reload

[root@rabbitmq-1 ~]# systemctl start rabbitmq-server

[root@rabbitmq-1 ~]# systemctl enable rabbitmq-server

启动方式二:

[root@rabbitmq-1 ~]# /sbin/service rabbitmq-server status ---查看状态

[root@rabbitmq-1 ~]# /sbin/service rabbitmq-server start ---启动 每台都操作

开启rabbitmq的web访问界面:

[root@rabbitmq-1 ~]# rabbitmq-plugins enable rabbitmq_management

所有机器都操作:开启用户远程登录:

[root@rabbitmq-2 ~]# cd /etc/rabbitmq/

[root@rabbitmq-2 rabbitmq]# cp /usr/share/doc/rabbitmq-server-3.7.10/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config

[root@rabbitmq-2 rabbitmq]# ls

enabled_plugins rabbitmq.config

[root@rabbitmq-2 rabbitmq]# vim rabbitmq.config

三台机器都操作重启服务服务:

[root@rabbitmq-1 ~]# systemctl restart rabbitmq-server

4369 -- erlang发现端口

5672 --程序连接端口

15672 -- 管理界面ui端口

25672 -- server间内部通信口

访问:192.168.50.138:15672

开始部署集群三台机器都操作:

1.首先创建好数据存放目录和日志存放目录:

[root@rabbitmq-1 ~]# mkdir -p /data/rabbitmq/data

[root@rabbitmq-1 ~]# mkdir -p /data/rabbitmq/logs

[root@rabbitmq-1 ~]# chmod 777 -R /data/rabbitmq

[root@rabbitmq-1 ~]# chown rabbitmq.rabbitmq /data/ -R

创建配置文件:

[root@rabbitmq-1 ~]# vim /etc/rabbitmq/rabbitmq-env.conf

[root@rabbitmq-1 ~]# cat /etc/rabbitmq/rabbitmq-env.conf RABBITMQ_MNESIA_BASE=/data/rabbitmq/data

RABBITMQ_LOG_BASE=/data/rabbitmq/logs

重启服务:

[root@rabbitmq-1 ~]# systemctl restart rabbitmq-server

拷⻉erlang.cookie

[root@rabbitmq-1 ~]# cat /var/lib/rabbitmq/.erlang.cookie

HOUCUGJDZYTFZDSWXTHJ

⽤scp的⽅式将rabbitmq-1节点的.erlang.cookie的值复制到其他两个节点中。

[root@rabbitmq-1 ~]# scp /var/lib/rabbitmq/.erlang.cookie root@192.168.188.146:/var/lib/rabbitmq/

[root@rabbitmq-1 ~]# scp /var/lib/rabbitmq/.erlang.cookie root@192.168.188.157:/var/lib/rabbitmq/

将mq-2、mq-3作为内存节点加⼊mq-1节点集群中

在mq-2、mq-3执⾏如下命令:[root@rabbitmq-2 ~]# systemctl restart rabbitmq-server[root@rabbitmq-2 ~]# rabbitmqctl stop_app #停止节点[root@rabbitmq-2 ~]# rabbitmqctl reset #如果有数据需要重置,没有则不用[root@rabbitmq-2 ~]# rabbitmqctl join_cluster --ram rabbit@rabbitmq-1 #添加到磁盘节点Clustering node 'rabbit@rabbitmq-2' with 'rabbit@rabbitmq-1' ...[root@rabbitmq-2 ~]# rabbitmqctl start_app #启动节点Starting node 'rabbit@rabbitmq-2' ...======================================================================[root@rabbitmq-3 ~]# systemctl restart rabbitmq-server[root@rabbitmq-3 ~]# rabbitmqctl stop_appStopping node 'rabbit@rabbitmq-3' ...[root@rabbitmq-3 ~]# rabbitmqctl resetResetting node 'rabbit@rabbitmq-3' ...[root@rabbitmq-3 ~]# rabbitmqctl join_cluster --ram rabbit@rabbitmq-1Clustering node 'rabbit@rabbitmq-3' with 'rabbit@rabbitmq-1' ...[root@rabbitmq-3 ~]# rabbitmqctl start_appStarting node 'rabbit@rabbitmq-3' ...(1)默认rabbitmq启动后是磁盘节点,在这个cluster命令下,mq-2和mq-3是内存节点,mq-1是磁盘节点。(2)如果要使mq-2、mq-3都是磁盘节点,去掉--ram参数即可。(3)如果想要更改节点类型,可以使⽤命令rabbitmqctl change_cluster_node_typedisc(ram),前提是必须停掉rabbit应⽤注:#如果有需要使用磁盘节点加入集群[root@rabbitmq-2 ~]# rabbitmqctl join_cluster rabbit@rabbitmq-1[root@rabbitmq-3 ~]# rabbitmqctl join_cluster rabbit@rabbitmq-1

在 RabbitMQ 集群任意节点上执行 rabbitmqctl cluster_status来查看是否集群配置成功。在mq-1磁盘节点上面查看[root@rabbitmq-1 ~]# rabbitmqctl cluster_status

2.RabbitMQ镜像集群配置

rabbitmqctl set_permissions ".*" ".*" ".*" (后面三个”*”代表用户拥有配置、写、读全部权限)

[root@rabbitmq-1 ~]# rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'Setting policy "ha-all" for pattern "^" to "{"ha-mode":"all"}" with priority "0" for vhost "/" ...[root@rabbitmq-2 ~]# rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'Setting policy "ha-all" for pattern "^" to "{"ha-mode":"all"}" with priority "0" for vhost "/" ...[root@rabbitmq-3 ~]# rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'Setting policy "ha-all" for pattern "^" to "{"ha-mode":"all"}" with priority "0" for vhost "/" ...

五、安装并配置负载均衡器HA

1、在mq-1、mq-2安装HAProxy

yum -y install haproxy

2、修改 /etc/haproxy/haproxy.cfg

[root@rabbitmq-1 ~]# cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak[root@rabbitmq-1 ~]# vim /etc/haproxy/haproxy.cfggloballog 127.0.0.1 local2chroot/var/lib/haproxypidfile/var/run/haproxy.pidmaxconn4000user haproxygroup haproxynbproc4daemon# turn on stats unix socketstats socket /var/lib/haproxy/stats#---------------------------------------------------------------------defaultsmodehttplog globalretries 3timeout connect 10stimeout client1mtimeout server1mtimeout check 10smaxconn 2048#---------------------------------------------------------------------##监控查看本地状态#####listen admin_statsbind *:80mode httpoption httplogoption httpcloselog 127.0.0.1 local2 infostats uri /haproxystats auth admin:123456stats refresh 30s#######################################反代监控frontend serverbind *:1234log globalmode tcp#option forwardfordefault_backend rabbitmqmaxconn 3backend rabbitmqmode tcplog globalbalancestatic-rrserverrabbitmq1 192.168.188.145:5672 check inter 2000s rise 2 fall 3serverrabbitmq2 192.168.188.146:5672 check inter 2000s rise 2 fall 3serverrabbitmq3 192.168.188.157:5672 check inter 2000s rise 2 fall 3[root@rabbitmq-1 ~]# systemctl start haproxy

浏览器输入http://192.168.188.145/haproxy查看rabbitmq的状态。

admin 123456

六、keepalived 环境搭建

在mq-1、mq-2安装HAProxy:

[root@rabbitmq-1 rabbitmq]# yum install -y keepalived

[root@rabbitmq-1 rabbitmq]# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalivedglobal_defs {router_id director1}vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 80priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.188.200/24}}

[root@rabbitmq-2 rabbitmq]# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalivedglobal_defs {router_id directory2}vrrp_instance VI_1 {state BACKUPinterface ens33nopreemptvirtual_router_id 80priority 50advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.188.200/24}}

启动KeepAlived(主备均启动)[root@rabbitmq-1 rabbitmq]# chkconfig keepalived on[root@rabbitmq-1 rabbitmq]# service keepalived start[root@rabbitmq-1 rabbitmq]# ip a

对调度器Haproxy健康检查

[root@rabbitmq-1 rabbitmq]# vim /etc/keepalived/check_haproxy_status.sh

#!/bin/bash /usr/bin/curl -I http://localhost/haproxy &>/dev/null if [ $? -ne 0 ];then# /etc/init.d/keepalived stopsystemctl stop keepalivedfi

[root@rabbitmq-1 rabbitmq]# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalivedglobal_defs {router_id director1}vrrp_script check_haproxy {script "/etc/keepalived/check_haproxy_status.sh"interval 5}vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 80priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.188.200/24}track_script {check_haproxy}}

[root@rabbitmq-1 rabbitmq]# systemctl restart keepalived

测试:

[root@rabbitmq-1 rabbitmq]# systemctl stop haproxy

vip成功漂移到rabitmq-2.

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。