数据迁移至openGauss

本文详细介绍了openGauss数据库的特性,包括其与MySQL的数据迁移过程,如全量迁移使用chameleon工具、增量迁移原理,以及数据校验的重要性。还涉及了反向迁移功能,展示了如何将openGauss数据回迁至MySQL。
摘要由CSDN通过智能技术生成

前言

openGauss 是华为旗下的国产数据库,我对着这个数据库的了解要从今年 8 月份开始说起,这个数据库我刚开始使用的时候还头疼了很久,感觉搭建的过程还是比较复杂的,但是熟悉之后发现是真的很香!

一、openGauss 介绍

官方介绍: openGauss 是一款全面友好开放,携手伙伴共同打造的企业级开源关系型数据库。openGauss 采用木兰宽松许可证 v2 发行,提供面向多核架构的极致性能、全链路的业务、数据安全、基于 AI 的调优和高效运维的能力。openGauss 内核源自 PostgreSQL,深度融合华为在数据库领域多年的研发经验,结合企业级场景需求,持续构建竞争力特性。同时,openGauss 也是一个开源、免费的数据库平台,鼓励社区贡献、合作。

个人理解: 基于 linux 为内核的国产数据库,安全性大大提高

二、MySQL 数据迁移到 openGauss

1.全量迁移

  • (1)介绍

    官方介绍 chameleon 是一个用 Python3 编写的将 MySQL 迁移至 openGauss 的实时复制工具,支持初始全量数据的复制以及后续增量数据的实时在线复制功能。chameleon 通过一次初始化配置,使用只读模式,将 MySQL 的数据全量拉取到 openGauss。支持在同一快照下,表间数据并行迁移。全量迁移支持的功能:支持表及表数据、视图、触发器、自定义函数、存储过程的全量迁移

    个人理解 也就是说,将数据库中的数据通过工具全量复制到 openGauss 里面,这是最简单易懂的解释。

    和上图其实原理很类似,就是对大量数据进行批量复制,从 MySQL 复制到 openGauss,只不过中间开始利用工具进行操作。

  • (2)优势

    官方解释: 基于 sysbench 测试模型,在 Kunpeng-920 2p 服务器上,MySQL 数据库 10 张表单表数据量在 300 万以上时,chameleon 使用 10 并发迁移数据至 openGauss,整体全量迁移性能可达 300M/S 以上。

    个人理解 也就是说,在大量数据的迁移的时候,通常会出现两种问题难以解决,第一数据量过于庞大,第二迁移速度太慢,openGauss 很好的解决了这两点问题。

  • (3)chameleon 工具

    pip3 install ./chameleon-1.0.0-py3-none-any.whl(安装 chameleon 命令)

  • (4)安装

    git clone git@gitee.com:opengauss/openGauss-tools-chameleon.git #(下载源码)
    
    python3 -m venv venv #(创建环境)
    
    source venv/bin/activate #(激活环境)
    
    cd openGauss-tools-chameleon #(进入指定目录)
    
    python3 setup.py install #(安装)
    
  • (5)迁移

    chameleon set_configuration_files (创建目录)
    
    cd ~/.pg_chameleon/configuration (进入目录)
    
    cp config-example.yml default.yml (配置default.yml)
    

    ** 修改 default.yml 配置文件 **

    global settings
    pid_dir: '~/.pg_chameleon/pid/'
    
    log_dir: '~/.pg_chameleon/logs/'
    
    log_dest: file
    
    log_level: info
    
    log_days_keep: 10
    
    rollbar_key: ''
    
    rollbar_env: ''
    
    # type_override allows the user to override the default type conversion
    
    # into a different one.
    
    type_override:
    
    "tinyint(1)":
    
    override_to: boolean
    
    override_tables:
    
    - "*"
    
    # postgres destination connection
    
    pg_conn:
    
    host: "1.1.1.1"
    
    port: "5432"
    
    user: "opengauss_test"
    
    password: "********_***"
    
    database: "opengauss_database"
    
    charset: "utf8"
    
    sources:
    
    mysql:
    
    readers: 4
    
    writers: 4
    
    db_conn:
    
    host: "1.1.1.1"
    
    port: "3306"
    
    user: "mysql_test"
    
    password: "***********"
    
    charset: 'utf8'
    
    connect_timeout: 10
    
    schema_mappings:
    
    mysql_database:sch_mysql_database
    
    limit_tables:
    
    skip_tables:
    
    grant_select_to:
    
    - usr_migration
    
    lock_timeout: "120s"
    
    my_server_id: 1
    
    replica_batch_size: 10000
    
    replay_max_rows: 10000
    
    batch_retention: '1 day'
    
    copy_max_memory: "300M"
    
    copy_mode: 'file'
    
    out_dir: /tmp
    
    sleep_loop: 1
    
    on_error_replay: continue
    
    on_error_read: continue
    
    auto_maintenance: "disabled"
    
    gtid_enable: false
    
    type: mysql
    
    keep_existing_schema: No
    
    migrate_default_value: Yes
    
    初始化
    
    chameleon create_replica_schema --config default
    
    chameleon add_source --config default --source mysql
    
    迁移数据
    
    chameleon init_replica --config default --source mysql
    
    chameleon start_view_replica --config default --source mysql --debug
    
    chameleon start_trigger_replica --config default --source mysql --debug
    
    chameleon start_func_replica --config default --source mysql --debug
    
    chameleon start_proc_replica --config default --source mysql --debug
    
    结束迁移
    
    chameleon stop_replica --config default --source mysql
    
    chameleon detach_replica --config default --source mysql
    
    chameleon drop_replica_schema --config default
    

