Debezium Mysql to Postgres测试


准备环境

使用docker-compose

version: '3'
services:
  dbz-zookeeper:
    image: debezium/zookeeper:1.7
    container_name: dbz-zookeeper
    ports:
     - 2181:2181
     - 2888:2888
     - 3888:3888
    networks:
      - dbz-network
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 1024M
  dbz-kafka:
    image: debezium/kafka:1.7
    container_name: dbz-kafka
    ports:
     - 9092:9092
    depends_on:
      - dbz-zookeeper
    environment:
      - ZOOKEEPER_CONNECT=dbz-zookeeper:2181
      - KAFKA_MAX_REQUEST=524288000
      - KAFKA_MESSAGE_MAX_BYTES=524288000
      - KAFKA_BUFFER_MEMORY=629145600
      - KAFKA_SOCKET_REQUEST_MAX_BYTES=629145600
    networks:
      - dbz-network
    deploy:
      resources:
        limits:
          cpus: '2'
          memory: 2048M
  pg13:
    container_name: pg13
    image: postgres:13.5
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    networks:
      - dbz-network
    deploy:
      resources:
        limits:
          cpus: '2'
          memory: 4096M
    privileged: true
  mysql8:
    container_name: mysql8
    image: mysql:5.7.36
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=mysql
    networks:
      - dbz-network
    volumes:
      - /root/cdc/compose/mysql/conf/mysql.cnf:/etc/mysql/conf.d/mysql.cnf
    deploy:
      resources:
        limits:
          cpus: '2'
          memory: 4096M
  dbz-connect:
    container_name: dbz-connect
    image: registry.cn-qingdao.aliyuncs.com/xfopen/connect:1.7
    ports:
      - 8083:8083
      - 5005:5005
    depends_on:
      - dbz-kafka
    environment:
        - BOOTSTRAP_SERVERS=dbz-kafka:9092
        - CONNECT_GROUP_ID:compose-connect-group
        - CONFIG_STORAGE_TOPIC=my_connect_configs
        - OFFSET_STORAGE_TOPIC=my_connect_offsets
        - STATUS_STORAGE_TOPIC=my_connect_statuses
        - CONNECT_MAX_REQUEST_SIZE=524288000
        - CONNECT_MESSAGE_MAX_BYTES=524288000
        - CONNECT_FETCH_MESSAGE_MAX_BYTES=629145600
        - CONNECT_PRODUCER_MAX_REQUEST_SIZE=524288000
        - CONNECT_BUFFER_MEMORY=629145600
        - CONNECT_PRODUCER_BUFFER_MEMORY=524288000
        - CONNECT_SOCKET_REQUEST_MAX_BYTES=629145600
        - CONNECT_OFFSET_FLUSH_INTERVAL_MS:10000
        - CONNECT_TOPIC_CREATION_DEFAULT_REPLICATION_FACTOR:3
        - CONNECT_TOPIC_CREATION_DEFAULT_PARTITIONS:3
    networks:
      - dbz-network
    deploy:
      resources:
        limits:
          cpus: '4'
          memory: 4096M
networks:
  dbz-network:
    external: false

mysql 挂载的配置文件

没有使用GTID 如果需要设置GTID 可以添加

expire_logs_days  = 10
binlog_rows_query_log_events=ON
enforce-gtid-consistency
gtid-mode=ON
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html

