RabbitMQ-HA搭建-部署

部署计划

  • 三台机器搭建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用户登录

  1. 修改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

修改完之后重启机器

  1. 修改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
  1. 将B机器rabbitmq加入A机器集群

    在B机器执行以下命令:

    rabbitmqctl join_cluster rabbit@rabbitmq-node1

    在C机器执行

    rabbitmqctl join_cluster rabbit@rabbitmq-node1
  2. 高可用配置
    执行此步需先新建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.bootgroupId> 
    <artifactId>spring-boot-starter-amqpartifactId>   
    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

你可能感兴趣的:(RabbitMQ)