概述

RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

运行模式大概有3种:

单一模式:非集群模式,单台。

普通模式:RabbitMQ默认的集群模式。

对于Queue来说,消息实体只存在于其中一个节点,A、B两个节点仅有相同的元数据,即队列结构。当消息进入A节点的Queue中后,consumer从B节点拉取时,RabbitMQ会临时在A、B间进行消息传输,把A中的消息实体取出并经过B发送给consumer。

所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连A或B,出口总在A,会产生瓶颈。

该模式存在一个问题就是当A节点故障后,B节点无法取到A节点中还未消费的消息实体。

如果做了消息持久化,那么得等A节点恢复,然后才可被消费;如果没有持久化会丢失消息。

镜像模式:Queue同时存在多个节点,可通过改模式实现HA高可用
该模式解决了上述问题,其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在consumer取数据时临时拉取。

该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉。

下面来通过配置RabbitMQ镜像模式来熟悉这3种运行模式

1. 环境说明

RabbitMQ集群安装在3个节点上:10.0.0.1、10.0.0.2、10.0.0.3

HAProxy安装在10.0.0.4上,用于对外提供RabbitMQ均衡

3个节点在/etc/hosts文件中分别添加如下内容:

  1. 10.0.0.1 rabbit1
  2. 10.0.0.2 rabbit2
  3. 10.0.0.3 rabbit3

2. 安装erlang、rabbitmq

  1. cd oneinstack/src
  2. wget http://erlang.org/download/otp_src_18.3.tar.gz
  3. tar xzf otp_src_18.3.tar.gz
  4. cd otp_src_18.3
  5. ./configure --prefix=/usr/local/erlang --enable-shared-zlib --with-ssl --enable-threads --enable-smp-support --enable-kernel-poll --enable-hipe --without-javac
  6. make && make install
  7. cd ..
  8. wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.5.7/rabbitmq-server-generic-unix-3.5.7.tar.gz
  9. tar xzf rabbitmq-server-generic-unix-3.5.4.tar.gz
  10. mv rabbitmq_server-3.5.4 rabbitmq
  11. sed -i 's@^ERL_DIR=.*@ERL_DIR=/usr/local/erlang/bin/@' /usr/local/rabbitmq/sbin/rabbitmq-defaults
  12. sed -i 's@^LOG_BASE=.*@LOG_BASE=/usr/local/rabbitmq/var/log/rabbitmq@' /usr/local/rabbitmq/sbin/rabbitmq-defaults  #日志目录
  13. mkdir -p /usr/local/rabbitmq/var/{lib,log}/rabbitmq

3. 一般用户(rabbitmq)运行RabbitMQ

  1. useradd rabbitmq
  2. wget http://pkgs.fedoraproject.org/cgit/rpms/rabbitmq-server.git/plain/rabbitmq-script-wrapper
  3. sed -i 's@cd /var/lib/rabbitmq@cd /usr/local/rabbitmq/var/lib/rabbitmq@g' rabbitmq-script-wrapper  #更改rabbitmq数据存储目录
  4. sed -i 's@/usr/lib/rabbitmq/bin/@/usr/local/rabbitmq/sbin/@g' rabbitmq-script-wrapper
  5. chmod +x rabbitmq-script-wrapper
  6. cp rabbitmq-script-wrapper /usr/sbin/rabbitmqctl
  7. cp rabbitmq-script-wrapper /usr/sbin/rabbitmq-server
  8. cp rabbitmq-script-wrapper /usr/sbin/rabbitmq-plugins
  9. chown -R rabbitmq.rabbitmq /usr/local/rabbitmq/var

