如何平稳地从nacos迁移到r-nacos?
1. 引言
很多同学了解r-nacos特性后最开始只将r-nacos用于开发测试环境。
经过一段时间的使用后,部分同学有打算生成环境也从nacos迁移到r-nacos。
一些之前使用nacos服务的同学了解r-nacos后打算从nacos迁移到r-nacos。
那么如何平衡地从nacos迁移到r-nacos呢?
r-nacos 简介:
r-nacos是一个用rust实现的nacos服务。相较于java nacos来说,是一个提供相同功能,启动更快、占用系统资源更小(初始内存小于10M)、性能更高、运行更稳定的服务。
r-nacos设计上完全兼容最新版本nacos面向client sdk 的协议(包含1.x的http OpenApi,和2.x的grpc协议), 支持使用nacos服务的应用平迁到 r-nacos。
2. 迁移计划
2.1 待迁移内容分析
迁移的目标已明确,在设计迁移计划前,我们需要先分析待迁移的数据。

从nacos迁移到r-nacos主要涉及4类数据:
- nacos鉴权用户数据
- 命名空间数据
- 配置数据
- 服务实例数据
nacos用户数据、命名空间数据与配置数据是持久化数据,需要事先完成设置与迁移。
服务实例数据是动态数据,切换后应该会自动注册,不需要事先迁移。
2.2 迁移阶段与步骤
我们可以把迁移分为3个阶段:
- 迁移前准备阶段;
- 迁移阶段;
- 迁移后收尾阶段;
一、迁移前准备

- 部署r-nacos,用于迁移前做数据迁移与数据录入。(如果nacos与r-nacos在同一台机器,可以用临时端口号启动r-nacos,等迁移时再更新端口号重启)
- 在r-nacos控制台录入应用依赖的用户信息,完成用户数据初始化。
- 在r-nacos控制台录入命名空间数据;
- 从nacos控制台按命名空间全量导出数据(每个命名空间会导出一个文件);然后分别把这部分配置数据通过r-nacos控制台导入对应命名空间中,完成配置数据迁移。
二、迁移中
数据迁移完成后即可开始切流迁移。

把应用请求流量切到r-nacos中,这一步不同的场景需要用不同的处理方式:
- 应用直接请求nacos服务场景:r-nacos需要和nacos在同一个机器替换它;需要先关闭nacos,再把r-nacos的端口改成原nacos端口启动,完成切换。
- 应用请求nginx后反向代理到nacos场景:更新nginx配置,把nacos反向代理地址更新为r-nacos地址,然后重新增加配置完成切换。
切流迁移完成后,注意观察应用与r-nacos的表现是否符合预期。
注意:就算目标是要开启鉴权,这个阶段r-naocs也不要启接口鉴权 (RNACOS_ENABLE_OPEN_API_AUTH=false),以防应用使用原nacos分配旧token请求被拦截。
三、迁移后收尾

完成迁移稳定运行一小段时间后,可以将nacos移除,只保留r-nacos。
如果需要对接口开启鉴权,则走以下操作:
a) 等应用旧token都过期(默认过期时间是5小时)都重新从r-nacos获取新token之后,再开启接口鉴权配置重启r-nacos(r-nacos可以秒级重启,应用几乎无感)。
b) 也可以分批重启应用强行其使用r-nacos token,之后再开启接口鉴权配置重启r-nacos。
至此完成从nacos迁移到r-nacos
3. 迁移案例
前面讲的是迁移操作步骤可能比较抽象,这里再补充两个具体迁移场景案例让读者更有体感。
3.1 应用服务直链单节点nacos的场景迁移方案
部署图:

nacos持久化内容:

