热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

RabbitMQ3.6.3集群搭建+HAProxy1.6做负载均衡

目录

目录
  • 目录
  • 1基本概念
    • 1RabbitMQ集群概述
    • 2软件负载均衡器HAProxy
  • 2RabbitMQ的配置步骤
    • 1安装 ErlangRabbitMQ
    • 2修改 etchosts
    • 2设置 Erlang COOKIE
    • 3使用detached参数在后台启动Rabbit Node
    • 4将node1node2node3组成集群
    • 5RabbitMQ镜像功能
    • 6安装软件负载均衡器HAProxy16
    • 7测试结果 向HAProxy发送消息
  • 3参考阅读

1、基本概念

1.1、RabbitMQ集群概述

通过 Erlang 的分布式特性(通过 magic COOKIE 认证节点)进行 RabbitMQ 集群,各 RabbitMQ 服务为对等节点,即每个节点都提供服务给客户端连接,进行消息发送与接收。

这些节点通过 RabbitMQ HA 队列(镜像队列)进行消息队列结构复制。本方案中搭建 3 个节点,并且都是磁盘节点(所有节点状态保持一致,节点完全对等),只要有任何一个节点能够工作,RabbitMQ 集群对外就能提供服务。

1.2、软件负载均衡器HAProxy

HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。根据官方数据,其最高极限支持10G的并发。HAProxy支持从4层至7层的网络交换,即覆盖所有的TCP协议。就是说,Haproxy 甚至还支持 Mysql 的均衡负载。

HAProxy的特点是:
1、HAProxy是支持虚拟主机的,,并能支持上万级别的连接;
2、能够补充Nginx的一些缺点比如Session的保持,COOKIE的引导等工作;
3、支持url检测后端的服务器出问题的检测会有很好的帮助;
4、它跟LVS一样,本身仅仅就只是一款负载均衡软件;单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的;
5、HAProxy可以对mysql读进行负载均衡,对后端的MySQL节点进行检测和负载均衡,不过在后端的MySQL slaves数量超过10台时性能不如LVS,所以我向大家推荐LVS+Keepalived;
6、能够提供4层,7层代理。HAProxy支持两种主要的代理模式:”tcp”也即4层(大多用于邮件服务器、内部协议通信服务器等),和7层(HTTP)。在4层模式 下,HAProxy仅在客户端和服务器之间转发双向流量,7层模式下,HAProxy会分析协议,并且能通过允许、拒绝、交换、增加、修改或者删除请求 (request)或者回应(response)里指定内容来控制协议,这种操作要基于特定规则;
7、HAProxy的算法现在也越来越多了,具体有如下8种:
①roundrobin,表示简单的轮询,这个不多说,这个是负载均衡基本都具备的;
②static-rr,表示根据权重,建议关注;
③leastconn,表示最少连接者先处理,建议关注;
④source,表示根据请求源IP,这个跟Nginx的IP_hash机制类似,我们用其作为解决session问题的一种方法,建议关注;
⑤ri,表示根据请求的URI;
⑥rl_param,表示根据请求的URl参数’balance url_param’ requires an URL parameter name;
⑦hdr(name),表示根据HTTP请求头来锁定每一次HTTP请求;
⑧rdp-COOKIE(name),表示根据据COOKIE(name)来锁定并哈希每一次TCP请求。

2、RabbitMQ的配置步骤

2.1、安装 Erlang、RabbitMQ

参考文章Ubuntu14.04+RabbitMQ3.6.3+Golang的最佳实践

2.2、修改 /etc/hosts

加入集群 3 个节点的对应关系:

192.168.0.31 node1
192.168.0.32 node2
192.168.0.33 node3

RabbitMQ节点之间和命令行工具 (e.g. rabbitmqctl)是使用COOKIE互通的,COOKIE是一组随机的数字+字母的字符串。当RabbitMQ服务器启动的时候,Erlang VM会自动创建一个随机内容的COOKIE文件。如果是通过源安装RabbitMQ的话,Erlang COOKIE 文件在/var/lib/rabbitmq/.erlang.COOKIE。如果是通过源码安装的RabbitMQ,Erlang COOKIE文件$HOME/.erlang.COOKIE。

