MSE Sync迁移方案

MSE Sync是一款基于开源Nacos Sync项目深度定制和优化的数据同步工具,不仅具备双向数据同步能力,还集成了自动服务发现与一键全量同步服务等高效功能。通过采用多实例部署架构,实现了高级别的容灾备份机制,适用于在Nacos、Zookeeper以及Eureka等配置管理平台之间进行平滑迁移的需求场景。

image

MSE Sync迁移介绍

MSE Sync迁移优势

  • 可平滑迁移

    在迁移过程中,MSE Sync能使源集群的服务信息和MSE云上产品的服务信息保持同步,从而实现自建配置注册中心和MSE产品之间的平滑迁移。

    图片中的pub指服务发布者,sub指服务订阅者。平滑迁移

  • 可多实例部署

    在服务同步的模式下支持多实例部署。多实例部署

    同步工具通过定时任务补偿宕机节点同步的数据。在节点宕机之后,正常节点会通过定时任务补偿因节点宕机丢失的数据。在节点宕机到定时任务执行之间的时间,客户端会有短时的实例列表为空的情况,定时任务的时间间隔可以通过以下参数进行配置。此参数为JVM参数,可以通过JAVA_OPT环境变量进行指定。

    -Dmsesync.daemon.refresh.interval=60 // 单位为秒

    示例如下。

    JAVA_OPT="$JAVA_OPT -Dmsesync.deamon.refresh.interval=10"
    重要
    • 定时任务时间间隔默认为60秒,扫描间隔不宜设置过短,否则会造成服务端和同步节点压力过大。具体时间设置需要根据集群负载和同步工具负载确定,建议值不要小于10秒。

    • 请勿在同步配置时进行多实例部署。

  • 操作简易

    MSE Sync适配Zookeeper、Nacos和Eureka的服务注册逻辑,能够实现Zookeeper到Zookeeper、Zookeeper到Nacos、Nacos到Nacos和Eureka到Nacos的服务信息同步,并且支持从Zookeeper、Nacos和Eureka中自动获取服务信息,一键全选避免繁琐操作。适配注册逻辑

支持的注册中心类型

MSE Sync支持的同步实例类型如下。

原注册中心类型

目标注册中心类型

同步支持说明

Nacos

Nacos

Nacos原生服务类型。

ZooKeeper

Nacos

基于Curator实现的服务发现功能和Dubbo服务。

ZooKeeper

ZooKeeper

服务和持久化配置。

重要
  1. 使用MSE Sync迁移工具对ZooKeeper的数据节点进行同步时,源集群和目标集群不支持同时变更同一个Znode,否则写入的数据在迁移过程中可能会丢失。请勿使用配置同步方式进行服务及临时节点(ephemeral节点)同步。

  2. 同步工具同步持久化节点会向源集群注册watch,每一个Znode都会注册一个watch,因此在源集群节点较多时,同步会创建大量watch,会占用源集群过多内存,请确保源集群Znode数量以及集群配置是否支持同步工具进行变更监听。

Eureka

Nacos

Eureka原生服务类型。

此同步实例类型需要将Nacos注册的服务名小写。因为Eureka默认注册的服务名为大写,但通过同步工具MSE Sync将服务同步到Nacos时,默认会将服务名转换成小写。如果原服务名中有大写字母,同步到Nacos的服务可能不互通。

例如,服务Service-1注册到Eureka的服务名是SERVICE-1,通过MSE Sync同步到Nacos的服务名是service-1,如果客户端使用nacosSDK之后注册到Nacos的服务名是Service-1,那么service-1和Service-1在Nacos中其实是两个服务,即服务中的实例信息不互通,Nacos注册的实例无法发现注册到MSE Sync同步到Nacos上的实例。若将所有的服务名改成小写,MSE Sync会将从Eureka同步的服务名转化成小写,这样两侧服务就能够互通了。

Consul

Nacos

Consul原生服务类型。

工具只同步健康的实例信息,元信息的变化同步工具目前不感知,因此元信息的变化不会被自动同步,并且目前同步工具不支持Consul配置信息的同步。

步骤一:部署MSE Sync迁移工具

重要

迁移工具需要连接到自建集群和MSE集群。请务必确保迁移工具部署在能够访问自建集群以及MSE集群的网络环境中(同一VPC内或者能够通过公网访问自建集群和MSE集群),否则会导致迁移失败。

部署模式

  • 依赖MySQL部署

    需要自行构建MySQL服务, 并创建具有读写权限的MSE Sync账号和数据库,通过环境变量传入MySQL的URL、用户名和密码。多个MSE Sync可共享一个MySQL服务。

  • 依赖Derby部署

    MSE Sync支持内嵌Derby数据库,可单机启动。

环境变量

  • 数据库相关环境变量

    MSE Sync通过环境变量自动判断使用MySQL还是Derby依赖启动,当MYSQL_URLMYSQL_USER_NAMEMYSQL_PASSWORD这几个环境变量的取值都不为空时,MSE Sync才会通过给定环境连接MySQL服务启动,其他情况下都通过依赖内嵌Derby数据库进行启动。

    环境变量名

    描述

    举例

    MYSQL_URL

    MySQL的连接串。

    jdbc:mysql://localhost:3306/sync

    MYSQL_USER_NAME

    MSE Sync具有读写权限的账户用户名。

    MYSQL_PASSWORD

    MYSQL_USER_NAME对应的密码。

  • JVM相关环境变量

    在conf文件夹下的java.env文件中,通过JAVA_OPT变量添加JVM 参数。

    例如,通过代码设置JVM堆内存大小,JAVA_OPT="$JAVA_OPT -Xms2048m -Xmx2048m"

