构建参考: [ Rabbitmq cluster setup with HAproxy ] [ python demo ]

RabbitMQ Cluster 遇到的问题

python pika 作为consumer 连接 rabbitmq cluster 的时候, 事实上连接的是 cluster 的一个 node, 当连接数过多的时候, 这个节点的处理性能会成为一个瓶颈, 可能会遇到这样的报错 [ connection reset by peer ].

对于 [ connection reset by peer ] 这个问题的处理, [ 这里 ] 提供了一个方案:

Client --> Load Balancer --> RabbitMQ Cluster Instances

RabbitMQ 集群构建

集群环境

系统: CentOS 7.x x64

haproxy-server : 172.16.0.100

rabbitmq-master : 172.16.0.10

rabbitmq-slave1 : 172.16.0.11

rabbitmq-slave2 : 172.16.0.12

配置 /etc/hosts

172.16.0.10 rabbitmq-master

172.16.0.11 rabbitmq-slave1

172.16.0.12 rabbitmq-slave2

安装 RabbitMQ

在三台 rabbitmq 服务器上面分别执行:

yum install rabbitmq-server

配置 Cookie

RabbitMQ 集群通过 /var/lib/rabbitmq/.erlang.cookie 内的 cookie 值来确认各节点是否在同一个集群.

在 rabbitmq-master:

rabbitmq-server -detached

在 rabbitmq-master上查看 /var/lib/rabbitmq/.erlang.cookie 值:

cat /var/lib/rabbitmq/.erlang.cookie

比如获取的值为: GBNXRROLXDWMMIFZQWHD

在 rabbitmq-slave1 & rabbitmq-slave2 :

echo GBNXRROLXDWMMIFZQWHD > /var/lib/rabbitmq/.erlang.cookie

添加 Slave 节点到 master

在 rabbitmq-slave1 & rabbitmq-slave2 上面启动服务:

rabbitmq-server -detached

在rabbitmq-slave1 & rabbitmq-slave2 上分别执行:

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbitmq@rabbitmq-master
rabbitmqctl start_app

查看集群状态

在 RabbitMQ Cluster 任意一个节点:

rabbitmctl cluster_status

启用集群高可用

在 RabbitMQ Cluster 每个节点执行:

rabbitmqctl set_policy ha-all "" '{"ha-mode":"all","ha-sync-mode":"automatic"}'

启用 RabbitMQ 组件

在 RabbitMQ Cluster 每个节点执行:

rabbitmq-plugins enable rabbitmq_management

添加用户

在 RabbitMQ Cluster 每个节点:

rabbitmqctl add_user <username> <password>
rabbitmqctl set_user_tags <username> <tag>
rabbitmqctl set_permissions -p / <username> ".*" ".*" ".*"

备注: 在 rabbitmqctl set_user_tags <username> <tag>中, <tag> 可以是任何标记用户的字符, 比如 admin, normal, guest, developer 等标记用户身份的 tag.

这样, RabbitMQ 集群配置完成.



Web 访问

web 访问的前提是我们启用了 RabbitMQ 的组件: rabbitmq-plugins enable rabbitmq_management

可以在浏览器访问: http://ip_address:15672

登录用户和密码是 : rabbitmqctl add_user username password 设定的.

也可以使用默认添加的用户和密码: guest / guest.

HAProxy

以下所有的配置均在 haproxy-server 上面执行

安装 haproxy

yum install haproxy

配置 haproxy

vim /etc/haproxy/haproxy.cfg

global
daemon defaults
mode tcp
maxconn 10000
timeout connect 5s
timeout client 100s
timeout server 100s listen rabbitmq 172.16.0.100:5672
mode tcp
balance roundrobin
server rabbit-master 172.16.0.10:5672 check inter 5s rise 2 fall 3
server rabbit-node1 172.16.0.11:5672 check inter 5s rise 2 fall 3
server rabbit-node2 172.16.0.12:5672 check inter 5s rise 2 fall 3

启动 haproxy

systemctl start haproxy

至此, 用 HAproxy 做RabbitMQ 的 LB 的集群已经配置完成, 在连接 MQ 的时候, 只要将地址配置为 haproxy-server 的 IP 和对应 Port 即可. 接下来会用 python 程序做测试

RabbitMQ Cluster Product & Consume Test

生产者: send.py

#!/usr/bin/env python
import pika connection = pika.BlockingConnection(pika.ConnectionParameters(host='172.16.0.100',port=5672))
channel = connection.channel() channel.queue_declare(queue='hello') channel.basic_publish(exchange='',
routing_key='hello',
body='Hello World!')
print(" [x] Sent 'Hello World!'")
connection.close()

消费者: receive.py

#!/usr/bin/env python
import pika connection = pika.BlockingConnection(pika.ConnectionParameters(host='172.16.0.100',port=5672))
channel = connection.channel() channel.queue_declare(queue='hello') def callback(ch, method, properties, body):
print(" [x] Received %r" % body) channel.basic_consume(callback,
queue='hello',
no_ack=True) print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()

生产

在同一网络中的机器 CLI 执行:

