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
- RABBITMQ_MNESIA_BASE
默认指向 /var/lib/rabbitmq/mnesia ,更改该环境变量可以使您存放 Mnesia 数据库文件到希望的位置。 RABBITMQ_LOG_BASE
默认指向 /var/log/rabbitmq ,server 产生的 log 文件将存放于该目录。RABBITMQ_NODENAME
默认指向 rabbit,当你打算在单台物理机上运行多于 1 个 node 时该环境变量有用 - RABBITMQ_NODENAME 在每一个 erlang-node-and-machine 搭配中应该是唯一的。 参见 clustering on a single machine 中的具体说明。RABBITMQ_NODE_IP_ADDRESS
默认情况 RabbitMQ 将绑定到全部 interface (IPv4 和 IPv6,如果存在的话) 上。通过设置该环境变量可以让您只绑定到一个网络 interface 或者 address family 上。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 ".*" ".*" ".*"
关于角色的描述:
用户角色可分为五类,超级管理员, 监控者, 策略制定者, 普通管理者以及其他。
- 超级管理员(administrator):可登陆管理控制台(启用management plugin的情况下),可查看所有的信息,并且可以对用户,策略(policy)进行操作。
- 监控者(monitoring) 可登陆管理控制台(启用management plugin的情况下),同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)
- 策略制定者(policymaker) 可登陆管理控制台(启用management plugin的情况下), 同时可以对policy进行管理。但无法查看节点的相关信息(上图红框标识的部分)。
- 普通管理者(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