rabbitmq有3种模式,集群模式2种
• 单机模式:即单机情况不做集群,就单独运行一个rabbitmq而已。
• 普通模式:默认模式,以两个节点(rabbit01、rabbit02)为例来进行说明。对于Queue来说,消息实体只存在于其中一个节点rabbit01(或者rabbit02),rabbit01和rabbit02两个节点仅有相同队列的结构。当消息进入rabbit01节点的Queue后,consumer从rabbit02节点消费时,RabbitMQ会临时在rabbit01、rabbit02间进行消息传输,把A中的消息实体取出并经过B发送给consumer。
当rabbit01节点故障后,rabbit02节点无法取到rabbit01节点中还未消费的消息实体。如果做了消息持久化,那么得等rabbit01节点恢复,然后才可被消费;如果没有持久化的话,就会产生消息丢失的现象。
• 高可用模式:把需要的队列做成镜像队列,存在与多个节点属于RabbitMQ的HA方案。该模式解决了普通模式中的问题,其实质和普通模式不同之处在于:消息实体会主动在镜像节点间同步,而不是在客户端取数据时临时拉取。该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉。所以在对可靠性要求较高的场合中适用。
单机模式安装
离线安装包官网下载地址:http://www.rabbitmq.com/download.html
官网安装文档:http://www.rabbitmq.com/install-debian.html
RabbitMQ需要运行Erlang / OTP。标准Debian和Ubuntu中的Erlang / OTP包也可能相当过时。考虑到离线安装依赖包比较麻烦,本文采用标准Ubuntu安装。
注: Erlang是一种通用的面向并发的编程语言,它由瑞典电信设备制造商爱立信所辖的CS-Lab开发,目的是创造一种可以应对大规模并发活动的编程语言和运行环境
注:本文的所有安装部署均在root用户下执行。
- 安装erlang环境
a) 在线安装(推荐)
sudo apt-get install -y erlang-nox erlang-dev erlang-src
sudo apt-get intstall –f erlang
b) 离线安装(遇到问题,暂未解决)
# 安装依赖包
sudo apt-get install gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel
# 解压otp 包
tar -zxvf otp_src_19.0.tar.gz
# 配置
cd otp_src_19.0
./configure --prefix=/usr/local/erlang --with-ssl -enable-threads -enable-smmp-support -enable-kernel-poll --enable-hipe --without-javac
# 安装
make
make install
可能会报错
configure: error: No curses library functions found configure: error: /bin/sh '/home/liyixiang/erlang/configure' failed for erts
原因:缺少ncurses依赖包
解决(笔者试过,实际上没有解决问题)
apt-cache search ncurses
apt-get install libncurses5-dev
- 安装rabbitmq-server
a) 离线安装(推荐)
准备rabbitmq-server-generic-unix-3.6.10.tar.xz
# 解压即可
tar -xvf rabbitmq-server-generic-unix-3.6.10.tar.xz
# 目录名字太长,建议改短一点
mv rabbitmq_server-3.6.10 rabbitmq-3.6.10
b) 在线安装
# 执行以下命令将APT存储库添加到/etc/apt/sources.list.d中:
echo 'deb http://www.rabbitmq.com/debian/ testing main' | sudo tee /etc/apt/sources.list.d/rabbitmq.list
# 请注意,这行中的testing是指我们发布的RabbitMQ的状态,而不是任何特定的Debian发行版,您可以使用Debian稳定,测试或不稳定以及Ubuntu,我们将该版本描述为“测试“,强调我们稍微放松一些。
#(可选)要避免有关未签名包的警告,请使用apt-key(8)将我们的公钥添加到您的信任密钥列表中 :
wget -O- https://www.rabbitmq.com/rabbitmq-release-signing-key.asc |
sudo apt-key add –
#运行以下命令更新程序包列表:
sudo apt-get update
# Install rabbitmq-server package:
sudo apt-get install rabbitmq-server
- 配置erlang和rabbitmq环境变量
sudo vi /etc/profile
文件底部加入以下内容
#set rabbitmq environment
RABBITMQ_HOME=/opt/rabbitmq-3.6.10
export PATH=$PATH: $RABBITMQ_HOME/sbin
#set erlang environment
ERLANG_HOME=/opt/otp_src_19.3
PATH=$PATH: $ERLANG_HOME/bin
- 至此,已经安装完毕。以下是常用命令
#启动Erlang node和Rabbit应用:
./sbin/rabbitmq-server
#后台启动Rabbit node
./sbin/rabbitmq-server –detached
# 启用web管理界面,语法rabbitmq-plugins enable xxx
./sbin/rabbitmq-plugins enable rabbitmq_management
# 添加用户rabbitmq,密码为rabbitmq
./sbin/rabbitmqctl add_user rabbitmq rabbitmq
#列出所有用户
./sbin/rabbitmqctl list_users
# 设置用户的管理员权限
./sbin/rabbitmqctl set_user_tags rabbitmq administrator
#设置用户的管理员权限,语法set_permissions [-pvhostpath] {user} {conf} {write} {read}
./sbin/rabbitmqctl set_permissions -p / rabbitmq '.*' '.*' '.*'
# 测试连接
wget http://127.0.0.1:15672/
# 关闭整个节点,包括应用
./sbin/rabbitmqctl stop
#仅关闭应用
./sbin/rabbitmqctl stop_app
#启动应用
./sbin/rabbitmqctl start_app
#获取服务器状态信息
./sbin/rabbitmqctl status
# 关闭插件,语法rabbitmq-plugins disable xxx,eg.
./sbin/rabbitmq-plugins disable rabbitmq_management
更多的命令可以查看官网文档:http://www.rabbitmq.com/manpages.html
管理员页面
http://127.0.0.1:15672/
配置文件与日志文件目录(管理员页面可查看)
Config file: /opt/rabbitmq-3.6.10/etc/rabbitmq/rabbitmq.config (not found)
Database directory: /opt/rabbitmq-3.6.10/var/lib/rabbitmq/mnesia/rabbit@vm1
Log file:/opt/rabbitmq-3.6.10/var/log/rabbitmq/rabbit@vm1.log
SASL log file:/opt/rabbitmq-3.6.10/var/log/rabbitmq/rabbit@vm1-sasl.log
普通模式集群(单机上的集群)
普通模式集群官网安装文档:http://www.rabbitmq.com/clustering.html
在某些情况下,在单台计算机上运行一组RabbitMQ节点可能非常有用。这通常对于在台式机或笔记本电脑上进行群集测试而无需为群集启动多个虚拟机的开销就很有用
为了在单台计算机上运行多个RabbitMQ节点,有必要确保节点具有不同的节点名称,数据存储位置,日志文件位置,并绑定到不同的端口,包括插件使用的端口(可以参考官网的配置引导中的
RABBITMQ_NODENAME、RABBITMQ_NODE_PORT和 RABBITMQ_DIST_PORT参数设置)
1. 进入安装目录下的sbin目录,以下所有命令都在sbin目录下执行。
cd /opt/rabbitmq-3.6.10/sbin
2. 执行命令启动不同端口的节点。
RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" RABBITMQ_NODENAME=rabbit1 ./rabbitmq-server –detached
RABBITMQ_NODE_PORT=5674 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15674}]" RABBITMQ_NODENAME=rabbit2 ./rabbitmq-server -detached
3. 此时已经启动了两个节点rabbit1和rabbit2,分别在两个集群,现在只需要把rabbit2加入到rabbit1集群就形成了一个集群两个节点了,在加入集群之前需要停止rabbitmq应用,加入成功再启动rabbitmq应用。
rabbitmqctl -n rabbit2 stop_app
rabbitmqctl -n rabbit2 join_cluster rabbit1@vm1
rabbitmqctl -n rabbit2 start_app
注:rabbit1@vm1的格式是“节点名@主机名”,其中主机名可以在/etc/hostname修改,最好在安装rabbitmq-server前修改,否则可能引起问题。
普通模式集群(真实集群)
安装原理
- 主机名配置
所有集群成员的主机名必须从所有集群节点以及可在其上使用诸如rabbitmqctl等命令行工具的机器进行解析 ,因此需要配置主机所有集群节点的主机名。主机名解析可以使用任何标准操作系统提供的方法:
DNS记录
本地主机文件(例如/ etc / hosts),本文使用该方式。
在更严格的环境中,DNS记录或主机文件修改很可能是受限的,Erlang VM可以配置为使用备用主机名解析方法,如备用DNS服务器,本地文件,非标准主机文件位置,或混合的方法。这些方法可以与标准的OS主机名解析方法效果是一致的。
注:如果需要使用完全限定名称,需要修改rabbitmq-env.conf 配置文件。
#当设置为true时,这将导致RabbitMQ使用完全限定名称来标识节点。
#这可能对EC2有用。请注意,在不重置节点的情况下,无法在使用短名称和长名称之间进行切换(也就是设置完毕后需要重启节点)。
RABBITMQ_USE_LONGNAME=true
节点(和CLI工具)如何相互验证:Erlang Cookie
RabbitMQ节点和CLI工具(例如,rabbitmqctl)使用cookie来确定它们是否被允许相互通信。为了使两个节点能够进行通信,它们必须具有称为Erlang cookie的相同共享密钥。Cookie只是一串字母数字字符。它可以是你想要的长或短。每个群集节点必须具有相同的cookie。
当RabbitMQ服务器启动时,Erlang VM将自动创建一个随机cookie文件。最简单的方法是允许一个节点创建文件,然后将其复制到集群中的所有其他节点。
在Unix系统上,cookie通常位于/var/lib/rabbitmq/.erlang.cookie(采用在线安装) 或$HOME/.erlang.cookie(采用解压的方式安装),本文推荐采用的是解压方式安装,因此可以使用SCP命令复制某节点的cookie文件到别的节点上。集群可以通过多种方式形成:
a) 使用rabbitmqctl命令人工配置(例如在开发环境中,本文采用此法)
b) 通过在配置文件中列出集群节点来声明性地说明
c) 使用rabbitmq-autocluster(插件)声明性地
安装步骤
本文分别在192.168.253.133(vm1)和192.168.253.134(vm2)两台虚拟机上安装了单机版的rabbitmq,步骤参考单机模式安装。现在我们把vm2的集群加入到vm1形成一个集群包含rabbit@vm1和rabbit@vm2两个节点即可完成部署。
- 主机文件修改
# 修改vm1和vm2的hosts文件
sudo nano /etc/hosts
# 修改如下,保存即可
127.0.0.1 localhost
192.168.253.133 vm1
192.168.253.134 vm2
# 重启服务时其生效
sudo/etc/init.d/networking restart
- 设置一致的cookie
# 使用Erlang命令在vm1设置cookie
erl -name rabbit@vm1 --setcookie 123456789
# 使用Erlang命令在vm2设置相同的cookie
erl -name rabbit@vm1 --setcookie 123456789
# 在vm1的erl 下设置允许其他节点加入,此处可以指定允许的节点,即net_kernel:allow([‘rabbit@vm2’]). 本文设置允许任何节点加入:
net_kernel:allow([]).
- 现在我们要把vm2的节点加入到vm1,首先确保所有节点的rabbitmq服务已启动。
#关闭vm2的rabbitmq应用
./sbin/rabbitmqctl stop_app
#加入vm1集群
./sbin/rabbitmqctl join_cluster -ram rabbit@vm1
#启动vm2的rabbitmq应用
./sbin/rabbitmqctl start_app
#到vm1的机器,查看集群节点vm1状态
./sbin/rabbitmqctl cluster_status
可见,两个节点已经形成了集群。若想加入新的节点,如法炮制,把新节点加入到vm1。
Cluster status of node rabbit@vm1
[{nodes,[{disc,[rabbit@vm1,rabbit@vm2]}]},
{running_nodes,[rabbit@vm1]},
{cluster_name,<<"rabbit@vm1">>},
{partitions,[{rabbit@vm1,[rabbit@vm2]}]},
{alarms,[{rabbit@vm1,[]}]}]
你可能遇到的问题:
Error: operation join_cluster used with invalid parameter: ["-ram", "rabbit@vm1"]
解决:
- 检查所有集群节点的Cookie文件是否一致。有些教程采用远程复制cookie文件,但是文件可能在/var/lib/rabbitmq/.erlang.cookie(采用在线安装) 或$HOME/.erlang.cookie(采用解压的方式安装),注意这点,推荐使用本文的erl命令设置。
- 检查/etc/hosts和/etc/hostname
高可用(镜像)模式集群
高可用模式集群官网安装文档:http://www.rabbitmq.com/ha.html
待续未完。