分享rabbitmq集群配置完美版,秒懂!

来源:互联网 发布:正规淘宝兼职网站 编辑:程序博客网 时间:2024/05/17 02:08

分享rabbitmq集群配置完美版,秒懂!详细安装word文档下载地址
http://bbs.qinwenbang.com/forum.php?mod=viewthread&tid=5&fromuid=4
(出处: 亲问帮论坛/免费帮助/交能人朋友/能帮人才/付费帮助/创业论坛)

安装Erlang
由于RabbitMQ依赖Erlang, 所以需要先安装Erlang。
Erlang的安装方式大概有两种:
1. 从Erlang Solution安装(推荐)
2. # 添加erlang solutions源
3. $ wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm
4. sudorpmUvherlangsolutions1.01.noarch.rpm6. sudo yum install erlang
6. 从EPEL源安装(这种方式安装的Erlang版本可能不是最新的,有时候不能满足RabbitMQ需要的最低版本)
7. # 启动EPEL源
8. sudo yum install epel-release   
9.   # 安装erlang  
10.
sudo yum install erlang
安装RabbitMQ
$ sudo rpm –import https://www.rabbitmq.com/rabbitmq-release-signing-key.asc
$ wget https://www.rabbitmq.com/releases/rabbitmq-server/v3.6.9/rabbitmq-server-3.6.9-1.el6.noarch.rpm # 下载RabbitMQ安装包
$ sudo yum install rabbitmq-server-3.6.9-1.el6.noarch.rpm
安装时如果遇到下面的依赖错误
error: Failed dependencies:
socat is needed by rabbitmq-server-3.6.9-1.el6.noarch
Step 1:
wget –no-cache http://www.convirture.com/repos/definitions/rhel/6.x/convirt.repo -O /etc/yum.repos.d/convirt.repo
–2017-03-31 14:57:37– http://www.convirture.com/repos/definitions/rhel/6.x/convirt.repo
正在解析主机 www.convirture.com… 69.195.93.219
正在连接 www.convirture.com|69.195.93.219|:80… 已连接。
已发出 HTTP 请求,正在等待回应… 200 OK
长度:184 [text/plain]
正在保存至: “/etc/yum.repos.d/convirt.repo”
Step 2:
yum makecache
Step 3:
yum install socat
yum install socat
已加载插件:fastestmirror, security
设置安装进程
Loading mirror speeds from cached hostfile
* base: mirrors.163.com
* extras: mirrors.163.com
* updates: mirrors.zju.edu.cn
解决依赖关系
–> 执行事务检查
—> Package socat.x86_64 0:1.7.1.3-1.el6.rf will be 安装
–> 完成依赖关系计算

依赖关系解决

软件包 架构 版本 仓库 大小

正在安装:
socat x86_64 1.7.1.3-1.el6.rf convirt-dep 325 k

事务概要

Install 1 Package(s)
总下载量:325 k
Installed size: 1.3 M
确定吗?[y/N]:y
下载软件包:
socat-1.7.1.3-1.el6.rf.x86_64.rpm | 325 kB 00:02
运行 rpm_check_debug
执行事务测试
事务测试成功
执行事务
正在安装 : socat-1.7.1.3-1.el6.rf.x86_64 1/1
Verifying : socat-1.7.1.3-1.el6.rf.x86_64 1/1
已安装:
socat.x86_64 0:1.7.1.3-1.el6.rf

装好后就可以安装 rabbitMQ 了。

关于RabbitMQ的一些基本操作
sudo chkconfig rabbitmq-server on  # 添加开机启动RabbitMQ服务 sudo service rabbitmq-server start # 启动服务
sudo service rabbitmq-server status  # 查看服务状态 sudo service rabbitmq-server stop # 停止服务

查看当前所有用户

$ sudo rabbitmqctl list_users

查看默认guest用户的权限

$ sudo rabbitmqctl list_user_permissions guest

由于RabbitMQ默认的账号用户名和密码都是guest。为了安全起见, 先删掉默认用户