4. 日志割接

  1. cat >> /etc/logrotate.d/rabbitmq-server << EOF
  2. /usr/local/rabbitmq/var/log/rabbitmq/*.log {
  3. weekly
  4. missingok
  5. rotate 20
  6. compress
  7. delaycompress
  8. notifempty
  9. sharedscripts
  10. postrotate
  11. /sbin/service rabbitmq-server rotate-logs > /dev/null
  12. endscript
  13. }
  14. EOF

5. 启动脚本

参考: 《RabbitMQ启动脚本

6. 设置Erlang Cookie

Erlang Cookie文件:/home/rabbitmq/.erlang.cookie。这里将rabbit1的该文件复制到rabbit2、rabbit3,并设置400权限

  1. chmod 400 /home/rabbitmq/.erlang.cookie
  2. chown rabbitmq.rabbitmq /home/rabbitmq/.erlang.cookie

7. 修改配置文件

密码和集群配置:

  1. cat > /usr/local/rabbitmq/etc/rabbitmq/rabbitmq.config << EOF
  2. [
  3. {rabbit, [
  4. {cluster_nodes, {['rabbit@rabbit1','rabbit@rabbit2', 'rabbit@rabbit3'], disc}},
  5. {tcp_listeners,[{"0.0.0.0",5672}]},
  6. {default_vhost,       <<"/">>},
  7. {default_user,        <<"linuxeye">>},
  8. {default_pass,        <<"linuxeye@123">>},
  9. {loopback_users, ["linuxeye"]},
  10. {default_permissions, [<<".*">>, <<".*">>, <<".*">>]}
  11. ]}
  12. ].
  13. EOF

启用rabbitmq_management

  1. cat > /usr/local/rabbitmq/etc/rabbitmq/enabled_plugins << EOF
  2. [rabbitmq_management].
  3. EOF

8. 分别启动3个节点rabbitmq

使用rabbitmqctl cluster_status命令表示集群搭建成功

  1. [root@rabbit2 ~]# rabbitmqctl cluster_status
  2. Cluster status of node rabbit@rabbit2 ...
  3. [{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2,rabbit@rabbit3]}]},
  4. {running_nodes,[rabbit@rabbit3,rabbit@rabbit1,rabbit@rabbit2]},
  5. {cluster_name,<<"rabbit@rabbit2">>},
  6. {partitions,[]}]

9. 设置镜像队列策略

在任意一个节点上执行:

  1. rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

10. 配置HAProxy

配置好HAProxy后,浏览器访问http://10.0.0.4:15672, 看到如下证明rabbitmq镜像模式搭建成功

最新文章

  1. gnuplot使用,操作,保存等教程
  2. 基于MVC4+EasyUI的Web开发框架经验总结(2)- 使用EasyUI的树控件构建Web界面
  3. (视频) 开源,免费和跨平台 - MVP ComCamp 2015 KEYNOTE
  4. hdu 4568 Hunter(spfa预处理 + 状压dp)
  5. 同源策略和JSONP(概念性)
  6. 读取Cookie及Cookie所有属性操作方法
  7. HDU 5438 Ponds (DFS,并查集)
  8. Form验证(转)
  9. C#-创建自定义双击事件
  10. 对setTimeout()第一个参数是字串的深入理解以及eval函数的理解
  11. Activiti的Eclipse插件离线安装指南
  12. Cocos2d-x中获取设备语言的方法
  13. CodeForces 22C System Administrator
  14. jquery php 百度搜索框智能提示效果
  15. google gflag使用方法举例
  16. redis的两种安装方法
  17. 基于Verilog的带FIFO输出缓冲的串口接收接口封装
  18. ORA-00600: internal error code, arguments: [2662]
  19. 机器学习超参数优化算法-Hyperband
  20. python下划线的5种含义

热门文章

  1. VS与Opencv的亲密接触之安装配置过程
  2. mfc 动态创建EDIT控件
  3. mfc CImageList和CListCtrl
  4. ats显示代理缓存
  5. Laravel 5.6 视图用Blade语法传递变量和流程控制if 语句和循环语句
  6. Linux内核分析 笔记二 操作系统是如何工作的 ——by王玥
  7. Linux内核设计与实现 第一章 第二章
  8. Python Pandas read_csv报错
  9. 网络助手的NABCD分析
  10. Linux命令(二十五) 磁盘管理命令(三) fdisk