本文演示的实例是用源码安装,由于这个文件权限是 400,所以需要先修改 node2、node3 中的该文件权限为 777:

lion@node1:~$ chmod 777 .erlang.COOKIE

然后将文件复制到node2、node3上面。

node2:

lion@node2:~$ chmod 777 .erlang.COOKIE
lion@node2:~$ scp -r node1:/home/lion/.erlang.COOKIE ~/
lion@node1's password:
.erlang.COOKIE 100% 20 0.0KB/s 00:00

node3:

lion@node3:~$ chmod 777 .erlang.COOKIE
lion@node3:~$ scp -r node1:/home/lion/.erlang.COOKIE ~/
lion@node1's password:
.erlang.COOKIE 100% 20 0.0KB/s 00:00

分别在node1、node2、node3将权限恢复过来:

lion@node1:~$ chmod 400 .erlang.COOKIE

最后分别在确认三台机器上的.erlang.COOKIE的值是一致的

lion@node1:~$ cat .erlang.COOKIE
VORMVSAAOFOFEQKTNWBA
lion@node2:~$ cat .erlang.COOKIE
VORMVSAAOFOFEQKTNWBA
lion@node3:~$ cat .erlang.COOKIE
VORMVSAAOFOFEQKTNWBA

2.3、使用detached参数,在后台启动Rabbit Node

要先停止现有的Rabbitmq-server,再重新在后台支行

lion@node1:~$ rabbitmqctl stop
Stopping and halting node rabbit@node1 ...
Gracefully halting Erlang VM
lion@node1:~$ rabbitmq-server -detached

通过rabbitmqctl cluster_status命令,可以查看和个节点的状态,节点的名称是rabbit@shorthostname,

node1:

lion@node1:~$ rabbitmqctl cluster_status
Cluster status of node rabbit@node1 ...
[{nodes,[{disc,[rabbit@node1]}]},
{running_nodes,[rabbit@node1]},
{cluster_name,<<"rabbit@node1">>},
{partitions,[]},
{alarms,[{rabbit@node1,[]}]}]

node2:

lion@node2:~$ rabbitmqctl cluster_status
Cluster status of node rabbit@node2 ...
[{nodes,[{disc,[rabbit@node2]}]},
{running_nodes,[rabbit@node2]},
{cluster_name,<<"rabbit@node2">>},
{partitions,[]},
{alarms,[{rabbit@node2,[]}]}]

node3:

lion@node3:~$ rabbitmqctl cluster_status
Cluster status of node rabbit@node3 ...
[{nodes,[{disc,[rabbit@node3]}]},
{running_nodes,[rabbit@node3]},
{cluster_name,<<"rabbit@node3">>},
{partitions,[]},
{alarms,[{rabbit@node3,[]}]}]

2.4、将node1、node2、node3组成集群

因为rabbitmq-server启动时,会一起启动节点和应用,它预先设置RabbitMQ应用为standalone模式。要将一个节点加入到现有的集群中,你需要停止这个应用并将节点设置为原始状态,然后就为加入集群准备好了。如果使用./rabbitmqctl stop,应用和节点都将被关闭。所以使用rabbitmqctl stop_app仅仅关闭应用。

node2:

lion@node2:~$ rabbitmqctl stop_app
Stopping node rabbit@node2 ...
lion@node2:~$ rabbitmqctl join_cluster rabbit@node1
Clustering node rabbit@node2 with rabbit@node1 ...
lion@node2:~$ rabbitmqctl start_app
Starting node rabbit@node2 ...

node3:

lion@node3:~$ rabbitmqctl stop_app
Stopping node rabbit@node3 ...
lion@node3:~$ rabbitmqctl join_cluster rabbit@node1
Clustering node rabbit@node3 with rabbit@node1 ...
lion@node3:~$ rabbitmqctl start_app
Starting node rabbit@node3 ...

此时 node2 与 node3 也会自动建立连接。

如果要使用内存节点,则可以使用以下命令:

lion@node2:~$ rabbitmqctl join_cluster --ram rabbit@node1

集群配置好后,可以在 RabbitMQ 任意节点上执行 rabbitmqctl cluster_status 来查看是否集群配置成功。