$ sudo rabbitmqctl delete_user guest

添加新用户

$ sudo rabbitmqctl add_user username password

设置用户tag

$ sudo rabbitmqctl set_user_tags username administrator

赋予用户默认vhost的全部操作权限

$ sudo rabbitmqctl set_permissions -p / username “.” “.” “.*”

查看用户的权限

$ sudo rabbitmqctl list_user_permissions username
更多关于rabbitmqctl的使用,可以参考帮助手册。

rabbitmqctl add_user admin admin
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p / admin “.” “.” “.*”
开启web管理接口
如果只从命令行操作RabbitMQ,多少有点不方便。幸好RabbitMQ自带了web管理界面,只需要启动插件便可以使用。
$ sudo rabbitmq-plugins enable rabbitmq_management
然后通过浏览器访问
http://localhost:15672
输入用户名和密码访问web管理界面了。
配置RabbitMQ
关于RabbitMQ的配置,可以下载RabbitMQ的配置文件模板到/etc/rabbitmq/rabbitmq.config, 然后按照需求更改即可。
关于每个配置项的具体作用,可以参考官方文档。
更新配置后,别忘了重启服务哦!
开启用户远程访问
默认情况下,RabbitMQ的默认的guest用户只允许本机访问, 如果想让guest用户能够远程访问的话,只需要将配置文件中的loopback_users列表置为空即可,如下:
{loopback_users, []}
另外关于新添加的用户,直接就可以从远程访问的,如果想让新添加的用户只能本地访问,可以将用户名添加到上面的列表, 如只允许admin用户本机访问。
{loopback_users, [“admin”]}
更新配置后,别忘了重启服务哦!

