消息列队课题
安装叙述
- 最近部门小组在学习消息队列的搭建的课题,在网上看了一些介绍,最后决定使用比较流行的RabbitMQ。
- 相关介绍可参考:https://cloud.tencent.com/developer/article/1006035
- 搭建RabbitMQ需要erlang环境,课题要求不允许用dock和yum安装,所以需要到官网分别下载RabbitMQ的rpm包和erlang压缩包到本地安装。
RabbitMQ单机安装
安装要求
- RabiitMQ和erlang版本有对应要求,到rabbitmq官网 查看对应结果如下:
RabbitMQ版本 | Erlang最低要求 | Erlang最高要求 |
---|---|---|
3.7.7 - 3.7.15 | 20.3.x | 21.x |
3.7.0 - 3.7.6 | 19.3 | 20.3.x |
最后我分别下载的 rabbitmq-server-3.7.15-1.el7.noarch.rpm otp_src_20.3.tar.gz
安装Erlang
- 安装依赖环境
[root@localhost ~]# yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel rsync perl-net-snmp wx fop net-snmp unixODBC unixODBC-devel vim make lrzsz bc sysstat lsof wget xz ncurses-devel
- 安装erlang otp 20.3
# 新建目录
[root@localhost ~]# mkdir -p /home/rabbitmq/things
# 将下载好的安装包上传到文件目录,然后进入文件目录
[root@localhost ~]# cd /home/rabbitmq/things
# 解压
[root@localhost things]# tar xvf otp_src_20.3.tar.gz
# 进入安装目录
[root@localhost things]# cd otp_src_20.3
# 配置并检查依赖,Erlang 默认安装路径为 /usr/local/lib/erlang
[root@localhost otp_src_20.3]# ./configure --prefix=/usr/local/lib/erlang
# 编译安装
[root@localhost otp_src_20.3]# make install
# 加入环境变量
[root@localhost otp_src_20.3]# cat >>/etc/profile<<EOF
export PATH=$PATH:/usr/local/lib/erlang/bin
EOF
# 让当前环境变量生效
[root@localhost otp_src_20.3]# source /etc/profile
# 验证erlang环境
[root@localhost things]erl
- 成功后执行 halt(). 退出
安装rabbitmq 3.7.15
# 回到文件目录
cd /home/rabbitmq/things
# 安装epel源
[root@localhost things]# yum -y install epel-release
# 安装socat
[root@localhost things]# yum -y install socat
# 安装rabbitmq,记得加上 --nodeps 不然会报错
[root@localhost things]# rpm -ivh abbitmq-server-3.7.15-1.el7.noarch.rpm --nodeps --force
# rabbitmq加入环境变量
[root@localhost tools]# cat >>/etc/profile<<EOF
export PATH=$PATH:/usr/lib/rabbitmq/bin
EOF
# 让当前环境变量生效
[root@localhost things]# source /etc/profile
# 开启rabbitmq web管理功能
[root@localhost things]# rabbitmq-plugins enable rabbitmq_management
# 设置成服务化启动
[root@localhost things]# systemctl enable rabbitmq-server
# 设置开机自动启动
[root@localhost things]# chkconfig rabbitmq-server on
# 启动rabbitmq
[root@localhost things]# rabbitmq-server start
# 停止rabbitmq
[root@localhost things]# rabbitmqctl stop_app
# 停止erlang节点
[root@localhost things]# rabbitmqctl stop
# 配置防火墙端口
[root@localhost things]# firewall-cmd --zone=public --add-port=15672/tcp --permanent
[root@localhost things]# firewall-cmd --zone=public --add-port=5672/tcp --permanent
# 重启防火墙服务
[root@localhost things]#systemctl restart firewalld.service
RabbitMQ常用命令
- 启动监控管理器:rabbitmq-plugins enable rabbitmq_management
- 关闭监控管理器:rabbitmq-plugins disable rabbitmq_management
- 启动rabbitmq:rabbitmq-service start
- 关闭rabbitmq:rabbitmq-service stop
- 查看所有的队列:rabbitmqctl list_queues
- 清除所有的队列:rabbitmqctl reset
- 关闭应用:rabbitmqctl stop_app
- 启动应用:rabbitmqctl start_app
- 用户和权限设置
- 添加用户:rabbitmqctl add_user username password
- 分配角色:rabbitmqctl set_user_tags username administrator
- 新增虚拟主机:rabbitmqctl add_vhost vhost_name
- 将新虚拟主机授权给新用户:rabbitmqctl set_permissions -p vhost_name username ‘.’ ‘.’ ‘.*’
- 角色说明
- none 最小权限角色
- management 管理员角色
- policymaker 决策者
- monitoring 监控
- administrator 超级管理员
访问rabbitmq web管理界面
- rabbitmq默认的账(guest/guest)号只能在localhost:15672 本地地址才能正常访问
-
可以通过修改rabbiqmq.config调整,本次实验没有配置,等需要定制复杂应用时,再使用配置文件通过新建账号,可以正常登陆管理页面
- 新增rabbitmq账号
# 添加新的vhost名称
[root@localhost things]# rabbitmqctl add_vhost new_vhost
# 新增账号为pzy 密码为 123456
[root@localhost things]# rabbitmqctl add_user pzy ‘123456’
# 设置用户角色
[root@localhost things]# rabbitmqctl set_user_tags pzy administrator
# 设置用户权限
[root@localhost things]# rabbitmqctl set_permissions -p new_vhost pzy ".*" ".*" ".*"
- 使用新增用户登陆如下
RabbitMQ集群安装
rabbitmq集群安装叙述
- rabbitmq集群安装有两种模式,普通模式(默认)和镜像模式;rabbitmq节点有2种,磁盘模式和内存模式,一个集群内必须存在一个节点是磁盘模式,否则无法做持久化设置,在这里测试3个节点,设置2个内存节点和1个磁盘节点。
安装普通集群准备工作
- 准备3台已安装rabbitmq单机版的服务器
- 分别设置3台服务器的ip:
192.168.160.128
192.168.160.129
192.168.160.130
- 设置主机hostname
rabbitmq-naode1
rabbitmq-naode2
rabbitmq-naode3
- 添加对应关系
192.168.160.128:rabbitmq-naode1
192.168.160.129:rabbitmq-naode2
192.168.160.130:rabbitmq-naode3
# 进入编辑模式,然后不同服务器设置不同的hostname,设置好后使用重启命令reboot重启服务器才生效
[root@rabbitmq-node1 ~]# vi /etc/hostname
# 查看设置好的hostname
[root@rabbitmq-node1 ~]# cat /etc/hostname
rabbitmq-node1
- 设置hosts文件,让3台服务器互相之间能互通,3台服务器配的hosts配置相同
# 进入hosts文件
[root@rabbitmq-node1 ~]# vi /etc/hosts
# 查询hosts文件配置
[root@rabbitmq-node1 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.160.128 rabbitmq-node1
192.168.160.129 rabbitmq-node2
192.168.160.130 rabbitmq-node3
# 使用ping 命令检查是否能正常通讯
[root@rabbitmq-node1 ~]# ping rabbitmq-node1
PING rabbitmq-node1 (192.168.160.128) 56(84) bytes of data.
64 bytes from rabbitmq-node1 (192.168.160.128): icmp_seq=1 ttl=64 time=0.029 ms
64 bytes from rabbitmq-node1 (192.168.160.129): icmp_seq=2 ttl=64 time=0.024 ms
64 bytes from rabbitmq-node1 (192.168.160.130): icmp_seq=3 ttl=64 time=0.053 ms
- 在此为了方便实验,可以关闭防火墙
# 关闭防火墙服务
[root@rabbitmq-node1 ~]# systemctl stop firewalld.service
# 开机禁止防火墙启动
[root@rabbitmq-node1 ~]# systemctl disable firewalld.service
同步.erlang.cookie内容
- .erlang.cookie文件内容相当于rabbitmq集群通讯的秘钥,必须保持一致
- 把rabbitmq-node1服务器的.erlang.cookie复制到另外2台
- .erlang.cookie文件路径默认在 /var/lib/rabbitmq/.erlang.cookie,如果用root编译安装则在/root/.erlang.cookie
# 查看root@rabbitmq-node1(192.168.160.128)的内容
[root@rabbitmq-node1 ~]# cat /root/.erlang.cookie
BFBLAAGYNTKFOHJOIAAT[root@rabbitmq-node1 ~]#
# 查看root@rabbitmq-node2(192.168.160.129)的内容与128一致
[root@rabbitmq-node2 ~]# cat /root/.erlang.cookie
BFBLAAGYNTKFOHJOIAAT[root@rabbitmq-node2 ~]#
# 查看root@rabbitmq-node3(192.168.160.130)的内容与128一致
[root@rabbitmq-node3 ~]# cat /root/.erlang.cookie
BFBLAAGYNTKFOHJOIAAT[root@rabbitmq-node3 ~]#
配置rabbitmq普通集群
- 进入rabbitmq-node1
# 新增一个rabbitmq.conf配置文件后续可以根据需要来配置此文件
[root@rabbitmq-node1 ~]# vi /etc/rabbitmq/rabbitmq.conf
# 新增一个rabbitmq-env.conf 环境配置文件,设置RABBITMQ_NODE_IP_ADDRESS=
[root@rabbitmq-node1 ~]# vi /etc/rabbitmq/rabbitmq-env.conf
# 查看rabbitmq-env.conf 环境配置信息,注意如果不设置此配置rabbitmq会启动失败
RABBITMQ_NODE_IP_ADDRESS配置:空字符串,意味着它应该绑定到所有网络接口
[root@rabbitmq-node1 ~]# cat /etc/rabbitmq/rabbitmq-env.conf
RABBITMQ_NODE_IP_ADDRESS=
# 启动rabbitmq
[root@rabbitmq-node1 ~]# rabbitmq-server start
- 详细rabbitmq.conf可以参考https://github.com/rabbitmq/rabbitmq-server
- 进入rabbitmq-node2
# 新增一个rabbitmq.conf配置文件后续可以根据需要来配置此文件
[root@rabbitmq-node2 ~]# vi /etc/rabbitmq/rabbitmq.conf
# 新增一个rabbitmq-env.conf 环境配置文件,设置RABBITMQ_NODE_IP_ADDRESS=
[root@rabbitmq-node2 ~]# vi /etc/rabbitmq/rabbitmq-env.conf
# 启动rabbitmq
[root@rabbitmq-node2 ~]# rabbitmq-server start &
# 停止rabbitmq
[root@rabbitmq-node2 ~]# rabbitmqctl stop_app
# 加入集群,注意:--ram是内存模式 --disc是磁盘模式(默认)
rabbitmqctl join_cluster --ram rabbit@rabbitmq-node1
# 启动
[root@rabbitmq-node2 ~]# rabbitmqctl start_app
- rabbitmq-node3按照rabbitmq-node3的步骤执行即可
新增rabbitmq web登录账户并验证
# 新增账号密码
[root@rabbitmq-node1 ~]# rabbitmqctl add_user admin admin
# 设置角色
[root@rabbitmq-node1 ~]# rabbitmqctl set_user_tags admin administrator
# 设置权限
[root@rabbitmq-node1 ~]# rabbitmqctl set_permissions admin ".*" ".*" ".*"
- 在本地浏览器输入http://192.168.160.128:15672
- 使用admin账号登陆,成功看到1个磁盘节点,2个内存节点
总结
单机安装总结:
- erlang模块版本要和rabbitmq版本匹配
- erlang模块依赖较多,出错要细心排查
- rabbitmq如果使用IP访问默认账户是限制登录,需要新增账号
- rabbitmq在web下使用IP地址不能访问,如果MQ服务启动正常的情况下,请检查防火墙是否信任MQ的端口或者直接禁止防火墙
集群安装总结:
- 配置rabbitmq集群前,请确认rabbitmq单机版是否能正常启动和关闭
- 修改服务器的主机名称hostname记得重启服务器
- 请检查防火墙是否关闭,或者添加已信任的端口
- 修改hosts文件后,记得使用ping校验网络是否畅通
- 连接集群前,先启动rabbitmq,然后使用rabbitmqctl_stop_app停止,再使用rabbitmqctl_join_