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类数据:

  1. nacos鉴权用户数据
  2. 命名空间数据
  3. 配置数据
  4. 服务实例数据

nacos用户数据、命名空间数据与配置数据是持久化数据,需要事先完成设置与迁移。

服务实例数据是动态数据,切换后应该会自动注册,不需要事先迁移。

2.2 迁移阶段与步骤

我们可以把迁移分为3个阶段:

  1. 迁移前准备阶段;
  2. 迁移阶段;
  3. 迁移后收尾阶段;

一、迁移前准备

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

二、迁移中

数据迁移完成后即可开始切流迁移。

把应用请求流量切到r-nacos中,这一步不同的场景需要用不同的处理方式:

  1. 应用直接请求nacos服务场景:r-nacos需要和nacos在同一个机器替换它;需要先关闭nacos,再把r-nacos的端口改成原nacos端口启动,完成切换。
  2. 应用请求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使用情况:

  1. 在10.0.24.9部署一台nacos,使用默认端口号8848,8948提供服务;
  2. nacos上设置两个命名空间pre,prod分别对预发、生产环境提供服务
  3. 有3个应用,每个应用2个实例使用nacos服务; 总共两套环境,其中一套环境共有3个配置文件,3个服务,6个实例;
  4. 应用使用的用户名: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、迁移配置信息

  1. 从nacos导出配置

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

导出的文件名格式为:nacos_config_export_20240721230938.zip

注意:每次导出后记得改下文件名增加命名空间标记,以防导入时选错文件。

  1. 把配置导入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?的更多相关文章

  1. Nacos系列:基于Nacos的注册中心

    前言 所谓注册中心,其实是分布式架构演进过程中的产物,在系统中充当一个协调者的角色.但是,为什么需要这样一个协调者的角色呢?我们先来看一个例子,以便理解为什么分布式架构中需要有注册中心. 案例 小明和 ...

  2. Nacos系列:基于Nacos的配置中心

    前言 在看正文之前,我想请你回顾一下自己待过的公司都是怎么管理配置的,我想应该会有以下几种方式: 1.硬编码 没有什么配置不配置的,直接写在代码里面,比如使用常量类 优势:对开发友好,开发清楚地知道代 ...

  3. Nacos系列(一):Nacos环境安装及Hello World示例

    现在微服务架构越来越火,微服务架构中比较重要的一项就是配置中心, Nacos是阿里巴巴的一个开源项目,它的其中一个功能就是可以作为配置中心,实现配置的动态变更.历史版本对比.配置回滚等功能. 更多的描 ...

  4. Nacos笔记01——使用Nacos作为SpringCloud项目的服务注册中心

    前言 刚学SpringCloud时使用eureka作为服务注册中心,随着网飞公司eureka2.x不再更新,以及最近在公司实习接触到的SpringCloud项目是使用Nacos来做服务注册中心的,所以 ...

  5. Nacos windows下 ERROR Nacos failed to start, please see

    如果是windows 本地启动 直接到你本地\nacos\bin下   用cmd 启动即可 startup.cmd -m standalone 看见它你就算是 完成 了   直接访问下本的的端口  h ...

  6. 【Nacos】Springboot整合Nacos配置中心(二) 多环境配置

    本篇随笔接上一篇文章:Springboot整合Nacos配置中心(一),主要记录Nacos多环境的配置的方法 Nacos多环境的配置 方法一: 1.在项目中的bootstrap.yaml文件中配置激活 ...

  7. 【Nacos】Springboot整合nacos配置中心(一)

    一.本地Nacos安装环境: Win7 ,JDK8 ,maven3.5 1.下载安装包 2.启动nacos服务,bin文件下下面startup.cmd 3.访问 http://localhost:88 ...

  8. 0停机迁移Nacos?Java字节码技术来帮忙

    摘要:本文介绍如何将Spring Cloud应用从开源Consul无缝迁移至华为云Nacos. 本文分享自华为云社区<0停机迁移Nacos?Java字节码技术来帮忙>,作者:华为云PaaS ...

  9. Spring Cloud Alibaba | Nacos集群部署

    目录 Spring Cloud Alibaba | Nacos集群部署 1. Nacos支持三种部署模式 2. 集群模式下部署Nacos 2.1 架构图 2.2 下载源码或者安装包 2.3 配置集群配 ...

  10. Nacos(九):Nacos集群部署和遇到的问题

    前言 前面的系列文章已经介绍了Nacos的如何接入SpringCloud,以及Nacos的基本使用方式 之前的文章中都是基于单机模式部署进行讲解的,本文对Nacos的集群部署方式进行说明 环境准备 J ...

随机推荐

  1. Java中双括号初始化是个什么操作

    最近在阅读Mybatis源码的时候,看到了一种原来很少见到的语法: public class RichType { ... private List richList = new ArrayList( ...

  2. nginx使用lua waf防火墙来做防CC配置

    nginx添加lua模块 启动和安装nginx yum install -y nginx systemctl daemon-reload systemctl enable nginx #为了实验方便这 ...

  3. ros2 foxy订阅话题问题

    代码片段 这部分代码在galactic版本编译是OK的,可在foxy下编译就出了问题 TeleopPanel::TeleopPanel(QWidget* parent) : rviz_common:: ...

  4. 在mobaxten上使用scala报错

    查看报错信息 [ERROR] Failed to construct terminal; falling back to unsupported java.io.IOException: Cannot ...

  5. Typora编写博客并发布

    (1)工具安装:下载博主xhznl开发的的工具,并按照说明进行正确的配置. EasyBlogImageForTypora使用说明:https://www.cnblogs.com/xhznl/p/132 ...

  6. Qt内存回收机制

    参考视频:https://www.bilibili.com/video/BV1XW411x7NU?p=16 Qt中内存的回收是自己完成的,实验中,我们自定义一个按钮,通过重写析构函数来观察现象. 新建 ...

  7. pandas基础--基本功能

    pandas含有是数据分析工作变得更快更简单的高级数据结构和操作工具,是基于numpy构建的. 本章节的代码引入pandas约定为:import pandas as pd,另外import numpy ...

  8. react自定义导航组件 路由参数

    为何需要自定义导航? 因为在项目中往往不是所有的声明式导航都是需要a标签完成,有时候可能需要别的标签,此时如果在需要的地方去写编程式导航就会有代码重复可能性,就在对于公共代码进行提取. 思路: 定义一 ...

  9. CSPJ赛前刷题

    T1 \(\color{red}\text{正难则反}\),最短路 T2 图论(糅杂着一点DP) T3 DP 优化:减去不需要的状态 T4 一定要写注释!!! 不开longlong见祖宗!!! T5 ...

  10. LINQ to Entities does not recognize the method 'System.String ToString()' method

    LINQ to Entities does not recognize the method 'System.String ToString()' method, and this method ca ...