目录
CentOs7.6 搭建 RabbitMQ 3.6 单机服务与使用
CentOs7.6 搭建 RabbitMQ 3.6 单机服务与使用
环境
三台主机
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
安装 RabbitMQ
$ 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, []}]}].
- 这里的意思是开放使用,rabbitmq默认创建的用户guest,密码也是guest,这个用户默认只能是本机访问,localhost或者127.0.0.1,从外部访问需要添加上面的配置。
保存配置后重启服务
$ service rabbitmq-server restart
开启管理UI
$ rabbitmq-plugins enable rabbitmq_management #重启报错不要急 稍等几秒 等服务端完全启动
重启服务
$ service rabbitmq-server restart
访问管理UI
通过 http://ip:15672 使用guest,guest 进行登陆了
开启镜像集群
停止RabbitMQ 服务
$ service rabbitmq-server stop
Redirecting to /bin/systemctl stop rabbitmq-server.service
设置 Erlang Cookie
设置不同节点间同一认证的Erlang Cookie
$ scp /var/lib/rabbitmq/.erlang.cookie node2:/var/lib/rabbitmq/
$ scp /var/lib/rabbitmq/.erlang.cookie node3:/var/lib/rabbitmq/
- 然后将 node1 中的该文件拷贝到 node2、node3最后将权限和所属用户/组修改回来
$ 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 [email protected]#忽略警告
按照顺序执行 先node2、node3
node2 $ rabbitmqctl stop_app # 停止rabbitmq服务
node2 $ rabbitmqctl join_cluster [email protected]
Clustering node [email protected] with [email protected] # node2和node1构成集群, node2必须能通过node1的主机名ping通
node2 $ rabbitmqctl start_app # 开启rabbitmq服务
node3 $ rabbitmqctl stop_app # 停止rabbitmq服务
node3 $ rabbitmqctl join_cluster [email protected] # node3和node1构成集群, node2必须能通过node1的主机名ping通
node3 $ rabbitmqctl start_app # 开启rabbitmq服务
此时 node2 与 node3 也会自动建立连接
设置内存节点
其中–ram指的是作为内存节点,要是想做为磁盘节点的话,就不用加–ram这个参数了
加入内存节点集群
node2 # rabbitmqctl join_cluster --ram [email protected]
只要在节点列表里包含了本身,它就成为一个磁盘节点。
在RabbitMQ集群里,必须至少有一个磁盘节点存在。
更改节点属性
node2 $ rabbitmqctl stop_app # 停止rabbitmq服务
node2 $ rabbitmqctl change_cluster_node_type ram # 更改节点为内存节点
Turning [email protected] into a ram node
node2 $ rabbitmqctl change_cluster_node_type disc # 更改节点为磁盘节点
Turning [email protected] into a disc node
node2 $ rabbitmqctl start_app # 开启rabbitmq服务
查看集群状态
执行完之后分别在每台机器上查看节点状态
[[email protected] ~]# rabbitmqctl cluster_status
Cluster status of node [email protected]
[{nodes,[{disc,[[email protected],[email protected]]}]},
{running_nodes,[[email protected],[email protected]]},
{cluster_name,<<"[email protected]">>},
{partitions,[]},
{alarms,[{[email protected],[]},{[email protected],[]}]}]
[[email protected] ~]# rabbitmqctl cluster_status
Cluster status of node [email protected]
[{nodes,[{disc,[[email protected],[email protected]]}]},
{running_nodes,[[email protected],[email protected]]},
{cluster_name,<<"[email protected]">>},
{partitions,[]},
{alarms,[{[email protected],[]},{[email protected],[]}]}]
第一行是集群中的节点成员,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
优化Linux内核参数(最大文件数量)
查看本机最大打开的数量
[[email protected] ~]# cat /proc/sys/fs/file-max
95086(根据磁盘内存计算)
更改系统级别打开最大文件句柄数量(永久)
vim /etc/sysctl.conf
fs.file-max = 102400
sysctl -p | grep file-max
执行命令立即生效
sysctl -p
[[email protected] ~]# ulimit -n //查看当前打开最大文件描述符
[[email protected] ~]# ulimit -a //查看所有属性值
[[email protected] ~]# ulimit -Hn 100000 //设置硬限制(临时规则)
[[email protected] ~]# ulimit -Sn 100000 //设置软限制(临时规则)用户可以调节自己的软限制,但是不允许超过硬限制
[[email protected] ~]# 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 <username> <newpassword>
$ rabbitmqctl add_user ymq 123456
Creating user "ymq"
删除用户
命令格式
rabbitmqctl delete_user <username>
$ rabbitmqctl delete_user penglei
Deleting user "penglei"
修改密码
命令格式
rabbitmqctl change_password <username> <newpassword>
$ 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 <username> <tag>
$ 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 "/"
参考:
https://segmentfault.com/a/1190000010693696#articleHeader4
http://chyufly.github.io/blog/2016/04/10/rabbitmq-cluster/
https://blog.51cto.com/linuxg/1967788