RabbitMQ集群安装

Posted yhongyin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RabbitMQ集群安装相关的知识,希望对你有一定的参考价值。

RabbitMQ安装

集群准备工作

现在有两台服务器:192.168.10.100,192.168.10.101

//进入到100服务器中
//查看hostname,或者使用hostname node1修改主机名
hostname
//配置hosts
vi /etc/hosts 
//修改如下
192.168.10.100 homename1
192.168.10.101 homename2
//在101服务器中同样配置就OK了
//注意:homename1是当前主机名哦!

如果不设置主机名,那么就查看主机名是什么,在hosts里面配置上就OK了。

linux安装

RabbitMQ 基于Erlang实现的,所以在安装rabbitmq之前需要先安装erlang,安装的时候需要注意erlang的版本号与rabbitmq的版本号。
安装注意:erlang版本号需要兼顾rabbitmq版本。版本不对,是无法启动rabbitmq的。
官网版本对应表:http://www.rabbitmq.com/which-erlang.html

//先安装erlang,如果不先安装erlang是无法安装rabbitmq的
[root@xiaobao ~]# yum install http://www.rabbitmq.com/releases/erlang/erlang-19.0.4-1.el6.x86_64.rpm

//安装rabbitmq
[root@xiaobao ~]# yum install http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.12/rabbitmq-server-3.6.12-1.el6.noarch.rpm

通过rpm文件安装的文件,直接就可以运行了, 无需配置环境变量之类的。如果是下载源码安装需要手动配置。

运行

//后台启动,如果不加-detached为直接启动,加了等于后台启动
rabbitmq-server -detached

//查看状态。
rabbitmqctl status

通过yum直接安装后,刚开始找不到安装的文件,以及配置文件,怎么办?
上面不是启动了吗,然后根据启动的进程来看ps -ef|grep rabbit 就能看到安装目录,以及配置文件的目录了。

插件管理

//启用插件
[root@xiaobao ~]# rabbitmq-plugins  enable plugins_name

//停用插件
[root@xiaobao ~]# rabbitmq-plugins disable plugins_name

//查看插件列表
[root@xiaobao ~]# rabbitmq-plugins list

管理监控插件

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

开始访问你的rabbitmq了。http://localhost:15672
5672是rabbitmq的默认端口,15672是后台管理的端口。
连接mq是使用IP 端口为5672.

配置文件

一般配置文件在/usr/local/etc/rabbitmq/rabbitmq-env.conf或者/etc/rabbitmq/rabbitmq-env.conf
实在找不到,那就自己搜索呗。

在配置文件里面可以修改端口各种参数之类的。

//修改端口
RABBITMQ_NODE_PORT=5672
  1. RABBITMQ_MNESIA_BASE
    默认指向 /var/lib/rabbitmq/mnesia ,更改该环境变量可以使您存放 Mnesia 数据库文件到希望的位置。
  2. RABBITMQ_LOG_BASE
    默认指向 /var/log/rabbitmq ,server 产生的 log 文件将存放于该目录。

  3. RABBITMQ_NODENAME
    默认指向 rabbit,当你打算在单台物理机上运行多于 1 个 node 时该环境变量有用 - RABBITMQ_NODENAME 在每一个 erlang-node-and-machine 搭配中应该是唯一的。 参见 clustering on a single machine 中的具体说明。

  4. RABBITMQ_NODE_IP_ADDRESS
    默认情况 RabbitMQ 将绑定到全部 interface (IPv4 和 IPv6,如果存在的话) 上。通过设置该环境变量可以让您只绑定到一个网络 interface 或者 address family 上。

  5. RABBITMQ_NODE_PORT
    默认为 5672。

建议查看官网配置http://www.rabbitmq.com/configure.html
注意mq有两个配置文件一个rabbitmq.conf参数变量配置 ,rabbitmq-env.conf全局环境变量配置。具体没怎么用过,我就用的后面这个配置一下端口啊,日志输出路径啊,rabbitmq的名称之类的。

用户管理

guest无法远程登录的问题

由于mq为了安全起见,guest只能在本地登录,是无法远程登录的。不过可以在配置文件里面修改,自己网上找。
最好的方法是添加一个新用户,这样是最安全,最保险的,看下面的用户管理。

