RabbitMQ安装(单机多节点和多机多节点)及简单使用
前言
因近期安装RabbitMQ时踩到了一些小坑,特意将安装步骤总结下来,希望能帮助到大家避开一些问题。 由于我只有一台服务器,我自己采用的是单机多节点部署,所以单机多节点的问题我会记录下来,多机多节点的仅提供部署方式。
一、安装依赖环境
- 在http://www.rabbitmq.com/which-erlang.html页面查看安装rabbitmq需要安装erlang对应的版本;
- 在https://github.com/rabbitmq/erlang-rpm/releases页面找到需要下载的erlang版本,erlang-*.centos.x86_64.rpm就是centos版本的;
- 复制下载地址后,使用wget命令下载:
wget -P /home/download https://github.com/rabbitmq/erlang-rpm/releases/download/v21.2.3/erlang-21.2.3-1.el7.centos.x86_64.rpm
- 安装 Erlang
sudo rpm -Uvh /home/download/erlang-21.2.3-1.el7.centos.x86_64.rpm
- 若上一步不成功,应该是相应的依赖未下载安装,如我自己的服务器则如下提示此时,我们需要在https://rpmfind.net/linux/rpm2html/search.php?query=&submit=Search%20…&system=&arch=下载上述依赖,将is needed by前面的文本拷入search框中搜索,我本次缺失的依赖下载内容如下
- 将上述依赖下载上传到服务器后,用以下命令执行安装依赖
rpm -ivh {文件} --force
- 安装 socat
sudo yum install -y socat
二、安装RabbitMQ
- 在官方下载页面找到CentOS7版本的下载链接,下载rpm安装包
wget -P /home/download https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.9/rabbitmq-server-3.7.9-1.el7.noarch.rpm
- 安装RabbitMQ
sudo rpm -Uvh /home/download/rabbitmq-server-3.7.9-1.el7.noarch.rpm
此时,RabbitMQ就已经安装完成。
三、启动和关闭
- 启动服务
sudo systemctl start rabbitmq-server
- 查看服务状态
sudo systemctl status rabbitmq-server
- 关闭服务
sudo systemctl stop rabbitmq-server
- 设置开机启动
sudo systemctl enable rabbitmq-server
四、开启Web管理插件
- 开启插件
rabbitmq-plugins enable rabbitmq_management
- 由于rabbitmq有一个默认的guest用户,但只能通过localhost访问,我们需要重新创建一个系统管理员
rabbitmqctl add_user admin admin
- 为用户分配操作权限
rabbitmqctl set_user_tags admin administrator
- 为用户分配资源权限
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
五、防火墙添加端口
RabbitMQ 服务启动后,此时还不能进行外部通信,需要将端口添加防火墙
- 添加端口
sudo firewall-cmd --zone=public --add-port=4369/tcp --permanent
sudo firewall-cmd --zone=public --add-port=5672/tcp --permanent
sudo firewall-cmd --zone=public --add-port=25672/tcp --permanent
sudo firewall-cmd --zone=public --add-port=15672/tcp --permanent
- 重启防火墙
sudo firewall-cmd --reload
六、单机多节点的部署
- 在启动前,先修改RabbitMQ 的默认节点名(非必要),在/etc/rabbitmq/rabbitmq-env.conf增加以下内容
NODENAME=rabbit1
- RabbitMQ 服务默认启动的,单机多节点时需要改为手动启动,先停止运行中的RabbitMQ 服务
sudo systemctl stop rabbitmq-server
- 启动第一个节点
rabbitmq-server -detached
- 启动第二个节点
RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_managementlistener [{port,15673}]" RABBITMQ_NODENAME=rabbit2 rabbitmq-server -detached
提示:执行后提示如下: 并且我在之前执行该命令时,命令错误导致节点未启动成功也会有如上提示,所以需要注意该提示并不能作为启动成功的标识。
- 启动第三个节点
RABBITMQ_NODE_PORT=5674 RABBITMQ_SERVER_START_ARGS="-rabbitmq_managementlistener [{port,15674}]" RABBITMQ_NODENAME=rabbit3 rabbitmq-server -detached
- 将rabbit2节点加入到集群
rabbitmqctl -n rabbit2 stop_app
rabbitmqctl -n rabbit2 reset
rabbitmqctl -n rabbit2 join_cluster rabbit1 --ram
rabbitmqctl -n rabbit2 start_app
- 将rabbit3节点加入到集群
rabbitmqctl -n rabbit3 stop_app
rabbitmqctl -n rabbit3 reset
rabbitmqctl -n rabbit3 join_cluster rabbit1 --ram
rabbitmqctl -n rabbit3 start_app
- 此时三个节点已全部启动完毕,执行
rabbitmqctl cluster_status
执行命令后,若看到有{running_nodes,[rabbit3@node1,rabbit2@node1,rabbit1@node1]}说明节点已启动成功。
- 但此时我再用admin登录管理后台时发现,登录不成功。经过了几分钟挣扎后,我猜测是在部署集群时admin用户被删除了,于是我执行以下命令查看用户
rabbitmqctl list_users
看到如下结果 果然证实了我的猜想,这时我们需要重新添加用户并授权(参考四、开启web管理插件命令),执行完成后就可以正常登陆了。登陆后可以看到,3个节点都添加成功。
七、多机多节点部署
1.环境准备
准备三台安装好RabbitMQ 的机器
- 10.10.10.11
- 10.10.10.12
- 10.10.10.13
2.修改配置文件
- 修改10.10.1.41机器上的/etc/hosts文件
sudo vim /etc/hosts
- 添加IP和节点名
10.10.10.11 node1
10.10.10.12 node2
10.10.10.13 node3
- 修改对应主机的hostname
hostname node1
hostname node2
hostname node3
- 将10.10.10.11上的hosts文件复制到另外两台机器上
sudo scp /etc/hosts root@node2:/etc/
sudo scp /etc/hosts root@node3:/etc/
说明:命令中的root是目标机器的用户名,命令执行后,可能会提示需要输入密码,输入对应用户的密码就行了
- 将10.10.10.11上的/var/lib/rabbitmq/.erlang.cookie文件复制到另外两台机器上
scp /var/lib/rabbitmq/.erlang.cookie root@node2:/var/lib/rabbitmq/
scp /var/lib/rabbitmq/.erlang.cookie root@node3:/var/lib/rabbitmq/
提示:如果是通过克隆的VM,可以省略这一步
3. 防火墙添加端口
给每台机器的防火墙添加端口
- 添加端口
sudo firewall-cmd --zone=public --add-port=4369/tcp --permanent
sudo firewall-cmd --zone=public --add-port=5672/tcp --permanent
sudo firewall-cmd --zone=public --add-port=25672/tcp --permanent
sudo firewall-cmd --zone=public --add-port=15672/tcp --permanent
- 重启防火墙
sudo firewall-cmd --reload
4.启动RabbitMQ
- 启动每台机器的RabbitMQ
sudo systemctl start rabbitmq-server
或者
rabbitmq-server -detached
- 将10.10.10.12加入到集群
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@node1 --ram
rabbitmqctl start_app
- 查看集群状态,看到running_nodes,[rabbit@node1,rabbit@node2]表示节点启动成功提示:在管理界面可以更直观的看到集群信息
rabbitmqctl cluster_status
- 将10.10.10.13加入到集群
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@node1 --ram
rabbitmqctl start_app
- 重复第3步,查看集群状态
rabbitmqctl cluster_status
八、镜像队列模式集群(高可用)
- 进入管理页面 -> Admin -> Policies(在页面右侧)-> Add / update a policy
- 在表单中填入:
name: ha-all
Pattern: ^
Apply to: Queues
Priority: 0
Definition: ha-mode = all
参数说明 name: 策略名称,如果使用已有的名称,保存后将会修改原来的信息 Apply to:策略应用到什么对象上 Pattern:策略应用到对象时,对象名称的匹配规则(正则表达式) Priority:优先级,数值越大,优先级越高,相同优先级取最后一个 Definition:策略定义的类容,对于镜像队列的配置来说,只需要包含3个部分: ha-mode、ha-params和ha-sync-mode。其中,ha-sync-mode是同步的方式,自动还是手动,默认是自动。ha-mode和ha-params组合使用。组合方式如下:
ha-mode | ha-params | 说明 |
---|
all | (empty) | 队列镜像到集群类所有节点 | exactly | count | 队列镜像到集群内指定数量的节点。如果集群内节点数少于此值,队列将会镜像到所有节点。如果大于此值,而且一个包含镜像的节点停止,则新的镜像不会在其它节点创建。 | nodes | nodename | 队列镜像到指定节点,指定的节点不在集群中不会报错。当队列申明时,如果指定的节点不在线,则队列会被创建在客户端所连接的节点上。 |
- 镜像队列模式相比较普通模式,镜像模式会占用更多的带宽来进行同步,所以镜像队列的吞吐量会低于普通模式
- 但普通模式不能实现高可用,某个节点挂了后,这个节点上的消息将无法被消费,需要等待节点启动后才能被消费。
|