消息列队课题

2019-06-17

安装叙述

  • 最近部门小组在学习消息队列的搭建的课题,在网上看了一些介绍,最后决定使用比较流行的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

image

安装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

image

  • 成功后执行 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 ".*" ".*" ".*"
  • 使用新增用户登陆如下

image

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个内存节点

image

总结

单机安装总结:

  • erlang模块版本要和rabbitmq版本匹配
  • erlang模块依赖较多,出错要细心排查
  • rabbitmq如果使用IP访问默认账户是限制登录,需要新增账号
  • rabbitmq在web下使用IP地址不能访问,如果MQ服务启动正常的情况下,请检查防火墙是否信任MQ的端口或者直接禁止防火墙

集群安装总结:

  • 配置rabbitmq集群前,请确认rabbitmq单机版是否能正常启动和关闭
  • 修改服务器的主机名称hostname记得重启服务器
  • 请检查防火墙是否关闭,或者添加已信任的端口
  • 修改hosts文件后,记得使用ping校验网络是否畅通
  • 连接集群前,先启动rabbitmq,然后使用rabbitmqctl_stop_app停止,再使用rabbitmqctl_join_