部署方式

  • K8s部署

    1. 修改以下配置的MySQL用户名、密码和replicas等参数,保存配置文件为mse-sync-deployment.yaml

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        labels:
          app.kubernetes.io/name: mse-sync
        name: mse-sync-svc
      spec:
        replicas: 3
        selector:
          matchLabels:
            app.kubernetes.io/name: mse-sync
        template:
          metadata:
            labels:
              app.kubernetes.io/name: mse-sync
          spec:
            containers:
            - name: mse-sync
              image: msecrinstance-registry.cn-hangzhou.cr.aliyuncs.com/mse-demo/mse-sync:latest
              ports:
              - containerPort: 8000
              env:
              - name: MYSQL_URL
                value: "jdbc:mysql://192.xx.xx.xx:3306/sync"
              - name: MYSQL_USER_NAME
                value: "mse-sync"
              - name: MYSQL_PASSWORD
                value: password
      说明

      如果需要访问MSE Sync UI,需要添加一个Service指向MSE Sync的8000端口。

    2. 执行以下命令,部署MSE Sync。

      kubectl apply -f mse-sync-deployment.yaml
  • ECS部署

    1. 下载MSE Sync的二进制包。

      curl https://msesync.oss-cn-hangzhou.aliyuncs.com/MseSync.zip --output msesync.zip
    2. 解压二进制包,并进入MSE Sync的根目录。

      unzip ./msesync.zip
    3. 可选:如需依赖MySQL,需要配置如下环境变量。

      export MYSQL_URL=""
      export MYSQL_USER_NAME=""
      export MYSQL_PASSWORD=""
    4. 启动应用。

      ./MseSync/bin/startup.sh start

步骤二:配置集群信息和迁移任务

MSE Sync可以通过UI配置迁移任务,也可以通过配置文件的形式构建迁移任务。

  • 通过UI迁移任务

    打开MSE Sync工具,在左侧导航栏,单击服务同步,然后单击导入配置,在导入配置对话框,输入配置内容,单击确定,完成配置导入。

  • 通过配置文件迁移任务

    1. 创建配置文件。本文提供如下YAML示例,自动同步src集群public、test两个命名空间的所有服务到dst集群中,同步类型为服务信息同步,同步模式为双向同步。

      配置项主要包含两个字段,即clusterstasks,分别描述集群和同步任务信息。clusterstasks字段说明,请参见配置字段

      clusters:
        - clusterName: src
          connectKeyList:
            - mse-xxxxx-nacos-ans.mse.aliyuncs.com:8848
          clusterType: NACOS
          namespace: public,test
        - clusterName: dst
          connectKeyList:
            - mse-xxxxxx-nacos-ans.mse.aliyuncs.com:8848
          clusterType: NACOS
      
      tasks:
        - source: src
          destination: dst
          type: Service
          mode: Bidirectional
          serviceMatchPattern: ".*"
          autoScanAndAddService: true
    2. 执行以下命令导入配置。

      ./bin/msesyncCMD.sh apply -f {配置文件的路径}
    3. 将配置文件挂载或者放置在MseSync/conf/config.yaml,并启动MSE Sync。MSE Sync启动会自动初始化配置文件,进行数据迁移。

    说明
    • 配置文件可通过在MSE控制台的迁移上云页面配置迁移任务而自动生成。

    • 通过配置导入的方式进行的同步功能,将实现对新增服务的自动同步。

配置字段

以下内容为List类型的clusterstasks字段说明。

Clusters字段说明

字段

说明

取值举例

clusterName

集群名称。

说明

配置中的集群名不可重复。

sourceCluster

clusterType

集群类型。

  • NACOS

  • ZOOKEEPER

  • EUREKA

  • CONSUL

namespace

Nacos namespace名称。

说明

可以输入多个,使用英文逗号分隔。

  • public

  • test

  • test1

connectKeyList

集群的接入Endpoint,类型为List。

connectKeyList:
- localhost:8848
- localhost1:8848

userName

Nacos用户名。

password

Nacos密码。

ak

MSE Nacos RAM鉴权具有读写权限子账号的AccessKey。

sk

AccessKey对应的SecretKey。

Tasks字段说明

字段

说明

取值举例

source

源集群名。

无。

destination

目标集群名。

目标集群的命名空间自动和源集群保持一致,如果目标集群中不存在对应的命名空间,MSE Sync会自动创建。

type

同步类型。

  • Service(服务同步)。

  • Config(配置同步,支持Nacos和ZooKeeper进行配置同步)。

  • All(根据原集群类型自动创建服务和配置同步任务)。

mode

同步模式。

  • Unidirectional (单向同步):只会将原生注册的服务信息从源集群同步到目标集群。

  • Bidirectional(双向同步):能够实现源集群和目标集群之间原生注册的服务信息的双向同步。

serviceMatchPattern

需要同步的服务的正则匹配表达式。

默认同步所有服务。

autoScanAndAddService

是否自动扫描并同步源集群中新增加的服务。

默认为True。