2.增量迁移

  • (1)介绍

    官方解释: 基于开源三方件 mysql-binlog-connector-java 解析 mysql 的 binlog,并根据 mysql 主备并行复制的原理,对可并行的事务在 openGauss 端采用多线程进行并行回放,以实现 MySQL 到 openGauss 端的在线迁移。其中并行事务的判断规则为:如果所有正在回放的事务的最小 sequence_number 大于该事务的 last_committed,那么该事务就可以并行执行。该方案可以严格保证事务的顺序和一致性。

    个人理解 也就是传输工程中的一种类似协议的东西,加固迁移过程的稳定性

  • (2)迁移代码

  git clone https://gitee.com/opengauss/openGauss-tools-onlineMigration-mysql.git(下载源码)

改动配置文件

#openGauss config

openGauss_conn:

host: "***.***.***.***"

port: "5432"

user: "opengauss"

password: "***********"

database: "postgres"

#mysql config

mysql_conn:

host: "***.***.***.***"

port: "3306"

user: "mysql"

password: "***********"

database: "mysql"

cd openGauss-tools-onlineMigration-mysql/mysql2openGauss/

mvn clean package(编译)

java -jar ./target/online-migration-mysql-3.1.0.jar (运行)

numactl -C 0-31 -m 0 java -Xms15G -Xmx25G -jar ./target/online-migration-mysql-3.1.0.jar (执行)

3.数据校验

  • (1)介绍

    官方介绍 全量校验: 在全量数据迁移完成后,由 extract 服务对 MySQL 源端和 openGauss 目标端数据抽取然后规整,并将数据推送到 kafka 中。最后由 check 服务提取 kafka 中的数据,并进行校验且输出校验结果。 增量校验: 由 debezium 服务侦听源端 MySQL 数据库的增量数据,到指定 topic。再由源端 extract 服务处理该 topic 增量数据,触发 check 增量校验。

    个人理解:就是在全量数据迁移之后,正对数据迁移的准确性做一个调查,查看数据库信息是否在迁移过程中有丢失等等情况

  • (2)代码

    git clone https://gitee.com/opengauss/openGauss-tools-datachecker-performance.git(下载源码)
    
    mvn clean package -Dmvnen.test.skip=true(构建check 和 extract jar包)
    
    配置application.yml文件
    
    server:
    
    port: 9000
    
    spring:
    
    kafka:
    
    bootstrap-servers: ***.***.***.***4:9092 # kafka 集群地址
    data:
    
    check:
    
    data-path: D:\code\tool  # 配置数据校验结果输出本地路径
    
    bucket-expect-capacity: 10 # 桶容量范围最小值为1
    
    source-uri: http://***.***.***.***:9002 # 配置源端服务地址和服务端口server.port
    
    sink-uri: http://***.***.***.***:9001 # 配置源端服务地址和服务端口server.port
    配置 application-source.yml文件
    
    server:
    
    port: 9002
    
    spring:
    
    check:
    
    server-uri: http://***.***.***.***:9000 # 数据校验服务地址
    extract:
    
    schema: test # 源端数据实例
    
    databaseType: MS  # 源端数据库类型 MS mysql
    
    debezium-enable: false #是否开启增量debezium配置 默认不开启
    
    debezium-topic:topic # debezium监听表增量数据,使用单一topic进行增量数据管理
    
    debezium-groupId: debezium-extract-group # d debezium增量迁移topic ,groupId消费Group设置
    
    debezium-topic-partitions: 1 # debezium监听topic 分区数量配置
    
    debezium-tables: # debezium-tables配置debezium监听的表名称列表; 该配置只在源端服务配置并生效
    
        table1,
    
        table2
    
    debezium-time-period: 1 # debezium增量迁移校验 时间周期 24*60 单位分钟
    
    debezium-num-period: 1000 #debezium增量迁移校验 统计增量变更记录数量阀值,默认值1000 阀值应大于100
    datasource:
    
    druid:
    
    
      dataSourceOne:
    
        driver-class-name: com.mysql.cj.jdbc.Driver
    
        url: jdbc:mysql://***.***.***.***:3306/test?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&allowPublicKeyRetrieval=true
    
        username: jack  # 源端mysql用于校验的用户名称
    
        password: ****@***  # 源端mysql用于校验的用户名称密码
    配置 application-sink.yml文件
    
    server:
    
    port: 9001
    
    spring:
    
    check:
    
    server-uri: http://***.***.***.***:9000 # 数据校验服务地址
    extract:
    
    schema: test  # 宿端opengauss 用于校验数据schema
    
    databaseType: OG  # 宿端数据库类型 OG opengauss
    datasource:
    
    druid:
    
      dataSourceOne:
    
        driver-class-name: org.opengauss.Driver
    
        # 宿端opengauss用于校验数据库链接地址
    
        url: jdbc:opengauss://***.***.***.***:15432/test?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&batchMode=OFF
    
        username: jack # 宿端opengauss用于校验的用户名称
    
        password: ****@***  # 宿端opengauss用于校验的用户名称密码
    校验前的准备工作
    
    cd /data/kafka/confluent-7.2.0
    
    bin/zookeeper-server-start -daemon etc/kafka/zookeeper.properties(启动服务)
    
    bin/kafka-server-start.sh -daemon etc/kafka/server.properties(启动服务)
    
    bin/connect-standalone -daemon etc/kafka/connect-standalone.properties etc/kafka/mysql-conect.properties(文件连接)
    
    校验
    
    sh extract-endpoints.sh stat|restart|stop(启动校验服务)
    
    sh check-endpoint.sh stat|restart|stop(启动校验服务)
    
    curl -X 'POST' 'http://localhost:9000/start/check?checkMode=FULL' -H 'accept: /' -d ''(全量校验)
    
    curl -X 'POST' 'http://localhost:9000/stop/clean/check' -H 'accept: /' -d ''(环境清理)
    
    debezium-enable: true(开始校验)
    
    

