提示:本次搭建只是rabbitmq服务的高可用负载均衡而不是rabbitmq消息的高可用负载均衡
文章目录
- 前言
-
- [RabbitMQ 集群 + HAProxy 高可用架构介绍](#RabbitMQ 集群 + HAProxy 高可用架构介绍)
- [1️⃣ RabbitMQ 集群概念](#1️⃣ RabbitMQ 集群概念)
-
- [🔹 节点类型](#🔹 节点类型)
- [🔹 集群特点](#🔹 集群特点)
- [2️⃣ HAProxy 在 RabbitMQ 集群中的作用](#2️⃣ HAProxy 在 RabbitMQ 集群中的作用)
-
- [🔹 目的](#🔹 目的)
-
- [- 负载均衡:](#- 负载均衡:)
- [- 高可用:](#- 高可用:)
- [- 统一管理界面入口:](#- 统一管理界面入口:)
- [🔹 逻辑架构](#🔹 逻辑架构)
-
- 具体作用如下:
- [📘 总结说明:](#📘 总结说明:)
- [🔹 HAProxy 工作模式](#🔹 HAProxy 工作模式)
- [3️⃣ RabbitMQ 集群与 HAProxy 的高可用原理](#3️⃣ RabbitMQ 集群与 HAProxy 的高可用原理)
- [4️⃣ 架构优势](#4️⃣ 架构优势)
- [5️⃣ 注意事项](#5️⃣ 注意事项)
-
- [1.Erlang Cookie 必须一致,否则节点无法加入集群](#1.Erlang Cookie 必须一致,否则节点无法加入集群)
- 2.队列高可用策略:
- [3.HAProxy 健康检查配置:](#3.HAProxy 健康检查配置:)
- 4.客户端重试机制:
- 5.防火墙与端口映射:
- 一、环境准备
- 二、修改主机名换、配置Hosts
- 三、三台机器同时安装Rabbitmq
- 四、安装HAProxy
-
- [4.1、HAProxy 安装在node1服务器上](#4.1、HAProxy 安装在node1服务器上)
- [五、搭建 RabbitMQ Server 高可用集群](#五、搭建 RabbitMQ Server 高可用集群)
-
- [5.1、将node2和node3 关闭节点和应用](#5.1、将node2和node3 关闭节点和应用)
- [5.2、将node1服务器中的.erlang.cookie文件,拷贝到node2&&node3服务器上,保证相同的Erlang Cookie](#5.2、将node1服务器中的.erlang.cookie文件,拷贝到node2&&node3服务器上,保证相同的Erlang Cookie)
- 5.3、node2和node3上查看erlang.cookie文件然后重新启动节点和应用
- 5.4、node2、node3执行----将node2和node3节点加入到node1集群
- [5.5、使用rabbitmqctl cluster_status命令查看各个节点集群状态](#5.5、使用rabbitmqctl cluster_status命令查看各个节点集群状态)
- 六、在node1节点配置HAProxy
-
- 6.1、copy配置文件并修改
- [6.2、启动 HAProxy:](#6.2、启动 HAProxy:)
- 七、负载均衡web显示
-
- [7.1、通过访问http://122.152.208.19:8100/stats,查看 HAProxy 负载均衡信息:](#7.1、通过访问http://122.152.208.19:8100/stats,查看 HAProxy 负载均衡信息:)
- 7.2、通过访问http://122.152.208.19:8101,查看rabbitmq的集群信息
- 总结
-
- [- RabbitMQ 集群提供 消息高可用 + 队列复制](#- RabbitMQ 集群提供 消息高可用 + 队列复制)
- [- HAProxy 提供 统一入口 + 负载均衡 + 健康检测](#- HAProxy 提供 统一入口 + 负载均衡 + 健康检测)
- [- 结合后,系统能保证 客户端访问透明、高可用、管理界面集中](#- 结合后,系统能保证 客户端访问透明、高可用、管理界面集中)
前言
RabbitMQ 集群 + HAProxy 高可用架构介绍
1️⃣ RabbitMQ 集群概念
🔹 节点类型
- Disk Node:保存队列元数据到磁盘,保证持久化
- RAM Node:只保存在内存中,启动快但断电会丢失元数据
- 通常 至少一个 Disk Node,其他节点可以是 RAM Node 或 Disk Node
🔹 集群特点
- 统一的逻辑集群:多节点组成一个集群,节点间共享元数据和队列信息
- 节点发现:节点通过 Erlang Cookie 和节点名相互识别
- 分布式队列:队列可选择是否镜像到多个节点(mirrored queue)
- 高可用性:
-- -- 队列可复制到多节点
-- -- 某个节点挂掉时,客户端可以自动切换到其他节点
2️⃣ HAProxy 在 RabbitMQ 集群中的作用
🔹 目的
- 负载均衡:
- 客户端访问单一入口(8102/AMQP)
- HAProxy 将请求分发到集群中的不同 RabbitMQ 节点
- 高可用:
- HAProxy 定期健康检查节点
- 如果某个节点不可用,自动剔除,客户端不会连接到宕机节点
- 统一管理界面入口:
- Web 管理界面(15672)也通过 HAProxy 统一访问(8101)
🔹 逻辑架构

注意:在 RabbitMQ 集群 中,端口 25672 是用于 节点间通信(Erlang distribution) 的专用端口。
具体作用如下:
- 🔗 节点间同步通信:RabbitMQ 集群的各个节点(例如 node1、node2、node3)需要相互通信以共享元数据(如队列、交换机、绑定信息等),这个通信就是通过 25672 端口进行的。
- 💬 Erlang 分布式协议使用:RabbitMQ 是基于 Erlang/OTP 开发的,Erlang 自带分布式机制,默认使用 TCP 端口 25672 建立节点间的分布式连接。
- ⚙️ 可配置:该端口可以在配置文件中通过环境变量 RABBITMQ_DIST_PORT 修改。
- 🔥 防火墙注意事项:如果你在不同服务器上部署 RabbitMQ 集群,必须确保防火墙放通 25672 端口,否则节点之间无法建立集群关系(会出现 "connection refused" 或 "timeout" 错误)。
| 端口 | 作用 | 默认协议 |
|---|---|---|
| 8100 | HAProxy 监控页面(访问地址如:http://node1:8100/stats,账号:admin/admin) | HTTP |
| 8101 | RabbitMQ 服务(AMQP 客户端)负载均衡入口,由 HAProxy 代理到各节点的 5672 端口 | TCP |
| 8102 | RabbitMQ Web 管理界面负载均衡入口,由 HAProxy 代理到各节点的 15672 端口 | HTTP |
| 5672 | RabbitMQ AMQP 通信端口(客户端连接消息队列) | TCP |
| 15672 | RabbitMQ Web 管理界面端口(单节点访问用) | HTTP |
| 25672 | RabbitMQ 集群节点间通信(Erlang 分布式协议) | TCP |
📘 总结说明:
-
8100、8101、8102 是 HAProxy 提供的统一入口端口,对外暴露,分别用于监控、消息队列和管理界面访问。
-
5672、15672、25672 是 RabbitMQ 自身的内部端口,用于客户端连接、管理和节点间通信。
🔹 HAProxy 工作模式
| 功能 | 模式 | 端口 | 描述 |
|---|---|---|---|
| stats 页面 | HTTP | 8100 | 监控 HAProxy 状态、节点健康 |
| 管理界面 | HTTP | 8101 | 负载均衡访问 RabbitMQ 节点 15672 |
| AMQP 客户端 | TCP | 8102 | 负载均衡访问 RabbitMQ 节点 5672 |
- HTTP 模式: 用于 Web 管理界面和 stats 页面
- TCP 模式: 用于 AMQP 协议流量
3️⃣ RabbitMQ 集群与 HAProxy 的高可用原理
1.客户端透明访问
- 客户端不需要知道 RabbitMQ 有多少节点
- 只连接 HAProxy 的单一端口(8102/AMQP)
- HAProxy 根据负载均衡策略(roundrobin、leastconn)选择节点
2.节点健康检测
- HAProxy 定期 check 各节点端口
- 节点宕机 → 自动剔除 → 负载均衡只分发到健康节点
3.队列高可用
- 如果使用 mirrored queue:
- 队列元数据和消息复制到多个节点
- 某个节点挂掉,消息不会丢失
- 集群内其他节点仍可提供服务
4.管理界面高可用
- RabbitMQ Web UI 默认监听 15672
- HAProxy 8101 端口负载均衡到各节点的 15672
- 管理员可通过单一入口查看整个集群状态
4️⃣ 架构优势
| 优势 | 说明 |
|---|---|
| 高可用性 | 节点挂掉,HAProxy 剔除,队列镜像保证消息不丢失 |
| 负载均衡 | 客户端请求均匀分布到集群节点,避免单节点过载 |
| 统一入口 | AMQP 客户端和 Web UI 通过单一 HAProxy 端口访问 |
| 易运维 | stats 页面查看 HAProxy 与节点状态,便于运维 |
5️⃣ 注意事项
1.Erlang Cookie 必须一致,否则节点无法加入集群
2.队列高可用策略:
- 不开启镜像 → 节点挂掉可能丢失消息
- 开启镜像 → 网络带宽和存储消耗增加
3.HAProxy 健康检查配置:
- HTTP 用 option httpchk
- TCP 用 check inter 5000 rise 2 fall 3
4.客户端重试机制:
- 即使 HAProxy 健康检查剔除了节点,客户端也可能缓存旧节点信息
5.防火墙与端口映射:
- 15672/5672/8100/8101/8102 都需要开放并正确转发
提示:以下是本篇文章正文内容,下面案例可供参考
一、环境准备
| 主机名称 | 公网IP | 内网IP | 系统 | 服务 |
|---|---|---|---|---|
| node1 | 122.152.208.19 | 172.17.48.15 | Centos8 | Rabbitmq、HAProxy |
| node2 | 49.235.24.247 | 172.17.48.123 | Centos8 | Rabbitmq |
| node3 | 1.15.25.123 | 172.17.48.107 | Centos8 | Rabbitmq |
二、修改主机名换、配置Hosts
2.1.修改主机名称
bash
hostnamectl set-hostname node1
hostnamectl set-hostname node2
hostnamectl set-hostname node3
2.2.配置Hosts
bash
三台机器同时修改
echo "122.152.208.19 node1" >> /etc/hosts
echo "49.235.106.214 node2" >> /etc/hosts
echo "110.40.181.62 node3" >> /etc/hosts
三、三台机器同时安装Rabbitmq
-------------------------------------------------------------------请点击查看安装Rabbitmq方法-------------------------------------------------------------------------
四、安装HAProxy
4.1、HAProxy 安装在node1服务器上
bash
[root@node1 ~]# yum -y install haproxy
五、搭建 RabbitMQ Server 高可用集群
注意:一定要注意关启服务的顺序,否则很可能会报错!!!
5.1、将node2和node3 关闭节点和应用
bash
[root@node2 ~]# /sbin/service rabbitmq-server stop
[root@node3 ~]# /sbin/service rabbitmq-server stop
5.2、将node1服务器中的.erlang.cookie文件,拷贝到node2&&node3服务器上,保证相同的Erlang Cookie
bash
[root@node1 ~]# find / -name ".erlang.cookie"
/var/lib/rabbitmq/.erlang.cookie
[root@node1 ~]# cat /var/lib/rabbitmq/.erlang.cookie
ZRRNSMYOZZFTLBARYSWZ
[root@node1 rabbitmq]# scp /var/lib/rabbitmq/.erlang.cookie root@172.17.48.123:/var/lib/rabbitmq
[root@node1 rabbitmq]# scp /var/lib/rabbitmq/.erlang.cookie root@172.17.48.107:/var/lib/rabbitmq
5.3、node2和node3上查看erlang.cookie文件然后重新启动节点和应用
bash
[root@node2 rabbitmq]# cat /var/lib/rabbitmq/.erlang.cookie
ZRRNSMYOZZFTLBARYSWZ
[root@node3 rabbitmq]# cat /var/lib/rabbitmq/.erlang.cookie
ZRRNSMYOZZFTLBARYSWZ
[root@node2 ~]# /sbin/service rabbitmq-server start
[root@node3 ~]# /sbin/service rabbitmq-server start
5.4、node2、node3执行----将node2和node3节点加入到node1集群
bash
rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@node1
rabbitmqctl start_app
5.5、使用rabbitmqctl cluster_status命令查看各个节点集群状态
5.5.1、在node1执行查看状态
bash
[root@node1 rabbitmq]# rabbitmqctl cluster_status
Cluster status of node rabbit@node1 ...
Basics
Cluster name: rabbit@node1
Total CPU cores available cluster-wide: 6
Disk Nodes
rabbit@node1
rabbit@node2
rabbit@node3
Running Nodes
rabbit@node1
rabbit@node2
rabbit@node3
Versions
rabbit@node1: RabbitMQ 3.13.7 on Erlang 26.2.5.4
rabbit@node2: RabbitMQ 3.13.7 on Erlang 26.2.5.4
rabbit@node3: RabbitMQ 3.13.7 on Erlang 26.2.5.4
CPU Cores
Node: rabbit@node1, available CPU cores: 2
Node: rabbit@node2, available CPU cores: 2
Node: rabbit@node3, available CPU cores: 2
Maintenance status
Node: rabbit@node1, status: not under maintenance
Node: rabbit@node2, status: not under maintenance
Node: rabbit@node3, status: not under maintenance
Alarms
(none)
Network Partitions
(none)
Listeners
Node: rabbit@node1, interface: 0.0.0.0, port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@node1, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@node1, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@node2, interface: 0.0.0.0, port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@node2, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@node2, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@node3, interface: 0.0.0.0, port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@node3, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@node3, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Feature flags
Flag: classic_mirrored_queue_version, state: enabled
Flag: classic_queue_type_delivery_support, state: enabled
Flag: detailed_queues_endpoint, state: enabled
Flag: direct_exchange_routing_v2, state: enabled
Flag: drop_unroutable_metric, state: enabled
Flag: empty_basic_get_metric, state: enabled
Flag: feature_flags_v2, state: enabled
Flag: implicit_default_bindings, state: enabled
Flag: khepri_db, state: disabled
Flag: listener_records_in_ets, state: enabled
Flag: maintenance_mode_status, state: enabled
Flag: message_containers, state: enabled
Flag: message_containers_deaths_v2, state: enabled
Flag: quorum_queue, state: enabled
Flag: quorum_queue_non_voters, state: enabled
Flag: restart_streams, state: enabled
Flag: stream_filtering, state: enabled
Flag: stream_queue, state: enabled
Flag: stream_sac_coordinator_unblock_group, state: enabled
Flag: stream_single_active_consumer, state: enabled
Flag: stream_update_config_command, state: enabled
Flag: tracking_records_in_ets, state: enabled
Flag: user_limits, state: enabled
Flag: virtual_host_metadata, state: enabled
5.5.2、在node2执行查看状态
bash
[root@node2 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@node2 ...
Basics
Cluster name: rabbit@node2
Total CPU cores available cluster-wide: 6
Disk Nodes
rabbit@node1
rabbit@node2
rabbit@node3
Running Nodes
rabbit@node1
rabbit@node2
rabbit@node3
Versions
rabbit@node2: RabbitMQ 3.13.7 on Erlang 26.2.5.4
rabbit@node1: RabbitMQ 3.13.7 on Erlang 26.2.5.4
rabbit@node3: RabbitMQ 3.13.7 on Erlang 26.2.5.4
CPU Cores
Node: rabbit@node2, available CPU cores: 2
Node: rabbit@node1, available CPU cores: 2
Node: rabbit@node3, available CPU cores: 2
Maintenance status
Node: rabbit@node2, status: not under maintenance
Node: rabbit@node1, status: not under maintenance
Node: rabbit@node3, status: not under maintenance
Alarms
(none)
Network Partitions
(none)
Listeners
Node: rabbit@node2, interface: 0.0.0.0, port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@node2, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@node2, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@node1, interface: 0.0.0.0, port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@node1, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@node1, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@node3, interface: 0.0.0.0, port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@node3, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@node3, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Feature flags
Flag: classic_mirrored_queue_version, state: enabled
Flag: classic_queue_type_delivery_support, state: enabled
Flag: detailed_queues_endpoint, state: enabled
Flag: direct_exchange_routing_v2, state: enabled
Flag: drop_unroutable_metric, state: enabled
Flag: empty_basic_get_metric, state: enabled
Flag: feature_flags_v2, state: enabled
Flag: implicit_default_bindings, state: enabled
Flag: khepri_db, state: disabled
Flag: listener_records_in_ets, state: enabled
Flag: maintenance_mode_status, state: enabled
Flag: message_containers, state: enabled
Flag: message_containers_deaths_v2, state: enabled
Flag: quorum_queue, state: enabled
Flag: quorum_queue_non_voters, state: enabled
Flag: restart_streams, state: enabled
Flag: stream_filtering, state: enabled
Flag: stream_queue, state: enabled
Flag: stream_sac_coordinator_unblock_group, state: enabled
Flag: stream_single_active_consumer, state: enabled
Flag: stream_update_config_command, state: enabled
Flag: tracking_records_in_ets, state: enabled
Flag: user_limits, state: enabled
Flag: virtual_host_metadata, state: enabled
5.5.3、在node3执行查看状态
bash
[root@node3 rabbitmq]# rabbitmqctl cluster_status
Cluster status of node rabbit@node3 ...
Basics
Cluster name: rabbit@node3
Total CPU cores available cluster-wide: 6
Disk Nodes
rabbit@node1
rabbit@node2
rabbit@node3
Running Nodes
rabbit@node1
rabbit@node2
rabbit@node3
Versions
rabbit@node3: RabbitMQ 3.13.7 on Erlang 26.2.5.4
rabbit@node1: RabbitMQ 3.13.7 on Erlang 26.2.5.4
rabbit@node2: RabbitMQ 3.13.7 on Erlang 26.2.5.4
CPU Cores
Node: rabbit@node3, available CPU cores: 2
Node: rabbit@node1, available CPU cores: 2
Node: rabbit@node2, available CPU cores: 2
Maintenance status
Node: rabbit@node3, status: not under maintenance
Node: rabbit@node1, status: not under maintenance
Node: rabbit@node2, status: not under maintenance
Alarms
(none)
Network Partitions
(none)
Listeners
Node: rabbit@node3, interface: 0.0.0.0, port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@node3, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@node3, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@node1, interface: 0.0.0.0, port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@node1, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@node1, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@node2, interface: 0.0.0.0, port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@node2, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@node2, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Feature flags
Flag: classic_mirrored_queue_version, state: enabled
Flag: classic_queue_type_delivery_support, state: enabled
Flag: detailed_queues_endpoint, state: enabled
Flag: direct_exchange_routing_v2, state: enabled
Flag: drop_unroutable_metric, state: enabled
Flag: empty_basic_get_metric, state: enabled
Flag: feature_flags_v2, state: enabled
Flag: implicit_default_bindings, state: enabled
Flag: khepri_db, state: disabled
Flag: listener_records_in_ets, state: enabled
Flag: maintenance_mode_status, state: enabled
Flag: message_containers, state: enabled
Flag: message_containers_deaths_v2, state: enabled
Flag: quorum_queue, state: enabled
Flag: quorum_queue_non_voters, state: enabled
Flag: restart_streams, state: enabled
Flag: stream_filtering, state: enabled
Flag: stream_queue, state: enabled
Flag: stream_sac_coordinator_unblock_group, state: enabled
Flag: stream_single_active_consumer, state: enabled
Flag: stream_update_config_command, state: enabled
Flag: tracking_records_in_ets, state: enabled
Flag: user_limits, state: enabled
Flag: virtual_host_metadata, state: enabled
六、在node1节点配置HAProxy
6.1、copy配置文件并修改
bash
[root@node1 rabbitmq]# cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak
[root@node1 rabbitmq]# vi /etc/haproxy/haproxy.cfg #删除以前代码并添加以下代码
global
log 127.0.0.1 local0 info
log 127.0.0.1 local1 notice
daemon
maxconn 4096
defaults
log global
mode tcp
option tcplog
option dontlognull
retries 3
option abortonclose
maxconn 4096
timeout connect 5000ms
timeout client 3000ms
timeout server 3000ms
balance roundrobin
# HAProxy stats 页面
listen private_monitoring
bind 0.0.0.0:8100
mode http
option httplog
stats refresh 5s
stats uri /stats
stats realm Haproxy
stats auth admin:admin
# RabbitMQ 管理界面(Web UI,HTTP,负载均衡端口 8101)
listen rabbitmq_admin
bind 0.0.0.0:8101
mode http
option httplog
balance roundrobin
# 转发到 RabbitMQ 管理端口 15672
server node1 node1:15672 check
server node2 node2:15672 check
server node3 node3:15672 check
# RabbitMQ AMQP 服务(5672,TCP,负载均衡端口 8102)
listen rabbitmq_cluster
bind 0.0.0.0:8102
mode tcp
option tcplog
balance roundrobin
timeout client 3h
timeout server 3h
# 转发到 RabbitMQ 节点 AMQP 端口 5672
server node1 node1:5672 check inter 5000 rise 2 fall 3
server node2 node2:5672 check inter 5000 rise 2 fall 3
server node3 node3:5672 check inter 5000 rise 2 fall 3
6.2、启动 HAProxy:
bash
[root@node1 rabbitmq]# haproxy -f /etc/haproxy/haproxy.cfg
关闭HAProxy话就直接杀掉进程
[root@node1 rabbitmq]# ps aux | grep haproxy
kill -9 进程号
七、负载均衡web显示
HAProxy 配置了三个地址:
http://122.152.208.19:8100/stats:HAProxy 负载均衡信息地址,账号密码:admin/admin。
http://122.152.208.19:8101:RabbitMQ Server Web 管理界面(基于负载均衡)。
http://122.152.208.19:8102:RabbitMQ Server 服务地址(基于负载均衡)。
7.1、通过访问http://122.152.208.19:8100/stats,查看 HAProxy 负载均衡信息:


7.2、通过访问http://122.152.208.19:8101,查看rabbitmq的集群信息


在每次点击刷新时下图中会切换到每个节点上,从而达到一个负载均衡的效果,即使停掉node3节点他也会在node1和node2节点上切换
