El conector de SelectDB integra Realtime Compute for Apache Flink con ApsaraDB for SelectDB, un almacén de datos en tiempo real totalmente administrado y compatible con Apache Doris en Alibaba Cloud. Úselo para construir pipelines en tiempo real que lean, escriban o busquen datos en SelectDB, así como para ejecutar la sincronización completa de bases de datos en trabajos de ingesta de datos basados en YAML.
Capacidades compatibles:
|
Categoría |
Detalles |
|
Tipos de tabla |
Tabla de origen, tabla de destino, tabla de dimensiones, destino de ingesta de datos |
|
Modo de ejecución |
Streaming y por lotes |
|
Formato de datos |
JSON y CSV |
|
Tipo de API |
DataStream, SQL y trabajos YAML de ingesta de datos |
|
Compatibilidad con actualizaciones y eliminaciones |
Sí |
|
Métricas de monitoreo |
Ninguna |
Características principales:
Sincronización completa de los datos de la base de datos.
Semántica exactly-once mediante confirmación en dos fases (2PC), sin registros duplicados ni perdidos.
Compatible con Apache Doris 1.0 y versiones posteriores.
Requisitos previos
Antes de empezar, asegúrese de contar con lo siguiente:
Realtime Compute for Apache Flink con Ververica Runtime (VVR) 8.0.10 o una versión posterior.
Una instancia de ApsaraDB for SelectDB. Consulte Create an instance.
Una lista blanca de direcciones IP configurada en la instancia. Consulte Configure a whitelist.
Configurar el conector
El conector de SelectDB viene integrado en VVR 11.1 y versiones posteriores, por lo que no se requiere instalación manual.
Para las versiones de VVR 8.0.10 a 11.0, instale el conector manualmente:
Descargue el paquete JAR desde Maven Central (versiones de Flink 1.15 a 1.17).
Cargue el archivo JAR en su consola de desarrollo de Realtime Compute for Apache Flink. Consulte Manage custom connectors.
Haga referencia al conector en su trabajo SQL mediante
'connector' = 'doris'.
SQL
Sintaxis
Los tres tipos de tabla (origen, destino y dimensiones) comparten la misma sintaxis DDL. El rol de la tabla se define según los parámetros que incluya.
Para usar SelectDB como tabla de origen, primero habilite la conexión directa al clúster. En la consola de ApsaraDB for SelectDB, vaya a Instance Details > Network Information y haga clic en Enable Direct Cluster Connection . Esta acción activa el protocolo Arrow Flight SQL para lecturas paralelas de alto rendimiento.
CREATE TABLE selectdb_source (
order_id BIGINT,
user_id BIGINT,
total_amount DECIMAL(10, 2),
order_status TINYINT,
create_time TIMESTAMP(3),
product_name STRING
) WITH (
'connector' = 'doris',
'fenodes' = 'selectdb-cn-*******.selectdbfe.rds.aliyuncs.com:8080',
'table.identifier' = 'shop_db.orders',
'username' = 'admin',
'password' = '****'
);
Parámetros
Generales
|
Parámetro |
Obligatorio |
Predeterminado |
Descripción |
|
|
Sí |
— |
Valor fijo: |
|
|
Sí |
— |
Endpoint HTTP de la instancia de SelectDB: |
|
|
No |
— |
Cadena de conexión Java Database Connectivity (JDBC) para búsquedas en tablas de dimensiones y consultas de metadatos: |
|
|
Sí |
— |
Tabla de destino con el formato |
|
|
Sí |
— |
Nombre de usuario de la base de datos. Si es necesario, restablezca la contraseña desde la esquina superior derecha de la página Instance Details. |
|
|
Sí |
— |
Contraseña del usuario de la base de datos. |
|
|
No |
|
Número de reintentos para solicitudes con errores. |
|
|
No |
|
Tiempo de espera de conexión. |
|
|
No |
|
Tiempo de espera de lectura. |
Tabla de origen
|
Parámetro |
Obligatorio |
Predeterminado |
Descripción |
|
|
No |
|
Tiempo de espera de la consulta (6 horas de forma predeterminada). |
|
|
No |
|
Número de tablets por partición. Los valores más bajos aumentan el paralelismo de Flink, pero generan mayor presión sobre la base de datos. |
|
|
No |
|
Máximo de filas leídas desde un nodo Backend (BE) por solicitud. Increméntelo para reducir la sobrecarga de conexión y la latencia de red. |
|
|
No |
|
Límite de memoria por consulta en bytes (8 GB de forma predeterminada). |
|
|
No |
|
No requiere configuración adicional. Al habilitar Direct Cluster Connection en la consola de SelectDB, Arrow Flight SQL se activa automáticamente. |
|
|
No |
— |
Puerto de Arrow Flight SQL ( |
Tabla de destino
El modo de escritura afecta las garantías de entrega y el comportamiento de vaciado. Elija la opción adecuada según sus requisitos de consistencia:
|
Escritura en streaming |
Escritura por lotes |
|
|
Condición de activación |
Sigue los intervalos de checkpoint de Flink |
Vaciado periódico por volumen de datos o umbral de tiempo |
|
Garantía de entrega |
Exactly-once (mediante 2PC) |
At-least-once; logre idempotencia con el modelo Unique |
|
Latencia |
Limitada por el intervalo de checkpoint |
Flexible e independiente de los checkpoints |
|
Tolerancia a fallos |
Recuperación completa del estado de Flink |
Depende de la deduplicación del modelo Unique |
|
Parámetro |
Obligatorio |
Predeterminado |
Descripción |
|
|
No |
— |
Prefijo de etiqueta para importaciones de Stream Load. Debe ser único a nivel global entre todos los trabajos, ya que la misma etiqueta solo se puede confirmar una vez. Es obligatorio para garantizar la semántica exactly-once tras reiniciar los trabajos. |
|
|
No |
— |
Parámetros de importación de Stream Load que se pasan directamente a la API de Stream Load de SelectDB. Consulte los ejemplos a continuación. |
|
|
No |
|
Propaga las operaciones DELETE. Requiere que la tabla de Doris tenga habilitada la eliminación por lotes y solo funciona con el modelo Unique. |
|
|
No |
|
Habilita la confirmación en dos fases (2PC) para lograr la semántica exactly-once. Consulte Explicit Transaction Operations. |
|
|
No |
|
Tamaño del búfer de caché de escritura en bytes. Mantenga el valor predeterminado. |
|
|
No |
|
Cantidad de búferes de caché de escritura. Mantenga el valor predeterminado. |
|
|
No |
|
Máximo de reintentos después de un error de confirmación. |
|
|
No |
|
Cambia al modo de escritura por lotes. El vaciado se controla mediante los tres parámetros |
|
|
No |
|
Tamaño de la cola de caché en modo por lotes. |
|
|
No |
|
Máximo de filas por vaciado en modo por lotes. |
|
|
No |
|
Máximo de bytes por vaciado en modo por lotes. |
|
|
No |
|
Intervalo de vaciado en modo por lotes. |
|
|
No |
|
Omite los eventos update-before provenientes de Flink CDC. |
**Ejemplos de sink.properties.*:**
Formato CSV:
'sink.properties.column_separator' = ','
-- If values may contain commas, use a non-printable separator:
-- 'sink.properties.column_separator' = '\x01'
Formato JSON:
'sink.properties.format' = 'json',
'sink.properties.read_json_by_line' = 'true'
-- Alternatively: 'sink.properties.strip_outer_array' = 'true'
Tabla de dimensiones
|
Parámetro |
Obligatorio |
Predeterminado |
Descripción |
|
|
No |
|
Máximo de filas en la caché de búsqueda. El valor |
|
|
No |
|
Tiempo de vida (TTL) de las entradas de la caché. |
|
|
No |
|
Reintentos tras fallar una consulta de búsqueda. |
|
|
No |
|
Habilita la búsqueda asíncrona. |
|
|
No |
|
Tamaño máximo de lote por consulta en modo de búsqueda asíncrona. |
|
|
No |
|
Tamaño de la cola del búfer intermedio en modo de búsqueda asíncrona. |
|
|
No |
|
Hilos de búsqueda JDBC por tarea en modo de búsqueda asíncrona. |
Ejemplos
Tabla de origen
CREATE TEMPORARY TABLE selectdb_source (
order_id BIGINT,
user_id BIGINT,
total_amount DECIMAL(10, 2),
order_status TINYINT,
create_time TIMESTAMP(3),
product_name STRING
) WITH (
'connector' = 'doris',
'fenodes' = 'selectdb-cn-*******.selectdbfe.rds.aliyuncs.com:8080',
'table.identifier' = 'shop_db.orders',
'username' = 'admin',
'password' = '****'
);
Tabla de destino
CREATE TEMPORARY TABLE selectdb_sink (
order_id BIGINT,
user_id BIGINT,
total_amount DECIMAL(10, 2),
order_status TINYINT,
create_time TIMESTAMP(3),
product_name STRING
) WITH (
'connector' = 'doris',
'fenodes' = 'selectdb-cn-*******.selectdbfe.rds.aliyuncs.com:8080',
'table.identifier' = 'shop_db.orders',
'username' = 'admin',
'password' = '****',
'sink.label-prefix' = 'flink_orders' -- Must be globally unique across jobs
);
Tabla de dimensiones
SelectDB actúa como tabla de dimensiones de búsqueda combinada con una tabla de hechos en streaming.
-- Fact table from Kafka
CREATE TEMPORARY TABLE fact_table (
`id` BIGINT,
`name` STRING,
`city` STRING,
`process_time` AS proctime()
) WITH (
'connector' = 'kafka',
...
);
-- Dimension table from SelectDB
CREATE TEMPORARY TABLE dim_city (
`city` STRING,
`level` INT,
`province` STRING,
`country` STRING
) WITH (
'connector' = 'doris',
'fenodes' = 'selectdb-cn-*******.selectdbfe.rds.aliyuncs.com:8080',
'jdbc-url' = 'jdbc:mysql://selectdb-cn-***.selectdbfe.rds.aliyuncs.com:9030',
'table.identifier' = 'dim.dim_city',
'username' = 'admin',
'password' = '****'
);
-- Temporal join
SELECT a.id, a.name, a.city, c.province, c.country, c.level
FROM fact_table a
LEFT JOIN dim_city FOR SYSTEM_TIME AS OF a.process_time AS c
ON a.city = c.city;
Ingesta de datos
Utilice el conector de SelectDB como destino en trabajos de ingesta de datos basados en YAML para sincronizar bases de datos completas.
Sintaxis
source:
type: <source-type>
sink:
type: doris
name: Doris Sink
fenodes: selectdb-cn-****.selectdbfe.rds.aliyuncs.com:8080
username: root
password: ""
Parámetros
|
Parámetro |
Obligatorio |
Predeterminado |
Descripción |
|
|
Sí |
— |
Valor fijo: |
|
|
No |
— |
Nombre descriptivo del destino. |
|
|
Sí |
— |
Endpoint HTTP: |
|
|
No |
— |
Cadena de conexión JDBC. Ejemplo: |
|
|
Sí |
— |
Nombre de usuario de la base de datos. |
|
|
Sí |
— |
Contraseña del usuario de la base de datos. |
|
|
No |
|
El modo por lotes está habilitado de forma predeterminada en los trabajos de ingesta de datos. El vaciado se controla mediante los tres parámetros |
|
|
No |
|
Tamaño de la cola de caché. |
|
|
No |
|
Máximo de filas por vaciado. |
|
|
No |
|
Máximo de bytes por vaciado. |
|
|
No |
|
Intervalo de vaciado. Mínimo: |
|
|
No |
— |
Parámetros de importación de Stream Load. |
**Ejemplos de sink.properties.*:**
Formato CSV:
sink.properties.column_separator: ','
# If values may contain commas, use a non-printable separator:
# sink.properties.column_separator: '\x01'
Formato JSON:
sink.properties.format: 'json'
sink.properties.read_json_by_line: 'true'
Ejemplos
A continuación se presentan ejemplos de escenarios comunes de ingesta de datos. Sustituya los endpoints, nombres de usuario y contraseñas de marcador de posición por sus valores reales.
La expresión ${secret_values.variable_name} hace referencia a una variable secreta creada en su espacio de trabajo. Para obtener más información, consulte Manage variables. Para ver la descripción completa de los parámetros de origen, consulte MySQL YAML connector y Postgres CDC connector.
El conector no crea las bases de datos de destino. Antes de empezar, cree en su instancia de ApsaraDB for SelectDB las bases de datos de destino que se usan en los siguientes ejemplos. Las tablas de destino se crean automáticamente si no existen.
Sincronización de una sola tabla
Sincronice una única tabla de MySQL hacia SelectDB. La tabla de destino se crea automáticamente si no existe.
source:
type: mysql
name: MySQL Source
hostname: <yourHostname>
port: 3306
username: ${secret_values.mysql_username}
password: ${secret_values.mysql_password}
tables: test_db.test_source_table
server-id: 5401-5499
# (Optional) Synchronize the existing full data first, and then the incremental data.
scan.startup.mode: initial
sink:
type: doris
name: SelectDB Sink
fenodes: selectdb-cn-****.selectdbfe.rds.aliyuncs.com:8080
jdbc-url: jdbc:mysql://selectdb-cn-****.selectdbfe.rds.aliyuncs.com:9030
username: ${secret_values.selectdb_username}
password: ${secret_values.selectdb_password}
pipeline:
name: MySQL to SelectDB Pipeline
Sincronización completa de la base de datos
Sincronice todas las tablas de una base de datos MySQL hacia SelectDB. Los nombres de las bases de datos y tablas descendentes coinciden con los de origen. Las tablas de destino se crean automáticamente si no existen.
source:
type: mysql
name: MySQL Source
hostname: <yourHostname>
port: 3306
username: ${secret_values.mysql_username}
password: ${secret_values.mysql_password}
# Matches all tables in the test_db database.
tables: test_db.\.*
server-id: 5401-5499
scan.startup.mode: initial
# (Optional) Synchronize tables that are created during the incremental phase without restarting the job.
scan.binlog.newly-added-table.enabled: true
sink:
type: doris
name: SelectDB Sink
fenodes: selectdb-cn-****.selectdbfe.rds.aliyuncs.com:8080
jdbc-url: jdbc:mysql://selectdb-cn-****.selectdbfe.rds.aliyuncs.com:9030
username: ${secret_values.selectdb_username}
password: ${secret_values.selectdb_password}
# (Optional) The flush interval for batch writing. Lower this value for small workloads so that data is not held in the buffer for too long.
sink.buffer-flush.interval: 10s
pipeline:
name: MySQL to SelectDB Pipeline
Exclusión de tablas en la sincronización completa
Omita las tablas que no desea sincronizar, como las temporales o las de registro. Sin un módulo de enrutamiento, los datos se escriben en la tabla de destino que tiene el mismo nombre que la tabla de origen.
source:
type: mysql
name: MySQL Source
hostname: <yourHostname>
port: 3306
username: ${secret_values.mysql_username}
password: ${secret_values.mysql_password}
tables: test_db.\.*
# Tables that match this regular expression are not synchronized. Separate multiple regular expressions with commas (,).
tables.exclude: test_db.tmp_\.*, test_db.log_\.*
server-id: 5401-5499
scan.startup.mode: initial
sink:
type: doris
name: SelectDB Sink
fenodes: selectdb-cn-****.selectdbfe.rds.aliyuncs.com:8080
jdbc-url: jdbc:mysql://selectdb-cn-****.selectdbfe.rds.aliyuncs.com:9030
username: ${secret_values.selectdb_username}
password: ${secret_values.selectdb_password}
pipeline:
name: MySQL to SelectDB Pipeline
Sincronización hacia bases de datos y tablas específicas
Utilice el módulo de enrutamiento para renombrar los destinos cuando los nombres de las bases de datos o tablas descendentes difieren de los originales. El siguiente ejemplo sincroniza las tablas de test_db hacia la base de datos ods_db y añade el prefijo ods_ al nombre de cada tabla. Por ejemplo, test_db.orders se sincroniza como ods_db.ods_orders.
source:
type: mysql
name: MySQL Source
hostname: <yourHostname>
port: 3306
username: ${secret_values.mysql_username}
password: ${secret_values.mysql_password}
tables: test_db.\.*
server-id: 5401-5499
scan.startup.mode: initial
sink:
type: doris
name: SelectDB Sink
fenodes: selectdb-cn-****.selectdbfe.rds.aliyuncs.com:8080
jdbc-url: jdbc:mysql://selectdb-cn-****.selectdbfe.rds.aliyuncs.com:9030
username: ${secret_values.selectdb_username}
password: ${secret_values.selectdb_password}
route:
# <> is a placeholder that is replaced with the matched source table name.
- source-table: test_db.\.*
sink-table: ods_db.ods_<>
replace-symbol: <>
pipeline:
name: MySQL to SelectDB Pipeline
Fusión de tablas fragmentadas
Combine varias tablas de fragmentos que comparten el mismo esquema en una única tabla de SelectDB. El siguiente ejemplo utiliza el módulo transform para agregar una columna que identifica la base de datos y la tabla de origen. Después, usa esta columna junto con la clave principal de negocio como clave principal compuesta, lo que permite rastrear el origen de los datos fusionados.
source:
type: mysql
name: MySQL Source
hostname: <yourHostname>
port: 3306
username: ${secret_values.mysql_username}
password: ${secret_values.mysql_password}
# Matches all shards, such as order_db_1.orders_1 and order_db_2.orders_2.
tables: order_db_\d+.orders_\d+
server-id: 5401-5499
scan.startup.mode: initial
sink:
type: doris
name: SelectDB Sink
fenodes: selectdb-cn-****.selectdbfe.rds.aliyuncs.com:8080
jdbc-url: jdbc:mysql://selectdb-cn-****.selectdbfe.rds.aliyuncs.com:9030
username: ${secret_values.selectdb_username}
password: ${secret_values.selectdb_password}
# Set this parameter to false when the downstream primary key differs from the upstream one. Otherwise, the rows that correspond to the old primary key are not deleted.
sink.ignore.update-before: false
transform:
- source-table: order_db_\d+.orders_\d+
# Append the src_table column that identifies the source database and table.
projection: "*, __schema_name__ || '.' || __table_name__ AS src_table"
# The composite primary key must be the same as the key columns of the destination table.
primary-keys: order_id, src_table
description: Append the source identifier and set a composite primary key
route:
# Merge all shards into a single table.
- source-table: order_db_\d+.orders_\d+
sink-table: dw_db.merged_orders
pipeline:
name: MySQL sharding to SelectDB Pipeline
Filtrado de datos y reducción de columnas
Utilice el módulo transform para filtrar datos y reducir columnas. La condición de filtro se evalúa sobre los campos de la tabla de origen para determinar si un registro se sincroniza, mientras que la proyección define qué columnas se escriben en la tabla descendente.
source:
type: mysql
name: MySQL Source
hostname: <yourHostname>
port: 3306
username: ${secret_values.mysql_username}
password: ${secret_values.mysql_password}
tables: test_db.test_source_table
server-id: 5401-5499
scan.startup.mode: initial
sink:
type: doris
name: SelectDB Sink
fenodes: selectdb-cn-****.selectdbfe.rds.aliyuncs.com:8080
jdbc-url: jdbc:mysql://selectdb-cn-****.selectdbfe.rds.aliyuncs.com:9030
username: ${secret_values.selectdb_username}
password: ${secret_values.selectdb_password}
transform:
- source-table: test_db.test_source_table
# Synchronize only the records whose order_status is PAID.
filter: "order_status = 'PAID'"
# Write only the following four columns.
projection: order_id, customer_id, total_amount, created_at
primary-keys: order_id
description: Filter by order status and prune columns
pipeline:
name: MySQL to SelectDB Pipeline
Sincronización completa de una base de datos PostgreSQL
Sincronice todas las tablas de un esquema de PostgreSQL hacia SelectDB. Antes de empezar, establezca wal_level en logical en la instancia de PostgreSQL y compruebe que max_replication_slots y max_wal_senders tengan capacidad suficiente. Para obtener más información, consulte Configure a PostgreSQL database.
source:
type: postgres
name: PostgreSQL Source
hostname: <yourHostname>
port: 5432
username: ${secret_values.pg_username}
password: ${secret_values.pg_password}
# PostgreSQL table names use the database.schema.table format.
tables: test_db.public.\.*
slot.name: <yourSlotName>
decoding.plugin.name: pgoutput
scan.startup.mode: initial
# (Optional) Use an existing publication instead of creating one when the job starts.
debezium.publication.autocreate.mode: disabled
debezium.publication.name: <yourPublicationName>
sink:
type: doris
name: SelectDB Sink
fenodes: selectdb-cn-****.selectdbfe.rds.aliyuncs.com:8080
jdbc-url: jdbc:mysql://selectdb-cn-****.selectdbfe.rds.aliyuncs.com:9030
username: ${secret_values.selectdb_username}
password: ${secret_values.selectdb_password}
pipeline:
name: PostgreSQL to SelectDB Pipeline
Mapeo de tipos
De Flink a SelectDB
|
Tipo de Flink CDC |
Tipo de SelectDB |
Notas |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SelectDB almacena cadenas en UTF-8. Los caracteres en inglés ocupan 1 byte y los caracteres chinos ocupan 3 bytes. La longitud máxima de |
|
|
|
Aplica el mismo multiplicador de UTF-8. La longitud máxima de |
|
|
|
|
|
|
|
|
|
|
|