node1:

lion@node1:~$ rabbitmqctl cluster_status
Cluster status of node rabbit@node1 ...
[{nodes,[{disc,[rabbit@node1,rabbit@node2,rabbit@node3]}]},
{running_nodes,[rabbit@node1]},
{cluster_name,<<"rabbit@node1">>},
{partitions,[]},
{alarms,[{rabbit@node1,[]}]}]

node2:

lion@node2:~$ rabbitmqctl cluster_status
Cluster status of node rabbit@node2 ...
[{nodes,[{disc,[rabbit@node1,rabbit@node2]}]},{alarms,[{rabbit@node1,[]}]}]

node3:

lion@node3:~$ rabbitmqctl cluster_status
Cluster status of node rabbit@node3 ...
[{nodes,[{disc,[rabbit@node1,rabbit@node2,rabbit@node3]}]},
{alarms,[{rabbit@node1,[]}]}]

同时在Web管理工具中也可以看到效果

idoall.org

2.5、RabbitMQ镜像功能

使用Rabbit镜像功能,需要基于RabbitMQ策略来实现,策略是用来控制和修改群集范围的某个vhost队列行为和Exchange行为

lion@node2:~$ rabbitmqctl set_policy -p hrsystem ha-allqueue"^" '{"ha-mode":"all"}'

这行命令在vhost名称为hrsystem创建了一个策略,策略名称为ha-allqueue,策略模式为 all 即复制到所有节点,包含新增节点,策略正则表达式为 “^” 表示所有匹配所有队列名称。

例如下面的命令,^message 这个规则要根据自己修改,这个是指同步”message”开头的队列名称,我们配置时使用的应用于所有队列,所以表达式为”^”。

lion@node2:~$ rabbitmqctl set_policy -p hrsystem ha-allqueue "^message" '{"ha-mode":"all"}'

更多set_policy说明:http://www.rabbitmq.com/man/rabbitmqctl.1.man.html

2.6、安装软件负载均衡器HAProxy1.6

由于Ubuntu的快速发展,官方的源可能不是最新的版本,大多数时候安装可能是1.4.24,可以通过以下命令,查询官方提供的版本号:

lion@node4:~$ sudo apt-cache showpkg haproxy

node4是一台新的机器 ,IP地址是192.168.0.34

在写本文的时候,官方包是没有1.6版本的,我们可以通过以下命令来安装 :

lion@node4:~$ sudo add-apt-repository ppa:vbernat/haproxy-1.6
lion@node4:~$ sudo apt-get update
lion@node4:~$ sudo apt-get install haproxy

安装完以后,可以通过以下命令,查看安装的版本

lion@node4:~$ haproxy -v
HA-Proxy version 1.6.7 2016/07/13
Copyright 2000-2016 Willy Tarreau @haproxy.org>

安装完以后,配置文件的目录在/etc/haproxy/haproxy.cfg,以下是我修改后的配置文件

