基础环境
搭建单机RabbitMQ
安装Erlang
erlang和rabbitmq的版本对应关系
通过rpm安装erlang
- 完成erlang的前置条件配置
curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash
- 安装erlang
yum install -y erlang
- 检查erlang的版本号
erl
安装RabbitMQ
- 先导入两个key
rpm --import https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey
rpm --import https://packagecloud.io/gpg.key
- 下载RabbitMQ安装包
https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.5/rabbitmq-server-3.8.5-1.el7.noarch.rpm
- 下载成功后,上传到服务器,然后使用命名安装
rpm -ivh rabbitmq-server-3.8.5-1.el7.noarch.rpm
- 调整最大可打开文件句柄限制
默认情况下,操作系统限制的rabbitmq的最大操作文件句柄256,往往会限制到rabiitmq的性能提升,这里需要调整到65536。打开rabbitmq-server文件,位于系统:/usr/lib/systemd/system/rabbitmq-server.service,可通过systemctl status rabbitmq-server查看到,修改如下:
[Service]
LimitNOFILE=65536
- 启用管理平台插件,启用插件后,可以可视化管理RabbitMQ
rabbitmq-plugins enable rabbitmq_management
- 启动RabbitMQ
systemctl start rabbitmq-server
访问控制台界面
- 访问地址
http://:15672
- 用户登录
默认账号密码都是guest,但是如果使用guest登录,会出现报错如下
原因是RabbitMQ3.3以后,guest账号只能在本机登录。这里就不去修改相应配置了,而是另外创建其他登录账号。
- 创建用户 创建用户名admin,密码aaaaaa的用户:
rabbitmqctl add_user admin aaaaaa
- 设置admin为超级管理员
rabbitmqctl set_user_tags admin administrator
- 创建完成后,重启RabbitMQ
systemctl restart rabbitmq-server
- 登录用户admin
此时看到admin是No access的,需要设置一下。点击name下面的admin,然后再点击Set permission即可。
- RabbitMQ配置完成
到目前为止,RabbitMQ安装配置完成,可是使用IP(192.168.10.88)、用户(admin)、密码(aaaaaa)进行连接使用了。
构建RabbitMQ集群
集群配置
- 配置IP和主机名的映射
IP1 rabbit1
IP2 rabbit2
IP3 rabbit3
- 以rabbit1节点为主节点,停止rabbit2、rabbit3节点的服务,命令如下:
rabbitmqctl stop
-
复制rabbit1主机节点的.erlang.cookie值,确保三个节点的秘钥令牌相同,cookie相当于秘钥令牌,集群中的RabbitMQ节点需要通过交换秘钥令牌以获得相互认证;
- 修改文件读写权限
chmod 777 /var/lib/rabbitmq/.erlang.cookie- cookie文件权限改为400
chmod 400 /var/lib/rabbitmq/.erlang.cookie -
启动Erlang虚拟机和RabbitMQ应用:
rabbitmq-server start -detached
- 关闭RabbitMQ应用:
rabbitmqctl stop_app
- 执行如下命令加入集群:
# 指示节点成为指定节点所在集群的成员,在加入集群之前节点要stop_app,并且要reset
# rabbitmqctl join_cluster seed-node [--ram|--disc] 指定加入集群的节点是ram类型还是disc,默认disc
# 节点离开集群,可以使用rabbitmqctl reset或rabbitmqctl -n rabbit@rabbit1 forget_cluster_node rabbit@rabbit3
# rabbit@rabbit1为要离开集群中的一个节点,rabbit@rabbit3为当前节点
rabbitmqctl join_cluster rabbit@rabbit1
- 启动RabbitMQ应用:
rabbitmqctl start_app
- 在任意一个节点上执行设置镜像模式命令
# 设置集群为镜像队列
# rabbitmqctl set_policy [-p vhost] [--priority priority] [--apply-to apply-to] {name} {pattern} {definition}
rabbitmqctl set_policy -p / --priority 0 --apply-to queues ha-all "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
- 查看已经添加的策略
rabbitmqctl list_policies
常用操作命令
- 集群相关操作命令
# 设置集群名称
rabbitmqctl set_cluster_name rabbit@rabbit_cluster
#重命名节点名称
rabbitmqctl rename_cluster_node oldnode1 newnode1 [oldnode2 newnode2] [oldnode3 newnode3...]
# 删除集群上指定的节点,删除是远程端点必须rabbitmqctl stop_app
# --offline 启用从脱机节点删除节点。这只在所有节点都脱机并且最后一个要关闭的节点无法联机的情况下才有用,
# 从而阻止整个集群启动。它不应该在任何其他情况下使用,因为它可能导致不一致
# rabbitmqctl -n rabbit@rabbit1 forget_cluster_node rabbit@rabbit3 在其它节点上操作,从节点rabbit@rabbit1删除节点rabbit@rabbit3
rabbitmqctl forget_cluster_node NodeName [--offline]
# 指示已加入集群的节点上线后联系clusternode,这不同于join_cluster,因为它不加入任何集群,
# 它会检查clusternode已经以集群的形式存在于集群中了
# 需要这个命令的动机是当节点离线时,集群可以变化.考虑这样的情况,节点A和节点B都在集群里边,
# 这里节点A掉线了,C又和B集群了,然后B又离开了集群.当A醒来的时候,它会尝试联系B,
# 但这会失败,因为B已经不在集群中了.update_cluster_nodes -n A C 可解决这种场景
# rabbitmqctl update_cluster_nodes clusternode
rabbitmqctl update_cluster_nodes -n rabbit@A rabbit@B rabbit@C
# 查看集群状态
rabbitmqctl cluster_status
# 更改集群节点类型
rabbitmqctl change_cluster_node_type [disk|ram]
- 清空节点的状态,并将其恢复到空白状态
# 表示设置RabbitMQ节点为原始状态。会从该节点所属的cluster中都删除,从管理数据库中删除所有数据,例如配置的用户和vhost,还会删除所有的持久消息。
# 要想reset和force_reset操作执行成功,RabbitMQ应用需要处于停止状态,即执行过 rabbitmqctl stop_app
rabbitmqctl reset
# 表示强制性地设置RabbitMQ节点为原始状态。它和reset的区别在于,可以忽略目前管理数据库的状态和cluster的配置,无条件的reset。
# 虽然会忽略目前管理的mnesia数据库和cluster配置,但是会删除掉当前节点的mnesia数据库配置和cluster配置,集群中的其它节点需要使用rabbitmqctl forget_cluster_node rabbit@hostname
# 该方法的使用,应当用在当数据库或者cluster配置损坏的情况下作为最后的方法。
rabbitmqctl force_reset
- 查看节点的日志
##日志存放在/var/log/rabbitmq目录下
tail -f /var/log/rabbitmq/rabbit\@rabbit3.log
- 环境变量和配置文件默认位置在
##配置文件
/etc/rabbitmq/rabbitmq.conf
#经典配置文件
/etc/rabbitmq/advanced.config
##环境变量配置文件
/etc/rabbitmq/rabbitmq-env.conf
##cookie地址
/var/lib/rabbitmq/.erlang.cookie
##mnesia数据库地址
/var/lib/rabbitmq/mnesia/
# 插件地址
/usr/lib/rabbitmq/lib/rabbitmq_server-3.8.1/plugins
##日志位置
/var/log/rabbitmq/rabbit\@rabbit1.log