添加用户

//添加用户
rabbitmqctl add_user userName Password
//给用户添加权限:userName为用户名, Tag为角色名(对应于administrator,monitoring,policymaker,management,或其他自定义名称)。
rabbitmqctl set_user_tags userName tags

//设置用户的接管队列的权限,这一步可以登陆后台管理页面Admin-Users-点击用户名,然后设置。
//如果不设置这一步,是无法看到队列的,因为创建的队列默认在guest名下。
rabbitmqctl set_permissions -p "/" userName ".*" ".*" ".*"

关于角色的描述:
用户角色可分为五类,超级管理员, 监控者, 策略制定者, 普通管理者以及其他。

  1. 超级管理员(administrator):可登陆管理控制台(启用management plugin的情况下),可查看所有的信息,并且可以对用户,策略(policy)进行操作。
  2. 监控者(monitoring) 可登陆管理控制台(启用management plugin的情况下),同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)
  3. 策略制定者(policymaker) 可登陆管理控制台(启用management plugin的情况下), 同时可以对policy进行管理。但无法查看节点的相关信息(上图红框标识的部分)。
  4. 普通管理者(management) 仅可登陆管理控制台(启用management plugin的情况下),无法看到节点信息,也无法对策略进行管理。

修改密码

//修改用户密码
rabbitmqctl change_password username newpassword

列出所有用户 
rabbitmqctl list_users 

权限控制

1.创建虚拟主机 

rabbitmqctl add_vhost vhostpath 

2.删除虚拟主机 

rabbitmqctl delete_vhost vhostpath 

3.列出所有虚拟主机 

rabbitmqctl list_vhosts 

4.设置用户权限 

rabbitmqctl set_permissions [-p vhostpath] username regexp regexp regexp 

5.清除用户权限 

rabbitmqctl clear_permissions [-p vhostpath] username 

6.列出虚拟主机上的所有权限 

rabbitmqctl list_permissions [-p vhostpath] 

7.列出用户权限 

rabbitmqctl list_user_permissions username

集群配置

第一步:pc:192.168.10.100 节点一,直接启动rabbitmq-server -detached 就完了,其他不用操作什么。

第二步:pc:192.168.10.101 节点二,暂时不用启动,配置步骤如下:

1.找到.erlang.cookie的目录
Erlang Cookie是保证不同节点可以相互通信的密钥,要保证集群中的不同节点相互通信必须共享相同的Erlang Cookie

//官网中有说明,要么在用户根目录下:
/Users/xiaobao/.erlang.cookie
//或者在/var/lib/rabbitmq目录下
/var/lib/rabbitmq/.erlang.cookie

2.在节点2中修改.erlang.cookie的权限:

//
chmod 777 /var/lib/rabbitmq/.erlang.cookie

//将节点1中的.erlang.cookie这个里面的值拷贝到节点2里面来,直接替换节点2里面的值就可以了。为了节点1,2的cooki保持一致。
vi /var/lib/rabbitmq/.erlang.cookie

//修改完成后,还原权限,默认是400,如果不还原,启动mq时会报错,直接启动不起来。
chmod 400 /var/lib/rabbitmq/.erlang.cookie

3.启动节点二rabbitmq-server -detached。

4.以节点一作为主节点,节点二中配置如下:

//这里stop_app停止应用,而不是停止服务。
[root@xiaobao ~]# rabbitmqctl  stop_app

//重置rabbitmq
[root@xiaobao ~]# rabbitmqctl reset

//将rabbit@homename1服务器加入到集群中
[root@xiaobao ~]# rabbitmqctl  join_cluster rabbit@homename1

//或者这样配置
//[root@xiaobao ~]# rabbitmqctl  join_cluster rabbit@homename1 -arm //这种就是告诉,他使用内存模式。默认是磁盘模式

//重启应用
[root@xiaobao ~]# rabbitmqctl  start_app

//查看集群状态
[root@xiaobao ~]# rabbitmqctl cluster_status

现在到控制台查看会看到有2个节点哦。

磁盘与内存模式说明

