离线安装Flink,使用Flink SQL同步数据。

文章介绍了如何利用FlinkSQL结合MySQL的变更数据捕获(CDC)功能从mysqlA的表AA同步数据到mysqlB的表BA。过程中涉及了配置Flink环境、启用MySQL的GTID模式、设置checkpoint间隔以及创建源表和目标表的FlinkSQL语句,最终实现了通过JDBC写入mysqlB的过渡表dw_orders来完成数据同步。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前情提要

同步mysqlA中表AA 至 mysqlB中表BA,此处读采用mysql-cdc,写采用JDBC

资源准备

  • 下载相应jar包

    • flink-sql-connector-mysql-cdc-2.3.0.jar
    • flink-connector-jdbc_2.12-1.14.6.jar
    • mysql-connector-java-8.0.30.jar
      将下载好的包,复制到flink-1.16.1/lib
  • 数据库开启GTID

    找到my.cnf,在[mysqld]中加入如下信息

    [mysqld]
    ……
    server-id=1
    log-bin=mysql-bin
    binlog-format=row
    gtid-mode=ON
    enforce-gtid-consistency=true
    log-slave-updates=ON
    
  • 准备数据

    mysqlA中信息

    CREATE DATABASE test_db;
    USE test_db;
    CREATE TABLE orders (
      order_id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
      order_date DATETIME NOT NULL,
      customer_name VARCHAR(255) NOT NULL,
      price DECIMAL(10, 5) NOT NULL,
      product_id INTEGER NOT NULL,
      order_status BOOLEAN NOT NULL -- Whether order has been placed
    ) AUTO_INCREMENT = 10001;
    
    INSERT INTO orders
    VALUES (default, '2020-07-30 10:08:22', 'Jark', 50.50, 102, false),
           (default, '2020-07-30 10:11:09', 'Sally', 15.00, 105, false),
           (default, '2020-07-30 12:00:30', 'Edward', 25.25, 106, false);
    

    mysqlB中信息

    CREATE DATABASE test_dw;
    USE test_dw;
    CREATE TABLE orders (
      order_id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
      order_date DATETIME NOT NULL,
      customer_name VARCHAR(255) NOT NULL,
      price DECIMAL(10, 5) NOT NULL,
      product_id INTEGER NOT NULL,
      order_status BOOLEAN NOT NULL -- Whether order has been placed
    )
    

离线安装Flink 文档

  • 安装java 11

    # mac 安装 java11
    $  brew install java11
    $  sudo ln -sfn /usr/local/opt/openjdk@11/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-11.jdk
    $  java -version
    openjdk version "11.0.16.1" 2022-08-12
    OpenJDK Runtime Environment Homebrew (build 11.0.16.1+0)
    OpenJDK 64-Bit Server VM Homebrew (build 11.0.16.1+0, mixed mode)
    
  • 下载 release 1.16.1 并解压

    $ tar -xzf flink-1.16.1-bin-scala_2.12.tgz
    $ cd flink-1.16.1
    
  • 启动集群

    $ cd flink-1.16.1
    # 启动集群
    $ ./bin/start-cluster.sh
    # 停止
    $ ./bin/stop-cluster.sh
    

    启动集群之后访问:http://localhost:8081/即可看到web UI

使用Fink SQL,零代码实现同步

  • 启动 Fink SQL

    $ cd flink-1.16.1
    $ ./bin/sql-client.sh
    
                                       ▒▓██▓██▒
                                   ▓████▒▒█▓▒▓███▓▒
                                ▓███▓░░        ▒▒▒▓██▒  ▒
                              ░██▒   ▒▒▓▓█▓▓▒░      ▒████
                              ██▒         ░▒▓███▒    ▒█▒█▒
                                ░▓█            ███   ▓░▒██
                                  ▓█       ▒▒▒▒▒▓██▓░▒░▓▓█
                                █░ █   ▒▒░       ███▓▓█ ▒█▒▒▒
                                ████░   ▒▓█▓      ██▒▒▒ ▓███▒
                             ░▒█▓▓██       ▓█▒    ▓█▒▓██▓ ░█░
                       ▓░▒▓████▒ ██         ▒█    █▓░▒█▒░▒█▒
                      ███▓░██▓  ▓█           █   █▓ ▒▓█▓▓█▒
                    ░██▓  ░█░            █  █▒ ▒█████▓▒ ██▓░▒
                   ███░ ░ █░          ▓ ░█ █████▒░░    ░█░▓  ▓░
                  ██▓█ ▒▒▓▒          ▓███████▓░       ▒█▒ ▒▓ ▓██▓
               ▒██▓ ▓█ █▓█       ░▒█████▓▓▒░         ██▒▒  █ ▒  ▓█▒
               ▓█▓  ▓█ ██▓ ░▓▓▓▓▓▓▓▒              ▒██▓           ░█▒
               ▓█    █ ▓███▓▒░              ░▓▓▓███▓          ░▒░ ▓█
               ██▓    ██▒    ░▒▓▓███▓▓▓▓▓██████▓▒            ▓███  █
              ▓███▒ ███   ░▓▓▒░░   ░▓████▓░                  ░▒▓▒  █▓
              █▓▒▒▓▓██  ░▒▒░░░▒▒▒▒▓██▓░                            █▓
              ██ ▓░▒█   ▓▓▓▓▒░░  ▒█▓       ▒▓▓██▓    ▓▒          ▒▒▓
              ▓█▓ ▓▒█  █▓░  ░▒▓▓██▒            ░▓█▒   ▒▒▒░▒▒▓█████▒
               ██░ ▓█▒█▒  ▒▓▓▒  ▓█                █░      ░░░░   ░█▒
               ▓█   ▒█▓   ░     █░                ▒█              █▓
                █▓   ██         █░                 ▓▓        ▒█▓▓▓▒█░
                 █▓ ░▓██░       ▓▒                  ▓█▓▒░░░▒▓█░    ▒█
                  ██   ▓█▓░      ▒                    ░▒█▒██▒      ▓▓
                   ▓█▒   ▒█▓▒░                         ▒▒ █▒█▓▒▒░░▒██
                    ░██▒    ▒▓▓▒                     ▓██▓▒█▒ ░▓▓▓▓▒█▓
                      ░▓██▒                          ▓░  ▒█▓█  ░░▒▒▒
                          ▒▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░▓▓  ▓░▒█░
    
        ______ _ _       _       _____  ____  _         _____ _ _            _  BETA
       |  ____| (_)     | |     / ____|/ __ \| |       / ____| (_)          | |
       | |__  | |_ _ __ | | __ | (___ | |  | | |      | |    | |_  ___ _ __ | |_
       |  __| | | | '_ \| |/ /  \___ \| |  | | |      | |    | | |/ _ \ '_ \| __|
       | |    | | | | | |   <   ____) | |__| | |____  | |____| | |  __/ | | | |_
       |_|    |_|_|_| |_|_|\_\ |_____/ \___\_\______|  \_____|_|_|\___|_| |_|\__|
    
            Welcome! Enter 'HELP;' to list all available commands. 'QUIT;' to exit.
    
    Command history file path: /Users/zhangkai/.flink-sql-history
    
    Flink SQL>
    
  • 设置checkpoint

    # 每隔3秒做一次 checkpoint 生产建议5-10分钟
    Flink SQL> SET execution.checkpointing.interval = 3s;
    
  • 使用 Flink SQL CLI 创建对应的表,用于同步这些底层数据库表的数据

