目录
CentOs7.6 搭建 RabbitMQ 3.6 单机服务与使用
安装
安装 RabbitMQ
启动服务
服务状态
查看日志
开启管理UI
访问管理UI
开启镜像集群
停止RabbitMQ 服务
设置 Erlang Cookie
注意事项
运行各节点
组成集群
设置内存节点
更改节点属性
查看集群状态
登录后台
设置镜像队列策略
集群重启
优化Linux内核参数(最大文件数量)
授权操作
添加用户
删除用户
修改密码
用户授权
查看用户授权
查看当前用户列表
添加角色
环境
三台主机
CentOS7.6.1810
RabbitMQ3.6
注意事项
关闭防火墙或iptables
centos 6.x 关闭 iptables
$ service iptables stop # 关闭命令:
centos 7.x 关闭firewall
$ systemctl stop firewalld.service # 停止firewall
注:不想关闭防火墙,就开放5672、15672、25672端口与4369端口,设置之后可以通过网页方式管理MQ
4369 -- erlang发现口
5672 --client端通信口
15672 -- 管理界面ui端口
25672 -- server间内部通信口
firewall-cmd --permanent --zone=public --add-port=4369/tcp
firewall-cmd --permanent --zone=public --add-port=5672/tcp
firewall-cmd --permanent --zone=public --add-port=15672/tcp
firewall-cmd --permanent --zone=public --add-port=25672/tcp
firewall-cmd --reload
修改主机名(建议重启)
]# hostnamectl set-hostname node1
]# hostnamectl set-hostname node2
修改hosts文件(三台主机文件必须相同)
vim /etc/hosts
192.168.2.3 node1
192.168.2.4 node2
注:保证集群的高可用,至少要有1个disc节点
RabbitMQ Cluster 全部挂掉,RAM节点无法先启动,必须先启动disc节点
推荐 2 RAM 1 DISC 集群搭建方式
(当disc节点崩溃,集群仍可以运行,但无法进行其他操作(增删查改),知道disc节点恢复,解决:增加disc节点)
RabbitMQ 安装需要依赖 Erlang 环境
$ cd /opt
$ wget http://www.rabbitmq.com/releases/erlang/erlang-19.0.4-1.el7.centos.x86_64.rpm
$ yum install erlang-19.0.4-1.el7.centos.x86_64.rpm
$ cd /opt
$ wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.10/rabbitmq-server-3.6.10-1.el7.noarch.rpm
$ yum install rabbitmq-server-3.6.10-1.el7.noarch.rpm -y
systemctl start rabbitmq-server.service
systemctl enable rabbitmq-server.service
$ service rabbitmq-server status
$ cat /var/log/rabbitmq/rabbit@node1.log
=INFO REPORT==== 16-Aug-2017::11:43:32 ===
Starting RabbitMQ 3.6.10 on Erlang 19.0.4
Copyright (C) 2007-2017 Pivotal Software, Inc.
Licensed under the MPL. See http://www.rabbitmq.com/
=INFO REPORT==== 16-Aug-2017::11:43:32 ===node : rabbit@localhost
home dir : /var/lib/rabbitmq
config file(s) : /etc/rabbitmq/rabbitmq.config (not found)
cookie hash : kuUba2xGLitNNO48qE0Hrg==log : /var/log/rabbitmq/rabbit@localhost.log
sasl log : /var/log/rabbitmq/rabbit@localhost-sasl.log
database dir : /var/lib/rabbitmq/mnesia/rabbit@localhost
=INFO REPORT==== 16-Aug-2017::11:43:33 ===
Memory limit set to 390MB of 976MB total.
=INFO REPORT==== 16-Aug-2017::11:43:33 ===
Enabling free disk space monitoring
=INFO REPORT==== 16-Aug-2017::11:43:33 ===
Disk free limit set to 50MB
=INFO REPORT==== 16-Aug-2017::11:43:33 ===
Limiting to approx 924 file handles (829 sockets)
=INFO REPORT==== 16-Aug-2017::11:43:33 ===
FHC read buffering: OFF
FHC write buffering: ON
=INFO REPORT==== 16-Aug-2017::11:43:33 ===
Database directory at /var/lib/rabbitmq/mnesia/rabbit@localhost is empty. Initialising from scratch...
=INFO REPORT==== 16-Aug-2017::11:43:33 ===
Waiting for Mnesia tables for 30000 ms, 9 retries left
=INFO REPORT==== 16-Aug-2017::11:43:33 ===
Waiting for Mnesia tables for 30000 ms, 9 retries left
这里显示的是没有找到配置文件,我们可以自己创建这个文件
config file(s) : /etc/rabbitmq/rabbitmq.config (not found)
创建rabbitmq.config
$ cd /etc/rabbitmq/
$ vi rabbitmq.config
编辑内容如下:
[{rabbit, [{loopback_users, []}]}].
保存配置后重启服务
$ service rabbitmq-server restart
$ rabbitmq-plugins enable rabbitmq_management #重启报错不要急 稍等几秒 等服务端完全启动
重启服务
$ service rabbitmq-server restart
通过 http://ip:15672 使用guest,guest 进行登陆了
$ service rabbitmq-server stop
Redirecting to /bin/systemctl stop rabbitmq-server.service
设置不同节点间同一认证的Erlang Cookie
$ scp /var/lib/rabbitmq/.erlang.cookie node2:/var/lib/rabbitmq/
$ scp /var/lib/rabbitmq/.erlang.cookie node3:/var/lib/rabbitmq/
$ chown rabbitmq /var/lib/rabbitmq/.erlang.cookie
$ chgrp rabbitmq /var/lib/rabbitmq/.erlang.cookie
cookie在所有节点上必须完全一样,同步时一定要注意。
erlang是通过主机名来连接服务,必须保证各个主机名之间可以ping通。可以通过编辑/etc/hosts来手工添加主机名和IP对应关系。如果主机名ping不通,rabbitmq服务启动会失败。
注意:主机名禁止特殊字符和小数点
$ rabbitmqctl stop
$ rabbitmq-server -detached
Warning: PID file not written; -detached was passed.#忽略警告
这个也可以不执行,直接在节点服务器执行下边的脚本,不过得保证这个rabbitmq服务是正常启动的
node1 $ rabbitmqctl stop_app #注意不执行
Stopping rabbit application on node rabbit@localhost#忽略警告
按照顺序执行 先node2、node3
node2 $ rabbitmqctl stop_app # 停止rabbitmq服务
node2 $ rabbitmqctl join_cluster rabbit@node1
Clustering node rabbit@node2 with rabbit@node1 # node2和node1构成集群, node2必须能通过node1的主机名ping通
node2 $ rabbitmqctl start_app # 开启rabbitmq服务
node3 $ rabbitmqctl stop_app # 停止rabbitmq服务
node3 $ rabbitmqctl join_cluster rabbit@node1 # node3和node1构成集群, node2必须能通过node1的主机名ping通
node3 $ rabbitmqctl start_app # 开启rabbitmq服务
此时 node2 与 node3 也会自动建立连接
其中–ram指的是作为内存节点,要是想做为磁盘节点的话,就不用加–ram这个参数了
加入内存节点集群
node2 # rabbitmqctl join_cluster --ram rabbit@node1
只要在节点列表里包含了本身,它就成为一个磁盘节点。
在RabbitMQ集群里,必须至少有一个磁盘节点存在。
node2 $ rabbitmqctl stop_app # 停止rabbitmq服务
node2 $ rabbitmqctl change_cluster_node_type ram # 更改节点为内存节点
Turning rabbit@node2 into a ram node
node2 $ rabbitmqctl change_cluster_node_type disc # 更改节点为磁盘节点
Turning rabbit@node2 into a disc node
node2 $ rabbitmqctl start_app # 开启rabbitmq服务
执行完之后分别在每台机器上查看节点状态
[root@node1 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@node1
[{nodes,[{disc,[rabbit@node1,rabbit@node2]}]},
{running_nodes,[rabbit@node2,rabbit@node1]},
{cluster_name,<<"rabbit@node1">>},
{partitions,[]},
{alarms,[{rabbit@node2,[]},{rabbit@node1,[]}]}]
[root@node2 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@node2
[{nodes,[{disc,[rabbit@node1,rabbit@node2]}]},
{running_nodes,[rabbit@node1,rabbit@node2]},
{cluster_name,<<"rabbit@node1">>},
{partitions,[]},
{alarms,[{rabbit@node1,[]},{rabbit@node2,[]}]}]
第一行是集群中的节点成员,disc表示这些都是磁盘节点
第二行是正在运行的节点成员
在普通集群的中任意节点启用策略,策略会自动同步到集群节点
命令格式
set_policy [-p vhostpath] {name} {pattern} {definition} [priority]
在任意一个节点上执行
[root@node1 ~]# rabbitmqctl set_policy -p / ha-allqueue "^message" '{"ha-mode":"all"}'
Setting policy "ha-allqueue" for pattern "^message" to "{\"ha-mode\":\"all\"}" with priority "0"
注意:"^message" 这个规则要根据自己修改,这个是指同步"message"开头的队列名称,配置时使用的应用于所有队列,所以表达式为"^"
集群重启时,最后一个挂掉的节点应该第一个重启,如果因特殊原因(比如同时断电),而不知道哪个节点最后一个挂掉。可用以下方法重启:
先在一个节点上执行
$ rabbitmqctl force_boot
$ service rabbitmq-server start #重启时需要等待几秒钟
在其他节点上执行
$ service rabbitmq-server start
查看cluster状态是否正常(要在所有节点上查询)。
$ rabbitmqctl cluster_status
查看本机最大打开的数量
[root@node2 ~]# cat /proc/sys/fs/file-max
95086(根据磁盘内存计算)
更改系统级别打开最大文件句柄数量(永久)
vim /etc/sysctl.conf
fs.file-max = 102400
sysctl -p | grep file-max
执行命令立即生效
sysctl -p
[root@proxy ~]# ulimit -n //查看当前打开最大文件描述符
[root@proxy ~]# ulimit -a //查看所有属性值
[root@proxy ~]# ulimit -Hn 100000 //设置硬限制(临时规则)
[root@proxy ~]# ulimit -Sn 100000 //设置软限制(临时规则)用户可以调节自己的软限制,但是不允许超过硬限制
[root@proxy ~]# vim /etc/security/limits.conf //永久修改
.. ..
* soft nofile 204800
* hard nofile 204800
* soft nproc 204800
* hard nproc 204800
设置当前用户立即生效(临时修改之后,无需操作)
ulimit -n 100000
注:修改RabbitMQ配置
在CentOS7中,如果是以systemd方式管理rabbitmq服务,则需要修改rabbitmq的service文件。
vim /usr/lib/systemd/system/rabbitmq-server.service
添加如下参数,其值请根据实际情况进行调整:
[Service]
LimitNOFILE=50000
重启rabbitmq即可
systemctl daemon-reload
systemctl restart rabbitmq-server
处于安全的考虑,guest这个默认的用户只能通过http://localhost:15672 来登录,其他的IP无法直接使用这个账号。 这对于服务器上没有安装桌面的情况是无法管理维护的,除非通过在前面添加一层代理向外提供服务,这个又有些麻烦了,这里通过配置文件来实现这个功能
命令格式
rabbitmqctl add_user
$ rabbitmqctl add_user ymq 123456
Creating user "ymq"
命令格式
rabbitmqctl delete_user
$ rabbitmqctl delete_user penglei
Deleting user "penglei"
命令格式
rabbitmqctl change_password
$ rabbitmqctl change_password ymq 123456
Changing password for user "ymq"
命令格式
rabbitmqctl set_permissions [-pvhostpath] {user} {conf} {write} {read}
该命令使用户ymq /(可以访问虚拟主机) 中所有资源的配置、写、读权限以便管理其中的资源
$ rabbitmqctl set_permissions -p "/" ymq ".*" ".*" ".*"
Setting permissions for user "ymq" in vhost "/"
命令格式
rabbitmqctl list_permissions [-p VHostPath]
$ rabbitmqctl list_permissions -p /
Listing permissions in vhost "/"
guest .* .* .*
ymq .* .* .*
可以看到添加用户成功了,但不是administrator角色
$ rabbitmqctl list_users
Listing users
guest [administrator]
ymq []
这里我们也将ymq用户设置为administrator角色
命令格式
rabbitmqctl set_user_tags
$ rabbitmqctl set_user_tags ymq administrator
Setting tags for user "ymq" to [administrator]
再次查看权限
$ rabbitmqctl list_users
Listing users
guest [administrator]
ymq [administrator]
清除权限信息
命令格式
rabbitmqctl clear_permissions [-p VHostPath] ymq
rabbitmqctl clear_permissions -p / ymq
Clearing permissions for user "ymq" in vhost "/"
参考:
http://www.rabbitmq.com
https://segmentfault.com/a/1190000010693696#articleHeader4
http://chyufly.github.io/blog/2016/04/10/rabbitmq-cluster/
https://blog.51cto.com/linuxg/1967788