rabbitmq存储消息有两种模式,一种是磁盘模式,一种是内存模式。听名字就知道,磁盘模式就是把消息存储到磁盘中,可以达到持久化的目标;内存模式就是把消息存储到内存中,读存速度上要快很多,但是一旦服务器重启就会有可能导致没有消费的消息丢失。

了解了两种模式后,我们知道,单机的情况基本使用的是磁盘模式,这样安全性更高。当两台做集群时,就可以一台磁盘模式,一台内存模式了。这样既可以做到保存消息持久化,另外一台速度也有保障。

[root@xiaobao ~]# rabbitmqctl join_cluster rabbit@homename1 -arm

在搭建集群时在后面加入-arm模式,即为内存模式,如果不加,默认为磁盘模式。

单机集群配置

由于rabbitMq是服务,而不是容器,所以在同一台服务上启动多个时,不需要像tomcat一样,需要拷贝多个tomcat安装文件出来。对于服务来说,我们只需要改变端口就可以启动多个服务。
所以单机集群就很简单了,只需要改变端口就好了。

单机集群部署1

//启动两个服务
[root@xiaobao ~]# RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=rabbit1@localhost rabbitmq-server -detached
[root@xiaobao ~]# RABBITMQ_NODE_PORT=5673 RABBITMQ_NODENAME=rabbit2@localhost rabbitmq-server -detached

//与rabbit1为主节点,在rabbit2中配置如下:
[root@xiaobao ~]# rabbitmqctl -n rabbit2 stop_app
[root@xiaobao ~]# rabbitmqctl -n rabbit2 join_cluster rabbit@localhost
[root@xiaobao ~]# rabbitmqctl -n rabbit2 start_app

这样就配置完成了。

单机集群部署2

如果你开启了rabbitMQ后台管理,可以需要修改一下端口。如下

//bww为我的主机名

//启动rabbit1节点
[root@xiaobao ~]# RABBITMQ_NODE_PORT=5672 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15672}]" RABBITMQ_NODENAME=rabbit1@bww rabbitmq-server –detached

//启动rabbit2节点
[root@xiaobao ~]# RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" RABBITMQ_NODENAME=rabbit2@bww rabbitmq-server -detached

[root@xiaobao ~]# rabbitmqctl -n rabbit2 stop_app
[root@xiaobao ~]# rabbitmqctl -n rabbit2 join_cluster rabbit@bww
[root@xiaobao ~]# rabbitmqctl -n rabbit2 start_app

启动报错,但是不知道错在哪里的时候,直接使用rabbitmq-server启动即可,不要使用rabbitmq-server -detached。

有时候插件比较多,插件监听的端口也会导致冲突,怎么解决呢,要么先关闭插件,或者找到插件监听的端口,单独设置。
如:

[root@xiaobao ~]# RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}] -rabbitmq_stomp tcp_listeners [61614] -rabbitmq_mqtt  tcp_listeners [1884]" RABBITMQ_NODENAME=rabbit2@hostname  rabbitmq-server -detached

实际操作过程中遇到的坑

  • RABBITMQ_NODE_PORT=5672,RABBITMQ_NODE_PORT与=号之间不能有空格。如果有空格就表示RABBITMQ_NODE_PORT =5672,RABBITMQ_NODE_PORT变成了一个命令,系统会提示,没有这个命令RABBITMQ_NODE_PORT。由于rabbitmq使用的是erlang语言编写的,所以传递参数和我们平常的不太一样,他是从后面传递参数的.
  • 我们平时传递参数应该是这样的:[root@xiaobao ~]# zk-server post=50 name=3222 命令在前,参数在后。

在mq有一个配置文件在/usr/local/etc/rabbitmq/rabbitmq-env.conf
在配置文件里面我配置了如下:

CONFIG_FILE=/usr/local/etc/rabbitmq/rabbitmq
NODE_IP_ADDRESS=127.0.0.1
NODENAME=rabbit@localhost
RABBITMQ_NODE_PORT=5672
RABBITMQ_DIST_PORT=25673

这里单机没问题,但是单机集群就把我坑死了,因为在上面启动中,这个属于环境变量配置文件,里面的参数会覆盖我们上面写的RABBITMQ_NODE_PORT=5673,所以导致在启动时RABBITMQ_NODE_PORT=5673这里配置了一直不起作用,提示我端口冲突,端口冲突,差一点崩溃了。

