This is an automated email from the ASF dual-hosted git repository.
dockerzhang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-inlong-website.git
The following commit(s) were added to refs/heads/master by this push:
new 0a9749bf8 [INLONG-393][Sort] Add usage document for MySQL Extract
Node, Elasticsearch Load Node (#394)
0a9749bf8 is described below
commit 0a9749bf8986a513c4b2272ac1e7eb6c978cf850
Author: yunqingmoswu <[email protected]>
AuthorDate: Thu Jun 9 11:47:10 2022 +0800
[INLONG-393][Sort] Add usage document for MySQL Extract Node, Elasticsearch
Load Node (#394)
---
docs/data_node/extract_node/auto_push.md | 2 +-
docs/data_node/extract_node/file.md | 2 +-
docs/data_node/extract_node/hdfs.md | 4 +
docs/data_node/extract_node/kafka.md | 2 +-
docs/data_node/extract_node/mongodb-cdc.md | 4 +
docs/data_node/extract_node/mysql-cdc.md | 607 +++++++++++++++++++++
docs/data_node/extract_node/mysql.md | 11 -
docs/data_node/extract_node/oracle-cdc.md | 4 +
docs/data_node/extract_node/overview.md | 59 ++
docs/data_node/extract_node/postgresql-cdc.md | 4 +
docs/data_node/extract_node/pulsar.md | 4 +
docs/data_node/extract_node/sqlserver-cdc.md | 4 +
docs/data_node/load_node/auto_consumption.md | 2 +-
docs/data_node/load_node/clickhouse.md | 2 +-
docs/data_node/load_node/elasticsearch.md | 356 ++++++++++++
docs/data_node/load_node/greenplum.md | 4 +
docs/data_node/load_node/hbase.md | 4 +
docs/data_node/load_node/hdfs.md | 4 +
docs/data_node/load_node/hive.md | 2 +-
docs/data_node/load_node/iceberg.md | 2 +-
docs/data_node/load_node/kafka.md | 2 +-
docs/data_node/load_node/mysql.md | 4 +
docs/data_node/load_node/oracle.md | 4 +
docs/data_node/load_node/overview.md | 80 +++
docs/data_node/load_node/postgresql.md | 4 +
docs/data_node/load_node/sqlserver.md | 4 +
docs/data_node/load_node/tdsql-postgresql.md | 4 +
docs/deployment/standalone.md | 2 +-
.../current/data_node/extract_node/auto_push.md | 2 +-
.../current/data_node/extract_node/file.md | 2 +-
.../current/data_node/extract_node/hdfs.md | 4 +
.../current/data_node/extract_node/kafka.md | 2 +-
.../current/data_node/extract_node/mongodb-cdc.md | 4 +
.../current/data_node/extract_node/mysql-cdc.md | 605 ++++++++++++++++++++
.../current/data_node/extract_node/mysql.md | 11 -
.../current/data_node/extract_node/oracle-cdc.md | 4 +
.../current/data_node/extract_node/overview.md | 61 +++
.../data_node/extract_node/postgresql-cdc.md | 4 +
.../current/data_node/extract_node/pulsar.md | 4 +
.../data_node/extract_node/sqlserver-cdc.md | 4 +
.../current/data_node/load_node/elasticsearch.md | 352 ++++++++++++
.../current/data_node/load_node/greenplum.md | 4 +
.../current/data_node/load_node/hbase.md | 4 +
.../current/data_node/load_node/hdfs.md | 4 +
.../current/data_node/load_node/mysql.md | 4 +
.../current/data_node/load_node/oracle.md | 4 +
.../current/data_node/load_node/overview.md | 80 +++
.../current/data_node/load_node/postgresql.md | 4 +
.../current/data_node/load_node/sqlserver.md | 4 +
.../data_node/load_node/tdsql-postgresql.md | 4 +
50 files changed, 2324 insertions(+), 34 deletions(-)
diff --git a/docs/data_node/extract_node/auto_push.md
b/docs/data_node/extract_node/auto_push.md
index f44c496c4..0cb5469ed 100644
--- a/docs/data_node/extract_node/auto_push.md
+++ b/docs/data_node/extract_node/auto_push.md
@@ -1,6 +1,6 @@
---
title: Auto Push
-sidebar_position: 1
+sidebar_position: 2
---
## Overview
diff --git a/docs/data_node/extract_node/file.md
b/docs/data_node/extract_node/file.md
index bd519cbfb..f3294debf 100644
--- a/docs/data_node/extract_node/file.md
+++ b/docs/data_node/extract_node/file.md
@@ -1,6 +1,6 @@
---
title: File
-sidebar_position: 2
+sidebar_position: 3
---
## Parameters
diff --git a/docs/data_node/extract_node/hdfs.md
b/docs/data_node/extract_node/hdfs.md
new file mode 100644
index 000000000..947e2f8c2
--- /dev/null
+++ b/docs/data_node/extract_node/hdfs.md
@@ -0,0 +1,4 @@
+---
+title: HDFS
+sidebar_position: 6
+---
\ No newline at end of file
diff --git a/docs/data_node/extract_node/kafka.md
b/docs/data_node/extract_node/kafka.md
index 9df2e534b..381ac68f9 100644
--- a/docs/data_node/extract_node/kafka.md
+++ b/docs/data_node/extract_node/kafka.md
@@ -1,6 +1,6 @@
---
title: Kafka
-sidebar_position: 3
+sidebar_position: 4
---
## Configuration
diff --git a/docs/data_node/extract_node/mongodb-cdc.md
b/docs/data_node/extract_node/mongodb-cdc.md
new file mode 100644
index 000000000..fd6fcb8f8
--- /dev/null
+++ b/docs/data_node/extract_node/mongodb-cdc.md
@@ -0,0 +1,4 @@
+---
+title: MongoDB-CDC
+sidebar_position: 7
+---
\ No newline at end of file
diff --git a/docs/data_node/extract_node/mysql-cdc.md
b/docs/data_node/extract_node/mysql-cdc.md
new file mode 100644
index 000000000..edb1a5e63
--- /dev/null
+++ b/docs/data_node/extract_node/mysql-cdc.md
@@ -0,0 +1,607 @@
+---
+title: MySQL-CDC
+sidebar_position: 5
+---
+
+## MySQL Extract Node
+
+The MySQL Extract Node allows for reading snapshot data and incremental data
from MySQL database. This document describes how to setup the MySQL Extract
Node to run SQL queries against MySQL databases.
+
+## Supported Version
+| Extract Node | Version
| Driver |
+|-----------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------|
+| [mysql-cdc](./mysql-cdc.md) | [MySQL](https://dev.mysql.com/doc): 5.6, 5.7,
8.0.x <br/> [RDS MySQL](https://www.aliyun.com/product/rds/mysql): 5.6, 5.7,
8.0.x <br/> [PolarDB MySQL](https://www.aliyun.com/product/polardb): 5.6, 5.7,
8.0.x <br/> [Aurora MySQL](https://aws.amazon.com/cn/rds/aurora): 5.6, 5.7,
8.0.x <br/> [MariaDB](https://mariadb.org): 10.x <br/> [PolarDB
X](https://github.com/ApsaraDB/galaxysql): 2.0.1 | JDBC Driver: 8.0.21 |
+
+## Dependencies
+
+In order to setup the MySQL Extract Node, the following table provides
dependency information for both projects using a build automation tool (such as
Maven or SBT) and SQL Client with Sort Connectors JAR bundles.
+
+### Maven dependency
+
+```
+<dependency>
+ <groupId>org.apache.inlong</groupId>
+ <artifactId>sort-connector-mysql-cdc</artifactId>
+ <!-- Choose the version that suits your application -->
+ <version>inlong_version</version>
+</dependency>
+```
+
+The MySQL driver dependency is also required to connect to MySQL database.
Please download
[mysql-connector-java-8.0.21.jar](https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.21/mysql-connector-java-8.0.21.jar)
and put it into `FLINK_HOME/lib/`.
+
+## Setup MySQL server
+
+You have to define a MySQL user with appropriate permissions on all databases
that the Debezium MySQL connector monitors.
+
+1. Create the MySQL user:
+
+```sql
+mysql> CREATE USER 'user'@'localhost' IDENTIFIED BY 'password';
+```
+
+2. Grant the required permissions to the user:
+
+```sql
+mysql> GRANT SELECT, SHOW DATABASES, REPLICATION SLAVE, REPLICATION CLIENT ON
*.* TO 'user' IDENTIFIED BY 'password';
+```
+**Note:** The RELOAD permissions is not required any more when
`scan.incremental.snapshot.enabled` is enabled (enabled by default).
+
+3. Finalize the user’s permissions:
+
+```sql
+mysql> FLUSH PRIVILEGES;
+```
+
+See more about the [permission
explanation](https://debezium.io/documentation/reference/1.5/connectors/mysql.html#mysql-creating-user).
+
+## Notes
+
+### Set a different SERVER ID for each reader
+
+Every MySQL database client for reading binlog should have an unique id,
called server id. MySQL server will use this id to maintain network connection
and the binlog position. Therefore, if different jobs share a same server id,
it may result to read from wrong binlog position.
+Thus, it is recommended to set different server id for each reader via the
[SQL
Hints](https://ci.apache.org/projects/flink/flink-docs-release-1.11/dev/table/sql/hints.html),
+e.g. assuming the source parallelism is 4, then we can use `SELECT * FROM
source_table /*+ OPTIONS('server-id'='5401-5404') */ ;` to assign unique server
id for each of the 4 source readers.
+
+
+### Setting up MySQL session timeouts
+
+When an initial consistent snapshot is made for large databases, your
established connection could timeout while the tables are being read. You can
prevent this behavior by configuring interactive_timeout and wait_timeout in
your MySQL configuration file.
+- `interactive_timeout`: The number of seconds the server waits for activity
on an interactive connection before closing it. See [MySQL
documentations](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_interactive_timeout).
+- `wait_timeout`: The number of seconds the server waits for activity on a
noninteractive connection before closing it. See [MySQL
documentations](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_wait_timeout).
+
+## How to create a MySQL Extract Node
+
+### Usage for SQL API
+
+The example below shows how to create an MySQL Extract Node with `Flink SQL` :
+
+```sql
+-- Set checkpoint every 3000 milliseconds
+Flink SQL> SET 'execution.checkpointing.interval' = '3s';
+
+-- Create a MySQL table 'mysql_extract_node' in Flink SQL
+Flink SQL> CREATE TABLE mysql_extract_node (
+ 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-inlong',
+ 'hostname' = 'YourHostname',
+ 'port' = '3306',
+ 'username' = 'YourUsername',
+ 'password' = 'YourPassword',
+ 'database-name' = 'YourDatabaseName',
+ 'table-name' = 'YourTableName');
+
+-- Read snapshot and binlogs from mysql_extract_node
+Flink SQL> SELECT * FROM mysql_extract_node;
+```
+
+### Usage for InLong Dashboard
+
+- Choose the `BINLOG` Data Source
+
+
+- Configure the MySQL Source
+
+
+### Usage for InLong Manager Client
+
+TODO: It will be supported in the future.
+
+## MySQL Extract Node Options
+
+<div class="highlight">
+<table class="colwidths-auto docutils">
+ <thead>
+ <tr>
+ <th class="text-left" style={{width: '10%'}}>Option</th>
+ <th class="text-left" style={{width: '8%'}}>Required</th>
+ <th class="text-left" style={{width: '7%'}}>Default</th>
+ <th class="text-left" style={{width: '10%'}}>Type</th>
+ <th class="text-left" style={{width: '65%'}}>Description</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>connector</td>
+ <td>required</td>
+ <td style={{wordWrap: 'break-word'}}>(none)</td>
+ <td>String</td>
+ <td>Specify what connector to use, here should be
<code>'mysql-cdc-inlong'</code>.</td>
+ </tr>
+ <tr>
+ <td>hostname</td>
+ <td>required</td>
+ <td style={{wordWrap: 'break-word'}}>(none)</td>
+ <td>String</td>
+ <td>IP address or hostname of the MySQL database server.</td>
+ </tr>
+ <tr>
+ <td>username</td>
+ <td>required</td>
+ <td style={{wordWrap: 'break-word'}}>(none)</td>
+ <td>String</td>
+ <td>Name of the MySQL database to use when connecting to the MySQL
database server.</td>
+ </tr>
+ <tr>
+ <td>password</td>
+ <td>required</td>
+ <td style={{wordWrap: 'break-word'}}>(none)</td>
+ <td>String</td>
+ <td>Password to use when connecting to the MySQL database server.</td>
+ </tr>
+ <tr>
+ <td>database-name</td>
+ <td>required</td>
+ <td style={{wordWrap: 'break-word'}}>(none)</td>
+ <td>String</td>
+ <td>Database name of the MySQL server to monitor. The database-name also
supports regular expressions to monitor multiple tables matches the regular
expression.</td>
+ </tr>
+ <tr>
+ <td>table-name</td>
+ <td>required</td>
+ <td style={{wordWrap: 'break-word'}}>(none)</td>
+ <td>String</td>
+ <td>Table name of the MySQL database to monitor. The table-name also
supports regular expressions to monitor multiple tables matches the regular
expression.</td>
+ </tr>
+ <tr>
+ <td>port</td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>3306</td>
+ <td>Integer</td>
+ <td>Integer port number of the MySQL database server.</td>
+ </tr>
+ <tr>
+ <td>server-id</td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>(none)</td>
+ <td>Integer</td>
+ <td>A numeric ID or a numeric ID range of this database client, The
numeric ID syntax is like '5400',
+ the numeric ID range syntax is like '5400-5408', The numeric ID
range syntax is recommended when 'scan.incremental.snapshot.enabled' enabled.
+ Every ID must be unique across all currently-running database
processes in the MySQL cluster. This connector joins the MySQL cluster
+ as another server (with this unique ID) so it can read the binlog.
By default, a random number is generated between 5400 and 6400,
+ though we recommend setting an explicit value.
+ </td>
+ </tr>
+ <tr>
+ <td>scan.incremental.snapshot.enabled</td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>true</td>
+ <td>Boolean</td>
+ <td>Incremental snapshot is a new mechanism to read snapshot of a
table. Compared to the old snapshot mechanism,
+ the incremental snapshot has many advantages, including:
+ (1) source can be parallel during snapshot reading,
+ (2) source can perform checkpoints in the chunk granularity
during snapshot reading,
+ (3) source doesn't need to acquire global read lock (FLUSH
TABLES WITH READ LOCK) before snapshot reading.
+ If you would like the source run in parallel, each parallel
reader should have an unique server id, so
+ the 'server-id' must be a range like '5400-6400', and the range
must be larger than the parallelism.
+ Please see <a
href="https://ververica.github.io/flink-cdc-connectors/release-2.2/content/connectors/mysql-cdc.html#incremental-snapshot-reading">Incremental
Snapshot Reading</a>section for more detailed information.
+ </td>
+ </tr>
+ <tr>
+ <td>scan.incremental.snapshot.chunk.size</td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>8096</td>
+ <td>Integer</td>
+ <td>The chunk size (number of rows) of table snapshot, captured
tables are split into multiple chunks when read the snapshot of table.</td>
+ </tr>
+ <tr>
+ <td>scan.snapshot.fetch.size</td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>1024</td>
+ <td>Integer</td>
+ <td>The maximum fetch size for per poll when read table
snapshot.</td>
+ </tr>
+ <tr>
+ <td>scan.startup.mode</td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>initial</td>
+ <td>String</td>
+ <td>Optional startup mode for MySQL CDC consumer, valid enumerations are
"initial"
+ and "latest-offset".
+ Please see <a
href="https://ververica.github.io/flink-cdc-connectors/release-2.2/content/connectors/mysql-cdc.html#startup-reading-position">Startup
Reading Position</a>section for more detailed information.</td>
+ </tr>
+ <tr>
+ <td>server-time-zone</td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>UTC</td>
+ <td>String</td>
+ <td>The session time zone in database server, e.g. "Asia/Shanghai".
+ It controls how the TIMESTAMP type in MYSQL converted to STRING.
+ See more <a
href="https://debezium.io/documentation/reference/1.5/connectors/mysql.html#mysql-temporal-types">here</a>.</td>
+ </tr>
+ <tr>
+ <td>debezium.min.row.
+ count.to.stream.result</td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>1000</td>
+ <td>Integer</td>
+ <td>During a snapshot operation, the connector will query each included
table to produce a read event for all rows in that table. This parameter
determines whether the MySQL connection will pull all results for a table into
memory (which is fast but requires large amounts of memory), or whether the
results will instead be streamed (can be slower, but will work for very large
tables). The value specifies the minimum number of rows a table must contain
before the connector will strea [...]
+ </tr>
+ <tr>
+ <td>connect.timeout</td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>30s</td>
+ <td>Duration</td>
+ <td>The maximum time that the connector should wait after trying to
connect to the MySQL database server before timing out.</td>
+ </tr>
+ <tr>
+ <td>connect.max-retries</td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>3</td>
+ <td>Integer</td>
+ <td>The max retry times that the connector should retry to build
MySQL database server connection.</td>
+ </tr>
+ <tr>
+ <td>connection.pool.size</td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>20</td>
+ <td>Integer</td>
+ <td>The connection pool size.</td>
+ </tr>
+ <tr>
+ <td>jdbc.properties.*</td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>20</td>
+ <td>String</td>
+ <td>Option to pass custom JDBC URL properties. User can pass custom
properties like 'jdbc.properties.useSSL' = 'false'.</td>
+ </tr>
+ <tr>
+ <td>heartbeat.interval</td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>30s</td>
+ <td>Duration</td>
+ <td>The interval of sending heartbeat event for tracing the latest
available binlog offsets.</td>
+ </tr>
+ <tr>
+ <td>append-mode</td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>false</td>
+ <td>Boolean</td>
+ <td>Whether to support append only, if true the MySQL Extract Node
will Convert all upsert streams to append streams to support downstream
scenarios where upsert streams are not supported.</td>
+ </tr>
+ <tr>
+ <td>migrate-all</td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>false</td>
+ <td>Boolean</td>
+ <td>Whether it is a whole library migration, Whether it is a whole
database migration scenario, if true, it compresses physical fields and other
meta fields supported by MySQL Extract Node into a special meta field `data` in
canal-json format.</td>
+ </tr>
+ <tr>
+ <td>debezium.*</td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>(none)</td>
+ <td>String</td>
+ <td>Pass-through Debezium's properties to Debezium Embedded Engine which
is used to capture data changes from MySQL server.
+ For example: <code>'debezium.snapshot.mode' = 'never'</code>.
+ See more about the <a
href="https://debezium.io/documentation/reference/1.5/connectors/mysql.html#mysql-connector-properties">Debezium's
MySQL Connector properties</a></td>
+ </tr>
+ </tbody>
+</table>
+</div>
+
+## Available Metadata
+
+The following format metadata can be exposed as read-only (VIRTUAL) columns in
a table definition.
+
+<table class="colwidths-auto docutils">
+ <thead>
+ <tr>
+ <th class="text-left" style={{width: '15%'}}>Key</th>
+ <th class="text-left" style={{width: '30%'}}>DataType</th>
+ <th class="text-left" style={{width: '55%'}}>Description</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>meta.table_name</td>
+ <td>STRING NOT NULL</td>
+ <td>Name of the table that contain the row.</td>
+ </tr>
+ <tr>
+ <td>meta.database_name</td>
+ <td>STRING NOT NULL</td>
+ <td>Name of the database that contain the row.</td>
+ </tr>
+ <tr>
+ <td>meta.op_ts</td>
+ <td>TIMESTAMP_LTZ(3) NOT NULL</td>
+ <td>It indicates the time that the change was made in the database.
<br/>If the record is read from snapshot of the table instead of the binlog,
the value is always 0.</td>
+ </tr>
+ <tr>
+ <td>meta.op_type</td>
+ <td>STRING</td>
+ <td>Type of database operation, such as INSERT/DELETE, etc.</td>
+ </tr>
+ <tr>
+ <td>meta.data</td>
+ <td>STRING</td>
+ <td>Data of the row that format by `canal-json` only exists when the
option `migrate-all` is 'true'.</td>
+ </tr>
+ <tr>
+ <td>meta.is_ddl</td>
+ <td>BOOLEAN</td>
+ <td>Whether the DDL statement.</td>
+ </tr>
+ <tr>
+ <td>meta.ts</td>
+ <td>TIMESTAMP_LTZ(3) NOT NULL</td>
+ <td>The current time when the row was received and processed.</td>
+ </tr>
+ <tr>
+ <td>meta.sql_type</td>
+ <td>MAP</td>
+ <td>Mapping of sql_type table fields to java data type IDs.</td>
+ </tr>
+ <tr>
+ <td>meta.mysql_type</td>
+ <td>MAP</td>
+ <td>Structure of the table.</td>
+ </tr>
+ <tr>
+ <td>meta.pk_names</td>
+ <td>ARRAY</td>
+ <td>Primay key name of the table.</td>
+ </tr>
+ <tr>
+ <td>meta.batch_id</td>
+ <td>BIGINT</td>
+ <td>Batch id of the Binlog.</td>
+ </tr>
+ <tr>
+ <td>meta.update_before</td>
+ <td>ARRAY</td>
+ <td>Data of the row before update.</td>
+ </tr>
+ </tbody>
+</table>
+
+The extended CREATE TABLE example demonstrates the syntax for exposing these
metadata fields:
+```sql
+CREATE TABLE `mysql_extract_node` (
+ `id` INT,
+ `name` STRING,
+ `database_name` string METADATA FROM 'meta.database_name',
+ `table_name` string METADATA FROM 'meta.table_name',
+ `op_ts` timestamp(3) METADATA FROM 'meta.op_ts',
+ `op_type` string METADATA FROM 'meta.op_type',
+ `batch_id` bigint METADATA FROM 'meta.batch_id',
+ `is_ddl` boolean METADATA FROM 'meta.is_ddl',
+ `update_before` ARRAY<MAP<STRING, STRING>> METADATA FROM
'meta.update_before',
+ `mysql_type` MAP<STRING, STRING> METADATA FROM 'meta.mysql_type',
+ `pk_names` ARRAY<STRING> METADATA FROM 'meta.pk_names',
+ `data` STRING METADATA FROM 'meta.data',
+ `sql_type` MAP<STRING, INT> METADATA FROM 'meta.sql_type',
+ `ingestion_ts` TIMESTAMP(3) METADATA FROM 'meta.ts',
+ PRIMARY KEY (`id`) NOT ENFORCED
+) WITH (
+ 'connector' = 'mysql-cdc-inlong',
+ 'hostname' = 'YourHostname',
+ 'migrate-all' = 'true',
+ 'port' = '3306',
+ 'username' = 'YourUsername',
+ 'password' = 'YourPassword',
+ 'database-name' = 'YourDatabase',
+ 'table-name' = 'YourTable'
+ );
+```
+
+## Data Type Mapping
+
+<div class="wy-table-responsive">
+<table class="colwidths-auto docutils">
+ <thead>
+ <tr>
+ <th class="text-left">MySQL type</th>
+ <th class="text-left">Flink SQL type</th>
+ <th class="text-left">NOTE</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>TINYINT</td>
+ <td>TINYINT</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+ SMALLINT<br/>
+ TINYINT UNSIGNED</td>
+ <td>SMALLINT</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+ INT<br/>
+ MEDIUMINT<br/>
+ SMALLINT UNSIGNED</td>
+ <td>INT</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+ BIGINT<br/>
+ INT UNSIGNED</td>
+ <td>BIGINT</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>BIGINT UNSIGNED</td>
+ <td>DECIMAL(20, 0)</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+ REAL<br/>
+ FLOAT<br/>
+ </td>
+ <td>FLOAT</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+ DOUBLE
+ </td>
+ <td>DOUBLE</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+ NUMERIC(p, s)<br/>
+ DECIMAL(p, s)<br/>
+ where p <= 38<br/>
+ </td>
+ <td>DECIMAL(p, s)</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+ NUMERIC(p, s)<br/>
+ DECIMAL(p, s)<br/>
+ where 38 < p <= 65<br/>
+ </td>
+ <td>STRING</td>
+ <td>The precision for DECIMAL data type is up to 65 in MySQL, but the
precision for DECIMAL is limited to 38 in Flink.
+ So if you define a decimal column whose precision is greater than 38, you
should map it to STRING to avoid precision loss.</td>
+ </tr>
+ <tr>
+ <td>
+ BOOLEAN<br/>
+ TINYINT(1)<br/>
+ BIT(1)
+ </td>
+ <td>BOOLEAN</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>DATE</td>
+ <td>DATE</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>TIME [(p)]</td>
+ <td>TIME [(p)]</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>TIMESTAMP [(p)]<br/>
+ DATETIME [(p)]
+ </td>
+ <td>TIMESTAMP [(p)]
+ </td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+ CHAR(n)
+ </td>
+ <td>CHAR(n)</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+ VARCHAR(n)
+ </td>
+ <td>VARCHAR(n)</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+ BIT(n)
+ </td>
+ <td>BINARY(⌈n/8⌉)</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+ BINARY(n)
+ </td>
+ <td>BINARY(n)</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+ VARBINARY(N)
+ </td>
+ <td>VARBINARY(N)</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+ TINYTEXT<br/>
+ TEXT<br/>
+ MEDIUMTEXT<br/>
+ LONGTEXT<br/>
+ </td>
+ <td>STRING</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+ TINYBLOB<br/>
+ BLOB<br/>
+ MEDIUMBLOB<br/>
+ LONGBLOB<br/>
+ </td>
+ <td>BYTES</td>
+ <td>Currently, for BLOB data type in MySQL, only the blob whose length
isn't greater than 2,147,483,647(2 ** 31 - 1) is supported. </td>
+ </tr>
+ <tr>
+ <td>
+ YEAR
+ </td>
+ <td>INT</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+ ENUM
+ </td>
+ <td>STRING</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+ JSON
+ </td>
+ <td>STRING</td>
+ <td>The JSON data type will be converted into STRING with JSON format
in Flink.</td>
+ </tr>
+ <tr>
+ <td>
+ SET
+ </td>
+ <td>ARRAY<STRING></td>
+ <td>As the SET data type in MySQL is a string object that can have zero
or more values,
+ it should always be mapped to an array of string
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+
diff --git a/docs/data_node/extract_node/mysql.md
b/docs/data_node/extract_node/mysql.md
deleted file mode 100644
index 93527b9cc..000000000
--- a/docs/data_node/extract_node/mysql.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-title: MySQL
-sidebar_position: 3
----
-
-## Configuration
-### Choose the `BINLOG` Data Source
-
-
-### Configure the MySQL Source
-
\ No newline at end of file
diff --git a/docs/data_node/extract_node/oracle-cdc.md
b/docs/data_node/extract_node/oracle-cdc.md
new file mode 100644
index 000000000..dc322188a
--- /dev/null
+++ b/docs/data_node/extract_node/oracle-cdc.md
@@ -0,0 +1,4 @@
+---
+title: Oracle-CDC
+sidebar_position: 8
+---
\ No newline at end of file
diff --git a/docs/data_node/extract_node/overview.md
b/docs/data_node/extract_node/overview.md
new file mode 100644
index 000000000..7c36dcbc9
--- /dev/null
+++ b/docs/data_node/extract_node/overview.md
@@ -0,0 +1,59 @@
+---
+title: Overview
+sidebar_position: 1
+---
+
+## Overview
+
+Extract Nodes is a set of Source Connectors based on <a
href="https://flink.apache.org/">Apache Flink<sup>®</sup></a> for extracting
data from different source systems.
+
+## Supported Extract Nodes
+| Extract Node | Version
| Driver |
+|-------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------|
+| [kafka](kafka.md) | [Kafka](https://kafka.apache.org/):
0.10+
| None |
+| [pulsar](pulsar.md) | [Pulsar](https://pulsar.apache.org/):
2.8.x+
| None |
+| [hdfs](hdfs.md) | [HDFS](https://hadoop.apache.org/):
2.x, 3.x
| None |
+| [mongodb-cdc](mongodb-cdc.md) | [MongoDB](https://www.mongodb.com):
3.6, 4.x, 5.0
| None |
+| [mysql-cdc](mysql-cdc.md) | [MySQL](https://dev.mysql.com/doc):
5.6, 5.7, 8.0.x <br/>[RDS MySQL](https://www.aliyun.com/product/rds/mysql):
5.6, 5.7, 8.0.x <br/> [PolarDB MySQL](https://www.aliyun.com/product/polardb):
5.6, 5.7, 8.0.x <br/> [Aurora MySQL](https://aws.amazon.com/cn/rds/aurora):
5.6, 5.7, 8.0.x <br/> [MariaDB](https://mariadb.org): 10.x <br/> [PolarDB
X](https://github.com/ApsaraDB/galaxysql): 2.0.1 | JDBC Driver: 8.0.21 |
+| [oracle-cdc](oracle-cdc.md) |
[Oracle](https://www.oracle.com/index.html): 11, 12, 19
| Oracle
Driver: 19.3.0.0 |
+| [postgresql-cdc](postgresql-cdc.md) |
[PostgreSQL](https://www.postgresql.org): 9.6, 10, 11, 12
| None
|
+| [sqlserver-cdc](sqlserver-cdc.md) |
[Sqlserver](https://www.microsoft.com/sql-server): 2012, 2014, 2016, 2017, 2019
| None
|
+
+## Supported Flink Versions
+The following table shows the version mapping between InLong<sup>®</sup>
Extract Nodes and Flink<sup>®</sup>:
+
+| InLong<sup>®</sup> Extract Nodes Version |
Flink<sup>®</sup> Version |
+|:------------------------------------------------------:|:-------------------------------------------:|
+| <font color="DarkCyan">1.2.0</font> | <font
color="MediumVioletRed">1.13.5</font> |
+
+## Usage for SQL API
+
+We need several steps to setup a Flink cluster with the provided connector.
+
+1. Setup a Flink cluster with version 1.13.5 and Java 8+ installed.
+2. Download and the Sort Connectors jars from the [Downloads](/download/main)
page (or [build yourself](../../quick_start/how_to_build.md)).
+3. Put the Sort Connectors jars under `FLINK_HOME/lib/`.
+4. Restart the Flink cluster.
+
+The example shows how to create a MySQL Extract Node in [Flink SQL
Client](https://ci.apache.org/projects/flink/flink-docs-release-1.13/dev/table/sqlClient.html)
and execute queries on it.
+
+```sql
+-- Creates a MySQL Extract Node
+CREATE TABLE mysql_extract_node (
+ id INT NOT NULL,
+ name STRING,
+ age INT,
+ weight DECIMAL(10,3),
+ PRIMARY KEY(id) NOT ENFORCED
+) WITH (
+ 'connector' = 'mysql-cdc-inlong',
+ 'hostname' = 'YourHostname',
+ 'port' = '3306',
+ 'username' = 'YourUsername',
+ 'password' = 'YourPassword',
+ 'database-name' = 'YourDatabaseName',
+ 'table-name' = 'YourTableName'
+);
+
+SELECT id, name, age, weight FROM mysql_extract_node;
+```
\ No newline at end of file
diff --git a/docs/data_node/extract_node/postgresql-cdc.md
b/docs/data_node/extract_node/postgresql-cdc.md
new file mode 100644
index 000000000..2466f033e
--- /dev/null
+++ b/docs/data_node/extract_node/postgresql-cdc.md
@@ -0,0 +1,4 @@
+---
+title: PostgreSQL
+sidebar_position: 9
+---
\ No newline at end of file
diff --git a/docs/data_node/extract_node/pulsar.md
b/docs/data_node/extract_node/pulsar.md
new file mode 100644
index 000000000..e452c4e72
--- /dev/null
+++ b/docs/data_node/extract_node/pulsar.md
@@ -0,0 +1,4 @@
+---
+title: Pulsar
+sidebar_position: 10
+---
\ No newline at end of file
diff --git a/docs/data_node/extract_node/sqlserver-cdc.md
b/docs/data_node/extract_node/sqlserver-cdc.md
new file mode 100644
index 000000000..d4f2c1a19
--- /dev/null
+++ b/docs/data_node/extract_node/sqlserver-cdc.md
@@ -0,0 +1,4 @@
+---
+title: SqlServer-CDC
+sidebar_position: 11
+---
\ No newline at end of file
diff --git a/docs/data_node/load_node/auto_consumption.md
b/docs/data_node/load_node/auto_consumption.md
index 5f45792d8..847a2df1c 100644
--- a/docs/data_node/load_node/auto_consumption.md
+++ b/docs/data_node/load_node/auto_consumption.md
@@ -1,6 +1,6 @@
---
title: Auto Consumption
-sidebar_position: 1
+sidebar_position: 2
---
## Overview
diff --git a/docs/data_node/load_node/clickhouse.md
b/docs/data_node/load_node/clickhouse.md
index da2be17fe..8cf4f748f 100644
--- a/docs/data_node/load_node/clickhouse.md
+++ b/docs/data_node/load_node/clickhouse.md
@@ -1,6 +1,6 @@
---
title: ClickHouse
-sidebar_position: 5
+sidebar_position: 6
---
## Overview
diff --git a/docs/data_node/load_node/elasticsearch.md
b/docs/data_node/load_node/elasticsearch.md
new file mode 100644
index 000000000..6aa54c548
--- /dev/null
+++ b/docs/data_node/load_node/elasticsearch.md
@@ -0,0 +1,356 @@
+---
+title: Elasticsearch
+sidebar_position: 8
+---
+
+## Elasticsearch Load Node
+
+The Elasticsearch Load Node allows for writing into an index of the
Elasticsearch engine. This document describes how to setup the Elasticsearch
Load Node to run SQL queries against Elasticsearch.
+
+The Load Node can operate in upsert mode for exchanging UPDATE/DELETE messages
with the external system using the primary key defined on the DDL.
+
+If no primary key is defined on the DDL, the Load Node can only operate in
append mode for exchanging INSERT only messages with external system.
+
+## Supported Version
+
+| Load Node | Version
|
+|-------------------------------------|----------------------------------------------------|
+| [elasticsearch](./elasticsearch.md) |
[Elasticsearch](https://www.elastic.co/): 6.x, 7.x |
+
+### Dependencies
+
+In order to use the Elasticsearch Load Node the following dependencies are
required for both projects using a build automation tool (such as Maven or SBT)
and SQL Client with Sort Connectors JAR bundles.
+
+- Elasticsearch 6
+
+```
+<dependency>
+ <groupId>org.apache.inlong</groupId>
+ <artifactId>sort-connector-elasticsearch6</artifactId>
+ <version>inlong_version</version>
+</dependency>
+```
+- Elasticsearch 7
+
+```
+<dependency>
+ <groupId>org.apache.inlong</groupId>
+ <artifactId>sort-connector-elasticsearch7</artifactId>
+ <version>inlong_version</version>
+</dependency>
+```
+
+## How to create an Elasticsearch Load Node
+
+### Usage for SQL API
+
+The example below shows how to create an Elasticsearch Load Node with `Flink
SQL` :
+
+```sql
+CREATE TABLE myUserTable (
+ user_id STRING,
+ user_name STRING,
+ uv BIGINT,
+ pv BIGINT,
+ PRIMARY KEY (user_id) NOT ENFORCED
+) WITH (
+ 'connector' = 'elasticsearch-7',
+ 'hosts' = 'http://localhost:9200',
+ 'index' = 'users'
+);
+```
+
+### Usage for InLong Dashboard
+
+TODO: It will be supported in the future.
+
+### Usage for InLong Manager Client
+
+TODO: It will be supported in the future.
+
+## Elasticsearch Load Node Options
+
+<table class="table table-bordered">
+ <thead>
+ <tr>
+ <th class="text-left" style={{width: '25%'}}>Option</th>
+ <th class="text-center" style={{width: '8%'}}>Required</th>
+ <th class="text-center" style={{width: '7%'}}>Default</th>
+ <th class="text-center" style={{width: '10%'}}>Type</th>
+ <th class="text-center" style={{width: '50%'}}>Description</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td><h5>connector</h5></td>
+ <td>required</td>
+ <td style={{wordWrap: 'break-word'}}>(none)</td>
+ <td>String</td>
+ <td>Specify what connector to use, valid values are:
+ <ul>
+ <li><code>elasticsearch-6</code>: connect to Elasticsearch 6.x
cluster.</li>
+ <li><code>elasticsearch-7</code>: connect to Elasticsearch 7.x and later
versions cluster.</li>
+ </ul></td>
+ </tr>
+ <tr>
+ <td><h5>hosts</h5></td>
+ <td>required</td>
+ <td style={{wordWrap: 'break-word'}}>(none)</td>
+ <td>String</td>
+ <td>One or more Elasticsearch hosts to connect to, e.g.
<code>'http://host_name:9092;http://host_name:9093'</code>.</td>
+ </tr>
+ <tr>
+ <td><h5>index</h5></td>
+ <td>required</td>
+ <td style={{wordWrap: 'break-word'}}>(none)</td>
+ <td>String</td>
+ <td>Elasticsearch index for every record. Can be a static index (e.g.
<code>'myIndex'</code>) or
+ a dynamic index (e.g. <code>'index-\{'{log_ts|yyyy-MM-dd}'}'</code>).
+ See the following <a href="#dynamic-index">Dynamic Index</a> section
for more details.</td>
+ </tr>
+ <tr>
+ <td><h5>document-type</h5></td>
+ <td>required in 6.x</td>
+ <td style={{wordWrap: 'break-word'}}>(none)</td>
+ <td>String</td>
+ <td>Elasticsearch document type. Not necessary anymore in
<code>elasticsearch-7</code>.</td>
+ </tr>
+ <tr>
+ <td><h5>document-id.key-delimiter</h5></td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>_</td>
+ <td>String</td>
+ <td>Delimiter for composite keys ("_" by default), e.g., "$" would
result in IDs "KEY1$KEY2$KEY3".</td>
+ </tr>
+ <tr>
+ <td><h5>username</h5></td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>(none)</td>
+ <td>String</td>
+ <td>Username used to connect to Elasticsearch instance. Please notice
that Elasticsearch doesn't pre-bundled security feature, but you can enable it
by following the <a
href="https://www.elastic.co/guide/en/elasticsearch/reference/master/configuring-security.html">guideline</a>
to secure an Elasticsearch cluster.</td>
+ </tr>
+ <tr>
+ <td><h5>password</h5></td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>(none)</td>
+ <td>String</td>
+ <td>Password used to connect to Elasticsearch instance. If
<code>username</code> is configured, this option must be configured with
non-empty string as well.</td>
+ </tr>
+ <tr>
+ <td><h5>failure-handler</h5></td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>fail</td>
+ <td>String</td>
+ <td>Failure handling strategy in case a request to Elasticsearch fails.
Valid strategies are:
+ <ul>
+ <li><code>fail</code>: throws an exception if a request fails and thus
causes a job failure.</li>
+ <li><code>ignore</code>: ignores failures and drops the request.</li>
+ <li><code>retry-rejected</code>: re-adds requests that have failed due
to queue capacity saturation.</li>
+ <li>custom class name: for failure handling with a
ActionRequestFailureHandler subclass.</li>
+ </ul>
+ </td>
+ </tr>
+ <tr>
+ <td><h5>sink.flush-on-checkpoint</h5></td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>true</td>
+ <td>Boolean</td>
+ <td>Flush on checkpoint or not. When disabled, a sink will not wait for
all pending action requests
+ to be acknowledged by Elasticsearch on checkpoints. Thus, a sink does
NOT provide any strong
+ guarantees for at-least-once delivery of action requests.
+ </td>
+ </tr>
+ <tr>
+ <td><h5>sink.bulk-flush.max-actions</h5></td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>1000</td>
+ <td>Integer</td>
+ <td>Maximum number of buffered actions per bulk request.
+ Can be set to <code>'0'</code> to disable it.
+ </td>
+ </tr>
+ <tr>
+ <td><h5>sink.bulk-flush.max-size</h5></td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>2mb</td>
+ <td>MemorySize</td>
+ <td>Maximum size in memory of buffered actions per bulk request. Must be
in MB granularity.
+ Can be set to <code>'0'</code> to disable it.
+ </td>
+ </tr>
+ <tr>
+ <td><h5>sink.bulk-flush.interval</h5></td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>1s</td>
+ <td>Duration</td>
+ <td>The interval to flush buffered actions.
+ Can be set to <code>'0'</code> to disable it. Note, both
<code>'sink.bulk-flush.max-size'</code> and
<code>'sink.bulk-flush.max-actions'</code>
+ can be set to <code>'0'</code> with the flush interval set allowing
for complete async processing of buffered actions.
+ </td>
+ </tr>
+ <tr>
+ <td><h5>sink.bulk-flush.backoff.strategy</h5></td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>DISABLED</td>
+ <td>String</td>
+ <td>Specify how to perform retries if any flush actions failed due to a
temporary request error. Valid strategies are:
+ <ul>
+ <li><code>DISABLED</code>: no retry performed, i.e. fail after the
first request error.</li>
+ <li><code>CONSTANT</code>: wait for backoff delay between retries.</li>
+ <li><code>EXPONENTIAL</code>: initially wait for backoff delay and
increase exponentially between retries.</li>
+ </ul>
+ </td>
+ </tr>
+ <tr>
+ <td><h5>sink.bulk-flush.backoff.max-retries</h5></td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>8</td>
+ <td>Integer</td>
+ <td>Maximum number of backoff retries.</td>
+ </tr>
+ <tr>
+ <td><h5>sink.bulk-flush.backoff.delay</h5></td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>50ms</td>
+ <td>Duration</td>
+ <td>Delay between each backoff attempt. For <code>CONSTANT</code>
backoff, this is simply the delay between each retry. For
<code>EXPONENTIAL</code> backoff, this is the initial base delay.</td>
+ </tr>
+ <tr>
+ <td><h5>connection.max-retry-timeout</h5></td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>(none)</td>
+ <td>Duration</td>
+ <td>Maximum timeout between retries.</td>
+ </tr>
+ <tr>
+ <td><h5>connection.path-prefix</h5></td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>(none)</td>
+ <td>String</td>
+ <td>Prefix string to be added to every REST communication, e.g.,
<code>'/v1'</code>.</td>
+ </tr>
+ <tr>
+ <td><h5>format</h5></td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>json</td>
+ <td>String</td>
+ <td>Elasticsearch connector supports to specify a format. The format
must produce a valid json document.
+ By default uses built-in <code>'json'</code> format. Please refer to <a
href="https://nightlies.apache.org/flink/flink-docs-release-1.13/docs/connectors/table/formats/overview/">JSON
Format</a> page for more details.
+ </td>
+ </tr>
+ </tbody>
+</table>
+
+Features
+----------------
+
+### Key Handling
+
+Elasticsearch sink can work in either upsert mode or append mode, it depends
on whether primary key is defined.
+If primary key is defined, Elasticsearch sink works in upsert mode which can
consume queries containing UPDATE/DELETE messages.
+If primary key is not defined, Elasticsearch sink works in append mode which
can only consume queries containing INSERT only messages.
+
+In Elasticsearch connector, the primary key is used to calculate the
Elasticsearch document id, which is a string of up to 512 bytes. It cannot have
whitespaces.
+The Elasticsearch connector generates a document ID string for every row by
concatenating all primary key fields in the order defined in the DDL using a
key delimiter specified by `document-id.key-delimiter`.
+Certain types are not allowed as primary key field as they do not have a good
string representation, e.g. `BYTES`, `ROW`, `ARRAY`, `MAP`, etc.
+If no primary key is specified, Elasticsearch will generate a document id
automatically.
+
+See [CREATE TABLE
DDL](https://nightlies.apache.org/flink/flink-docs-release-1.13/docs/dev/table/sql/create/#create-table)
for more details about PRIMARY KEY syntax.
+
+### Dynamic Index
+
+<a name = "dynamic-index"></a>
+
+Elasticsearch Load Node supports both static index and dynamic index.
+
+If you want to have a static index, the `index` option value should be a plain
string, e.g. `'myusers'`, all the records will be consistently written into
"myusers" index.
+
+If you want to have a dynamic index, you can use `{field_name}` to reference a
field value in the record to dynamically generate a target index.
+You can also use `'{field_name|date_format_string}'` to convert a field value
of `TIMESTAMP/DATE/TIME` type into the format specified by the
`date_format_string`.
+The `date_format_string` is compatible with Java's
[DateTimeFormatter](https://docs.oracle.com/javase/8/docs/api/index.html).
+For example, if the option value is `'myusers-{'{log_ts|yyyy-MM-dd}'}'`, then
a record with `log_ts` field value `2020-03-27 12:25:55` will be written into
"myusers-2020-03-27" index.
+
+## Data Type Mapping
+
+<table class="table table-bordered">
+ <thead>
+ <tr>
+ <th class="text-left">JSON type</th>
+ <th class="text-left">Flink SQL type</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td><code>string</code></td>
+ <td><code>CHAR / VARCHAR / STRING</code></td>
+ </tr>
+ <tr>
+ <td><code>boolean</code></td>
+ <td><code>BOOLEAN</code></td>
+ </tr>
+ <tr>
+ <td><code>string with encoding: base64</code></td>
+ <td><code>BINARY / VARBINARY</code></td>
+ </tr>
+ <tr>
+ <td><code>number</code></td>
+ <td><code>DECIMAL</code></td>
+ </tr>
+ <tr>
+ <td><code>number</code></td>
+ <td><code>TINYINT</code></td>
+ </tr>
+ <tr>
+ <td><code>number</code></td>
+ <td><code>SMALLINT</code></td>
+ </tr>
+ <tr>
+ <td><code>number</code></td>
+ <td><code>INT</code></td>
+ </tr>
+ <tr>
+ <td><code>number</code></td>
+ <td><code>BIGINT</code></td>
+ </tr>
+ <tr>
+ <td><code>number</code></td>
+ <td><code>FLOAT</code></td>
+ </tr>
+ <tr>
+ <td><code>number</code></td>
+ <td><code>DOUBLE</code></td>
+ </tr>
+ <tr>
+ <td><code>string with format: date</code></td>
+ <td><code>DATE</code></td>
+ </tr>
+ <tr>
+ <td><code>string with format: time</code></td>
+ <td><code>TIME</code></td>
+ </tr>
+ <tr>
+ <td><code>string with format: date-time</code></td>
+ <td><code>TIMESTAMP</code></td>
+ </tr>
+ <tr>
+ <td><code>string with format: date-time (with UTC time zone)</code></td>
+ <td><code>TIMESTAMP_WITH_LOCAL_TIME_ZONE</code></td>
+ </tr>
+ <tr>
+ <td><code>number</code></td>
+ <td><code>INTERVAL</code></td>
+ </tr>
+ <tr>
+ <td><code>array</code></td>
+ <td><code>ARRAY</code></td>
+ </tr>
+ <tr>
+ <td><code>object</code></td>
+ <td><code>MAP / MULTISET</code></td>
+ </tr>
+ <tr>
+ <td><code>object</code></td>
+ <td><code>ROW</code></td>
+ </tr>
+ </tbody>
+</table>
\ No newline at end of file
diff --git a/docs/data_node/load_node/greenplum.md
b/docs/data_node/load_node/greenplum.md
new file mode 100644
index 000000000..79a2493d8
--- /dev/null
+++ b/docs/data_node/load_node/greenplum.md
@@ -0,0 +1,4 @@
+---
+title: Greenplum
+sidebar_position: 9
+---
\ No newline at end of file
diff --git a/docs/data_node/load_node/hbase.md
b/docs/data_node/load_node/hbase.md
new file mode 100644
index 000000000..c5d5d973d
--- /dev/null
+++ b/docs/data_node/load_node/hbase.md
@@ -0,0 +1,4 @@
+---
+title: HBase
+sidebar_position: 10
+---
\ No newline at end of file
diff --git a/docs/data_node/load_node/hdfs.md b/docs/data_node/load_node/hdfs.md
new file mode 100644
index 000000000..c4a3c3864
--- /dev/null
+++ b/docs/data_node/load_node/hdfs.md
@@ -0,0 +1,4 @@
+---
+title: HDFS
+sidebar_position: 11
+---
\ No newline at end of file
diff --git a/docs/data_node/load_node/hive.md b/docs/data_node/load_node/hive.md
index 5e86a18f9..c1ddfdb09 100644
--- a/docs/data_node/load_node/hive.md
+++ b/docs/data_node/load_node/hive.md
@@ -1,6 +1,6 @@
---
title: Hive
-sidebar_position: 2
+sidebar_position: 3
---
## Configuration
diff --git a/docs/data_node/load_node/iceberg.md
b/docs/data_node/load_node/iceberg.md
index da5565727..18ebbb444 100644
--- a/docs/data_node/load_node/iceberg.md
+++ b/docs/data_node/load_node/iceberg.md
@@ -1,6 +1,6 @@
---
title: Iceberg
-sidebar_position: 3
+sidebar_position: 4
---
## Overview
diff --git a/docs/data_node/load_node/kafka.md
b/docs/data_node/load_node/kafka.md
index 6438a4fac..5094d92ea 100644
--- a/docs/data_node/load_node/kafka.md
+++ b/docs/data_node/load_node/kafka.md
@@ -1,6 +1,6 @@
---
title: Kafka
-sidebar_position: 4
+sidebar_position: 5
---
## Configuration
diff --git a/docs/data_node/load_node/mysql.md
b/docs/data_node/load_node/mysql.md
new file mode 100644
index 000000000..813cfcb29
--- /dev/null
+++ b/docs/data_node/load_node/mysql.md
@@ -0,0 +1,4 @@
+---
+title: MySQL
+sidebar_position: 12
+---
\ No newline at end of file
diff --git a/docs/data_node/load_node/oracle.md
b/docs/data_node/load_node/oracle.md
new file mode 100644
index 000000000..d08324620
--- /dev/null
+++ b/docs/data_node/load_node/oracle.md
@@ -0,0 +1,4 @@
+---
+title: Oracle
+sidebar_position: 13
+---
\ No newline at end of file
diff --git a/docs/data_node/load_node/overview.md
b/docs/data_node/load_node/overview.md
new file mode 100644
index 000000000..58fb9dd83
--- /dev/null
+++ b/docs/data_node/load_node/overview.md
@@ -0,0 +1,80 @@
+---
+title: Overview
+sidebar_position: 1
+---
+
+## Overview
+
+Load Nodes is a set of Sink Connectors based on <a
href="https://flink.apache.org/">Apache Flink<sup>®</sup></a> for loading data
to different storage systems.
+
+## Supported Load Nodes
+| Load Node | Version
| Driver |
+|-----------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------|
+| [kafka](kafka.md) |
[Kafka](https://kafka.apache.org/): 0.10+
| None
|
+| [hbase](hbase.md) |
[Hbase](https://hbase.apache.org/): 2.2.x
| None
|
+| [postgresql](postgresql.md) |
[PostgreSQL](https://www.postgresql.org/): 9.6, 10, 11, 12
| None
|
+| [oracle](oracle.md) |
[Oracle](https://www.oracle.com/index.html): 11, 12, 19
| Oracle
Driver: 19.3.0.0 |
+| [mysql](mysql.md) |
[MySQL](https://dev.mysql.com/doc): 5.6, 5.7, 8.0.x <br/> [RDS
MySQL](https://www.aliyun.com/product/rds/mysql): 5.6, 5.7, 8.0.x <br/>
[PolarDB MySQL](https://www.aliyun.com/product/polardb): 5.6, 5.7, 8.0.x <br/>
[Aurora MySQL](https://aws.amazon.com/cn/rds/aurora): 5.6, 5.7, 8.0.x <br/>
[MariaDB](https://mariadb.org): 10.x <br/> [PolarDB
X](https://github.com/ApsaraDB/galaxysql): 2.0.1 | JDBC Driver: 8.0.21 |
+| [tdsql-postgresql](tdsql-postgresql.md) |
[TDSQL-PostgreSQL](https://cloud.tencent.com/document/product/1129): 10.17
| Oracle
Driver: 19.3.0.0 |
+| [greenplum](greenplum.md) |
[Greeplum](https://greenplum.org/): 4.x, 5.x, 6.x
| None
|
+| [elasticsearch](elasticsearch.md) |
[Elasticsearch](https://www.elastic.co/): 6.x, 7.x
| None
|
+| [clickhouse](clickhouse.md) |
[ClickHouse](https://clickhouse.com/): 20.7+
| None
|
+| [hive](hive.md) | [Hive](https://hive.apache.org/):
1.x, 2.x, 3.x
| None |
+| [sqlserver](sqlserver.md) |
[Sqlserver](https://www.microsoft.com/sql-server): 2012, 2014, 2016, 2017, 2019
| None
|
+| [hdfs](hdfs.md) |
[HDFS](https://hadoop.apache.org/): 2.x, 3.x
| None
|
+| [iceberg](iceberg.md) |
[Iceberg](https://iceberg.apache.org/): 0.13.1+
| None
|
+
+
+## Supported Flink Versions
+
+The following table shows the version mapping between InLong<sup>®</sup> Load
Nodes and Flink<sup>®</sup>:
+
+| InLong<sup>®</sup> Load Nodes Version | Flink<sup>®</sup> Version
|
+|:-------------------------------------:|:-------------------------------------------:|
+| <font color="DarkCyan">1.2.0</font> | <font
color="MediumVioletRed">1.13.5</font> |
+
+## Usage for SQL API
+
+We need several steps to setup a Flink cluster with the provided connector.
+
+1. Setup a Flink cluster with version 1.13.5 and Java 8+ installed.
+2. Download and decompress the Sort Connectors jars from the
[Downloads](/download/main) page (or [build
yourself](../../quick_start/how_to_build.md)).
+3. Put the Sort Connectors jars under `FLINK_HOME/lib/`.
+4. Restart the Flink cluster.
+
+The example shows how to create a MySQL Load Node in [Flink SQL
Client](https://ci.apache.org/projects/flink/flink-docs-release-1.13/dev/table/sqlClient.html)
and load data to it.
+
+```sql
+-- Creates a MySQL Extract Node
+CREATE TABLE mysql_extract_node (
+ id INT NOT NULL,
+ name STRING,
+ age INT,
+ weight DECIMAL(10,3),
+ PRIMARY KEY(id) NOT ENFORCED
+) WITH (
+ 'connector' = 'mysql-cdc-inlong',
+ 'hostname' = 'YourHostname',
+ 'port' = '3306',
+ 'username' = 'YourUsername',
+ 'password' = 'YourPassword',
+ 'database-name' = 'YourDatabaseName',
+ 'table-name' = 'YourTableName'
+ );
+-- Creates a MySQL Load Node
+CREATE TABLE mysql_load_node (
+ id INT NOT NULL,
+ name STRING,
+ age INT,
+ weight DECIMAL(10,3),
+ PRIMARY KEY(id) NOT ENFORCED
+) WITH (
+ 'connector' = 'jdbc-inlong',
+ 'url' = 'jdbc:mysql://YourHostname:3306/YourDatabaseName',
+ 'username' = 'YourUsername',
+ 'password' = 'YourPassword',
+ 'table-name' = 'YourTableName'
+);
+
+INSERT INTO mysql_load_node SELECT id, name, age, weight FROM
mysql_extract_node;
+```
\ No newline at end of file
diff --git a/docs/data_node/load_node/postgresql.md
b/docs/data_node/load_node/postgresql.md
new file mode 100644
index 000000000..bcdacf590
--- /dev/null
+++ b/docs/data_node/load_node/postgresql.md
@@ -0,0 +1,4 @@
+---
+title: PostgreSQL
+sidebar_position: 14
+---
\ No newline at end of file
diff --git a/docs/data_node/load_node/sqlserver.md
b/docs/data_node/load_node/sqlserver.md
new file mode 100644
index 000000000..d44335d9b
--- /dev/null
+++ b/docs/data_node/load_node/sqlserver.md
@@ -0,0 +1,4 @@
+---
+title: SqlServer
+sidebar_position: 15
+---
\ No newline at end of file
diff --git a/docs/data_node/load_node/tdsql-postgresql.md
b/docs/data_node/load_node/tdsql-postgresql.md
new file mode 100644
index 000000000..35bef838b
--- /dev/null
+++ b/docs/data_node/load_node/tdsql-postgresql.md
@@ -0,0 +1,4 @@
+---
+title: TDSQL-PostgreSQL
+sidebar_position: 16
+---
\ No newline at end of file
diff --git a/docs/deployment/standalone.md b/docs/deployment/standalone.md
index cb16510f2..60f6cd8c1 100644
--- a/docs/deployment/standalone.md
+++ b/docs/deployment/standalone.md
@@ -12,7 +12,7 @@ InLong Support the following Message Queue services now, you
can choose one of t
- [Apache Pulsar 2.8.x](https://pulsar.apache.org/docs/en/2.8.1/standalone/)
## Download the Binary Package
-You can get binary package from [Download
Page](https://inlong.apache.org/download/main/) ,or you can build the InLong
refer to [How to Build](quick_start/how_to_build.md).。
+You can get binary package from [Download
Page](https://inlong.apache.org/download/main/) ,or you can build the InLong
refer to [How to Build](quick_start/how_to_build.md).
## DB Dependencies
- If the backend database is MySQL, please download
[mysql-connector-java-8.0.27.jar](https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.27/mysql-connector-java-8.0.27.jar)
and put it into the following directories:
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/extract_node/auto_push.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/extract_node/auto_push.md
index ac588d86f..9429f83f4 100644
---
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/extract_node/auto_push.md
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/extract_node/auto_push.md
@@ -1,6 +1,6 @@
---
title: 自动推送
-sidebar_position: 1
+sidebar_position: 2
---
## 总览
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/extract_node/file.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/extract_node/file.md
index 68e138129..313fdcdd2 100644
---
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/extract_node/file.md
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/extract_node/file.md
@@ -1,6 +1,6 @@
---
title: 文件
-sidebar_position: 2
+sidebar_position: 3
---
## 参数说明
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/extract_node/hdfs.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/extract_node/hdfs.md
new file mode 100644
index 000000000..947e2f8c2
--- /dev/null
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/extract_node/hdfs.md
@@ -0,0 +1,4 @@
+---
+title: HDFS
+sidebar_position: 6
+---
\ No newline at end of file
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/extract_node/kafka.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/extract_node/kafka.md
index 1df9d3351..4ead68435 100644
---
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/extract_node/kafka.md
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/extract_node/kafka.md
@@ -1,6 +1,6 @@
---
title: Kafka
-sidebar_position: 3
+sidebar_position: 4
---
## 配置
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/extract_node/mongodb-cdc.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/extract_node/mongodb-cdc.md
new file mode 100644
index 000000000..fd6fcb8f8
--- /dev/null
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/extract_node/mongodb-cdc.md
@@ -0,0 +1,4 @@
+---
+title: MongoDB-CDC
+sidebar_position: 7
+---
\ No newline at end of file
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/extract_node/mysql-cdc.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/extract_node/mysql-cdc.md
new file mode 100644
index 000000000..969484caa
--- /dev/null
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/extract_node/mysql-cdc.md
@@ -0,0 +1,605 @@
+---
+title: MySQL-CDC
+sidebar_position: 5
+---
+
+## MySQL Extract Node
+
+MySQL Extract 节点允许从 MySQL 数据库中读取快照数据和增量数据。本文档介绍如何设置 MySQL Extract 节点以对 MySQL
数据库运行 SQL 查询。
+
+## 支持的版本
+
+| Extract 节点 | 版本
| Driver |
+|-----------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------|
+| [mysql-cdc](./mysql-cdc.md) | [MySQL](https://dev.mysql.com/doc): 5.6, 5.7,
8.0.x <br/> [RDS MySQL](https://www.aliyun.com/product/rds/mysql): 5.6, 5.7,
8.0.x <br/> [PolarDB MySQL](https://www.aliyun.com/product/polardb): 5.6, 5.7,
8.0.x <br/> [Aurora MySQL](https://aws.amazon.com/cn/rds/aurora): 5.6, 5.7,
8.0.x <br/> [MariaDB](https://mariadb.org): 10.x <br/> [PolarDB
X](https://github.com/ApsaraDB/galaxysql): 2.0.1 | JDBC Driver: 8.0.21 |
+
+## 依赖
+
+为了设置 MySQL Extract 节点,下表提供了使用构建自动化工具(例如 Maven 或 SBT)和带有 Sort Connectors JAR 包的
SQL 客户端的两个项目的依赖关系信息。
+
+### Maven 依赖
+
+```
+<dependency>
+ <groupId>org.apache.inlong</groupId>
+ <artifactId>sort-connector-mysql-cdc</artifactId>
+ <!-- 选择适合你的 Application 的版本 -->
+ <version>inlong_version</version>
+</dependency>
+```
+
+连接 MySQL 数据库还需要 MySQL
驱动程序依赖项。请下载[mysql-connector-java-8.0.21.jar](https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.21/mysql-connector-java-8.0.21.jar)
并将其放入 `FLINK_HOME/lib/`。
+
+## 设置 MySQL 服务器
+
+你必须定义一个对 Debezium MySQL 连接器监控的所有数据库具有适当权限的 MySQL 用户。
+
+- 创建 MySQL 用户:
+
+```sql
+mysql> CREATE USER 'user'@'localhost' IDENTIFIED BY 'password';
+```
+- 向用户授予所需的权限:
+
+```sql
+mysql> GRANT SELECT, SHOW DATABASES, REPLICATION SLAVE, REPLICATION CLIENT ON
*.* TO 'user' IDENTIFIED BY 'password';
+```
+**注意:** 启用 `scan.incremental.snapshot.enabled` 时不再需要 RELOAD 权限(默认启用)。
+
+- 刷新用户的权限:
+
+```sql
+mysql> FLUSH PRIVILEGES;
+```
+
+查看更多关于[权限说明](https://debezium.io/documentation/reference/1.5/connectors/mysql.html#mysql-creating-user)。
+
+## 注意事项
+
+### 为每个 Reader 设置一个不同的 SERVER ID
+
+每一个读取 Binlog 的 MySQL 数据库客户端都应该有一个唯一的 Id,称为 Server Id。 MySQL 服务器将使用此 Id
来维护网络连接和 Binlog 位置。因此,如果不同的作业共享相同的服务器 Id,可能会导致从错误的 Binlog 位置读取。
+因此,建议通过 [SQL
Hints](https://ci.apache.org/projects/flink/flink-docs-release-1.11/dev/table/sql/hints.
html),
+例如假设源并行度为 4,那么我们可以使用 `SELECT * FROM source_table /*+
OPTIONS('server-id'='5401-5404') */ ;` 为 4 个 Source Reader 中的每一个分配唯一的服务器 Id。
+
+### 设置 MySQL 会话超时
+
+当为大型数据库制作初始一致快照时,您建立的连接可能会在读取表时超时。您可以通过在 MySQL 配置文件中配置 `interactive_timeout` 和
`wait_timeout` 来防止这种行为。
+- `interactive_timeout`:服务器在关闭交互式连接之前等待其活动的秒数。请参阅 [MySQL
文档](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_interactive_timeout)。
+- `wait_timeout`:服务器在关闭非交互式连接之前等待其活动的秒数。请参阅 [MySQL
文档](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_wait_timeout)。
+
+## 如何创建一个 MySQL Extract 节点
+
+### SQL API 用法
+
+下面这个例子展示了如何用 `Flink SQL` 创建一个 MySQL Extract 节点:
+
+```sql
+-- 设置 Checkpoint 为 3000 毫秒
+Flink SQL> SET 'execution.checkpointing.interval' = '3s';
+
+Flink SQL> CREATE TABLE mysql_extract_node (
+ 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-inlong',
+ 'hostname' = 'YourHostname',
+ 'port' = '3306',
+ 'username' = 'YourUsername',
+ 'password' = 'YourPassword',
+ 'database-name' = 'YourDatabaseName',
+ 'table-name' = 'YourTableName');
+
+Flink SQL> SELECT * FROM mysql_extract_node;
+```
+
+### InLong Dashboard 用法
+
+- Choose the `BINLOG` Data Source
+ 
+
+- Configure the MySQL Source
+ 
+
+### InLong Manager Client 用法
+
+TODO: 将在未来支持此功能。
+
+## MySQL Extract 节点参数
+
+<div class="highlight">
+<table class="colwidths-auto docutils">
+ <thead>
+ <tr>
+ <th class="text-left" style={{width: '10%'}}>参数</th>
+ <th class="text-left" style={{width: '8%'}}>是否必须</th>
+ <th class="text-left" style={{width: '7%'}}>默认值</th>
+ <th class="text-left" style={{width: '10%'}}>数据类型</th>
+ <th class="text-left" style={{width: '65%'}}>描述</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>connector</td>
+ <td>required</td>
+ <td style={{wordWrap: 'break-word'}}>(none)</td>
+ <td>String</td>
+ <td>指定要使用的连接器,这里应该是 <code>'mysql-cdc-inlong'</code>。</td>
+ </tr>
+ <tr>
+ <td>hostname</td>
+ <td>required</td>
+ <td style={{wordWrap: 'break-word'}}>(none)</td>
+ <td>String</td>
+ <td>MySQL 数据库服务器的 IP 地址或主机名。</td>
+ </tr>
+ <tr>
+ <td>username</td>
+ <td>required</td>
+ <td style={{wordWrap: 'break-word'}}>(none)</td>
+ <td>String</td>
+ <td>连接到 MySQL 数据库服务器时要使用的 MySQL 用户名称。</td>
+ </tr>
+ <tr>
+ <td>password</td>
+ <td>required</td>
+ <td style={{wordWrap: 'break-word'}}>(none)</td>
+ <td>String</td>
+ <td>连接到 MySQL 数据库服务器时使用的密码。</td>
+ </tr>
+ <tr>
+ <td>database-name</td>
+ <td>required</td>
+ <td style={{wordWrap: 'break-word'}}>(none)</td>
+ <td>String</td>
+ <td>要监控的 MySQL 服务器的数据库名称。 database-name 还支持正则表达式来监控多个表是否匹配正则表达式。</td>
+ </tr>
+ <tr>
+ <td>table-name</td>
+ <td>required</td>
+ <td style={{wordWrap: 'break-word'}}>(none)</td>
+ <td>String</td>
+ <td>要监控的 MySQL 数据库的表名。 table-name 还支持正则表达式来监控多个表是否匹配正则表达式。</td>
+ </tr>
+ <tr>
+ <td>port</td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>3306</td>
+ <td>Integer</td>
+ <td>MySQL 数据库服务器的整数端口号。</td>
+ </tr>
+ <tr>
+ <td>server-id</td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>(none)</td>
+ <td>Integer</td>
+ <td>此数据库客户端的数字 Id 或数字 Id 范围,数字 Id 语法类似于 '5400',
+ 数字 Id
范围语法类似于“5400-5408”,启用“scan.incremental.snapshot.enabled”时建议使用数字 Id 范围语法。
+ 在 MySQL 集群中所有当前运行的数据库进程中,每个 Id 都必须是唯一的。此连接器加入 MySQL 集群
+ 作为另一台服务器(具有此唯一 Id),因此它可以读取 Binlog。默认情况下,会生成一个介于 5400 和 6400 之间的随机数,
+ 尽管我们建议设置一个明确的值。
+ </td>
+ </tr>
+ <tr>
+ <td>scan.incremental.snapshot.enabled</td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>true</td>
+ <td>Boolean</td>
+ <td>增量快照是一种读取表快照的新机制。与旧的快照机制相比,
+ 增量快照有很多优点,包括:
+ (1) 快照读取时 Source 可以并行,
+ (2) Source 可以在快照读取时在 Chunk 粒度上进行检查点,
+ (3) Source 在读快照前不需要获取全局读锁(FLUSH TABLES WITH READ LOCK)。
+ 如果您希望源代码并行运行,每个并行阅读器都应该有一个唯一的服务器 ID,所以
+ 'server-id' 必须是 '5400-6400' 这样的范围,并且范围必须大于并行度。
+ 请参阅<a
href="https://ververica.github.io/flink-cdc-connectors/release-2.2/content/connectors/mysql-cdc.html#incremental-snapshot-reading">增量快照阅读</a>部分了解更多详细信息。
+ </td>
+ </tr>
+ <tr>
+ <td>scan.incremental.snapshot.chunk.size</td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>8096</td>
+ <td>Integer</td>
+ <td>表快照的块大小(行数),读取表的快照时,表的快照被分成多个块。</td>
+ </tr>
+ <tr>
+ <td>scan.snapshot.fetch.size</td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>1024</td>
+ <td>Integer</td>
+ <td>读取表快照时每次轮询的最大获取大小。</td>
+ </tr>
+ <tr>
+ <td>scan.startup.mode</td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>initial</td>
+ <td>String</td>
+ <td>MySQL CDC 消费者的可选启动模式,有效枚举为"initial"
+ 和"latest-offset"。
+ 请参阅<a
href="https://ververica.github.io/flink-cdc-connectors/release-2.2/content/connectors/mysql-cdc.html#startup-reading-position">启动阅读位置</a>部分了解更多详细信息。</td>
+ </tr>
+ <tr>
+ <td>server-time-zone</td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>UTC</td>
+ <td>String</td>
+ <td>数据库服务器中的会话时区,例如"Asia/Shanghai"。
+ 它控制 MYSQL 中的 TIMESTAMP 类型如何转换为 STRING。
+ 查看更多<a
href="https://debezium.io/documentation/reference/1.5/connectors/mysql.html#mysql-temporal-types">这里</a>。</td>
+ </tr>
+ <tr>
+ <td>debezium.min.row.
+ count.to.stream.result</td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>1000</td>
+ <td>Integer</td>
+ <td>在快照操作期间,连接器将查询每个包含的表,以便为该表中的所有行生成读取事件。此参数确定 MySQL
连接是否会将表的所有结果拉入内存(速度很快但需要大量内存),或者是否将结果改为流式传输(可能较慢,但适用于非常大的表)。该值指定在连接器流式传输结果之前表必须包含的最小行数,默认为
1,000。将此参数设置为'0'以跳过所有表大小检查并始终在快照期间流式传输所有结果。</td>
+ </tr>
+ <tr>
+ <td>connect.timeout</td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>30s</td>
+ <td>Duration</td>
+ <td>连接器在尝试连接到 MySQL 数据库服务器后在超时之前应等待的最长时间。</td>
+ </tr>
+ <tr>
+ <td>connect.max-retries</td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>3</td>
+ <td>Integer</td>
+ <td>连接器应重试以建立 MySQL 数据库服务器连接的最大重试次数。</td>
+ </tr>
+ <tr>
+ <td>connection.pool.size</td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>20</td>
+ <td>Integer</td>
+ <td>连接池大小。</td>
+ </tr>
+ <tr>
+ <td>jdbc.properties.*</td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>20</td>
+ <td>String</td>
+ <td>传递自定义 JDBC URL 属性的选项。用户可以传递自定义属性,例如 'jdbc.properties.useSSL' =
'false'。</td>
+ </tr>
+ <tr>
+ <td>heartbeat.interval</td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>30s</td>
+ <td>Duration</td>
+ <td>发送心跳事件的时间间隔,用于跟踪最新可用的 Binlog 偏移量。</td>
+ </tr>
+ <tr>
+ <td>append-mode</td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>false</td>
+ <td>Boolean</td>
+ <td>是否仅支持 Append,如果为 'true',MySQL Extract Node 会将所有 Upsert 流转换为
Append 流,以支持不支持 Upsert 流的下游场景。</td>
+ </tr>
+ <tr>
+ <td>migrate-all</td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>false</td>
+ <td>Boolean</td>
+ <td>是否是全库迁移场景,如果为 'true',MySQL Extract Node 则将表的物理字段和其他元字段压缩成
'canal-json' 格式的特殊元字段 'data'。</td>
+ </tr>
+ <tr>
+ <td>debezium.*</td>
+ <td>optional</td>
+ <td style={{wordWrap: 'break-word'}}>(none)</td>
+ <td>String</td>
+ <td>将 Debezium 的属性传递给用于从 MySQL 服务器捕获数据更改的 Debezium Embedded Engine。
+ 例如:<code>'debezium.snapshot.mode' = 'never'</code>。
+ 详细了解 <a
href="https://debezium.io/documentation/reference/1.5/connectors/mysql.html#mysql-connector-properties">Debezium
的 MySQL 连接器属性。</a></td>
+ </tr>
+ </tbody>
+</table>
+</div>
+
+## 可用的元数据字段
+
+以下格式元数据可以作为表定义中的只读 (VIRTUAL) 列公开。
+
+<table class="colwidths-auto docutils">
+ <thead>
+ <tr>
+ <th class="text-left" style={{width: '15%'}}>字段名称</th>
+ <th class="text-left" style={{width: '30%'}}>数据类型</th>
+ <th class="text-left" style={{width: '55%'}}>描述</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>meta.table_name</td>
+ <td>STRING NOT NULL</td>
+ <td>该行所属的表名。</td>
+ </tr>
+ <tr>
+ <td>meta.database_name</td>
+ <td>STRING NOT NULL</td>
+ <td>该行所属的数据库名称。</td>
+ </tr>
+ <tr>
+ <td>meta.op_ts</td>
+ <td>TIMESTAMP_LTZ(3) NOT NULL</td>
+ <td>它指示在数据库中进行更改的时间。 <br/>如果记录是从表的快照而不是binlog中读取的,则该值始终为0。</td>
+ </tr>
+ <tr>
+ <td>meta.op_type</td>
+ <td>STRING</td>
+ <td>数据库操作的类型,如 INSERT/DELETE 等。</td>
+ </tr>
+ <tr>
+ <td>meta.data</td>
+ <td>STRING</td>
+ <td>`canal-json` 格式化的行的数据只有在 `migrate-all` 选项为 'true' 时才存在。</td>
+ </tr>
+ <tr>
+ <td>meta.is_ddl</td>
+ <td>BOOLEAN</td>
+ <td>是否是 DDL 语句。</td>
+ </tr>
+ <tr>
+ <td>meta.ts</td>
+ <td>TIMESTAMP_LTZ(3) NOT NULL</td>
+ <td>接收和处理行的当前时间。</td>
+ </tr>
+ <tr>
+ <td>meta.sql_type</td>
+ <td>MAP</td>
+ <td>将 Sql_type 表字段映射到 Java 数据类型 Id。</td>
+ </tr>
+ <tr>
+ <td>meta.mysql_type</td>
+ <td>MAP</td>
+ <td>表的结构。</td>
+ </tr>
+ <tr>
+ <td>meta.pk_names</td>
+ <td>ARRAY</td>
+ <td>表的主键名称。</td>
+ </tr>
+ <tr>
+ <td>meta.batch_id</td>
+ <td>BIGINT</td>
+ <td>Binlog的批次id。</td>
+ </tr>
+ <tr>
+ <td>meta.update_before</td>
+ <td>ARRAY</td>
+ <td>该行更新前的数据。</td>
+ </tr>
+ </tbody>
+</table>
+
+扩展的 CREATE TABLE 示例演示了使用这些元数据字段的语法:
+
+```sql
+CREATE TABLE `mysql_extract_node` (
+ `id` INT,
+ `name` STRING,
+ `database_name` string METADATA FROM 'meta.database_name',
+ `table_name` string METADATA FROM 'meta.table_name',
+ `op_ts` timestamp(3) METADATA FROM 'meta.op_ts',
+ `op_type` string METADATA FROM 'meta.op_type',
+ `batch_id` bigint METADATA FROM 'meta.batch_id',
+ `is_ddl` boolean METADATA FROM 'meta.is_ddl',
+ `update_before` ARRAY<MAP<STRING, STRING>> METADATA FROM
'meta.update_before',
+ `mysql_type` MAP<STRING, STRING> METADATA FROM 'meta.mysql_type',
+ `pk_names` ARRAY<STRING> METADATA FROM 'meta.pk_names',
+ `data` STRING METADATA FROM 'meta.data',
+ `sql_type` MAP<STRING, INT> METADATA FROM 'meta.sql_type',
+ `ingestion_ts` TIMESTAMP(3) METADATA FROM 'meta.ts',
+ PRIMARY KEY (`id`) NOT ENFORCED
+) WITH (
+ 'connector' = 'mysql-cdc-inlong',
+ 'hostname' = 'YourHostname',
+ 'migrate-all' = 'true',
+ 'port' = '3306',
+ 'username' = 'YourUsername',
+ 'password' = 'YourPassword',
+ 'database-name' = 'YourDatabase',
+ 'table-name' = 'YourTable'
+ );
+```
+
+## 数据类型映射
+
+<div class="wy-table-responsive">
+<table class="colwidths-auto docutils">
+ <thead>
+ <tr>
+ <th class="text-left">MySQL type</th>
+ <th class="text-left">Flink SQL type</th>
+ <th class="text-left">NOTE</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>TINYINT</td>
+ <td>TINYINT</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+ SMALLINT<br/>
+ TINYINT UNSIGNED</td>
+ <td>SMALLINT</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+ INT<br/>
+ MEDIUMINT<br/>
+ SMALLINT UNSIGNED</td>
+ <td>INT</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+ BIGINT<br/>
+ INT UNSIGNED</td>
+ <td>BIGINT</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>BIGINT UNSIGNED</td>
+ <td>DECIMAL(20, 0)</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+ REAL<br/>
+ FLOAT<br/>
+ </td>
+ <td>FLOAT</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+ DOUBLE
+ </td>
+ <td>DOUBLE</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+ NUMERIC(p, s)<br/>
+ DECIMAL(p, s)<br/>
+ where p <= 38<br/>
+ </td>
+ <td>DECIMAL(p, s)</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+ NUMERIC(p, s)<br/>
+ DECIMAL(p, s)<br/>
+ where 38 < p <= 65<br/>
+ </td>
+ <td>STRING</td>
+ <td>The precision for DECIMAL data type is up to 65 in MySQL, but the
precision for DECIMAL is limited to 38 in Flink.
+ So if you define a decimal column whose precision is greater than 38, you
should map it to STRING to avoid precision loss.</td>
+ </tr>
+ <tr>
+ <td>
+ BOOLEAN<br/>
+ TINYINT(1)<br/>
+ BIT(1)
+ </td>
+ <td>BOOLEAN</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>DATE</td>
+ <td>DATE</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>TIME [(p)]</td>
+ <td>TIME [(p)]</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>TIMESTAMP [(p)]<br/>
+ DATETIME [(p)]
+ </td>
+ <td>TIMESTAMP [(p)]
+ </td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+ CHAR(n)
+ </td>
+ <td>CHAR(n)</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+ VARCHAR(n)
+ </td>
+ <td>VARCHAR(n)</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+ BIT(n)
+ </td>
+ <td>BINARY(⌈n/8⌉)</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+ BINARY(n)
+ </td>
+ <td>BINARY(n)</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+ VARBINARY(N)
+ </td>
+ <td>VARBINARY(N)</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+ TINYTEXT<br/>
+ TEXT<br/>
+ MEDIUMTEXT<br/>
+ LONGTEXT<br/>
+ </td>
+ <td>STRING</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+ TINYBLOB<br/>
+ BLOB<br/>
+ MEDIUMBLOB<br/>
+ LONGBLOB<br/>
+ </td>
+ <td>BYTES</td>
+ <td>Currently, for BLOB data type in MySQL, only the blob whose length
isn't greater than 2,147,483,647(2 ** 31 - 1) is supported. </td>
+ </tr>
+ <tr>
+ <td>
+ YEAR
+ </td>
+ <td>INT</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+ ENUM
+ </td>
+ <td>STRING</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+ JSON
+ </td>
+ <td>STRING</td>
+ <td>The JSON data type will be converted into STRING with JSON format
in Flink.</td>
+ </tr>
+ <tr>
+ <td>
+ SET
+ </td>
+ <td>ARRAY<STRING></td>
+ <td>As the SET data type in MySQL is a string object that can have zero
or more values,
+ it should always be mapped to an array of string
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/extract_node/mysql.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/extract_node/mysql.md
deleted file mode 100644
index ffa69e191..000000000
---
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/extract_node/mysql.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-title: MySQL
-sidebar_position: 3
----
-
-## 配置
-### 数据源选择 `BINLOG`
-
-
-### 配置 MySQL 数据源
-
\ No newline at end of file
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/extract_node/oracle-cdc.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/extract_node/oracle-cdc.md
new file mode 100644
index 000000000..dc322188a
--- /dev/null
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/extract_node/oracle-cdc.md
@@ -0,0 +1,4 @@
+---
+title: Oracle-CDC
+sidebar_position: 8
+---
\ No newline at end of file
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/extract_node/overview.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/extract_node/overview.md
new file mode 100644
index 000000000..cc2871259
--- /dev/null
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/extract_node/overview.md
@@ -0,0 +1,61 @@
+---
+title: 总览
+sidebar_position: 1
+---
+
+## 简介
+
+Extract 节点列表是一组基于 <a href="https://flink.apache.org/">Apache
Flink<sup>®</sup></a> 的 Source Connectors 用于从不同的源系统抽取数据。
+
+## 支持的 Extract 节点列表
+
+| Extract 节点 | 版本
| 驱动包 |
+|-------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------|
+| [kafka](kafka.md) | [Kafka](https://kafka.apache.org/):
0.10+
| None |
+| [pulsar](pulsar.md) | [Pulsar](https://pulsar.apache.org/):
2.8.x+
| None |
+| [hdfs](hdfs.md) | [HDFS](https://hadoop.apache.org/):
2.x, 3.x
| None |
+| [mongodb-cdc](mongodb-cdc.md) | [MongoDB](https://www.mongodb.com):
3.6, 4.x, 5.0
| None |
+| [mysql-cdc](mysql-cdc.md) | [MySQL](https://dev.mysql.com/doc):
5.6, 5.7, 8.0.x <br/>[RDS MySQL](https://www.aliyun.com/product/rds/mysql):
5.6, 5.7, 8.0.x <br/> [PolarDB MySQL](https://www.aliyun.com/product/polardb):
5.6, 5.7, 8.0.x <br/> [Aurora MySQL](https://aws.amazon.com/cn/rds/aurora):
5.6, 5.7, 8.0.x <br/> [MariaDB](https://mariadb.org): 10.x <br/> [PolarDB
X](https://github.com/ApsaraDB/galaxysql): 2.0.1 | JDBC Driver: 8.0.21 |
+| [oracle-cdc](oracle-cdc.md) |
[Oracle](https://www.oracle.com/index.html): 11, 12, 19
| Oracle
Driver: 19.3.0.0 |
+| [postgresql-cdc](postgresql-cdc.md) |
[PostgreSQL](https://www.postgresql.org): 9.6, 10, 11, 12
| None
|
+| [sqlserver-cdc](sqlserver-cdc.md) |
[Sqlserver](https://www.microsoft.com/sql-server): 2012, 2014, 2016, 2017, 2019
| None
|
+
+## 支持的 Flink 版本列表
+
+下表展示了 InLong<sup>®</sup> Extract 节点 和 Flink<sup>®</sup> 版本之间的对应关系。
+
+| InLong<sup>®</sup> Extract 节点版本 | Flink<sup>®</sup> 版本
|
+|:-----------------------------------:|:-------------------------------------------:|
+| <font color="DarkCyan">1.2.0</font> | <font
color="MediumVioletRed">1.13.5</font> |
+
+## SQL API 用法
+
+我们需要几个步骤来使用提供的连接器设置 Flink 集群。
+
+- 设置一个安装了 1.13.5 版本和 Java 8+ 的 Flink 集群。
+- 从 [下载](/zh-CN/download/main) 页面下载并解压 Sort Connectors jars (或者参考
[如何编译](../../quick_start/how_to_build.md) 编译需要的版本)。
+- 将下载并解压后的 Sort Connectors jars 放到 `FLINK_HOME/lib/`。
+- 重启 Flink 集群。
+
+下面例子展示了如何在 [Flink SQL
Client](https://ci.apache.org/projects/flink/flink-docs-release-1.13/dev/table/sqlClient.html)
创建 MySQL Extarct 节点,并从中查询数据:
+
+```sql
+-- 创建一个 MySQL Extract 节点
+CREATE TABLE mysql_extract_node (
+ id INT NOT NULL,
+ name STRING,
+ age INT,
+ weight DECIMAL(10,3),
+ PRIMARY KEY(id) NOT ENFORCED
+) WITH (
+ 'connector' = 'mysql-cdc-inlong',
+ 'hostname' = 'YourHostname',
+ 'port' = '3306',
+ 'username' = 'YourUsername',
+ 'password' = 'YourPassword',
+ 'database-name' = 'YourDatabaseName',
+ 'table-name' = 'YourTableName'
+);
+
+SELECT id, name, age, weight FROM mysql_extract_node;
+```
\ No newline at end of file
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/extract_node/postgresql-cdc.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/extract_node/postgresql-cdc.md
new file mode 100644
index 000000000..2466f033e
--- /dev/null
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/extract_node/postgresql-cdc.md
@@ -0,0 +1,4 @@
+---
+title: PostgreSQL
+sidebar_position: 9
+---
\ No newline at end of file
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/extract_node/pulsar.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/extract_node/pulsar.md
new file mode 100644
index 000000000..e452c4e72
--- /dev/null
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/extract_node/pulsar.md
@@ -0,0 +1,4 @@
+---
+title: Pulsar
+sidebar_position: 10
+---
\ No newline at end of file
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/extract_node/sqlserver-cdc.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/extract_node/sqlserver-cdc.md
new file mode 100644
index 000000000..d4f2c1a19
--- /dev/null
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/extract_node/sqlserver-cdc.md
@@ -0,0 +1,4 @@
+---
+title: SqlServer-CDC
+sidebar_position: 11
+---
\ No newline at end of file
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/load_node/elasticsearch.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/load_node/elasticsearch.md
new file mode 100644
index 000000000..ddef13972
--- /dev/null
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/load_node/elasticsearch.md
@@ -0,0 +1,352 @@
+---
+title: Elasticsearch
+sidebar_position: 8
+---
+
+## Elasticsearch Load 节点
+
+Elasticsearch Load 节点允许将数据写入到 Elasticsearch 引擎的索引中。本文档描述运行 SQL 查询时如何设置
Elasticsearch Load 节点。
+
+连接器可以工作在 Upsert 模式,使用 DDL 中定义的主键与外部系统交换 UPDATE/DELETE 消息。
+
+如果 DDL 中没有定义主键,那么连接器只能工作在 Append 模式,只能与外部系统交换 INSERT 消息。
+
+## 支持的版本
+
+| Load 节点 | 版本
|
+|-------------------------------------|----------------------------------------------------|
+| [elasticsearch](./elasticsearch.md) |
[Elasticsearch](https://www.elastic.co/): 6.x, 7.x |
+
+### 依赖
+
+为了设置 Elasticsearch Load 节点,下表提供了使用构建自动化工具(例如 Maven 或 SBT)和带有 Sort Connectors
JAR 包的 SQL 客户端的两个项目的依赖关系信息。
+
+- Elasticsearch 6
+
+```
+<dependency>
+ <groupId>org.apache.inlong</groupId>
+ <artifactId>sort-connector-elasticsearch6</artifactId>
+ <version>inlong_version</version>
+</dependency>
+```
+- Elasticsearch 7
+
+```
+<dependency>
+ <groupId>org.apache.inlong</groupId>
+ <artifactId>sort-connector-elasticsearch7</artifactId>
+ <version>inlong_version</version>
+</dependency>
+```
+
+## 如何创建一个 Elasticsearch Load 节点
+
+### SQL API 用法
+
+下面列子展示了如何利用`Flink SQL`创建一个 Elasticsearch Load 节点:
+
+```sql
+CREATE TABLE myUserTable (
+ user_id STRING,
+ user_name STRING,
+ uv BIGINT,
+ pv BIGINT,
+ PRIMARY KEY (user_id) NOT ENFORCED
+) WITH (
+ 'connector' = 'elasticsearch-7',
+ 'hosts' = 'http://localhost:9200',
+ 'index' = 'users'
+);
+```
+
+### InLong Dashboard 用法
+
+TODO: 将在未来支持这个特性。
+
+### InLong Manager Client 用法
+
+TODO: 将在未来支持这个特性。
+
+## Elasticsearch Load 节点参数
+
+<table class="table table-bordered">
+ <thead>
+ <tr>
+ <th class="text-left" style={{width: '25%'}}>参数</th>
+ <th class="text-center" style={{width: '8%'}}>是否必选</th>
+ <th class="text-center" style={{width: '7%'}}>默认值</th>
+ <th class="text-center" style={{width: '10%'}}>数据类型</th>
+ <th class="text-center" style={{width: '50%'}}>描述</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td><h5>connector</h5></td>
+ <td>必选</td>
+ <td style={{wordWrap: 'break-word'}}>(none)</td>
+ <td>String</td>
+ <td>指定要使用的连接器,有效值为:
+ <ul>
+ <li><code>elasticsearch-6</code>:连接到 Elasticsearch 6.x 的集群。</li>
+ <li><code>elasticsearch-7</code>:连接到 Elasticsearch 7.x 及更高版本的集群。</li>
+ </ul></td>
+ </tr>
+ <tr>
+ <td><h5>hosts</h5></td>
+ <td>必选</td>
+ <td style={{wordWrap: 'break-word'}}>(none)</td>
+ <td>String</td>
+ <td>要连接到的一台或多台 Elasticsearch 主机,例如
<code>'http://host_name:9092;http://host_name:9093'</code>。</td>
+ </tr>
+ <tr>
+ <td><h5>index</h5></td>
+ <td>必选</td>
+ <td style={{wordWrap: 'break-word'}}>(none)</td>
+ <td>String</td>
+ <td>Elasticsearch 中每条记录的索引。可以是一个静态索引(例如
<code>'myIndex'</code>)或一个动态索引(例如 <code>'index-{'{log_ts|yyyy-MM-dd}'}'</code>)。
+ 更多详细信息,请参见下面的<a href="#dymic-index">动态索引</a>部分。</td>
+ </tr>
+ <tr>
+ <td><h5>document-type</h5></td>
+ <td>6.x 版本中必选</td>
+ <td style={{wordWrap: 'break-word'}}>(none)</td>
+ <td>String</td>
+ <td>Elasticsearch 文档类型。在 <code>elasticsearch-7</code> 中不再需要。</td>
+ </tr>
+ <tr>
+ <td><h5>document-id.key-delimiter</h5></td>
+ <td>可选</td>
+ <td style={{wordWrap: 'break-word'}}>_</td>
+ <td>String</td>
+ <td>复合键的分隔符(默认为"_"),例如,指定为"$"将导致文档 ID 为"KEY1$KEY2$KEY3"。</td>
+ </tr>
+ <tr>
+ <td><h5>username</h5></td>
+ <td>可选</td>
+ <td style={{wordWrap: 'break-word'}}>(none)</td>
+ <td>String</td>
+ <td>用于连接 Elasticsearch 实例的用户名。请注意,Elasticsearch 没有预绑定安全特性,但你可以通过如下<a
href="https://www.elastic.co/guide/en/elasticsearch/reference/master/configuring-security.html">指南</a>启用它来保护
Elasticsearch 集群。</td>
+ </tr>
+ <tr>
+ <td><h5>password</h5></td>
+ <td>可选</td>
+ <td style={{wordWrap: 'break-word'}}>(none)</td>
+ <td>String</td>
+ <td>用于连接 Elasticsearch
实例的密码。如果配置了<code>username</code>,则此选项也必须配置为非空字符串。</td>
+ </tr>
+ <tr>
+ <td><h5>failure-handler</h5></td>
+ <td>可选</td>
+ <td style={{wordWrap: 'break-word'}}>fail</td>
+ <td>String</td>
+ <td>对 Elasticsearch 请求失败情况下的失败处理策略。有效策略为:
+ <ul>
+ <li><code>fail</code>:如果请求失败并因此导致作业失败,则抛出异常。</li>
+ <li><code>ignore</code>:忽略失败并放弃请求。</li>
+ <li><code>retry-rejected</code>:重新添加由于队列容量饱和而失败的请求。</li>
+ <li>自定义类名称:使用 ActionRequestFailureHandler 的子类进行失败处理。</li>
+ </ul>
+ </td>
+ </tr>
+ <tr>
+ <td><h5>sink.flush-on-checkpoint</h5></td>
+ <td>可选</td>
+ <td style={{wordWrap: 'break-word'}}>true</td>
+ <td>Boolean</td>
+ <td>是否在 checkpoint 时执行 flush。禁用后,在 checkpoint 时 sink 将不会等待所有的 pending
请求被 Elasticsearch 确认。因此,sink 不会为请求的 at-least-once 交付提供任何有力保证。
+ </td>
+ </tr>
+ <tr>
+ <td><h5>sink.bulk-flush.max-actions</h5></td>
+ <td>可选</td>
+ <td style={{wordWrap: 'break-word'}}>1000</td>
+ <td>Integer</td>
+ <td>每个批量请求的最大缓冲操作数。
+ 可以设置为<code>'0'</code>来禁用它。
+ </td>
+ </tr>
+ <tr>
+ <td><h5>sink.bulk-flush.max-size</h5></td>
+ <td>可选</td>
+ <td style={{wordWrap: 'break-word'}}>2mb</td>
+ <td>MemorySize</td>
+ <td>每个批量请求的缓冲操作在内存中的最大值。单位必须为 MB。
+ 可以设置为<code>'0'</code>来禁用它。
+ </td>
+ </tr>
+ <tr>
+ <td><h5>sink.bulk-flush.interval</h5></td>
+ <td>可选</td>
+ <td style={{wordWrap: 'break-word'}}>1s</td>
+ <td>Duration</td>
+ <td>flush 缓冲操作的间隔。
+
可以设置为<code>'0'</code>来禁用它。注意,<code>'sink.bulk-flush.max-size'</code>和<code>'sink.bulk-flush.max-actions'</code>都设置为<code>'0'</code>的这种
flush 间隔设置允许对缓冲操作进行完全异步处理。
+ </td>
+ </tr>
+ <tr>
+ <td><h5>sink.bulk-flush.backoff.strategy</h5></td>
+ <td>可选</td>
+ <td style={{wordWrap: 'break-word'}}>DISABLED</td>
+ <td>String</td>
+ <td>指定在由于临时请求错误导致任何 flush 操作失败时如何执行重试。有效策略为:
+ <ul>
+ <li><code>DISABLED</code>:不执行重试,即第一次请求错误后失败。</li>
+ <li><code>CONSTANT</code>:等待重试之间的回退延迟。</li>
+ <li><code>EXPONENTIAL</code>:先等待回退延迟,然后在重试之间指数递增。</li>
+ </ul>
+ </td>
+ </tr>
+ <tr>
+ <td><h5>sink.bulk-flush.backoff.max-retries</h5></td>
+ <td>可选</td>
+ <td style={{wordWrap: 'break-word'}}>8</td>
+ <td>Integer</td>
+ <td>最大回退重试次数。</td>
+ </tr>
+ <tr>
+ <td><h5>sink.bulk-flush.backoff.delay</h5></td>
+ <td>可选</td>
+ <td style={{wordWrap: 'break-word'}}>50ms</td>
+ <td>Duration</td>
+ <td>每次回退尝试之间的延迟。对于 <code>CONSTANT</code> 回退策略,该值是每次重试之间的延迟。对于
<code>EXPONENTIAL</code> 回退策略,该值是初始的延迟。</td>
+ </tr>
+ <tr>
+ <td><h5>connection.max-retry-timeout</h5></td>
+ <td>可选</td>
+ <td style={{wordWrap: 'break-word'}}>(none)</td>
+ <td>Duration</td>
+ <td>最大重试超时时间。</td>
+ </tr>
+ <tr>
+ <td><h5>connection.path-prefix</h5></td>
+ <td>可选</td>
+ <td style={{wordWrap: 'break-word'}}>(none)</td>
+ <td>String</td>
+ <td>添加到每个 REST 通信中的前缀字符串,例如,<code>'/v1'</code>。</td>
+ </tr>
+ <tr>
+ <td><h5>format</h5></td>
+ <td>可选</td>
+ <td style={{wordWrap: 'break-word'}}>json</td>
+ <td>String</td>
+ <td>Elasticsearch 连接器支持指定格式。该格式必须生成一个有效的 json 文档。
+ 默认使用内置的 <code>'json'</code> 格式。更多详细信息,请参阅 <a
href="https://nightlies.apache.org/flink/flink-docs-release-1.13/zh/docs/connectors/table/formats/overview/">JSON
Format</a> 页面。
+ </td>
+ </tr>
+ </tbody>
+</table>
+
+特性
+----------------
+
+### Key 处理
+
+Elasticsearch Load 节点可以根据是否定义了主键来确定是在 Upsert 模式还是 Append 模式下工作。
+如果定义了主键,Elasticsearch Load 节点将以 Upsert 模式工作,该模式可以消费包含 UPDATE/DELETE 消息的查询。
+如果未定义主键,Elasticsearch Load 节点将以 Append 模式工作,该模式只能消费包含 INSERT 消息的查询。
+
+在 Elasticsearch Load 节点中,主键用于计算 Elasticsearch 的文档 Id,文档 Id 为最多 512
字节且不包含空格的字符串。
+Elasticsearch Load 节点通过使用 `document-id.key-delimiter` 指定的键分隔符按照 DDL
中定义的顺序连接所有主键字段,为每一行记录生成一个文档 Id 字符串。
+某些类型不允许作为主键字段,因为它们没有对应的字符串表示形式,例如,`BYTES`,`ROW`,`ARRAY`,`MAP` 等。
+如果未指定主键,Elasticsearch 将自动生成文档 Id。
+
+有关 PRIMARY KEY 语法的更多详细信息,请参见 [CREATE TABLE
DDL](https://nightlies.apache.org/flink/flink-docs-release-1.13/zh/docs/dev/table/sql/create/#create-table)。
+
+### 动态索引
+
+<a name = "dymic-index"></a>
+
+Elasticsearch Load 节点同时支持静态索引和动态索引。
+
+如果你想使用静态索引,则 `index` 选项值应为纯字符串,例如 `'myusers'`,所有记录都将被写入到 "myusers" 索引中。
+
+如果你想使用动态索引,你可以使用 `{field_name}` 来引用记录中的字段值来动态生成目标索引。
+你也可以使用 `'{field_name|date_format_string}'` 将 `TIMESTAMP/DATE/TIME` 类型的字段值转换为
`date_format_string` 指定的格式。
+`date_format_string` 与 Java 的
[DateTimeFormatter](https://docs.oracle.com/javase/8/docs/api/index.html) 兼容。
+例如,如果选项值设置为 `'myusers-{'{log_ts|yyyy-MM-dd}'}'`,则 `log_ts` 字段值为 `2020-03-27
12:25:55` 的记录将被写入到 "myusers-2020-03-27" 索引中。
+
+## 数据类型映射
+
+<table class="table table-bordered">
+ <thead>
+ <tr>
+ <th class="text-left">JSON type</th>
+ <th class="text-left">Flink SQL type</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td><code>string</code></td>
+ <td><code>CHAR / VARCHAR / STRING</code></td>
+ </tr>
+ <tr>
+ <td><code>boolean</code></td>
+ <td><code>BOOLEAN</code></td>
+ </tr>
+ <tr>
+ <td><code>string with encoding: base64</code></td>
+ <td><code>BINARY / VARBINARY</code></td>
+ </tr>
+ <tr>
+ <td><code>number</code></td>
+ <td><code>DECIMAL</code></td>
+ </tr>
+ <tr>
+ <td><code>number</code></td>
+ <td><code>TINYINT</code></td>
+ </tr>
+ <tr>
+ <td><code>number</code></td>
+ <td><code>SMALLINT</code></td>
+ </tr>
+ <tr>
+ <td><code>number</code></td>
+ <td><code>INT</code></td>
+ </tr>
+ <tr>
+ <td><code>number</code></td>
+ <td><code>BIGINT</code></td>
+ </tr>
+ <tr>
+ <td><code>number</code></td>
+ <td><code>FLOAT</code></td>
+ </tr>
+ <tr>
+ <td><code>number</code></td>
+ <td><code>DOUBLE</code></td>
+ </tr>
+ <tr>
+ <td><code>string with format: date</code></td>
+ <td><code>DATE</code></td>
+ </tr>
+ <tr>
+ <td><code>string with format: time</code></td>
+ <td><code>TIME</code></td>
+ </tr>
+ <tr>
+ <td><code>string with format: date-time</code></td>
+ <td><code>TIMESTAMP</code></td>
+ </tr>
+ <tr>
+ <td><code>string with format: date-time (with UTC time zone)</code></td>
+ <td><code>TIMESTAMP_WITH_LOCAL_TIME_ZONE</code></td>
+ </tr>
+ <tr>
+ <td><code>number</code></td>
+ <td><code>INTERVAL</code></td>
+ </tr>
+ <tr>
+ <td><code>array</code></td>
+ <td><code>ARRAY</code></td>
+ </tr>
+ <tr>
+ <td><code>object</code></td>
+ <td><code>MAP / MULTISET</code></td>
+ </tr>
+ <tr>
+ <td><code>object</code></td>
+ <td><code>ROW</code></td>
+ </tr>
+ </tbody>
+</table>
\ No newline at end of file
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/load_node/greenplum.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/load_node/greenplum.md
new file mode 100644
index 000000000..79a2493d8
--- /dev/null
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/load_node/greenplum.md
@@ -0,0 +1,4 @@
+---
+title: Greenplum
+sidebar_position: 9
+---
\ No newline at end of file
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/load_node/hbase.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/load_node/hbase.md
new file mode 100644
index 000000000..c5d5d973d
--- /dev/null
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/load_node/hbase.md
@@ -0,0 +1,4 @@
+---
+title: HBase
+sidebar_position: 10
+---
\ No newline at end of file
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/load_node/hdfs.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/load_node/hdfs.md
new file mode 100644
index 000000000..c4a3c3864
--- /dev/null
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/load_node/hdfs.md
@@ -0,0 +1,4 @@
+---
+title: HDFS
+sidebar_position: 11
+---
\ No newline at end of file
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/load_node/mysql.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/load_node/mysql.md
new file mode 100644
index 000000000..813cfcb29
--- /dev/null
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/load_node/mysql.md
@@ -0,0 +1,4 @@
+---
+title: MySQL
+sidebar_position: 12
+---
\ No newline at end of file
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/load_node/oracle.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/load_node/oracle.md
new file mode 100644
index 000000000..d08324620
--- /dev/null
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/load_node/oracle.md
@@ -0,0 +1,4 @@
+---
+title: Oracle
+sidebar_position: 13
+---
\ No newline at end of file
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/load_node/overview.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/load_node/overview.md
new file mode 100644
index 000000000..fab832a9d
--- /dev/null
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/load_node/overview.md
@@ -0,0 +1,80 @@
+---
+title: 总览
+sidebar_position: 1
+---
+
+## 简介
+
+Load 节点列表是一组基于 <a href="https://flink.apache.org/">Apache
Flink<sup>®</sup></a> 的 Sink Connectors 用于将数据加载到不同的存储系统。
+
+## 支持的 Load 节点列表
+| Load 节点 | 版本
| 驱动包 |
+|-----------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------|
+| [kafka](kafka.md) |
[Kafka](https://kafka.apache.org/): 0.10+
| None
|
+| [hbase](hbase.md) |
[Hbase](https://hbase.apache.org/): 2.2.x
| None
|
+| [postgresql](postgresql.md) |
[PostgreSQL](https://www.postgresql.org/): 9.6, 10, 11, 12
| None
|
+| [oracle](oracle.md) |
[Oracle](https://www.oracle.com/index.html): 11, 12, 19
| Oracle
Driver: 19.3.0.0 |
+| [mysql](mysql.md) |
[MySQL](https://dev.mysql.com/doc): 5.6, 5.7, 8.0.x <br/> [RDS
MySQL](https://www.aliyun.com/product/rds/mysql): 5.6, 5.7, 8.0.x <br/>
[PolarDB MySQL](https://www.aliyun.com/product/polardb): 5.6, 5.7, 8.0.x <br/>
[Aurora MySQL](https://aws.amazon.com/cn/rds/aurora): 5.6, 5.7, 8.0.x <br/>
[MariaDB](https://mariadb.org): 10.x <br/> [PolarDB
X](https://github.com/ApsaraDB/galaxysql): 2.0.1 | JDBC Driver: 8.0.21 |
+| [tdsql-postgresql](tdsql-postgresql.md) |
[TDSQL-PostgreSQL](https://cloud.tencent.com/document/product/1129): 10.17
| Oracle
Driver: 19.3.0.0 |
+| [greenplum](greenplum.md) |
[Greeplum](https://greenplum.org/): 4.x, 5.x, 6.x
| None
|
+| [elasticsearch](elasticsearch.md) |
[Elasticsearch](https://www.elastic.co/): 6.x, 7.x
| None
|
+| [clickhouse](clickhouse.md) |
[ClickHouse](https://clickhouse.com/): 20.7+
| None
|
+| [hive](hive.md) | [Hive](https://hive.apache.org/):
1.x, 2.x, 3.x
| None |
+| [sqlserver](sqlserver.md) |
[Sqlserver](https://www.microsoft.com/sql-server): 2012, 2014, 2016, 2017, 2019
| None
|
+| [hdfs](hdfs.md) |
[HDFS](https://hadoop.apache.org/): 2.x, 3.x
| None
|
+| [iceberg](iceberg.md) |
[Iceberg](https://iceberg.apache.org/): 0.13.1+
| None
|
+
+
+## 支持的 Flink 版本列表
+
+下表展示了 InLong<sup>®</sup> Load 节点 和 Flink<sup>®</sup> 版本之间的对应关系。
+
+| InLong<sup>®</sup> Load 节点版本 | Flink<sup>®</sup> 版本
|
+|:-----------------------------------:|:-------------------------------------------:|
+| <font color="DarkCyan">1.2.0</font> | <font
color="MediumVioletRed">1.13.5</font> |
+
+## SQL API 的用法
+
+我们需要几个步骤来使用提供的连接器设置 Flink 集群。
+
+- 设置一个安装了 1.13.5 版本和 Java 8+ 的 Flink 集群。
+- 从 [下载](/zh-CN/download/main) 页面下载并解压 Sort Connectors jars (或者参考
[如何编译](../../quick_start/how_to_build.md) 编译需要的版本)。
+- 将下载并解压后的 Sort Connectors jars 放到 `FLINK_HOME/lib/`。
+- 重启 Flink 集群。
+
+下面例子展示了如何在 [Flink SQL
Client](https://ci.apache.org/projects/flink/flink-docs-release-1.13/dev/table/sqlClient.html)
创建一个 MySQL Load 节点并加载数据进去:
+
+```sql
+-- 创建一个 MySQL Extract 节点
+CREATE TABLE mysql_extract_node (
+ id INT NOT NULL,
+ name STRING,
+ age INT,
+ weight DECIMAL(10,3),
+ PRIMARY KEY(id) NOT ENFORCED
+) WITH (
+ 'connector' = 'mysql-cdc-inlong',
+ 'hostname' = 'YourHostname',
+ 'port' = '3306',
+ 'username' = 'YourUsername',
+ 'password' = 'YourPassword',
+ 'database-name' = 'YourDatabaseName',
+ 'table-name' = 'YourTableName'
+ );
+-- 创建一个 MySQL Load 节点
+CREATE TABLE mysql_load_node (
+ id INT NOT NULL,
+ name STRING,
+ age INT,
+ weight DECIMAL(10,3),
+ PRIMARY KEY(id) NOT ENFORCED
+) WITH (
+ 'connector' = 'jdbc-inlong',
+ 'url' = 'jdbc:mysql://YourHostname:3306/YourDatabaseName',
+ 'username' = 'YourUsername',
+ 'password' = 'YourPassword',
+ 'table-name' = 'YourTableName'
+);
+
+INSERT INTO mysql_load_node SELECT id, name, age, weight FROM
mysql_extract_node;
+```
\ No newline at end of file
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/load_node/postgresql.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/load_node/postgresql.md
new file mode 100644
index 000000000..bcdacf590
--- /dev/null
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/load_node/postgresql.md
@@ -0,0 +1,4 @@
+---
+title: PostgreSQL
+sidebar_position: 14
+---
\ No newline at end of file
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/load_node/sqlserver.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/load_node/sqlserver.md
new file mode 100644
index 000000000..d44335d9b
--- /dev/null
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/load_node/sqlserver.md
@@ -0,0 +1,4 @@
+---
+title: SqlServer
+sidebar_position: 15
+---
\ No newline at end of file
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/load_node/tdsql-postgresql.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/load_node/tdsql-postgresql.md
new file mode 100644
index 000000000..35bef838b
--- /dev/null
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/data_node/load_node/tdsql-postgresql.md
@@ -0,0 +1,4 @@
+---
+title: TDSQL-PostgreSQL
+sidebar_position: 16
+---
\ No newline at end of file