for i in {1..10};do python send.py;done

这可以写10条数据到 RabbitMQ 的队列中.

在 RabbitMQ Cluster 的任意一个节点执行:

rabbitmqctl list_queues

可以查看到队列以及队列内消息的数量.

消费

在同一网络中的机器 CLI 执行:

python receive.py

即可读取队列中的数据.

btw, 我爱死博客园的 markdown 了!

用 HAproxy 搭建 RabbitMQ 集群的更多相关文章

  1. 使用Haproxy代理rabbitmq集群,用keepalive保证haproxy高可用

    原文地址:https://www.jianshu.com/p/440b8e1d5339 使用Haproxy代理rabbitmq集群 上一篇文章教了rabbitmq集群搭建.但是这样搭建出来的集群是3个 ...

  2. Docker:搭建RabbitMQ集群

    RabbitMQ原理介绍(一) RabbitMQ安装使用(二) RabbitMQ添加新用户并支持远程访问(三) RabbitMQ管理命令rabbitmqctl详解(四) RabbitMQ两种集群模式配 ...

  3. 搭建RabbitMQ集群(Docker)

    前一篇搭建RabbitMQ集群(通用)只是把笔记直接移动过来了,因为我的机器硬盘已经满了,实在是开不了那么虚拟机. 还好,我的Linux中安装了Docker,这篇文章就简单介绍一下Docker中搭建R ...

  4. Docker搭建RabbitMQ集群

    Docker搭建RabbitMQ集群 Docker安装 见官网 RabbitMQ镜像下载及配置 见此博文 集群搭建 首先,我们需要启动运行RabbitMQ docker run -d --hostna ...

  5. 搭建rabbitmq集群

    查看rabbitmq日志文件 开启web管理工具 [root@controller rabbitmq]# rabbitmq-plugins list [root@controller rabbitmq ...

  6. CentOS7 搭建RabbitMQ集群 后台管理 历史消费记录查看

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

  7. docker+phantomjs+haproxy 搭建phantomjs集群

    目标: 搭建一个远程的phantomjs服务器,提供高可用服务,支持并发. 原料: 1.docker环境.docker-compose环境 2.phantomjs镜像: docker.io/werni ...

  8. 搭建RabbitMQ集群(通用)

    RabbitMQ在Erlang node(节点)上 Erlang天生具有集群特性,非常好搭建集群,每一个节点(node)上具有一个叫erlang.Cookie的东西,也是一个标识符,可以互认. 1). ...

  9. Haproxy搭建web集群

    目录: 一.常见的web集群调度器 二.Haproxy应用分析 三.Haproxy调度算法原理 四.Haproxy特性 五.Haproxy搭建 Web 群集 一.常见的web集群调度器 目前常见的we ...

随机推荐

  1. 深入解析Java垃圾回收机制

    引入垃圾回收 哪些内存需要回收? 引用计数法 可达性分析 如何回收 Marking 标记 Normal Deletion 清除 Deletion with Compacting 压缩 为什么需要分代收 ...

  2. 初识CSS

    css解释 css样式: css是英文Cascading Style Sheets的缩写,称为层叠样式表,用于对页面进行美化,CSS的可以使页面更加的美观.基本上所有的html页面都或多或少的使用cs ...

  3. 3、C#基础 - C# 的 Hello World

    HelloWorld,是学会程序的通用起手式了,哈哈. 打开我们的VS:文件\新建\项目 选择"控制台应用(.NET Framework)",名称改为"HelloWorl ...

  4. SpringBoot多数据源配置

    准备环境: jdk1.8 eclipse tomcat8.0 第一步:在配置文件添加如下信息: spring.datasource.primary.url=jdbc:mysql://localhost ...

  5. 參与 Spring 4 中文文档翻译

    參与 Spring 4 中文文档翻译 我们从2014年12月開始翻译Spring 4的框架文档.尽管至今已有一年,可是进度非常慢. 当中一部分原因是由于Spring 文档有1000多页,并且翻译的时候 ...

  6. Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Query was empty

    1 错误描写叙述 at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(Invocable ...

  7. Python笔记·第七章—— IO(文件)处理

    一.文件处理简介 计算机系统分为:计算机硬件,操作系统,应用程序三部分. 我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知 ...

  8. 五.RabbitMQ之路由(Routing)和主题(topics)

    翻译官网的文章已经翻译了几天了,这份官方文档写的总体算是很简洁易懂.它让我们很快的入门并了解了RabbitMQ的运作原理和使用方式.本篇最后介绍一下Exchange的另外两种类别,即direct和to ...

  9. jstl常用语句

    1.select框中if选中,下面的语句实现从后台给过来一个category实体,如果category的categoryType为指定的值,则选中. <select class="fo ...

  10. SSM学习(一)搭建基础框架

    不知不自觉,工作也两年多了,由于公司一直用的是ssh框架,所以所学也一直是ssh.直到有一天,服务器被攻击,tomcat目录下总有莫名其妙的一些文件,这些文件通过远程ftp下载了一些病毒和木马,服务器 ...