nacos使用情况:
- 在10.0.24.9部署一台nacos,使用默认端口号8848,8948提供服务;
- nacos上设置两个命名空间pre,prod分别对预发、生产环境提供服务
- 有3个应用,每个应用2个实例使用nacos服务; 总共两套环境,其中一套环境共有3个配置文件,3个服务,6个实例;
- 应用使用的用户名:
xxx_app_id,密码:a07a6deb5e56
目标:
在同一台机器中部署r-nacos替换nacos提供服务,使用systemd方式部署
2.2.1 迁移步骤——迁移前
步骤1 、 在10.0.24.9使用临时端口8858部署r-nacos。
这里假设使用linux systemd方式部署。具体部署方式参考r-nacos说明文档,这里不展开。
关键配置项如下:
# r-nacos监听http端口,这里使用临时端口8858,后面切流时调整回来
RNACOS_HTTP_PORT=8858
# r-nacos监听grpc端口,grpc端口这里不配置,默认值:HTTP端口+1000
# RNACOS_GRPC_PORT=9858
# r-nacos独立控制台端口,这个没有端口冲突,可以直接使用正式端口
RNACOS_HTTP_CONSOLE_PORT=10848
RNACOS_ENABLE_OPEN_API_AUTH=false
注:如果是docker启动方式,配置端口不用改,只需改对应对外映射的端口号即可
步骤2 、初始化用户信息
访问http://10.0.24.9:10848/rnacos/进入控制台。
增加应用依赖用户,用户名:xxx_app_id ,密码: `a07a6deb5e56

步骤3、初始化命名空间
初始化命名空间 pre、prod

步骤4、迁移配置信息
- 从nacos导出配置

分别导出pre、prod命名空间下的配置

导出的文件名格式为:nacos_config_export_20240721230938.zip
注意:每次导出后记得改下文件名增加命名空间标记,以防导入时选错文件。
- 把配置导入r-nacos
分别把上一步nacos导出的配置文件包导出到r-nacos pre、prod命名空间下的配置。
a) 进入r-nacos控制台->配置列表页,选择对应命名空间

b) 上传导入配置文件

导入后:

上面图中操作的是pre命名空间,prod命名空间也操作一遍,这里不展开。
2.2.2 迁移步骤——迁移中
步骤5、 完成数据初始化后关闭r-nacos,先把临时端口更新正式端口,方便后面可以直接启动r-nacos。
关闭r-nacos服务
systemctl stop rnacos
关键配置项如下:
properties
# r-nacos监听http端口
RNACOS_HTTP_PORT=8848
# r-nacos监听grpc端口,grpc端口这里不配置,默认值:HTTP端口+1000
# RNACOS_GRPC_PORT=9848
# r-nacos独立控制台端口
RNACOS_HTTP_CONSOLE_PORT=10848
# 切换过程中不开启接口鉴权
RNACOS_ENABLE_OPEN_API_AUTH=false
步骤6、关闭nacos
# 切换到nacos目录,执行以下命名关闭nacos
./bin/shutdown.sh
步骤7、启动r-nacos
配置信息在关闭nacos前已准备好,直接启动r-nacos服务:
systemctl start rnacos
2.2.3 迁移步骤——迁移后
步骤8、切流完成,观察应用与r-nacos确认其是否正常工作。
应用服务可通过上游应用页面访问看看是否正常。
r-nacos可能通过监控页面查询其是否被应用访问。

步骤9、开启r-nacos接口鉴权 (可选)
切流完成后过5个小时之后,开启r-nacos接口鉴权。
关键配置项如下:
properties
# r-nacos监听http端口
RNACOS_HTTP_PORT=8848
# r-nacos监听grpc端口,grpc端口这里不配置,默认值:HTTP端口+1000
# RNACOS_GRPC_PORT=9848
# r-nacos独立控制台端口
RNACOS_HTTP_CONSOLE_PORT=10848
# 开启接口鉴权
RNACOS_ENABLE_OPEN_API_AUTH=true
重启r-nacos服务:
systemctl start rnacos
至此,完成从nacos到r-nacos的迁移
3.2 应用服务通过nginx链接nacos场景迁移方案
部署图:

nacos内容和前一个场景一样,部署时中间多用了nginx代理提供服务。
通过nginx链接nacos,那么切换时只需要把nginx配置中原nacos地址切换为r-naocs地址,然后通过 nginx -s reload 重新加载配置规则即可完成切流。
3.2.1 迁移步骤——迁移前
步骤和前一个场景第1、2、3、4步一致,这里不展开。
3.2.2 迁移步骤——迁移中
步骤5、更新nginx配置,把原nacos地址切换为r-naocs地址。
原nginx配置
# nacos http
server {
listen 8848;
listen [::]:8848;
server_name localhost;
location /nacos {
proxy_set_header Host $proxy_host;
proxy_pass http://10.0.24.9:8848;
}
}
# nacos grpc
server {
listen 9848;
listen [::]:9848;
server_name localhost;
location /nacos {
grpc_pass grpc://10.0.24.9:9848;
}
}
更新后的nginx配置
# nacos http
server {
listen 8848;
listen [::]:8848;
server_name localhost;
location /nacos {
proxy_set_header Host $proxy_host;
proxy_pass http://10.0.24.9:8858;
}
}
# nacos grpc
server {
listen 9848;
listen [::]:9848;
server_name localhost;
location /nacos {
grpc_pass grpc://10.0.24.9:9858;
}
}
执行nginx -s reload 重新加载配置规则即可完成切流。
切换后:

3.2.3 迁移步骤——迁移后
步骤和前一个场景第8、9步一致,这里不展开。
总结
对于nacos迁移到r-nacos,分析待迁移数据项与划分好迁移各个阶段需要做的事项,可以设计出合适的迁移方案。
迁移可分在迁移前、迁移中、迁移后三个阶段,本文结合样例场景给出了较具体操作步骤。
如果上面的案例和自己的实际情况一致,可以考虑应用请求nacos前加一层nginx反向代理,之后再按案例2迁移即可。
如何平稳地从nacos迁移到r-nacos?的更多相关文章
- Nacos系列:基于Nacos的注册中心
前言 所谓注册中心,其实是分布式架构演进过程中的产物,在系统中充当一个协调者的角色.但是,为什么需要这样一个协调者的角色呢?我们先来看一个例子,以便理解为什么分布式架构中需要有注册中心. 案例 小明和 ...
- Nacos系列:基于Nacos的配置中心
前言 在看正文之前,我想请你回顾一下自己待过的公司都是怎么管理配置的,我想应该会有以下几种方式: 1.硬编码 没有什么配置不配置的,直接写在代码里面,比如使用常量类 优势:对开发友好,开发清楚地知道代 ...
- Nacos系列(一):Nacos环境安装及Hello World示例
现在微服务架构越来越火,微服务架构中比较重要的一项就是配置中心, Nacos是阿里巴巴的一个开源项目,它的其中一个功能就是可以作为配置中心,实现配置的动态变更.历史版本对比.配置回滚等功能. 更多的描 ...
- Nacos笔记01——使用Nacos作为SpringCloud项目的服务注册中心
前言 刚学SpringCloud时使用eureka作为服务注册中心,随着网飞公司eureka2.x不再更新,以及最近在公司实习接触到的SpringCloud项目是使用Nacos来做服务注册中心的,所以 ...
- Nacos windows下 ERROR Nacos failed to start, please see
如果是windows 本地启动 直接到你本地\nacos\bin下 用cmd 启动即可 startup.cmd -m standalone 看见它你就算是 完成 了 直接访问下本的的端口 h ...
- 【Nacos】Springboot整合Nacos配置中心(二) 多环境配置
本篇随笔接上一篇文章:Springboot整合Nacos配置中心(一),主要记录Nacos多环境的配置的方法 Nacos多环境的配置 方法一: 1.在项目中的bootstrap.yaml文件中配置激活 ...
- 【Nacos】Springboot整合nacos配置中心(一)
一.本地Nacos安装环境: Win7 ,JDK8 ,maven3.5 1.下载安装包 2.启动nacos服务,bin文件下下面startup.cmd 3.访问 http://localhost:88 ...
- 0停机迁移Nacos?Java字节码技术来帮忙
摘要:本文介绍如何将Spring Cloud应用从开源Consul无缝迁移至华为云Nacos. 本文分享自华为云社区<0停机迁移Nacos?Java字节码技术来帮忙>,作者:华为云PaaS ...
- Spring Cloud Alibaba | Nacos集群部署
目录 Spring Cloud Alibaba | Nacos集群部署 1. Nacos支持三种部署模式 2. 集群模式下部署Nacos 2.1 架构图 2.2 下载源码或者安装包 2.3 配置集群配 ...
- Nacos(九):Nacos集群部署和遇到的问题
前言 前面的系列文章已经介绍了Nacos的如何接入SpringCloud,以及Nacos的基本使用方式 之前的文章中都是基于单机模式部署进行讲解的,本文对Nacos的集群部署方式进行说明 环境准备 J ...
随机推荐
- Android 13 - Media框架(22)- ACodec(四)
关注公众号免费阅读全文,进入音视频开发技术分享群! 前面两节我们了解了 ACodec 的创建及配置流程,配置完成后 ACodec 进入了 LoadedState,这一节开始将会了解 ACodec 的启 ...
- C#异步调用Process(),后台静默调用cmd控制台
C#调用cmd控制台操作,网上有太多的教程了,但是大多数都是执行完一条指令,退出Process,下次执行指令,再次new Process(),(只为了接收到cmd指令的回复,不然会进程阻塞,程序至此不 ...
- zabbix笔记_005 zabbix自动发现
自动发现 [消耗资源较大] 1.1 自动发现监控主机 自动发现的好处: 快速发现,并自动添加主机,省去管理员配置的麻烦. 管理简单高效 zabbix监控构建速度更高效 1.2 自动发现的原理 自动发现 ...
- Codes 重新定义 SaaS 模式的研发项目管理平台开源版 4.5.3 发布
一:简介 Codes 重新定义 SaaS 模式 = 云端认证 + 程序及数据本地安装 + 不限功能 + 30 人免费 Codes 是一个 高效.简洁.轻量的一站式研发项目管理平台.包含需求管理,任 ...
- Java求两个List集合的交集、并集、差集
在项目中经常会求解集合的交集.并集.差集,这里做个记录.首先创建两个集合list1.list2以及添加元素. List<String> list1 = new ArrayList<& ...
- 关于前三次pta的总结
前言 这三次pta难度在不断上升的同时,要求我们线上慕课+自主学习来了解更多的java中的各种方法,如:正则表达式 List Map等.与此同时要求我们展开尝试并熟练类的构造,类的引用,链表的基本运用 ...
- INFINI Labs 产品更新 | 发布 Easysearch Java 客户端,Console 支持 SQL 查询等功能
近年来,日志管理平台越来越流行.使用日志管理平台可以实时地.统一地.方便地管理和查看日志,挖掘日志数据价值,驱动运维.运营,提升服务管理效率. 方案架构 Beats 是轻量级采集器,包括 Filebe ...
- 铭瑄主板重启后USB3.0失效键盘鼠标无反应需要重新插拔
铭瑄主板重启后USB3.0失效键盘鼠标无反应需要重新插拔 环境: 铭瑄B760 主板,使用鼠标键盘使用USB 3.0 HUB 连接到主板 USB 3.0 口. 重启后,键盘鼠标无反应,需要重新插拔. ...
- .net core .net6 webapi 连接mysql 8
1.表结构: CREATE TABLE `table2` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `myname` varchar(255) NOT NULL, ...
- Vue学习:9.watch监听器
"watch" 监听器是一种在 Vue.js 中用于监视数据变化并执行相应操作的机制.它是 Vue 实例的一个选项,允许你监视指定的数据,并在数据变化时执行特定的逻辑.通常情况下, ...