集群配置
多机多节点部署
不同于单机多节点的情况,在多机环境,如果要在cluster集群内部署多个节点,需要注意两个方面:
• 保证需要部署的这几个节点在同一个局域网内
• 需要有相同的Erlang Cookie,否则不能进行通信,为保证cookie的完全一致,采用从一个节点copy的方式
设计集群的目的
• 允许消费者和生产者在RabbitMQ节点崩溃的情况下继续运行
• 通过增加更多的节点来扩展消息通信的吞吐量
1 集群配置方式
RabbitMQ可以通过三种方法来部署分布式集群系统,分别是:cluster,federation,shovel
• cluster:
o 不支持跨网段,用于同一个网段内的局域网
o 可以随意的动态增加或者减少
o 节点之间需要运行相同版本的RabbitMQ和Erlang
• federation:应用于广域网,允许单台服务器上的交换机或队列接收发布到另一台服务器上交换机或队列的消息,可以是单独机器或集群。federation队列类似于单向点对点连接,消息会在联盟队列之间转发任意次,直到被消费者接受。通常使用federation来连接internet上的中间服务器,用作订阅分发消息或工作队列。
• shovel:连接方式与federation的连接方式类似,但它工作在更低层次。可以应用于广域网。
2 节点类型
• RAM node:内存节点将所有的队列、交换机、绑定、用户、权限和vhost的元数据定义存储在内存中,好处是可以使得像交换机和队列声明等操作更加的快速。
• Disk node:将元数据存储在磁盘中,单节点系统只允许磁盘类型的节点,防止重启RabbitMQ的时候,丢失系统的配置信息。
问题说明: RabbitMQ要求在集群中至少有一个磁盘节点,所有其他节点可以是内存节点,当节点加入或者离开集群时,必须要将该变更通知到至少一个磁盘节点。如果集群中唯一的一个磁盘节点崩溃的话,集群仍然可以保持运行,但是无法进行其他操作(增删改查),直到节点恢复。
解决方案:设置两个磁盘节点,至少有一个是可用的,可以保存元数据的更改。
3 Erlang Cookie
Erlang Cookie是保证不同节点可以相互通信的密钥,要保证集群中的不同节点相互通信必须共享相同的Erlang Cookie。具体的目录存放在/var/lib/rabbitmq/.erlang.cookie。
说明: 这就要从rabbitmqctl命令的工作原理说起,RabbitMQ底层是通过Erlang架构来实现的,所以rabbitmqctl会启动Erlang节点,并基于Erlang节点来使用Erlang系统连接RabbitMQ节点,在连接过程中需要正确的Erlang Cookie和节点名称,Erlang节点通过交换Erlang Cookie以获得认证。
4 镜像队列
功能和原理
RabbitMQ的Cluster集群模式一般分为两种,普通模式和镜像模式。
• 普通模式:默认的集群模式,以两个节点(rabbit01、rabbit02)为例来进行说明。对于Queue来说,消息实体只存在于其中一个节点rabbit01(或者rabbit02),rabbit01和rabbit02两个节点仅有相同的元数据,即队列的结构。当消息进入rabbit01节点的Queue后,consumer从rabbit02节点消费时,RabbitMQ会临时在rabbit01、rabbit02间进行消息传输,把A中的消息实体取出并经过B发送给consumer。所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连rabbit01或rabbit02,出口总在rabbit01,会产生瓶颈。当rabbit01节点故障后,rabbit02节点无法取到rabbit01节点中还未消费的消息实体。如果做了消息持久化,那么得等rabbit01节点恢复,然后才可被消费;如果没有持久化的话,就会产生消息丢失的现象。
• 镜像模式:将需要消费的队列变为镜像队列,存在于多个节点,这样就可以实现RabbitMQ的HA高可用性。作用就是消息实体会主动在镜像节点之间实现同步,而不是像普通模式那样,在consumer消费数据时临时读取。缺点就是,集群内部的同步通讯会占用大量的网络带宽。
实现机制
镜像队列实现了RabbitMQ的高可用性(HA),具体的实现策略如下所示:
ha-mode ha-params 功能
all 空 镜像队列将会在整个集群中复制。当一个新的节点加入后,也会在这 个节点上复制一份。
exactly count 镜像队列将会在集群上复制count份。如果集群数量少于count时候,队列会复制到所有节点上。如果大于Count集群,有一个节点crash后,新进入节点也不会做新的镜像。
nodes node name 镜像队列会在node name中复制。如果这个名称不是集群中的一个,这不会触发错误。如果在这个node list中没有一个节点在线,那么这个queue会被声明在client连接的节点。

步骤
1. 修改 /etc/hosts,并配置ssh相互免密登录,node1,node2配置hostname
[root@node1 ~]# vim /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=node1
[root@node1 ~]#hostname node1 #执行命令立即生效,然后退出当前shell,重新打开一个shell窗口做登录才行
[root@node1 ~]# vi /etc/hosts
127.0.0.1 node1 localhost
::1 node1 localhost
172.20.8.148 node1
172.20.8.39 node2

  1. 安装 erlang、rabbitmq
      在 192.168.1.1、192.168.1.2、192.168.1.3 三个节点上安装,然后开启 RabbitMQ 监控插件。
    [root@node1 ~]# wget http://www.rabbitmq.com/releases/erlang/erlang-18.1-1.el6.centos.x86_64.rpm
    [root@node1 ~]# wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.3/rabbitmq-server-3.6.3-1.noarch.rpm
    [root@node1 ~]# rpm -ivh erlang-18.1-1.el6.centos.x86_64.rpm
    [root@node1 ~]# rpm -ivh rabbitmq-server-3.6.3-1.noarch.rpm
    [root@node1 ~]# rabbitmq-plugins enable rabbitmq_management
  2. 设置 Erlang Cookie
      Erlang Cookie 文件:/var/lib/rabbitmq/.erlang.cookie。这里将 node1 的该文件复制到 node2、node3,由于这个文件权限是 400,所以需要先修改 node2、node3 中的该文件权限为 777,然后将 node1 中的该文件拷贝到 node2、node3,最后将权限和所属用户/组修改回来。
    [root@node1 ~]# chmod 777 /var/lib/rabbitmq/.erlang.cookie
    [root@node1 ~]# scp -r /var/lib/rabbitmq/.erlang.cookie root@node2:/var/lib/rabbitmq/.erlang.cookie
    [root@node1 ~]# chmod 400 /var/lib/rabbitmq/.erlang.cookie
    [root@node1 ~]# chown rabbitmq /var/lib/rabbitmq/.erlang.cookie
    [root@node1 ~]# chgrp rabbitmq /var/lib/rabbitmq/.erlang.cookie
  3. 使用启动各节点
    [root@node1 ~]# service rabbitmq-server start
  4. 组成集群
    将 node2、 与 node1 组成集群
    [root@node2 ~]# rabbitmqctl stop_app
    [root@node2 ~]# rabbitmqctl join_cluster rabbit@node1
    [root@node2 ~]# rabbitmqctl start_app