# 读取mysqlA中信息
CREATE TABLE orders (
   order_id INT,
   order_date TIMESTAMP(0),
   customer_name STRING,
   price DECIMAL(10, 5),
   product_id INT,
   order_status BOOLEAN,
   PRIMARY KEY (order_id) NOT ENFORCED
 ) WITH (
   'connector' = 'mysql-cdc',
   'hostname' = 'localhost',
   'port' = '3306',
   'username' = 'root',
   'password' = 'secret',
   'database-name' = 'test_db',
   'table-name' = 'orders'
 );
  • 创建 dw_orders 表, 用来将关联后的订单数据写入 mysqlB 中
# 用于写入mysqlB 的过度表
CREATE TABLE dw_orders (
   order_id INT,
   order_date TIMESTAMP(0),
   customer_name STRING,
   price DECIMAL(10, 5),
   product_id INT,
   order_status BOOLEAN,
   PRIMARY KEY (order_id) NOT ENFORCED
 ) WITH (
   'connector' = 'jdbc',
   'url' = 'jdbc:mysql://localhost:3306/test_dw',
   'username' = 'root',
   'password' = 'secret',
   'table-name' = 'orders'
 );
  • 执行写入 mysqlB 中
INSERT INTO dw_orders SELECT * FROM orders;
  • 至此,test_db.orders 增删改都会同步至 test_dw.orders中

  • 总的来说就是

    mysql-cdc 读取mysqlA中信息,jdbc 过度写入mysqlB中。

### 方案概述 为了实现从 MongoDB 同步数据到 MySQL,可以利用 Flink SQL 和其内置的 CDC 连接器功能。具体来说,这涉及到配置源表和目标表,并设置相应的连接器属性。 ### 配置环境 确保已经正确安装并配置好 Flink 环境以及 MongoDB 和 MySQL 数据库服务。对于离线环境中部署 Flink 及其 Web UI 访问路径可参照说明[^3]。 ### 创建源表 (MongoDB) 定义一个名为 `mongo_source` 的源表来读取来自 MongoDB 的变更日志: ```sql CREATE TABLE mongo_source ( id STRING, name STRING, age INT, ts TIMESTAMP(3), WATERMARK FOR ts AS ts - INTERVAL '5' SECOND ) WITH ( 'connector' = 'mongodb-cdc', 'hostname' = 'localhost', -- 替换成实际地址 'port' = '27017', -- 默认端口 'database' = 'test_db', -- 要监控变化的目标数据库名称 'collection' = 'users' -- 监控的具体集合名 ); ``` 此部分描述了如何通过指定 `'connector'='mongodb-cdc'` 来启用对 MongoDB 中特定 collection 的更改追踪能力[^4]。 ### 创建目标表 (MySQL) 接着,在 MySQL 中创建接收同步过来的数据的目的地表 `mysql_sink`: ```sql CREATE TABLE mysql_sink ( id VARCHAR(255), name VARCHAR(255), age INTEGER, PRIMARY KEY(id) ) WITH ( 'connector' = 'jdbc', 'url' = 'jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC', 'table-name' = 'synced_users', 'username' = '${your_username}', -- 用户名替换为真实值 'password' = '${your_password}' -- 密码替换为真实值 ); ``` 这里指定了 JDBC URL、用户名及密码等必要参数以建立与 MySQL 之间的连接。 ### 构建同步作业 最后一步就是构建将上述两张表关联起来的任务逻辑: ```sql INSERT INTO mysql_sink SELECT * FROM mongo_source; ``` 这条语句会持续不断地把所有发生在 MongoDB 上的变化记录转发给 MySQL 表中相应字段上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值