###########全局配置#########
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy # 改变当前工作目录
stats socket /run/haproxy/admin.sock mode 660 level admin # 创建监控所用的套接字目录
pidfile /var/run/haproxy.pid # haproxy的pid存放路径,启动进程的用户必须有权限访问此文件
maxconn 4000 # 最大连接数,默认4000
user haproxy # 默认用户
group haproxy # 默认用户组
daemon # 创建1个进程进入deamon模式运行。此参数要求将运行模式设置为"daemon
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# Default ciphers to use on SSL-enabled listening sockets.
# For more information, see ciphers(1SSL). This list is from:
# https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
ssl-default-bind-options no-sslv3
###########默认配置#########
defaults
log global
mode http # 默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
option httplog # 采用http日志格式
option dontlognull # 启用该项,日志中将不会记录空连接。所谓空连接就是在上游的负载均衡器
# 或者监控系统为了探测该 服务是否存活可用时,需要定期的连接或者获取某
# 一固定的组件或页面,或者探测扫描端口是否在监听或开放等动作被称为空连接;
# 官方文档中标注,如果该服务上游没有其他的负载均衡器的话,建议不要使用
# 该参数,因为互联网上的恶意扫描或其他动作就不会被记录下来
timeout connect 5000 # 连接超时时间
timeout client 50000 # 客户端连接超时时间
timeout server 50000 # 服务器端连接超时时间
option httpclose # 每次请求完毕后主动关闭http通道
option httplog # 日志类别http日志格式
#option forwardfor # 如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip
option redispatch # serverId对应的服务器挂掉后,强制定向到其他健康的服务器
timeout connect 10000 # default 10 second timeout if a backend is not found
maxconn 60000 # 最大连接数
retries 3 # 3次连接失败就认为服务不可用,也可以通过后面设置
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
####################################################################
listen http_front
bind 0.0.0.0:1080 #监听端口
stats refresh 30s #统计页面自动刷新时间
stats uri /haproxy?stats #统计页面url
stats realm Haproxy Manager #统计页面密码框上提示文本
stats auth admin:admin #统计页面用户名和密码设置
#stats hide-version #隐藏统计页面上HAProxy的版本信息
#####################我把RabbitMQ的管理界面也放在HAProxy后面了###############################
listen rabbitmq_admin
bind 0.0.0.0:8004
server node1 192.168.0.31:15672
server node2 192.168.0.32:15672
server node3 192.168.0.33:15672
####################################################################
listen rabbitmq_cluster
bind 0.0.0.0:5672
option tcplog
mode tcp
timeout client 3h
timeout server 3h
option clitcpka
balance roundrobin #负载均衡算法(#banlance roundrobin 轮询,balance source 保存session值,支持static-rr,leastconn,first,uri等参数)
#balance url_param userid
#balance url_param session_id check_post 64
#balance hdr(User-Agent)
#balance hdr(host)
#balance hdr(Host) use_domain_only
#balance rdp-COOKIE
#balance leastconn
#balance source //ip
server node1 192.168.0.31:5672 check inter 5s rise 2 fall 3 #check inter 2000 是检测心跳频率,rise 2是2次正确认为服务器可用,fall 3是3次失败认为服务器不可用
server node2 192.168.0.32:5672 check inter 5s rise 2 fall 3
server node3 192.168.0.33:5672 check inter 5s rise 2 fall 3

更多Haproxy的配置文件介绍参考:http://www.haproxy.org/download/1.4/doc/configuration.txt

重新启动HAProxy

lion@node4:~$ sudo service haproxy restart
* Restarting haproxy haproxy [ OK ]

然后用浏览器输入http://:1080/haproxy?stats,可以看到以下结果,说明node1、node2、node3都已经搭建好了:

idoall.org

2.7、测试结果 ,向HAProxy发送消息

使用Ubuntu14.04+RabbitMQ3.6.3+Golang的最佳实践中的代码来发送消息, 在node3上我们将消息发送到node4(192.168.0.34)上

原来默认的guest用户是禁止远程访问的,如果要使用lion帐号访问,需要在web管理控制台中开启lion对Virtual Host访问

Console1(node3):

lion@node3:~/_code/_rabbitmq/_golang$ go run producer_hello.go
2016/07/29 12:46:50 dialing "amqp://lion:123456@192.168.0.34:5672/"
2016/07/29 12:46:50 got Connection, getting Channel
2016/07/29 12:46:50 got queue, declaring "test-idoall-queues"
2016/07/29 12:46:50 declared queue, publishing 16B body ("hello idoall.org")
2016/07/29 12:46:50 published 16B OK

Console(node1):

lion@node1:~/_code/_rabbitmq/_golang$ go run consumer_hello.go
2016/07/25 17:37:12 dialing "amqp://guest:guest@localhost:5672/"
2016/07/25 17:37:12 got Connection, getting Channel
2016/07/25 17:37:12 got queue, declaring "test-idoall-queues"
2016/07/25 17:37:12 Queue bound to Exchange, starting Consume
2016/07/25 17:37:12 [*] Waiting for messages. To exit press CTRL+C
2016/07/25 17:37:12 Received a message: hello idoall.org

在上面的代码中,我们可以看到在node3是向192.168.0.34这台HAProxy上发送消息,然后在node1上可以正常接收。

3、参考阅读

Haproxy 配置项\配置实例

How to Install HAProxy Load Balancer on Ubuntu