[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
skip-host-cache
skip-name-resolve
#datadir=/var/lib/mysql
#socket=/var/lib/mysql/mysql.sock
#secure-file-priv=/var/lib/mysql-files
user=mysql

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

#log-error=/var/log/mysqld.log
#pid-file=/var/run/mysqld/mysqld.pid

# ----------------------------------------------
# Enable the binlog for replication & CDC
# ----------------------------------------------

# Enable binary replication log and set the prefix, expiration, and log format.
# The prefix is arbitrary, expiration can be short for integration tests but would
# be longer on a production system. Row-level info is required for ingest to work.
# Server ID is required, but this will vary on production systems
server-id         = 223344
log_bin           = mysql-bin
expire_logs_days  = 1
binlog_format     = row

default_authentication_plugin = mysql_native_password

source文件

{
    "name": "m-s-connector",
    "config": {
        "connector.class": "io.debezium.connector.mysql.MySqlConnector",
        "tasks.max": "1",
        "database.server.name": "test",
        "database.user": "root",
        "database.server.id": "184054",
        "database.password" : "mysql",
        "database.dbname" : "test",
        "database.hostname": "ip",
        "database.port": "3306",
        "table.include.list": "test.bmsql_config,test.bmsql_customer,test.bmsql_district,test.bmsql_history,test.bmsql_item,test.bmsql_new_order,test.bmsql_oorder,test.bmsql_order_line,test.bmsql_stock,test.bmsql_warehouse",
        "database.history.kafka.bootstrap.servers" : "dbz-kafka:9092",
        "database.history.kafka.topic": "schema-changes.mysql-source",
        "include.schema.changes": "true",
        "database.history.skip.unparseable.ddl": true,
        "database.history.store.only.captured.tables.ddl": true
    }
}

sink文件

{
    "name":"p-s-connector",
    "config":{
        "topics": "test.test.bmsql_config,test.test.bmsql_customer,test.test.bmsql_district,test.test.bmsql_history,test.test.bmsql_item,test.test.bmsql_new_order,test.test.bmsql_oorder,test.test.bmsql_order_line,test.test.bmsql_stock,test.test.bmsql_warehouse",
        "connector.class": "io.confluent.connect.jdbc.JdbcSinkConnector",
        "connection.url": "jdbc:postgresql://ip:5432/test",
        "connection.user": "postgres",
        "connection.password": "postgres",
        "tasks.max": "1",
        "auto.create": true,
        "auto.evolve": true,
        "insert.mode":"upsert",
        "delete.enabled": true,
        "batch.size": 3000,
        "delete.enabled": false,
        "pk.mode": "record_key",
        "transforms":"ExtractField,repTopic,TimestampConverter",
        "transforms.ExtractField.type":"org.apache.kafka.connect.transforms.ExtractField$Value",
        "transforms.ExtractField.field":"after",
        "transforms.repTopic.type":"org.apache.kafka.connect.transforms.RegexRouter",
        "transforms.repTopic.regex":"(.*.test).(.*)",
        "transforms.repTopic.replacement":"$2",
        "transforms.TimestampConverter.type": "com.github.howareyouo.kafka.connect.transforms.TimestampConverter$Value",
        "transforms.TimestampConverter.target.type": "Timestamp",
        "transforms.TimestampConverter.format":"yyyy-MM-dd'T'HH:mm:ss'Z'",
        "transforms.TimestampConverter.fields": "ol_delivery_d,o_entry_d,h_date,c_since"
  }
}

测试软件下载

点击下载 下载zip文件 支持mysql的版本

创建数据库

在mysql端跟postgres分别进入容器操作数据库创建database

mysql用户名密码 root/mysql
postgres用户名密码 postgres/postgres 切换postgres用户免密
双端创建测试数据库
CREATE DATABASE test
使用Benchmark的建表创建表跟索引 不使用Benchmark的初始化会额外创建外键等
mysql仅执行benchmarksql-mysql/run/sql.mysql/tableCreates.sql 即可
postgresql端要执行
    benchmarksql-mysql/run/sql.common/tableCreates.sql
    benchmarksql-mysql/run/sql.common/indexCreates.sql
    benchmarksql-mysql/run/sql.postgres/extraHistID.sql
    三个sql的内容

加载测试数据

./runLoader.sh 配置文件
./runBenchmark.sh 配置文件

配置文件示例

db=mysql
driver=com.mysql.jdbc.Driver
conn=jdbc:mysql://localhost:3306/test?useSSL=false&useServerPrepStmts=true&useConfigs=maxPerformance&rewriteBatchedStatements=true
user=root
password=mysql

warehouses=1
loadWorkers=4

terminals=1
//To run specified transactions per terminal- runMins must equal zero
runTxnsPerTerminal=0
//To run for specified minutes- runTxnsPerTerminal must equal zero
runMins=10
//Number of total transactions per minute
limitTxnsPerMin=0

//Set to true to run in 4.x compatible mode. Set to false to use the
//entire configured database evenly.
terminalWarehouseFixed=true

//The following five values must add up to 100
//The default percentages of 45, 43, 4, 4 & 4 match the TPC-C spec
newOrderWeight=45
paymentWeight=43
orderStatusWeight=4
deliveryWeight=4
stockLevelWeight=4

// Directory name to create for collecting detailed result data.
// Comment this out to suppress.
resultDirectory=my_result_%tY-%tm-%td_%tH%tM%tS
//osCollectorScript=./misc/os_collector_linux.py
//osCollectorInterval=1
//osCollectorSSHAddr=user@dbhost
//osCollectorDevices=net_eth0 blk_sda

创建source、sink connector

curl -i -X POST -H "Accept:application/json" -H "Content-Type:application/json" http://localhost:8083/connectors/ -d @source.json
curl -i -X POST -H "Accept:application/json" -H "Content-Type:application/json" http://localhost:8083/connectors/ -d @sink.json