退出集群

[root@node2 ~]# rabbitmqctl stop_app
[root@node2 ~]# rabbitmqctl reset
[root@node2 ~]# rabbitmqctl start_app

———————————————————————————

  此时 node2 会自动建立连接;如果要使用内存节点,则可以使用下面的命令加入集群。
[root@node2 ~]# rabbitmqctl join_cluster –ram rabbit@node1
  集群配置好后,可以在 RabbitMQ 任意节点上执行下面的命令来查看是否集群配置成功。
rabbitmqctl cluster_status
6. 设置镜像队列策略
  在任意一个节点上执行下面的命令
[root@node1 ~]# rabbitmqctl set_policy ha-all “^” ‘{“ha-mode”:”all”}’
镜像配置参考:http://www.rabbitmq.com/ha.html#replication-factor

  1. 控制台查看是否集群成功
    这里写图片描述
    这里写图片描述
    将所有队列设置为镜像队列,即队列会被复制到各个节点,各个节点状态保持一直。完成这 6 个步骤后,RabbitMQ 高可用集群就已经搭建好了,最后一个步骤就是搭建均衡器。(HAPROXY,暂时略)
    提示:
      RabbitMQ的配置文件为:/etc/rabbitmq/rabbitmq.config
      RabbitMQ的环境配置文件为:/etc/rabbitmq/rabbitmq-env.conf

集群高可用HAProxy配置
 安装 HAProxy,然后修改 /etc/haproxy/haproxy.cfg。
[root@snails ~]# haproxy -vv
[root@snails ~]# vi /etc/haproxy/haproxy.cfg
listen rabbitmq_cluster 0.0.0.0:5600
mode tcp
balance roundrobin
server rabbitmqnode1 172.20.8.148:5672 weight 5 check inter 2000 rise 2 fall 3
server rabbitmqnode2 172.20.8.39:5672 weight 5 check inter 2000 rise 2 fall 3

check inter 2000 每隔2s检测一次, rise 2是2次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重

listen private_monitoring :8100
mode http
option httplog
stats enable
#设置haproxy监控地址为http://localhost:8100/rabbitmq-stats
stats uri /rabbitmq-stats
stats refresh 5s
[root@snails ~]# /usr/sbin/haproxy -D -f /etc/haproxy/haproxy.cfg
[WARNING] 145/160652 (29361) : parsing [/etc/haproxy/haproxy.cfg:45] : ‘option httplog’ not usable with proxy ‘rabbitmq_cluster’ (needs ‘mode http’). Falling back to ‘option tcplog’.
[WARNING] 145/160652 (29361) : config : ‘option forwardfor’ ignored for proxy ‘rabbitmq_cluster’ as it requires HTTP mode.
警告可忽略,不影响
查看控制台http://172.20.8.148:8100/rabbitmq-stats

这里写图片描述

启动不成功的原因
1.检查5672端口是否被占用

更多关于RabbitMQ的参考资料:
• RabbitMQ文档
• RabbitMQ服务端配置
• rabbitmqctl手册
• RabbitMQ web界面操作的命令行工具 rabbitmqadmin

原创粉丝点击