http://www.rabbitmq.com/clustering.html

Can’t access RabbitMQ web management interface after fresh install

Nginx/LVS/HAProxy负载均衡软件的优缺点详解


博文作者:迦壹
博客地址: RabbitMQ3.6.3集群搭建+HAProxy1.6做负载均衡
转载声明:可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明,谢谢合作!




版权声明:本文为狮子原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/狮子/article/details/52104891
推荐阅读
  • 本文详细介绍了Java代码分层的基本概念和常见分层模式,特别是MVC模式。同时探讨了不同项目需求下的分层策略,帮助读者更好地理解和应用Java分层思想。 ... [详细]
  • 本文详细介绍了 Java 网站开发的相关资源和步骤,包括常用网站、开发环境和框架选择。 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 2016-2017学年《网络安全实战》第三次作业
    2016-2017学年《网络安全实战》第三次作业总结了教材中关于网络信息收集技术的内容。本章主要探讨了网络踩点、网络扫描和网络查点三个关键步骤。其中,网络踩点旨在通过公开渠道收集目标信息,为后续的安全测试奠定基础,而不涉及实际的入侵行为。 ... [详细]
  • Nginx不仅是一款轻量级的高性能Web服务器,还具备出色的负载均衡和反向代理功能。它支持复杂的正则匹配规则、动静内容分离以及灵活的URL重写功能,使得配置和管理更加便捷高效。此外,Nginx提供了多种负载均衡算法,如轮询、加权轮询、最少连接数等,以满足不同应用场景的需求。 ... [详细]
  • 本文总结了一次针对大厂Java研发岗位的面试经历,探讨了面试中常见的问题及其背后的原因,并分享了一些实用的面试准备资料。 ... [详细]
  • PHP面试题精选及答案解析
    本文精选了新浪PHP笔试题及最新的PHP面试题,并提供了详细的答案解析,帮助求职者更好地准备PHP相关的面试。 ... [详细]
  • 深入解析:存储技术的演变与发展
    本文探讨了从单机文件系统到分布式文件系统的存储技术发展过程,详细解释了各种存储模型及其特点。 ... [详细]
  • Redis:缓存与内存数据库详解
    本文介绍了数据库的基本分类,重点探讨了关系型与非关系型数据库的区别,并详细解析了Redis作为非关系型数据库的特点、工作模式、优点及持久化机制。 ... [详细]
  • 对象存储与块存储、文件存储等对比
    看到一篇文档,讲对象存储,好奇,搜索文章,摘抄,学习记录!背景:传统存储在面对海量非结构化数据时,在存储、分享与容灾上面临很大的挑战,主要表现在以下几个方面:传统存储并非为非结 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 本文介绍了Memcached分布式集群中的取模算法和一致性哈希算法的原理及其对缓存命中率的影响。通过详细分析,探讨了如何优化这些算法以提高系统的稳定性和性能。 ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 第二章:Kafka基础入门与核心概念解析
    本章节主要介绍了Kafka的基本概念及其核心特性。Kafka是一种分布式消息发布和订阅系统,以其卓越的性能和高吞吐量而著称。最初,Kafka被设计用于LinkedIn的活动流和运营数据处理,旨在高效地管理和传输大规模的数据流。这些数据主要包括用户活动记录、系统日志和其他实时信息。通过深入解析Kafka的设计原理和应用场景,读者将能够更好地理解其在现代大数据架构中的重要地位。 ... [详细]
  • 解读中台架构:微服务与分布式技术的区别及应用
    中心化与去中心化是长期讨论的话题。中心化架构的优势在于部署和维护相对简单,尤其在服务负载较为稳定的情况下,能够提供高效稳定的性能。然而,随着业务规模的扩大和技术需求的多样化,中心化架构的局限性逐渐显现,如扩展性和故障恢复能力较差。相比之下,微服务和分布式技术通过解耦系统组件,提高了系统的灵活性和可扩展性,更适合处理复杂多变的业务场景。本文将深入探讨中台架构中微服务与分布式技术的区别及其应用场景,帮助读者更好地理解和选择适合自身业务的技术方案。 ... [详细]
author-avatar
萧勇志762852
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有