4.反向迁移

  • 1.介绍

    官方解释: 反向迁移是指用户将源端数据库迁移到目标数据库,应用切到目标数据库后,再将目标端新产生的数据迁移回源端。反向迁移可满足用户业务迁移逃生的诉求,保持源端、目标端两个库并行运行,在目标端数据库出问题后应用能及时切回源端数据库。openGauss 提供 reverse-migration 工具,将 openGauss 数据库迁移至 MySQL 数据库,满足反向迁移要求。

    个人理解: 也就是从 openGauss 数据库迁移回 Mysql 数据库中的过程

  • 2.代码

    配置config.yaml文件
    
    og_conn:
    
    host: "openGauss_ip"
    
    port: "5432"
    
    user: "user"
    
    password: "******"
    
    database: "postgres"
    
    charset: "utf8"
    
    driver: "org.opengauss.Driver"
    
    ASSUME_MIN_SERVER_VERSION: "9.4"//逻辑复制必备属性
    
    REPLICATION: "database" //逻辑复制必备属性
    
    PREFER_QUERY_MODE: "simple"//逻辑复制必备属性
    
    slot:
    
    name: "replication_slot"//逻辑复制槽名称
    
    include-xids: false//解码数据是否包含xid信息
    
    skip-empty-xacts: true//解码事务是否包含空事务
    
    waitLSN: ""//逻辑复制槽开启的lsn
    
    parallel-decode-num: 20//并行解码个数,最大20
    
    white-table-list: ""//库表白名单
    
    standby-connection: false//强制备机解码
    
    decode-style: "j"//解码格式
    
    decoding: "mppdb_decoding"//创建逻辑复制槽的工具
    
    runnable_num: 1//并行回放个数
    
    mysql:
    
    driver: "com.mysql.cj.jdbc.Driver"
    
    host: "mysql_ip"
    
    port: "3306"
    
    user: "user"
    
    password: "******"
    
    database: "database
    
    反项迁移
    
    mvn clean package(编译)
    
    java -jar ./reverse-migration-mysql-1.0-SNAPSHOT.jar start/create/drop(运行)
    
    numactl -c 0 -31 -m 0 java -Xms15G -Xmx25Gs -jar ./reverse-migration-mysql-1.0-SNAPSHOT.jar start/create/drop(执行)
    

三、小结

本次文章我准备写一个系列,主要针对 openGauss 数据库的各种讲解,希望各位小伙伴予以支持!

  • 20
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值