单机集群要需要配置hosts

vi /etc/hosts
127.0.0.1 bww //自己的主机名

集群之镜像模式

上面搭建起来了,集群已经好了,但是,,但是,不是完整的集群模式。它只是rabbitmq的普通模式

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消费数据时临时读取。缺点就是,集群内部的同步通讯会占用大量的网络带宽。
    普通模式说明:队列只能存在某个节点下,node1或者node2中,在创建节点时就决定了在某个节点下。
    p1–> node1—> node2 –>c1;//队列q在node1中,p生产者连接了node1,往队列q里面发送消息,c消费者连接了node2,接收q队列消息,他们通信是node1发送给node2,node2再发送给c消费着的。
    node1挂了,p1连接node2,c1也连接node2。由于队列q是在node1中的, 此时p1,发送消息失败,提示没有该队列。
    p1–> node1—> c2; //p,c都连接了node1,他们消息直接由node1发送就OK了。
    p1–> node2—> c2;

镜像模式

镜像模式配置非常简单,首先镜像模式是基于普通集群模式的,所以前面搭建的集群就是普通模式集群了。在搭建好的集群模式下,进入任意一台mq管理后台。
http://ip:15672.点击Admin–> policies 选线,然后添加prolicy就可以了。

添加prolicy参数说明如下:

rabbitmqctl set_policy [-p Vhost] Name Pattern Definition [Priority]

-p Vhost: 可选参数,针对指定vhost下的queue进行设置
Name: policy的名字,随便自定义。
Pattern: queue的匹配模式(正则表达式)
Definition:镜像定义,包括三个部分ha-mode, ha-params, ha-sync-mode
    ha-mode:指明镜像队列的模式,有效值为 all/exactly/nodes
        all:表示在集群中所有的节点上进行镜像
        exactly:表示在指定个数的节点上进行镜像,节点的个数由ha-params指定
        nodes:表示在指定的节点上进行镜像,节点名称通过ha-params指定
    ha-params:ha-mode模式需要用到的参数
    ha-sync-mode:进行队列中消息的同步方式,有效值为automatic和manual
priority:可选参数,policy的优先级,值越大,优先级越高

特别说明:如果ha-mode指定为exactly,exactly个数,将在ha-params中设置。如果ha-mode指定为all,则ha-params不需要填写。

例如:rabbitmqctl set_policy -p vhostName allName “^message” ‘{“ha-mode”:”all”}’ 10

  • “^message” :表示”message”开头的队列名称,我们配置时使用的应用于所有队列,所以表达式为”^”
  • vhostName :表示虚拟host的名字,后台可以选择。
  • allName :表示名字,自定义的,随便
  • ‘{“ha-mode”:”all”}’ 应用到所有节点上。
    综合起来解释就是说:将message开头的队列名称,使用镜像模式,拷贝到所有节点。如:现在有一个hello-message的队列,mq服务器有node1,node2,node3.创建的时候hello-message在node1节点上面,然后我们创建了一个prolicy规则,所以hello-message就会被使用镜像模式把数据也一起拷贝到node2,node3节点上面(普通模式只拷贝队列的结构,不拷贝数据)。

参考文档

http://www.rabbitmq.com/clustering.html 官网集群搭建地址
https://www.linuxidc.com/Linux/2016-12/137812.htm
https://www.linuxidc.com/Linux/2017-09/147030.htm
https://blog.csdn.net/woogeyu/article/details/51119101
https://blog.csdn.net/zhu_tianwei/article/details/40936723
https://blog.csdn.net/u013256816/article/details/71097186 镜像模式的原理说明

————————————————
版权声明:本文为CSDN博主「piaoslowly」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/piaoslowly/article/details/81625335

以上是关于RabbitMQ集群安装的主要内容,如果未能解决你的问题,请参考以下文章

rabbitmq3.8.2安装步骤及集群配置

高可用RabbitMQ集群安装配置

从零开始搭建RabbitMQ集群遇到的问题

运维-安装rabbitmq 集群

rabbitmq单机和集群部署

rabbitmq单机和集群部署