部署计划
- 由三台机器搭建rabbitMQ高可用集群。分别为A机器、B机器、C机器
- A、B、C机器分别执行下文中,单机器搭建步骤 搭建3台可以运行的rabbitmq
单机器搭建步骤
安装环境须知
- ==本安装文档基于CentOS 7.3.1611==
==安装过程需要用到root账户权限(sudo),请先新建用户赋予sudo权限==
==确保可以打开以下端口(如果未开放可能导致rabbitmq无法运行)==
端口 | 描述 |
---|---|
4369 | RabbitMQ节点和CLI工具使用的对等发现服务 |
5672 | AMQP 0-9-1和1.0客户端使用没有和使用TLS |
25672 | 用于节点间和CLI工具通信, 除非确实需要这些端口上的外部连接(例如、集群) 否则不应公开这些端口。有关详情, 请参阅网络指南 |
15672 | HTTP API客户端,管理UI和rabbitmqadmin(仅当启用了管理插件时) 。如果不使用web-ui,此端口不需要开放 |
新建linux用户
# root用户登录
# 创建用户组
groupadd rabbit
# 创建用户
useradd rabbit -g rabbit
# 为用户创建密码
passwd rabbit
# 修改suduers文件,赋予用户sudo权限
# root用户直接执行
visudo
# 在 "root ALL=(ALL) ALL" 这行下面新增一行
rabbit ALL=(ALL) ALL
# 保存退出
:wq
安装
自行去下载,下载时需要注意版本的支持 ,下载地址如下
https://github.com/rabbitmq/erlang-rpm/releases
https://github.com/rabbitmq/rabbitmq-server/releases
安装 Erlang / OTP
在安装RabbitMQ之前,必须安装受支持的Erlang / OTP 版本 ,这里我们使用已经下载好的rpm包。将erlang-21.0.3-1.el7.centos.x86_64.rpm放置到服务器上之后,使用ROOT用户安装
# 这里使用root用户
# 到根目录
cd /
# 新建文件夹,用来放置安装包,将下载的安装包放入setup文件夹
mkdir setup
# 切换 rabbit 用户
sudo yum install -y erlang-21.0.3-1.el7.centos.x86_64.rpm
# 安装完成之后会显示 Complete!
安装rabbitmq-server
# 同样在setup目录下 使用rabbit用户执行
sudo yum install -y rabbitmq-server-3.7.7-1.el7.noarch.rpm
# 显示 Complete! 安装完成
运行rabbitmq
使用root用户
# 默认情况下,在安装RabbitMQ服务器软件包时,服务器不会作为守护程序启动。在系统引导时,默认情况下以管理员身份运行时启动守护程序
systemctl enable rabbitmq-server.service
# 启动rabbitMQ
/sbin/service rabbitmq-server start
rabbitmq 在运行时,会新建一个rabbitmq系统用户。rabbitmq由rabbitmq用户运行。
# 查看rabbitMQ 状态
rabbitmqctl status
集群搭建
==NOTE: A、B、C三台机器均需执行。==
使用root用户登录
- 修改host文件。似的两台机器能够相互发现
RabbitMQ节点使用域名称相互通信.
若主机名不可修改,请参考http://www.rabbitmq.com/clustering.html#hostname-resolution-requirement进行配置
登录A机器
# 修改 hosts 文件 ,新增
vi /etc/hosts
A机器IP rabbitmq-node1
B机器IP rabbitmq-node2
C机器IP rabbitmq-node3
# 修改 hostname 文件,新增 abbitmq-node1
vi /etc/hostname
rabbitmq-node1
# 修改 network 文件, 新增 HOSTNAME=abbitmq-node1
vi /etc/sysconfig/network
HOSTNAME=abbitmq-node1
登录B机器
# 修改 hosts 文件 ,新增
vi /etc/hosts
A机器IP rabbitmq-node1
B机器IP rabbitmq-node2
C机器IP rabbitmq-node3
# 修改 hostname 文件,新增 abbitmq-node2
vi /etc/hostname
rabbitmq-node2
# 修改 network 文件, 新增 HOSTNAME=abbitmq-node2
vi /etc/sysconfig/network
HOSTNAME=abbitmq-node2
登录C机器
# 修改 hosts 文件 ,新增
vi /etc/hosts
A机器IP rabbitmq-node1
B机器IP rabbitmq-node2
C机器IP rabbitmq-node3
# 修改 hostname 文件,新增 abbitmq-node3
vi /etc/hostname
rabbitmq-node2
# 修改 network 文件, 新增 HOSTNAME=abbitmq-node3
vi /etc/sysconfig/network
HOSTNAME=abbitmq-node3
修改完之后重启机器
- 修改cookie文件,使得部署rabbitmq的机器cookie文件相同
使用A机器的cookie文件,将A机器的cookie文件复制到B机器的 /var/lib/rabbitmq/目录下
cookie通常位于 /var/lib/rabbitmq/.erlang.cookie
此文件使用 ll -a可以观察到。
# 在B机器执行
# 停止服务
rabbitmqctl stop_app
# 重置节点
rabbitmqctl reset
------
ps:
如果在操作过程中报错,请使用 ps -ef| grep rabbitmq 命令查看rabbitmq相关进程,并使用kill结束进程。重新操作一遍。
------
# 在A机器执行
[root@localhost rabbitmq]# cd /var/lib/rabbitmq/
[root@localhost rabbitmq]# ll -a
[root@localhost rabbitmq]# scp .erlang.cookie B机器root用户@B机器IP:/var/lib/rabbitmq/
# 输入B机器的root用户密码
B机器root用户@B机器IP's password:
.erlang.cookie
[root@localhost rabbitmq]# scp .erlang.cookie C机器root用户@C机器IP:/var/lib/rabbitmq/
# 输入C机器的root用户密码
C机器root用户@C机器IP's password:
.erlang.cookie
NOTE: 注意.erlang.cookie文件所属用户组,所属用户,应都为rabbitmq
将B机器rabbitmq加入A机器集群
在B机器执行以下命令:
rabbitmqctl join_cluster rabbit@rabbitmq-node1
在C机器执行
rabbitmqctl join_cluster rabbit@rabbitmq-node1
高可用配置
执行此步需先新建vhost 为AAA的虚拟机。# 在A机器上执行此命令,给vhost为 AAA 的所有的队列配置镜像队列 rabbitmqctl set_policy -p 'AAA' --priority 9 --apply-to all ecas-ha "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
安全考虑因素
RabbitMQ新建用户
A机器执行即可
当服务器首次开始运行会初始化一个账户
- 一个名为/的虚拟主机
- 名为guest的用户,其默认密码为 guest,授予对/ virtual host的完全访问权限
为了安全起见,要删除这个默认用户,并新建使用的用户。(命令参考)
删除guest用户
rabbitmqctl delete_user guest
新建用户 aaa 密码为 aaa
rabbitmqctl add_user aaa aaa
新建虚拟机
新建名为 ecas 的虚拟机
rabbitmqctl add_vhost aaa
授予aaa用户访问 aaa虚拟机的权限
rabbitmqctl set_permissions -p aaa aaa".*" ".*" ".*"
查看有权限访问的用户
rabbitmqctl list_permissions -p ecas
web管理界面
如果需要有后台操作管理rabbitmq的需要,执行以下命令
==NOTE: 此操作需要开放15672 端口==
rabbitmq-plugins enable rabbitmq_management
开启管理界面之后,还需要为用户设置可访问管理界面的权限
# 这里赋予用户 aaa管理员的权限
rabbitmqctl set_user_tags aaa administrator
加入自启
- 新建脚本文件
vi rabbitRun.sh
- 新增脚本内容
#!/bin/bash
echo "The rabbitmq will be runs! waiting~~~~~~~~~~~~"
/sbin/service rabbitmq-server start
- 保存退出
:wq
- 使脚本具有执行权限
chmod +x ./rabbitRun.sh
- 将脚本加入自启
vi /etc/rc.d/rc.local
- 在文档末尾添加
sh 脚本所在路径/rabbitRun.sh
- 保存退出
:wq
备份策略
备份方法这里采用人工通过web-ui手动备份元数据的的方式(即 用户,vhost,队列,交换,绑定,运行时参数 ),如果未开启web管理界面请参考更多备份方式,如果要备份消息请参考官网。
- 访问 http://A机器的IP:15672/
- 在Overview选项下点击Export definitions
- 点击Download broker definitions 即可把备份导出到本地
- 导入备份只需要点击下方的Import definitions选择导出的文件即可
与spring、springBoot整合
与spring整合使用spring提供的spring-amqp
导入依赖,在pom中添加
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency>
在resources新建下新建rabbit-context.xml
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rabbit="http://www.springframework.org/schema/rabbit" xsi:schemaLocation="http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <rabbit:connection-factory id="connectionFactory" addresses="A机器ip:5672,B机器IP:5672,C机器ip:5672" username="ecas" password="ecas" virtual-host="ecas" channel-cache-size="50" /> <rabbit:template id="amqpTemplate" connection-factory="connectionFactory" /> </beans>
如果是springBoot,需要在Application.java 中添加
@ImportResource("classpath:rabbit-context.xml")
如果是spring,需要在web.xml中声名rabbit-context.xml
具体的用法以及相关设置请参考http://spring.io/projects/spring-amqp