You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by mo...@apache.org on 2021/12/21 11:03:32 UTC

[incubator-doris-website] branch master updated (3b3b931 -> 8116356)

This is an automated email from the ASF dual-hosted git repository.

morningman pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-doris-website.git.


 discard 3b3b931  add articles
     new 8116356  add articles

This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version.  This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:

 * -- * -- B -- O -- O -- O   (3b3b931)
            \
             N -- N -- N   refs/heads/master (8116356)

You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.

Any revisions marked "omit" are not gone; other references still
refer to them.  Any revisions marked "discard" are gone forever.

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .github/workflows/manual-deploy-website.yml | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org


[incubator-doris-website] 01/01: add articles

Posted by mo...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

morningman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-doris-website.git

commit 8116356c886656ff7ff333be9a1bcb72799c4d3c
Author: morningman <ch...@baidu.com>
AuthorDate: Tue Dec 21 18:53:38 2021 +0800

    add articles
---
 .github/workflows/manual-deploy-website.yml        |   4 +-
 README.md                                          |  87 +++-
 blogs/en/datax-doris-writer.md                     | 257 +++++++++++
 blogs/en/doris-binlog-load.md                      | 418 ++++++++++++++++++
 blogs/en/fe-load-balance.md                        | 476 +++++++++++++++++++++
 blogs/en/flink-cdc-to-doris.md                     | 374 ++++++++++++++++
 .../datax-doris-writer/image-20210903132250723.png | Bin 0 -> 250503 bytes
 .../datax-doris-writer/image-20210903132539511.png | Bin 0 -> 54482 bytes
 .../datax-doris-writer/image-20210903134043421.png | Bin 0 -> 333578 bytes
 .../doris-binlog-load/image-20211110145044815.png  | Bin 0 -> 146900 bytes
 .../doris-binlog-load/image-20211110160106602.png  | Bin 0 -> 52259 bytes
 .../doris-binlog-load/image-20211110160331479.png  | Bin 0 -> 67624 bytes
 .../doris-binlog-load/image-20211110160710709.png  | Bin 0 -> 56885 bytes
 .../flink-cdc-to-doris/image-20211025162831632.png | Bin 0 -> 143949 bytes
 .../flink-cdc-to-doris/image-20211025165547903.png | Bin 0 -> 39487 bytes
 .../flink-cdc-to-doris/image-20211025170642628.png | Bin 0 -> 49165 bytes
 .../flink-cdc-to-doris/image-20211025182341086.png | Bin 0 -> 21677 bytes
 .../flink-cdc-to-doris/image-20211025182435827.png | Bin 0 -> 48534 bytes
 .../flink-cdc-to-doris/image-20211026095513892.png | Bin 0 -> 92955 bytes
 .../flink-cdc-to-doris/image-20211026100505972.png | Bin 0 -> 33173 bytes
 .../flink-cdc-to-doris/image-20211026100804091.png | Bin 0 -> 10829 bytes
 .../flink-cdc-to-doris/image-20211026100943474.png | Bin 0 -> 284282 bytes
 .../flink-cdc-to-doris/image-20211026101004547.png | Bin 0 -> 21854 bytes
 .../flink-cdc-to-doris/image-20211026101203629.png | Bin 0 -> 43195 bytes
 blogs/zh-CN/datax-doris-writer.md                  | 261 +++++++++++
 blogs/zh-CN/doris-binlog-load.md                   | 421 ++++++++++++++++++
 blogs/zh-CN/fe-load-balance.md                     | 475 ++++++++++++++++++++
 blogs/zh-CN/flink-cdc-to-doris.md                  | 372 ++++++++++++++++
 28 files changed, 3142 insertions(+), 3 deletions(-)

diff --git a/.github/workflows/manual-deploy-website.yml b/.github/workflows/manual-deploy-website.yml
index de3a675..0ebb7eb 100644
--- a/.github/workflows/manual-deploy-website.yml
+++ b/.github/workflows/manual-deploy-website.yml
@@ -25,7 +25,9 @@ jobs:
         git clone https://github.com/apache/incubator-doris.git incubator-doris
         git checkout ${{ github.event.inputs.branch }}
         export BRANCH=${{ github.event.inputs.branch }}
-        echo "cmy $BRANCH"
+        cp -R blogs/zh-CN/ incubator-doris/docs/zh-CN/article/articles/
+        cp -R blogs/en/ incubator-doris/docs/en/article/articles/
+        cp -R blogs/images/blogs/ incubator-doris/docs/.vuepress/public/images/
         cd incubator-doris/docs && npm install && npm run build
         touch .vuepress/dist/.dummy
         ls .vuepress/dist/
diff --git a/README.md b/README.md
index fda8d45..a2a8b07 100644
--- a/README.md
+++ b/README.md
@@ -40,8 +40,91 @@ To view the website, navigate to
 or
 [https://doris.incubator.apache.org](https://doris.incubator.apache.org)
 
-## For more details
+## How to share a blog
+
+The Doris community welcomes the sharing of Doris-related articles. Once merged, these articles will appear on the official Doris website.
+
+Articles include, but are not limited to.
+
+* Doris usage tips
+* Introduction to Doris features
+* Doris system tuning
+* How Doris works
+* Doris business scenarios in practice
+
+### Write a blog
+
+TL;DR, you can refer to `blogs/en/datax-doris-writer.md`, and all images should be placed in `blogs/images/blogs/datax-doris-writer/`(One dir per article)
+
+To write a blog file, you must first include following information in the header,It mainly contains the following contents:
+
+| Variable | default | description |
+|--------|----------------------------|----------|
+| title| - | Blog title|
+| description | - | Blog description|
+| date | - | Blog date |
+| author | - | Blog author |
+| metaTitle | - | The title displayed by the browser when browsing the article |
+| language | en/zn-CN | language |
+| layout | Article | Layout of the components |
+| sidebar | false | Hide the sidebar |
+| isArticle | true | Whether it is an article, do not modify by default |
+
+>**Attention**
+>
+>The title, description, date, author, and metaTitle field values are filled in by the blog writer, and the other fields are fixed values.
+>
+>language: en, zh-CN
+
+File header example:
+
+```json
+---
+{
+    "title": "This is title",
+    "description": "This is description",
+    "date": "2021-11-03",
+    "author": "Alex",
+    "metaTitle": "article",
+    "language": "zh-CN",
+    "layout": "Article",
+    "sidebar": false
+    "isArticle":true
+}
+---
+```
+
+At the same time add Apache License content after the file header:
+
+```
+<!-- 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+  http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+```
+
+Finally, write the content of the blog body.
+
+### Blog file directory
+
+After the blog file is written, put it in the corresponding directory. The Chinese language directory is: `blogs/zh-CN/`,The directory corresponding to the English language is:`blogs/en/`.
+
+All images in the blog should be placed in certain directory. For example, your blog file named: `doris-article1.md`, and you need to create a directory `blogs/images/blogs/datax-article1/`, and put all images in this directory.
+
+## About Doris
 
-For more details about Dorirs, refer to [incubator-doris](https://github.com/apache/incubator-doris/blob/master/docs/README.md).
+For more details about Doris, refer to [incubator-doris](https://github.com/apache/incubator-doris/blob/master/docs/README.md).
 
 
diff --git a/blogs/en/datax-doris-writer.md b/blogs/en/datax-doris-writer.md
new file mode 100644
index 0000000..8d20479
--- /dev/null
+++ b/blogs/en/datax-doris-writer.md
@@ -0,0 +1,257 @@
+---
+{
+    "title": "How to use Apache doris Datax DorisWriter extension",
+    "description": "In order to better expand the Apache doris ecosystem and provide more convenient data import for doris users, the community development and extension supports Datax DorisWriter, making it more convenient for Datax to access data.",
+    "date": "2021-11-11",
+    "metaTitle": "How to use Apache doris Datax DorisWriter extension",
+    "language": "en",
+    "author": "张家锋",
+    "isArticle": true,
+    "layout": "Article",
+    "sidebar": false
+}
+---
+
+<!-- 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+DataX is an open source version of Alibaba Cloud DataWorks data integration, an offline data synchronization tool/platform widely used in Alibaba Group. DataX implements efficient data synchronization functions between various heterogeneous data sources including MySQL, Oracle, SqlServer, Postgre, HDFS, Hive, ADS, HBase, TableStore (OTS), MaxCompute (ODPS), Hologres, DRDS, etc.
+
+In order to better expand the Apache doris ecosystem and provide more convenient data import for doris users, the community development and extension supports Datax DorisWriter, making it more convenient for Datax to access data..
+
+## 1.Scenes
+
+Here is a demonstration of using Doris' Datax extension DorisWriter to extract data from Mysql data and import it into the Doris data warehouse table.
+
+## 2.Build DorisWriter
+
+The compilation of this extension can not be done in the docker compilation environment of doris, this article is compiled under the WLS under windows
+
+First pull the source code from github
+
+```
+git clone https://github.com/apache/incubator-doris.git
+```
+
+Enter `incubator-doris/extension/DataX/` to execute compilation
+
+First execute:
+
+```shell
+sh init_env.sh
+```
+
+This script is mainly used to build the DataX development environment. It mainly performs the following operations:
+
+1. Clone the DataX code base to the local.
+
+2. Softlink the `doriswriter/` directory to the `DataX/doriswriter` directory.
+
+3. Add the `<module>doriswriter</module>` module in the `DataX/pom.xml` file.
+
+4. Change the httpclient version in the `DataX/core/pom.xml` file from 4.5 to 4.5.13.
+
+    > httpclient v4.5 has a bug in handling 307 forwarding.
+
+After the script is executed, the developer can enter the `DataX/` directory to start development or compilation. Because of the soft link, any modification to the files in the `DataX/doriswriter` directory will be reflected in the `doriswriter/` directory, which is convenient for developers to submit code
+
+### 2.1 Build
+
+Here I removed a lot of useless plug-ins in order to speed up the compilation: here, just comment out the pom.xml in the Datax directory.
+
+```
+hbase11xreader
+hbase094xreader
+tsdbreader
+oceanbasev10reader
+odpswriter
+hdfswriter
+adswriter
+ocswriter
+oscarwriter
+oceanbasev10writer
+```
+
+Then enter the Datax directory under the `incubator-doris/extension/DataX/` directory and execute the compilation
+
+Here I am performing the compilation of Datax into a tar package, which is not the same as the official compilation command.
+
+```
+mvn -U clean package assembly:assembly -Dmaven.test.skip=true
+```
+
+![](/images/blogs/datax-doris-writer/image-20210903132250723.png)
+
+![](/images/blogs/datax-doris-writer/image-20210903132539511.png)
+
+After the compilation is complete, the tar package is in the `Datax/target` directory. You can copy the tar package to the place you need. Here I am directly performing the test in datax. Because the python version is 3.x version, you need to The three files in the bin directory are replaced with other versions of python 3. You can download this from the following address:
+
+```
+https://github.com/WeiYe-Jing/datax-web/tree/master/doc/datax-web/datax-python3
+```
+
+After replacing the downloaded three files with the files in the bin directory, the entire compilation is complete, and the installation is complete
+
+## 3.Data access
+
+At this time we can start to use Datax's doriswriter extension to directly extract data from Mysql (or other data sources) and import it into the Doris table.
+
+### 3.1 Mysql database preparation
+
+The following is the database table creation script (mysql 8):
+
+```sql
+CREATE TABLE `order_analysis` (
+  `date` varchar(19) DEFAULT NULL,
+  `user_src` varchar(9) DEFAULT NULL,
+  `order_src` varchar(11) DEFAULT NULL,
+  `order_location` varchar(2) DEFAULT NULL,
+  `new_order` int DEFAULT NULL,
+  `payed_order` int DEFAULT NULL,
+  `pending_order` int DEFAULT NULL,
+  `cancel_order` int DEFAULT NULL,
+  `reject_order` int DEFAULT NULL,
+  `good_order` int DEFAULT NULL,
+  `report_order` int DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT
+```
+
+Sample data
+
+```sql
+INSERT INTO `sql12298540`.`order_analysis` (`date`, `user_src`, `order_src`, `order_location`, `new_order`, `payed_order`, `pending_order`, `cancel_order`, `reject_order`, `good_order`, `report_order`) VALUES ('2015-10-12 00:00:00', '广告二维码', 'Android APP', '上海', 15253, 13210, 684, 1247, 1000, 10824, 862);
+INSERT INTO `sql12298540`.`order_analysis` (`date`, `user_src`, `order_src`, `order_location`, `new_order`, `payed_order`, `pending_order`, `cancel_order`, `reject_order`, `good_order`, `report_order`) VALUES ('2015-10-14 00:00:00', '微信朋友圈H5页面', 'iOS APP', '广州', 17134, 11270, 549, 204, 224, 10234, 773);
+INSERT INTO `sql12298540`.`order_analysis` (`date`, `user_src`, `order_src`, `order_location`, `new_order`, `payed_order`, `pending_order`, `cancel_order`, `reject_order`, `good_order`, `report_order`) VALUES ('2015-10-17 00:00:00', '地推二维码扫描', 'iOS APP', '北京', 16061, 9418, 1220, 1247, 458, 13877, 749);
+INSERT INTO `sql12298540`.`order_analysis` (`date`, `user_src`, `order_src`, `order_location`, `new_order`, `payed_order`, `pending_order`, `cancel_order`, `reject_order`, `good_order`, `report_order`) VALUES ('2015-10-17 00:00:00', '微信朋友圈H5页面', '微信公众号', '武汉', 12749, 11127, 1773, 6, 5, 9874, 678);
+INSERT INTO `sql12298540`.`order_analysis` (`date`, `user_src`, `order_src`, `order_location`, `new_order`, `payed_order`, `pending_order`, `cancel_order`, `reject_order`, `good_order`, `report_order`) VALUES ('2015-10-18 00:00:00', '地推二维码扫描', 'iOS APP', '上海', 13086, 15882, 1727, 1764, 1429, 12501, 625);
+INSERT INTO `sql12298540`.`order_analysis` (`date`, `user_src`, `order_src`, `order_location`, `new_order`, `payed_order`, `pending_order`, `cancel_order`, `reject_order`, `good_order`, `report_order`) VALUES ('2015-10-18 00:00:00', '微信朋友圈H5页面', 'iOS APP', '武汉', 15129, 15598, 1204, 1295, 1831, 11500, 320);
+INSERT INTO `sql12298540`.`order_analysis` (`date`, `user_src`, `order_src`, `order_location`, `new_order`, `payed_order`, `pending_order`, `cancel_order`, `reject_order`, `good_order`, `report_order`) VALUES ('2015-10-19 00:00:00', '地推二维码扫描', 'Android APP', '杭州', 20687, 18526, 1398, 550, 213, 12911, 185);
+INSERT INTO `sql12298540`.`order_analysis` (`date`, `user_src`, `order_src`, `order_location`, `new_order`, `payed_order`, `pending_order`, `cancel_order`, `reject_order`, `good_order`, `report_order`) VALUES ('2015-10-19 00:00:00', '应用商店', '微信公众号', '武汉', 12388, 11422, 702, 106, 158, 5820, 474);
+INSERT INTO `sql12298540`.`order_analysis` (`date`, `user_src`, `order_src`, `order_location`, `new_order`, `payed_order`, `pending_order`, `cancel_order`, `reject_order`, `good_order`, `report_order`) VALUES ('2015-10-20 00:00:00', '微信朋友圈H5页面', '微信公众号', '上海', 14298, 11682, 1880, 582, 154, 7348, 354);
+INSERT INTO `sql12298540`.`order_analysis` (`date`, `user_src`, `order_src`, `order_location`, `new_order`, `payed_order`, `pending_order`, `cancel_order`, `reject_order`, `good_order`, `report_order`) VALUES ('2015-10-21 00:00:00', '地推二维码扫描', 'Android APP', '深圳', 22079, 14333, 5565, 1742, 439, 8246, 211);
+INSERT INTO `sql12298540`.`order_analysis` (`date`, `user_src`, `order_src`, `order_location`, `new_order`, `payed_order`, `pending_order`, `cancel_order`, `reject_order`, `good_order`, `report_order`) VALUES ('2015-10-22 00:00:00', 'UC浏览器引流', 'iOS APP', '上海', 28968, 18151, 7212, 2373, 1232, 10739, 578);
+
+```
+
+### 3.2 doris database preparation
+
+The following is the table creation script corresponding to the above data table in doris
+
+```sql
+CREATE TABLE `order_analysis` (
+  `date` datetime DEFAULT NULL,
+  `user_src` varchar(30) DEFAULT NULL,
+  `order_src` varchar(50) DEFAULT NULL,
+  `order_location` varchar(10) DEFAULT NULL,
+  `new_order` int DEFAULT NULL,
+  `payed_order` int DEFAULT NULL,
+  `pending_order` int DEFAULT NULL,
+  `cancel_order` int DEFAULT NULL,
+  `reject_order` int DEFAULT NULL,
+  `good_order` int DEFAULT NULL,
+  `report_order` int DEFAULT NULL
+) ENGINE=OLAP
+DUPLICATE KEY(`date`,user_src)
+COMMENT "OLAP"
+DISTRIBUTED BY HASH(`user_src`) BUCKETS 1
+PROPERTIES (
+"replication_num" = "3",
+"in_memory" = "false",
+"storage_format" = "V2"
+);
+```
+
+### 3.3 Datax Job JSON file
+
+Create and edit the datax job task json file and save it to the specified directory
+
+```json
+{
+    "job": {
+        "setting": {
+            "speed": {
+                "channel": 1
+            },
+            "errorLimit": {
+                "record": 0,
+                "percentage": 0
+            }
+        },
+        "content": [
+            {
+                "reader": {
+                    "name": "mysqlreader",
+                    "parameter": {
+                        "username": "root",
+                        "password": "zhangfeng",
+                        "column": ["date","user_src","order_src","order_location","new_order","payed_order"," pending_order"," cancel_order"," reject_order"," good_order"," report_order" ],
+                        "connection": [ { "table": [ "order_analysis" ], "jdbcUrl": [ "jdbc:mysql://localhost:3306/demo" ] } ] }
+                },
+                "writer": {
+                    "name": "doriswriter",
+                    "parameter": {
+                        "feLoadUrl": ["fe:8030"],
+                        "beLoadUrl": ["be1:8040","be1:8040","be1:8040","be1:8040","be1:8040","be1:8040"],
+                        "jdbcUrl": "jdbc:mysql://fe:9030/",
+                        "database": "test_2",
+                        "table": "order_analysis",
+                        "column": ["date","user_src","order_src","order_location","new_order","payed_order"," pending_order"," cancel_order"," reject_order"," good_order"," report_order"],
+                        "username": "root",
+                        "password": "",
+                        "postSql": [],
+                        "preSql": [],
+                        "loadProps": {
+                        },
+                        "maxBatchRows" : 10000,
+                        "maxBatchByteSize" : 104857600,
+                        "labelPrefix": "datax_doris_writer_demo_",
+                        "lineDelimiter": "\n"
+                    }
+                }
+            }
+        ]
+    }
+}
+```
+
+Refer to the usage of this piece of Mysql reader:
+
+```
+https://github.com/alibaba/DataX/blob/master/mysqlreader/doc/mysqlreader.md
+```
+
+The use and parameter description of doriswriter:
+
+```
+https://github.com/apache/incubator-doris/blob/master/extension/DataX/doriswriter/doc/doriswriter.md
+```
+
+## 4.Perform Datax data import tasks
+
+```python
+python bin/datax.py doris.json
+```
+
+Then you can see the execution result:
+
+![](/images/blogs/datax-doris-writer/image-20210903134043421.png)
+
+Then go to the Doris database to check your table, the data has been imported, and the task execution is over
+
+Because Datax tasks are executed by external triggers, here you can use Linux crontab or Apache DolphinScheduler to control task operation
diff --git a/blogs/en/doris-binlog-load.md b/blogs/en/doris-binlog-load.md
new file mode 100644
index 0000000..a7f3564
--- /dev/null
+++ b/blogs/en/doris-binlog-load.md
@@ -0,0 +1,418 @@
+---
+{
+    "title": "How to use Apache Doris Binlog Load and examples",
+    "description": "Binlog Load provides a CDC (Change Data Capture) function that enables Doris to incrementally synchronize the user's data update operation in the Mysql database, making it more convenient for users to complete the import of Mysql data.",
+    "date": "2021-11-10",
+    "metaTitle": "How to use Apache Doris Binlog Load and examples",
+    "language": "en",
+    "isArticle": true,
+    "author": "张家锋",
+    "layout": "Article",
+    "sidebar": false
+}
+---
+<!-- 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+Binlog Load provides a CDC (Change Data Capture) function that enables Doris to incrementally synchronize the user's data update operation in the Mysql database, making it more convenient for users to complete the import of Mysql data.
+
+>Note:
+>
+>This function needs to be used in 0.15 and later versions
+
+## 1. Install and configure Mysql
+
+1. Install Mysql
+
+   Quickly use Docker to install and configure Mysql, refer to the following link for details
+
+   https://segmentfault.com/a/1190000021523570
+
+   If it is installed on a physical machine, please refer to the following connection:
+
+   [在 CentOS 7 中安装 MySQL 8 的教程详解](https://cloud.tencent.com/developer/article/1721575)
+
+2. enable Mysql binlog
+
+   Enter the Docker container or modify the `/etc/my.cnf` file on the physical machine, and add the following content under [mysqld],
+
+   ```
+   log_bin=mysql_bin
+   binlog-format=Row
+   server-id=1
+   ```
+
+   Then restart Mysql
+
+   ```
+   systemctl restart mysqld
+   ```
+
+3. Create Mysql table
+
+   ```sql
+   create database demo;
+   
+    CREATE TABLE `test_cdc` (
+     `id` int NOT NULL AUTO_INCREMENT,
+     `sex` TINYINT(1) DEFAULT NULL,
+     `name` varchar(20) DEFAULT NULL,
+     `address` varchar(255) DEFAULT NULL,
+     PRIMARY KEY (`id`)
+    ) ENGINE=InnoDB
+   ```
+
+
+## 2. Install and configure Canal
+
+Download canal-1.1.5: https://github.com/alibaba/canal/releases/download/canal-1.1.5/canal.deployer-1.1.5.tar.gz
+
+1. Unzip Canal to the specified directory:
+
+   ```shell
+   tar zxvf canal.deployer-1.1.5.tar.gz -C ./canal
+   ```
+
+2. Create a new directory in the conf folder and rename it as the root directory of the instance. You can name the directory for easy identification.
+
+   For example, my name here is consistent with the name of my database library: demo 
+
+   ```shell
+   vi conf/demo/instance.properties
+   ```
+
+   Given below is a sample configuration of mine:
+
+   For the parameter description, please refer to Canal official documentation:[QuickStart ](https://github.com/alibaba/canal/wiki/QuickStart)
+
+   ```ini
+   #################################################
+   ## mysql serverId , v1.0.26+ will autoGen
+   canal.instance.mysql.slaveId=12115
+   
+   # enable gtid use true/false
+   canal.instance.gtidon=false
+   
+   # position info
+   canal.instance.master.address=10.220.146.11:3306
+   canal.instance.master.journal.name=
+   canal.instance.master.position=
+   canal.instance.master.timestamp=
+   canal.instance.master.gtid=
+   
+   # rds oss binlog
+   canal.instance.rds.accesskey=
+   canal.instance.rds.secretkey=
+   canal.instance.rds.instanceId=
+   
+   # table meta tsdb info
+   canal.instance.tsdb.enable=true
+   #canal.instance.tsdb.url=jdbc:mysql://127.0.0.1:3306/canal_tsdb
+   #canal.instance.tsdb.dbUsername=canal
+   #canal.instance.tsdb.dbPassword=canal
+   
+   #canal.instance.standby.address =
+   #canal.instance.standby.journal.name =
+   #canal.instance.standby.position =
+   #canal.instance.standby.timestamp =
+   #canal.instance.standby.gtid=
+   
+   # username/password
+   canal.instance.dbUsername=zhangfeng
+   canal.instance.dbPassword=zhangfeng800729)(*Q
+   canal.instance.connectionCharset = UTF-8
+   # enable druid Decrypt database password
+   canal.instance.enableDruid=false
+   #canal.instance.pwdPublicKey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALK4BUxdDltRRE5/zXpVEVPUgunvscYFtEip3pmLlhrWpacX7y7GCMo2/JM6LeHmiiNdH1FWgGCpUfircSwlWKUCAwEAAQ==
+   
+   # table regex
+   canal.instance.filter.regex=demo\\..*
+   # table black regex
+   canal.instance.filter.black.regex=
+   # table field filter(format: schema1.tableName1:field1/field2,schema2.tableName2:field1/field2)
+   #canal.instance.filter.field=test1.t_product:id/subject/keywords,test2.t_company:id/name/contact/ch
+   # table field black filter(format: schema1.tableName1:field1/field2,schema2.tableName2:field1/field2)
+   #canal.instance.filter.black.field=test1.t_product:subject/product_image,test2.t_company:id/name/contact/ch
+   
+   # mq config
+   #canal.mq.topic=
+   # dynamic topic route by schema or table regex
+   #canal.mq.dynamicTopic=mytest1.user,mytest2\\..*,.*\\..*
+   #canal.mq.partition=0
+   # hash partition config
+   #canal.mq.partitionsNum=3
+   #canal.mq.partitionHash=test.table:id^name,.*\\..*
+   #################################################
+   ```
+
+   
+
+3. Start Canal
+
+   ```shell
+   sh bin/startup.sh
+   ```
+
+> Note: canal instance user/passwd
+>
+>Version 1.1.5, add these two configurations in canal.properties
+>
+>canal.user = canal
+>canal.passwd = E3619321C1A937C46A0D8BD1DAC39F93B27D4458
+>
+>The default password is canal/canal, and the password value of canal.passwd can be obtained by selecting password("xxx")
+
+4. Verify whether the startup is successful
+
+   ```shell
+   tail -200f logs/demo/demo.log
+   ```
+
+   ![](/images/blogs/doris-binlog-load/image-20211110145044815.png)
+
+## 3.Start synchronizing data
+
+### 3.1 Create Doris target table
+
+The user needs to first create the target table corresponding to the Mysql side on the Doris side
+
+Binlog Load can only support unique target tables, and the Batch Delete function of the target table must be activated.
+
+For the method of enabling Batch Delete, please refer to the batch delete function in `help alter table`.
+
+```sql
+CREATE TABLE `doris_mysql_binlog_demo` (
+  `id` int NOT NULL,
+  `sex` TINYINT(1),
+  `name` varchar(20),
+  `address` varchar(255) 
+) ENGINE=OLAP
+UNIQUE KEY(`id`,sex)
+COMMENT "OLAP"
+DISTRIBUTED BY HASH(`sex`) BUCKETS 1
+PROPERTIES (
+"replication_allocation" = "tag.location.default: 3",
+"in_memory" = "false",
+"storage_format" = "V2"
+);
+
+-- enable batch delete
+ALTER TABLE test_2.doris_mysql_binlog_demo ENABLE FEATURE "BATCH_DELETE";
+```
+
+
+
+### 3.1 Create sync job
+
+#### 3.1.1 Create Sync Job syntax description
+
+The data synchronization (Sync Job) function supports the user to submit a resident data synchronization job. By reading the Binlog log from the specified remote address, incrementally synchronize the user's CDC (Change Data Capture) of the data update operation in the Mysql database Function.
+
+Currently, the data synchronization job only supports Canal docking. The parsed Binlog data is obtained from Canal Server and imported into Doris.
+
+Users can check the status of data synchronization job through `SHOW SYNC JOB`.
+
+grammar:
+
+```	
+CREATE SYNC [db.]job_name
+ (
+ 	channel_desc, 
+ 	channel_desc
+ 	...
+ )
+binlog_desc
+```
+
+1. `job_name`
+
+	The name of the synchronization job is the unique identifier of the job in the current database. Only one job with the same `job_name` can be running.
+   
+2. `channel_desc`
+
+	The data channel under the job is used to describe the mapping relationship between the mysql source table and the doris target table.
+	
+	grammar:  		
+	
+	```
+	FROM mysql_db.src_tbl INTO des_tbl
+	[partitions]
+	[columns_mapping]
+	```
+	
+	1. `mysql_db.src_tbl`
+
+        Specify the database and source table on the mysql side.
+		
+	2. `des_tbl`
+
+        Specify the target table on the doris side. Only unique tables are supported, and the batch delete function of the table needs to be enabled (for the opening method, please refer to the "batch delete function" of help alter table).
+	
+	3. `partitions`
+
+        Specify which partitions of the destination table to import. If not specified, it will be automatically imported into the corresponding partition.
+		
+        Example:
+	
+        ```
+        PARTITION(p1, p2, p3)
+        ```
+		
+	4. `column_mapping`
+
+        Specify the mapping relationship between the columns of the mysql source table and the doris target table. If not specified, FE will default the source table and target table columns in a one-to-one correspondence.
+		
+        The form of col_name = expr is not supported to represent columns.
+		
+        Example:
+		
+        ```
+        Suppose the target table is listed as (k1, k2, v1),
+	     
+        Change the order of columns k1 and k2
+        COLUMNS(k2, k1, v1)
+	     
+        Ignore the fourth column of the source data
+        COLUMNS(k2, k1, v1, dummy_column)
+        ```
+	
+3. `binlog_desc`
+
+    Used to describe the remote data source, currently only supports one type of canal.
+
+    grammar:
+
+    ```
+    FROM BINLOG
+    (
+        "key1" = "value1", 
+        "key2" = "value2"
+    )
+    ```
+
+    1. The attribute corresponding to the Canal data source, prefixed with `canal.`
+
+      1. canal.server.ip: the address of the canal server
+      2. canal.server.port: canal server port
+      3. canal.destination: the identity of the instance
+      4. canal.batchSize: the maximum value of the batch size obtained, the default is 8192
+      5. canal.username: instance username
+      6. canal.password: instance password
+      7. canal.debug: Optional, when set to true, the batch and detailed information of each row of data will be printed out
+          Examples:
+
+1. Simply create a data synchronization job named `job1` for `test_tbl` of `test_db`, connect to the local Canal server, and correspond to the Mysql source table `mysql_db1.tbl1`.
+
+		CREATE SYNC `test_db`.`job1`
+		(
+			FROM `mysql_db1`.`tbl1` INTO `test_tbl `
+		)
+		FROM BINLOG 
+		(
+			"type" = "canal",
+			"canal.server.ip" = "127.0.0.1",
+			"canal.server.port" = "11111",
+			"canal.destination" = "example",
+			"canal.username" = "",
+			"canal.password" = ""
+		);
+	
+2. Create a data synchronization job named `job1` for multiple tables of `test_db`, corresponding to multiple Mysql source tables one by one, and explicitly specify the column mapping.
+
+		CREATE SYNC `test_db`.`job1` 
+		(
+			FROM `mysql_db`.`t1` INTO `test1` COLUMNS(k1, k2, v1) PARTITIONS (p1, p2),
+			FROM `mysql_db`.`t2` INTO `test2` COLUMNS(k3, k4, v2) PARTITION p1
+		) 
+		FROM BINLOG 
+		(
+			"type" = "canal", 
+			"canal.server.ip" = "xx.xxx.xxx.xx", 
+			"canal.server.port" = "12111", 
+			"canal.destination" = "example",  
+			"canal.username" = "username", 
+			"canal.password" = "password"
+		);
+
+#### 3.1.2 Start to synchronize data in mysql table to Doris
+
+>Notice:
+>
+>Before creating a synchronization task, first configure enable_create_sync_job=true in fe.conf, this is false by default and not enabled, otherwise the synchronization task cannot be created
+
+```
+CREATE SYNC test_2.doris_mysql_binlog_demo_job 
+(
+	FROM demo.test_cdc INTO doris_mysql_binlog_demo
+) 
+FROM BINLOG 
+(
+	"type" = "canal", 
+	"canal.server.ip" = "10.220.146.10", 
+	"canal.server.port" = "11111", 
+	"canal.destination" = "demo",  
+	"canal.username" = "canal", 
+	"canal.password" = "canal"
+);
+```
+
+#### 3.1.3 View synchronization tasks
+
+```sql
+SHOW SYNC JOB from test_2;
+```
+
+![](/images/blogs/doris-binlog-load/image-20211110160106602.png)
+
+#### 3.1.4 View the data in the table
+
+```sql
+select * from doris_mysql_binlog_demo;
+```
+
+![](/images/blogs/doris-binlog-load/image-20211110160331479.png)
+
+#### 3.1.5 Delete Data
+
+We delete the data in the Mysql data table, and then look at the changes in the Doris table
+
+```
+delete from test_cdc where id in (12,13)
+```
+
+We are looking at the Doris table, the two data with id 12 and 13 have been deleted
+
+![](/images/blogs/doris-binlog-load/image-20211110160710709.png)
+
+#### 3.1.6 Multi-table synchronization
+
+Multi-table synchronization only needs to be written like the following
+
+
+
+```sql
+CREATE SYNC test_2.doris_mysql_binlog_demo_job 
+(
+    FROM demo.test_cdc INTO doris_mysql_binlog_demo,
+    FROM demo.test_cdc_1 INTO doris_mysql_binlog_demo,
+    FROM demo.test_cdc_2 INTO doris_mysql_binlog_demo,
+    FROM demo.test_cdc_3 INTO doris_mysql_binlog_demo
+) 
+```
+
diff --git a/blogs/en/fe-load-balance.md b/blogs/en/fe-load-balance.md
new file mode 100644
index 0000000..c705035
--- /dev/null
+++ b/blogs/en/fe-load-balance.md
@@ -0,0 +1,476 @@
+---
+{
+    "title": "Apache Doris FE load balance",
+    "description": "In order to better expand the Apache doris ecosystem and provide more convenient data import for doris users, the community development and extension supports Datax DorisWriter, making it more convenient for Datax to access data.",
+    "date": "2021-11-11",
+    "metaTitle": "Apache Doris FE load balance",
+    "language": "en",
+    "author": "张家锋",
+    "isArticle": true,
+    "layout": "Article",
+    "sidebar": false
+}
+---
+
+<!-- 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+When deploying multiple FE nodes, users can deploy a load balancing layer on top of multiple FEs to achieve high availability of Doris.
+
+## 1. Code method
+
+Retry and load balance yourself in the application layer code. For example, if a connection is found to be down, it will automatically retry on other connections. Application layer code retry requires the application to configure multiple doris front-end node addresses.
+
+## 2. JDBC Connector
+
+If you use mysql jdbc connector to connect to Doris, you can use jdbc's automatic retry mechanism:
+
+```
+jdbc:mysql:loadbalance://[host:port],[host:port].../[database][?propertyName1][=propertyValue1][&propertyName2][=propertyValue
+```
+
+For details, please refer to [Mysql official website document](https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-usagenotes-j2ee-concepts-managing-load-balanced-connections.html)
+
+## 3. ProxySQL method
+
+ProxySQL is a flexible and powerful MySQL proxy layer. It is a MySQL middleware that can be actually used in a production environment. It can realize read-write separation, support Query routing function, support dynamic designation of a certain SQL for cache, support dynamic loading configuration, failure Switching and some SQL filtering functions.
+
+Doris's FE process is responsible for receiving user connections and query requests. It itself is horizontally scalable and highly available, but it requires users to set up a proxy on multiple FEs to achieve automatic connection load balancing.
+
+### 3.1 Install ProxySQL (yum way)
+
+```shell
+ Configure yum source
+# vim /etc/yum.repos.d/proxysql.repo
+[proxysql_repo]
+name= ProxySQL YUM repository
+baseurl=http://repo.proxysql.com/ProxySQL/proxysql-1.4.x/centos/\$releasever
+gpgcheck=1
+gpgkey=http://repo.proxysql.com/ProxySQL/repo_pub_key
+ 
+Perform installation
+# yum clean all
+# yum makecache
+# yum -y install proxysql
+View version  
+# proxysql --version
+ProxySQL version 1.4.13-15-g69d4207, codename Truls
+Set up auto start
+# systemctl enable proxysql
+# systemctl start proxysql      
+# systemctl status proxysql
+After startup, it will listen to two ports, the default is 6032 and 6033. Port 6032 is the management port of ProxySQL, and 6033 is the port for ProxySQL to provide external services (that is, the forwarding port connected to the real database of the forwarding backend).
+# netstat -tunlp
+Active Internet connections (only servers)
+Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name  
+tcp        0      0 0.0.0.0:6032            0.0.0.0:*               LISTEN      23940/proxysql    
+tcp        0      0 0.0.0.0:6033            0.0.0.0:*               LISTEN
+```
+
+### 3.2 **ProxySQL Config**
+
+ProxySQL has a configuration file `/etc/proxysql.cnf` and a configuration database file `/var/lib/proxysql/proxysql.db`. **Special attention is needed here**: If there is a `"proxysql.db"` file (under the `/var/lib/proxysql` directory), the ProxySQL service will only be read when it is started for the first time The `proxysql.cnf file` and parse it; after startup, the `proxysql.cnf` file will not be read! If you want the configuration in the proxysql.cnf file to take effect after restart [...]
+
+#### 3.2.1 View and modify configuration files
+
+Here are mainly a few parameters, which have been commented out below, and you can modify them according to your needs
+
+```sql
+# egrep -v "^#|^$" /etc/proxysql.cnf
+datadir="/var/lib/proxysql"         #data dir
+admin_variables=
+{
+        admin_credentials="admin:admin"  #User name and password for connecting to the management terminal
+        mysql_ifaces="0.0.0.0:6032"    #Management port, used to connect to proxysql management database
+}
+mysql_variables=
+{
+        threads=4      #Specify the number of threads opened for the forwarding port
+        max_connections=2048
+        default_query_delay=0
+        default_query_timeout=36000000
+        have_compress=true
+        poll_timeout=2000
+        interfaces="0.0.0.0:6033"    #Specify the forwarding port, used to connect to the back-end mysql database, which is equivalent to acting as a proxy
+        default_schema="information_schema"
+        stacksize=1048576
+        server_version="5.5.30"        #Specify the version of the backend mysql
+        connect_timeout_server=3000
+        monitor_username="monitor"
+        monitor_password="monitor"
+        monitor_history=600000
+        monitor_connect_interval=60000
+        monitor_ping_interval=10000
+        monitor_read_only_interval=1500
+        monitor_read_only_timeout=500
+        ping_interval_server_msec=120000
+        ping_timeout_server=500
+        commands_stats=true
+        sessions_sort=true
+        connect_retries_on_failure=10
+}
+mysql_servers =
+(
+)
+mysql_users:
+(
+)
+mysql_query_rules:
+(
+)
+scheduler=
+(
+)
+mysql_replication_hostgroups=
+(
+)
+```
+
+#### 3.2.2 Connect to the ProxySQL management port test
+
+```sql
+
+# mysql -uadmin -padmin -P6032 -hdoris01
+View the global_variables table information of the main library (it is in this library after login by default)
+MySQL [(none)]> show databases;
++-----+---------------+-------------------------------------+
+| seq | name          | file                                |
++-----+---------------+-------------------------------------+
+| 0   | main          |                                     |
+| 2   | disk          | /var/lib/proxysql/proxysql.db       |
+| 3   | stats         |                                     |
+| 4   | monitor       |                                     |
+| 5   | stats_history | /var/lib/proxysql/proxysql_stats.db |
++-----+---------------+-------------------------------------+
+5 rows in set (0.000 sec)
+MySQL [(none)]> use main;
+Reading table information for completion of table and column names
+You can turn off this feature to get a quicker startup with -A
+ 
+Database changed
+MySQL [main]> show tables;
++--------------------------------------------+
+| tables                                     |
++--------------------------------------------+
+| global_variables                           |
+| mysql_collations                           |
+| mysql_group_replication_hostgroups         |
+| mysql_query_rules                          |
+| mysql_query_rules_fast_routing             |
+| mysql_replication_hostgroups               |
+| mysql_servers                              |
+| mysql_users                                |
+| proxysql_servers                           |
+| runtime_checksums_values                   |
+| runtime_global_variables                   |
+| runtime_mysql_group_replication_hostgroups |
+| runtime_mysql_query_rules                  |
+| runtime_mysql_query_rules_fast_routing     |
+| runtime_mysql_replication_hostgroups       |
+| runtime_mysql_servers                      |
+| runtime_mysql_users                        |
+| runtime_proxysql_servers                   |
+| runtime_scheduler                          |
+| scheduler                                  |
++--------------------------------------------+
+20 rows in set (0.000 sec)
+
+```
+
+#### 3.2.3 ProxySQL configuration backend Doris FE
+
+
+Use the insert statement to add the host to the mysql_servers table, where: hostgroup_id is 10 for the write group, and 20 for the read group. We don't need to read and write the license here, and it doesn't matter which one can be set randomly.
+
+```sql
+[root@mysql-proxy ~]# mysql -uadmin -padmin -P6032 -h127.0.0.1
+............
+MySQL [(none)]> insert into mysql_servers(hostgroup_id,hostname,port) values(10,'192.168.9.211',9030);
+Query OK, 1 row affected (0.000 sec)
+  
+MySQL [(none)]> insert into mysql_servers(hostgroup_id,hostname,port) values(10,'192.168.9.212',9030);
+Query OK, 1 row affected (0.000 sec)
+  
+MySQL [(none)]> insert into mysql_servers(hostgroup_id,hostname,port) values(10,'192.168.9.213',9030);
+Query OK, 1 row affected (0.000 sec)
+ 
+If an error occurs during the insertion process:
+ERROR 1045 (#2800): UNIQUE constraint failed: mysql_servers.hostgroup_id, mysql_servers.hostname, mysql_servers.port
+ 
+It means that other configurations may have been defined before, you can clear this table or delete the configuration of the corresponding host
+MySQL [(none)]> select * from mysql_servers;
+MySQL [(none)]> delete from mysql_servers;
+Query OK, 6 rows affected (0.000 sec)
+
+Check whether these 3 nodes are inserted successfully and their status.
+MySQL [(none)]> select * from mysql_servers\G;
+*************************** 1. row ***************************
+       hostgroup_id: 10
+           hostname: 192.168.9.211
+               port: 9030
+             status: ONLINE
+             weight: 1
+        compression: 0
+    max_connections: 1000
+max_replication_lag: 0
+            use_ssl: 0
+     max_latency_ms: 0
+            comment:
+*************************** 2. row ***************************
+       hostgroup_id: 10
+           hostname: 192.168.9.212
+               port: 9030
+             status: ONLINE
+             weight: 1
+        compression: 0
+    max_connections: 1000
+max_replication_lag: 0
+            use_ssl: 0
+     max_latency_ms: 0
+            comment:
+*************************** 3. row ***************************
+       hostgroup_id: 10
+           hostname: 192.168.9.213
+               port: 9030
+             status: ONLINE
+             weight: 1
+        compression: 0
+    max_connections: 1000
+max_replication_lag: 0
+            use_ssl: 0
+     max_latency_ms: 0
+            comment:
+6 rows in set (0.000 sec)
+  
+ERROR: No query specified
+  
+After the above modification, load it to RUNTIME and save it to disk. The following two steps are very important, otherwise your configuration information will be gone after you exit and must be saved
+MySQL [(none)]> load mysql servers to runtime;
+Query OK, 0 rows affected (0.006 sec)
+  
+MySQL [(none)]> save mysql servers to disk;
+Query OK, 0 rows affected (0.348 sec)
+```
+
+#### 3.2.4 Monitor Doris FE node configuration
+
+After adding doris fe nodes, you also need to monitor these back-end nodes. For multiple FE high-availability load balancing environments on the backend, this is necessary because ProxySQL needs to be automatically adjusted by the read_only value of each node
+
+Whether they belong to the read group or the write group.
+
+First create a user name for monitoring on the back-end master main data node
+
+```sql
+Execute on the node of the doris fe master master database:
+# mysql -P9030 -uroot -p 
+mysql> create user monitor@'192.168.9.%' identified by 'P@ssword1!';
+Query OK, 0 rows affected (0.03 sec)
+mysql> grant ADMIN_PRIV on *.* to monitor@'192.168.9.%';
+Query OK, 0 rows affected (0.02 sec)
+ 
+Then go back to the mysql-proxy proxy layer node to configure monitoring
+# mysql -uadmin -padmin -P6032 -h127.0.0.1
+MySQL [(none)]> set mysql-monitor_username='monitor';
+Query OK, 1 row affected (0.000 sec)
+ 
+MySQL [(none)]> set mysql-monitor_password='P@ssword1!';
+Query OK, 1 row affected (0.000 sec)
+ 
+After modification, load to RUNTIME and save to disk
+MySQL [(none)]> load mysql variables to runtime;
+Query OK, 0 rows affected (0.001 sec)
+ 
+MySQL [(none)]> save mysql variables to disk;
+Query OK, 94 rows affected (0.079 sec)
+ 
+Verify the monitoring results: The indicators of the ProxySQL monitoring module are stored in the log table of the monitor library.
+The following is the monitoring of whether the connection is normal (monitoring of connect indicators):
+Note: There may be many connect_errors, this is because there is an error when the monitoring information is not configured. After the configuration, if the result of connect_error is NULL, it means normal。
+MySQL [(none)]> select * from mysql_server_connect_log;
++---------------+------+------------------+-------------------------+---------------+
+| hostname      | port | time_start_us    | connect_success_time_us | connect_error |
++---------------+------+------------------+-------------------------+---------------+
+| 192.168.9.211 | 9030 | 1548665195883957 | 762                     | NULL          |
+| 192.168.9.212 | 9030 | 1548665195894099 | 399                     | NULL          |
+| 192.168.9.213 | 9030 | 1548665195904266 | 483                     | NULL          |
+| 192.168.9.211 | 9030 | 1548665255883715 | 824                     | NULL          |
+| 192.168.9.212 | 9030 | 1548665255893942 | 656                     | NULL          |
+| 192.168.9.211 | 9030 | 1548665495884125 | 615                     | NULL          |
+| 192.168.9.212 | 9030  | 1548665495894254 | 441                     | NULL          |
+| 192.168.9.213 | 9030 | 1548665495904479 | 638                     | NULL          |
+| 192.168.9.211 | 9030 | 1548665512917846 | 487                     | NULL          |
+| 192.168.9.212 | 9030 | 1548665512928071 | 994                     | NULL          |
+| 192.168.9.213 | 9030 | 1548665512938268 | 613                     | NULL          |
++---------------+------+------------------+-------------------------+---------------+
+20 rows in set (0.000 sec)
+The following is the monitoring of heartbeat information (monitoring of ping indicators)
+MySQL [(none)]> select * from mysql_server_ping_log;
++---------------+------+------------------+----------------------+------------+
+| hostname      | port | time_start_us    | ping_success_time_us | ping_error |
++---------------+------+------------------+----------------------+------------+
+| 192.168.9.211 | 9030 | 1548665195883407 | 98                   | NULL       |
+| 192.168.9.212 | 9030 | 1548665195885128 | 119                  | NULL       |
+...........
+| 192.168.9.213 | 9030 | 1548665415889362 | 106                  | NULL       |
+| 192.168.9.213 | 9030 | 1548665562898295 | 97                   | NULL       |
++---------------+------+------------------+----------------------+------------+
+110 rows in set (0.001 sec)
+ 
+The read_only log is also empty at this time (normally, when the new environment is configured, this read-only log is empty)
+MySQL [(none)]> select * from mysql_server_read_only_log;
+Empty set (0.000 sec)
+
+All 3 nodes are in the group with hostgroup_id=10.
+Now, load the modification of the mysql_replication_hostgroups table just now to RUNTIME to take effect。
+MySQL [(none)]> load mysql servers to runtime;
+Query OK, 0 rows affected (0.003 sec)
+ 
+MySQL [(none)]> save mysql servers to disk;
+Query OK, 0 rows affected (0.361 sec)
+
+
+MySQL [(none)]> select hostgroup_id,hostname,port,status,weight from mysql_servers;
++--------------+---------------+------+--------+--------+
+| hostgroup_id | hostname      | port | status | weight |
++--------------+---------------+------+--------+--------+
+| 10           | 192.168.9.211 | 9030 | ONLINE | 1      |
+| 20           | 192.168.9.212 | 9030 | ONLINE | 1      |
+| 20           | 192.168.9.213 | 9030 | ONLINE | 1      |
++--------------+---------------+------+--------+--------+
+3 rows in set (0.000 sec)
+```
+
+#### 3.2.5 Configure Doris users
+
+All the above configurations are about the back-end Doris FE node. Now you can configure the SQL statements, including: the user who sends the SQL statement, the routing rules of the SQL statement, the cache of the SQL query, the rewriting of the SQL statement, and so on.
+
+This section is the user configuration used by the SQL request, such as the root user. This requires that we need to add relevant users to the back-end Doris FE node first. Here are examples of two user names root and doris.
+
+```sql
+First, execute on the Doris FE master master database node:
+# mysql -P9030 -uroot -p
+.........
+
+mysql> create user doris@'%' identified by 'P@ssword1!';
+Query OK, 0 rows affected, 1 warning (0.04 sec)
+ 
+mysql> grant ADMIN_PRIV on *.* to doris@'%';
+Query OK, 0 rows affected, 1 warning (0.03 sec)
+ 
+ 
+Then go back to the mysql-proxy proxy layer node, configure the mysql_users table, and add the two users just now to the table.
+admin> insert into mysql_users(username,password,default_hostgroup) values('root','',10);
+Query OK, 1 row affected (0.001 sec)
+  
+admin> insert into mysql_users(username,password,default_hostgroup) values('doris','P@ssword1!',10);
+Query OK, 1 row affected (0.000 sec)
+  
+admin> load mysql users to runtime;
+Query OK, 0 rows affected (0.001 sec)
+  
+admin> save mysql users to disk;
+Query OK, 0 rows affected (0.108 sec)
+  
+The mysql_users table has many fields. The three main fields are username, password, and default_hostgroup:
+      -username: The username used by the front-end to connect to ProxySQL and ProxySQL to route SQL statements to MySQL.
+      -password: the password corresponding to the user name. It can be a plain text password or a hash password. If you want to use the hash password, you can execute it on a MySQL node first  select password(PASSWORD), and then copy the encryption result to this field.
+      -default_hostgroup: The default routing destination of the username. For example, when the field value of the specified root user is 10, the SQL statement sent by the root user is used by default
+    In this case, it will be routed to a node in the hostgroup_id=10 group.
+ 
+admin> select * from mysql_users\G
+*************************** 1. row ***************************
+              username: root
+              password: 
+                active: 1
+               use_ssl: 0
+     default_hostgroup: 10
+        default_schema: NULL
+         schema_locked: 0
+transaction_persistent: 1
+          fast_forward: 0
+               backend: 1
+              frontend: 1
+       max_connections: 10000
+*************************** 2. row ***************************
+              username: doris
+              password: P@ssword1!
+                active: 1
+               use_ssl: 0
+     default_hostgroup: 10
+        default_schema: NULL
+         schema_locked: 0
+transaction_persistent: 1
+          fast_forward: 0
+               backend: 1
+              frontend: 1
+       max_connections: 10000
+2 rows in set (0.000 sec)
+  
+Although the mysql_users table is not described in detail here, only users with active=1 are valid users, and the default active is 1.
+
+MySQL [(none)]> load mysql users to runtime;
+Query OK, 0 rows affected (0.001 sec)
+ 
+MySQL [(none)]> save mysql users to disk;
+Query OK, 0 rows affected (0.123 sec)
+
+In this way, you can use the doris username and password to connect to ProxySQL through the sql client
+```
+
+#### 3.2.6 Connect to Doris through ProxySQL for testing
+
+Next, use the root user and doris user to test whether they can be routed to the default hostgroup_id=10 (it is a write group) to read data. The following is connected through the forwarding port 6033, the connection is forwarded to the real back-end database!
+
+```sql
+#mysql -uroot -p -P6033 -hdoris01 -e "show databases;"
+Enter password: 
+ERROR 9001 (HY000) at line 1: Max connect timeout reached while reaching hostgroup 10 after 10000ms
+At this time, an error was found, and it was not forwarded to the real doris fe on the backend.
+Through the log, you can see that there is set autocommit=0 to open the transaction
+Check the configuration found:
+
+mysql-forward_autocommit=false
+mysql-autocommit_false_is_transaction=false
+
+We don’t need to read and write separation here, just turn these two parameters into true directly through the following statement.
+mysql> UPDATE global_variables SET variable_value='true' WHERE variable_name='mysql-forward_autocommit';
+Query OK, 1 row affected (0.00 sec)
+
+mysql> UPDATE global_variables SET variable_value='true' WHERE variable_name='mysql-autocommit_false_is_transaction';
+Query OK, 1 row affected (0.01 sec)
+
+mysql>  LOAD MYSQL VARIABLES TO RUNTIME;
+Query OK, 0 rows affected (0.00 sec)
+
+mysql> SAVE MYSQL VARIABLES TO DISK;
+Query OK, 98 rows affected (0.12 sec)
+
+Then we try again and it shows success
+[root@doris01 ~]# mysql -udoris -pP@ssword1! -P6033 -h192.168.9.211  -e "show databases;"
+Warning: Using a password on the command line interface can be insecure.
++--------------------+
+| Database           |
++--------------------+
+| doris_audit_db     |
+| information_schema |
+| retail             |
++--------------------+
+```
+
+OK, that's the end, you can use Mysql client, JDBC, etc. to connect to ProxySQL to operate your doris.
diff --git a/blogs/en/flink-cdc-to-doris.md b/blogs/en/flink-cdc-to-doris.md
new file mode 100644
index 0000000..e9c3857
--- /dev/null
+++ b/blogs/en/flink-cdc-to-doris.md
@@ -0,0 +1,374 @@
+---
+{
+    "title": "Use Flink CDC to realize real-time MySQL data into Apache Doris",
+    "description": "This article uses examples to demonstrate how to use Flink CDC and Doris' Flink Connector to monitor data from the Mysql database and store it in the corresponding table of the Doris data warehouse in real time.",
+    "date": "2021-11-11",
+    "metaTitle": "Use Flink CDC to realize real-time MySQL data into Apache Doris",
+    "language": "en",
+    "author": "张家锋",
+    "layout": "Article",
+    "isArticle": true,
+    "sidebar": false
+}
+---
+
+<!-- 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+# Use Flink CDC to realize real-time MySQL data into Apache Doris
+
+This article uses examples to demonstrate how to use Flink CDC and Doris' Flink Connector to monitor data from the Mysql database and store it in the corresponding table of the Doris data warehouse in real time.
+
+## 1. What is CDC
+
+CDC is the abbreviation of Change Data Capture technology. It can record incremental changes of the source database (Source) and synchronize it to one or more data destinations (Sink). In the synchronization process, you can also perform certain processing on the data, such as grouping (GROUP BY), multi-table association (JOIN), and so on.
+
+For example, for an e-commerce platform, a user’s order will be written to a source database in real time; Department A needs to simply aggregate the real-time data every minute and then save it to Redis for query, and Department B needs to temporarily store the data of the day in Elasticsearch will use a copy for report display, and Department C also needs a copy of data to ClickHouse for real-time data warehouse. As time goes by, the subsequent D and E departments will also have data a [...]
+
+### 1.1 Application Scenarios of CDC
+
+-**Data synchronization: **Used for backup and disaster recovery;
+-**Data distribution:** One data source is distributed to multiple downstream systems;
+-**Data Collection:** ETL data integration for data warehouse/data lake is a very important data source.
+
+There are many technical solutions for CDC, and the current mainstream implementation mechanisms in the industry can be divided into two types:
+
+-CDC based on query:
+  -Offline scheduling query jobs, batch processing. Synchronize a table to other systems, and obtain the latest data in the table through query each time;
+  -Data consistency cannot be guaranteed, and the data may have been changed many times during the inspection process;
+  -Real-time performance is not guaranteed, and there is a natural delay based on offline scheduling.
+-Log-based CDC:
+  -Real-time consumption log, stream processing, for example, MySQL's binlog log completely records the changes in the database, and the binlog file can be used as the data source of the stream;
+  -Ensure data consistency, because the binlog file contains details of all historical changes;
+  -Guarantee real-time performance, because log files like binlog can be streamed for consumption and provide real-time data.
+
+## 2.Flink CDC
+
+Flink added the feature of CDC in version 1.11, referred to as change data capture. The name is a bit messy, let's look at the content of CDC from the previous data structure.
+
+The above is the log processing flow of the previous `mysq binlog`, for example, canal listens to binlog and writes the log to Kafka. And Apache Flink consumes Kakfa data in real time to achieve mysql data synchronization or other content. As a whole, it can be divided into the following stages.
+
+1. mysql open binlog
+2. Canal synchronize binlog data write to kafka
+3. Flink reads the binlog data in kakfa for related business processing.
+
+The overall processing link is longer and requires more components. Apache Flink CDC can obtain binlog directly from the database for downstream business calculation analysis
+
+### 2.1 Flink Connector Mysql CDC 2.0 Features
+
+Provide MySQL CDC 2.0, core features include
+
+-Concurrent reading, the reading performance of the full amount of data can be horizontally expanded;
+-No locks throughout the process, no risk of locks on online business;
+-Resumable transfers at breakpoints, support full-stage checkpoints.
+
+There are test documents on the Internet showing that the customer table in the TPC-DS data set was used for testing. The Flink version is 1.13.1, the data volume of the customer table is 65 million, the Source concurrency is 8, and the full read stage:
+
+-MySQL CDC 2.0 takes **13** minutes;
+-MySQL CDC 1.4 takes **89** minutes;
+-Reading performance improved by **6.8** times.
+
+## 3. What is Doris Flink Connector
+
+Flink Doris Connector is an extension of the doris community in order to facilitate users to use Flink to read and write Doris data tables.
+
+Currently doris supports Flink 1.11.x, 1.12.x, 1.13.x, Scala version: 2.12.x
+
+Currently, the Flink doris connector currently controls the warehousing through two parameters:
+
+1. sink.batch.size: How many pieces are written once, the default is 100 pieces
+2. sink.batch.interval: how many seconds to write each time, the default is 1 second
+
+These two parameters work at the same time, and that condition will trigger the write doris table operation when the condition comes first.
+
+**Notice:**
+
+**Note** here is to enable the http v2 version, specifically configure `enable_http_server_v2=true` in fe.conf, and because the be list is obtained through fe http rest api, the users who need to be configured have admin permissions.
+
+## 4. Usage example
+
+### 4.1 Flink Doris Connector compilation
+
+First, we need to compile Doris's Flink connector, which can also be downloaded from the following address:
+
+https://github.com/hf200012/hf200012.github.io/raw/main/lib/doris-flink-1.0-SNAPSHOT.jar
+
+>Note:
+>
+>Here because Doris' Flink Connector is developed based on Scala 2.12.x version, so when you use Flink, please choose the version corresponding to Scala 2.12.
+>
+>If you downloaded the corresponding jar using the above address, please ignore the compiled content part below
+
+Compile under the doris docker compilation environment `apache/incubator-doris:build-env-1.2`, because the JDK version below 1.3 is 11, there will be compilation problems.
+
+Execute in the extension/flink-doris-connector/ source directory:
+
+```
+sh build.sh
+```
+
+After the compilation is successful, the file `doris-flink-1.0.0-SNAPSHOT.jar` will be generated in the `output/` directory. Copy this file to the `ClassPath` of `Flink` to use `Flink-Doris-Connector`. For example, for `Flink` running in `Local` mode, put this file in the `jars/` folder. For `Flink` running in `Yarn` cluster mode, put this file into the pre-deployment package.
+
+**For Flink 1.13.x version adaptation issues**
+
+```xml
+   <properties>
+        <scala.version>2.12</scala.version>
+        <flink.version>1.11.2</flink.version>
+        <libthrift.version>0.9.3</libthrift.version>
+        <arrow.version>0.15.1</arrow.version>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <doris.home>${basedir}/../../</doris.home>
+        <doris.thirdparty>${basedir}/../../thirdparty</doris.thirdparty>
+    </properties>
+```
+
+Just change the `flink.version` here to be the same as your Flink cluster version, and edit again
+
+### 4.2 Configure Flink
+
+Here we use Flink Sql Client to operate.
+
+Here we demonstrate the software version used:
+
+1. Mysql 8.x
+2. Apache Flink: 1.13.3
+3. Apache Doris: 0.14.13.1
+
+#### 4.2.1 Install Flink
+
+First download and install Flink:
+
+https://dlcdn.apache.org/flink/flink-1.13.3/flink-1.13.3-bin-scala_2.12.tgz
+
+
+Download Flink CDC related Jar packages:
+
+https://repo1.maven.org/maven2/com/ververica/flink-connector-mysql-cdc/2.0.2/flink-connector-mysql-cdc-2.0.2.jar
+
+Pay attention to the version correspondence between Flink CDC and Flink here
+
+![](/images/blogs/flink-cdc-to-doris/image-20211025170642628.png)
+
+-Copy the Flink Doris Connector jar package downloaded or compiled above to the lib directory under the Flink root directory
+-The Flink cdc jar package is also copied to the lib directory under the Flink root directory
+
+The demonstration here uses the local stand-alone mode,
+
+```shell
+# wget https://dlcdn.apache.org/flink/flink-1.13.3/flink-1.13.3-bin-scala_2.12.tgz
+# tar zxvf flink-1.13.3-bin-scala_2.12.tgz
+# cd flink-1.13.3
+# wget https://repo1.maven.org/maven2/com/ververica/flink-connector-mysql-cdc/2.0.2/flink-connector-mysql-cdc-2.0.2.jar -P ./lib/
+# wget https://github.com/hf200012/hf200012.github.io/raw/main/lib/doris-flink-1.0-SNAPSHOT.jar -P ./lib/
+```
+
+![](/images/blogs/flink-cdc-to-doris/image-20211026095513892.png)
+
+#### 4.2.2 Start Flink
+
+Here we are using the local stand-alone mode
+
+```
+# bin/start-cluster.sh
+Starting cluster.
+Starting standalonesession daemon on host doris01.
+Starting taskexecutor daemon on host doris01.
+```
+
+We start the Flink cluster through web access (the default port is 8081), and we can see that the cluster starts normally
+
+![](/images/blogs/flink-cdc-to-doris/image-20211025162831632.png)
+
+### 4.3 Install Apache Doris
+
+For the specific method of installing and deploying Doris, refer to the following link:
+
+https://hf200012.github.io/2021/09/Apache-Doris-Environment installation and deployment
+
+### 4.3 Installation and Configuration Mysql
+
+1. Install Mysql
+
+   Quickly use Docker to install and configure Mysql, refer to the following link for details
+
+   https://segmentfault.com/a/1190000021523570
+
+2. Open Mysql binlog
+
+   Enter the Docker container to modify the /etc/my.cnf file, and add the following content under [mysqld],
+
+   ```
+   log_bin=mysql_bin
+   binlog-format=Row
+   server-id=1
+   ```
+
+   Then restart Mysql
+
+   ```
+   systemctl restart mysqld
+   ```
+
+3. Create Mysql database table
+
+```sql
+ CREATE TABLE `test_cdc` (
+  `id` int NOT NULL AUTO_INCREMENT,
+  `name` varchar(255) DEFAULT NULL,
+  PRIMARY KEY (`id`)
+ ) ENGINE=InnoDB
+```
+
+### 4.4 Create doris table
+
+```sql
+CREATE TABLE `doris_test` (
+  `id` int NULL COMMENT "",
+  `name` varchar(100) NULL COMMENT ""
+ ) ENGINE=OLAP
+ UNIQUE KEY(`id`)
+ COMMENT "OLAP"
+ DISTRIBUTED BY HASH(`id`) BUCKETS 1
+ PROPERTIES (
+ "replication_num" = "3",
+ "in_memory" = "false",
+ "storage_format" = "V2"
+ );
+```
+
+### 4.5 Start Flink Sql Client
+
+```shell
+./bin/sql-client.sh embedded
+> set execution.result-mode=tableau;
+```
+
+![](/images/blogs/flink-cdc-to-doris/image-20211025165547903.png)
+
+#### 4.5.1 Create Flink CDC Mysql mapping table
+
+```sql
+CREATE TABLE test_flink_cdc (
+  id INT,
+  name STRING,
+  primary key(id) NOT ENFORCED
+) WITH (
+  'connector' ='mysql-cdc',
+  'hostname' ='localhost',
+  'port' = '3306',
+  'username' ='root',
+  'password' ='password',
+  'database-name' ='demo',
+  'table-name' ='test_cdc'
+);
+```
+
+The Mysql mapping table created by the query is displayed normally
+
+```
+select * from test_flink_cdc;
+```
+
+![](/images/blogs/flink-cdc-to-doris/image-20211026100505972.png)
+
+#### 4.5.2 Create Flink Doris Table Mapping Table
+
+Use Doris Flink Connector to create Doris mapping table
+
+```sql
+CREATE TABLE doris_test_sink (
+   id INT,
+   name STRING
+)
+WITH (
+  'connector' ='doris',
+  'fenodes' ='localhost:8030',
+  'table.identifier' ='db_audit.doris_test',
+  'sink.batch.size' = '2',
+  'sink.batch.interval'='1',
+  'username' ='root',
+  'password' =''
+)
+```
+
+Execute the above statement on the command line, you can see that the table is created successfully, and then execute the query statement to verify whether it is normal
+
+```sql
+select * from doris_test_sink;
+```
+
+![](/images/blogs/flink-cdc-to-doris/image-20211026100804091.png)
+
+Perform an insert operation, insert the data in Mysql into Doris through Flink CDC combined with Doris Flink Connector
+
+```sql
+INSERT INTO doris_test_sink select id,name from test_flink_cdc
+```
+
+![](/images/blogs/flink-cdc-to-doris/image-20211026101004547.png)
+
+After the submission is successful, we can see the related job task information on the Flink web interface
+
+![](/images/blogs/flink-cdc-to-doris/image-20211026100943474.png)
+
+#### 4.5.3 Insert data into Mysql table
+
+```sql
+INSERT INTO test_cdc VALUES (123,'this is a update');
+INSERT INTO test_cdc VALUES (1212,'Test flink CDC');
+INSERT INTO test_cdc VALUES (1234,'This is a test');
+INSERT INTO test_cdc VALUES (11233,'zhangfeng_1');
+INSERT INTO test_cdc VALUES (21233,'zhangfeng_2');
+INSERT INTO test_cdc VALUES (31233,'zhangfeng_3');
+INSERT INTO test_cdc VALUES (41233,'zhangfeng_4');
+INSERT INTO test_cdc VALUES (51233,'zhangfeng_5');
+INSERT INTO test_cdc VALUES (61233,'zhangfeng_6');
+INSERT INTO test_cdc VALUES (71233,'zhangfeng_7');
+INSERT INTO test_cdc VALUES (81233,'zhangfeng_8');
+INSERT INTO test_cdc VALUES (91233,'zhangfeng_9');
+```
+
+#### 4.5.4 Observe the data in the Doris table
+
+First stop the Insert into task, because I am in the local stand-alone mode, there is only one task task, so I have to stop it, and then execute the query statement on the command line to see the data
+
+![](/images/blogs/flink-cdc-to-doris/image-20211026101203629.png)
+
+#### 4.5.5 Modify Mysql data
+
+Restart the Insert into task
+
+![](/images/blogs/flink-cdc-to-doris/image-20211025182341086.png)
+
+Modify the data in the Mysql table
+
+```sql
+update test_cdc set name='This is an operation to verify the modification' where id =123
+```
+
+Look at the data in the Doris table again, you will find that it has been modified
+
+Note that if you want to modify the data in the Mysql table, the data in Doris is also modified. If the model of the Doris data table is a unique key model, other data models (Aggregate Key and Duplicate Key) cannot update data.
+
+![](/images/blogs/flink-cdc-to-doris/image-20211025182435827.png)
+
+#### 4.5.6 Delete data operation
+
+Currently Doris Flink Connector does not support delete operation, it is planned to add this operation later
+
diff --git a/blogs/images/blogs/datax-doris-writer/image-20210903132250723.png b/blogs/images/blogs/datax-doris-writer/image-20210903132250723.png
new file mode 100644
index 0000000..94efe97
Binary files /dev/null and b/blogs/images/blogs/datax-doris-writer/image-20210903132250723.png differ
diff --git a/blogs/images/blogs/datax-doris-writer/image-20210903132539511.png b/blogs/images/blogs/datax-doris-writer/image-20210903132539511.png
new file mode 100644
index 0000000..80bcc00
Binary files /dev/null and b/blogs/images/blogs/datax-doris-writer/image-20210903132539511.png differ
diff --git a/blogs/images/blogs/datax-doris-writer/image-20210903134043421.png b/blogs/images/blogs/datax-doris-writer/image-20210903134043421.png
new file mode 100644
index 0000000..204c093
Binary files /dev/null and b/blogs/images/blogs/datax-doris-writer/image-20210903134043421.png differ
diff --git a/blogs/images/blogs/doris-binlog-load/image-20211110145044815.png b/blogs/images/blogs/doris-binlog-load/image-20211110145044815.png
new file mode 100644
index 0000000..c701de1
Binary files /dev/null and b/blogs/images/blogs/doris-binlog-load/image-20211110145044815.png differ
diff --git a/blogs/images/blogs/doris-binlog-load/image-20211110160106602.png b/blogs/images/blogs/doris-binlog-load/image-20211110160106602.png
new file mode 100644
index 0000000..0a3b9a7
Binary files /dev/null and b/blogs/images/blogs/doris-binlog-load/image-20211110160106602.png differ
diff --git a/blogs/images/blogs/doris-binlog-load/image-20211110160331479.png b/blogs/images/blogs/doris-binlog-load/image-20211110160331479.png
new file mode 100644
index 0000000..6adbe59
Binary files /dev/null and b/blogs/images/blogs/doris-binlog-load/image-20211110160331479.png differ
diff --git a/blogs/images/blogs/doris-binlog-load/image-20211110160710709.png b/blogs/images/blogs/doris-binlog-load/image-20211110160710709.png
new file mode 100644
index 0000000..c17c211
Binary files /dev/null and b/blogs/images/blogs/doris-binlog-load/image-20211110160710709.png differ
diff --git a/blogs/images/blogs/flink-cdc-to-doris/image-20211025162831632.png b/blogs/images/blogs/flink-cdc-to-doris/image-20211025162831632.png
new file mode 100644
index 0000000..3760970d
Binary files /dev/null and b/blogs/images/blogs/flink-cdc-to-doris/image-20211025162831632.png differ
diff --git a/blogs/images/blogs/flink-cdc-to-doris/image-20211025165547903.png b/blogs/images/blogs/flink-cdc-to-doris/image-20211025165547903.png
new file mode 100644
index 0000000..0e61dda
Binary files /dev/null and b/blogs/images/blogs/flink-cdc-to-doris/image-20211025165547903.png differ
diff --git a/blogs/images/blogs/flink-cdc-to-doris/image-20211025170642628.png b/blogs/images/blogs/flink-cdc-to-doris/image-20211025170642628.png
new file mode 100644
index 0000000..5381d95
Binary files /dev/null and b/blogs/images/blogs/flink-cdc-to-doris/image-20211025170642628.png differ
diff --git a/blogs/images/blogs/flink-cdc-to-doris/image-20211025182341086.png b/blogs/images/blogs/flink-cdc-to-doris/image-20211025182341086.png
new file mode 100644
index 0000000..800c63a
Binary files /dev/null and b/blogs/images/blogs/flink-cdc-to-doris/image-20211025182341086.png differ
diff --git a/blogs/images/blogs/flink-cdc-to-doris/image-20211025182435827.png b/blogs/images/blogs/flink-cdc-to-doris/image-20211025182435827.png
new file mode 100644
index 0000000..fa97de2
Binary files /dev/null and b/blogs/images/blogs/flink-cdc-to-doris/image-20211025182435827.png differ
diff --git a/blogs/images/blogs/flink-cdc-to-doris/image-20211026095513892.png b/blogs/images/blogs/flink-cdc-to-doris/image-20211026095513892.png
new file mode 100644
index 0000000..8f139bd
Binary files /dev/null and b/blogs/images/blogs/flink-cdc-to-doris/image-20211026095513892.png differ
diff --git a/blogs/images/blogs/flink-cdc-to-doris/image-20211026100505972.png b/blogs/images/blogs/flink-cdc-to-doris/image-20211026100505972.png
new file mode 100644
index 0000000..e92f187
Binary files /dev/null and b/blogs/images/blogs/flink-cdc-to-doris/image-20211026100505972.png differ
diff --git a/blogs/images/blogs/flink-cdc-to-doris/image-20211026100804091.png b/blogs/images/blogs/flink-cdc-to-doris/image-20211026100804091.png
new file mode 100644
index 0000000..7c1dd62
Binary files /dev/null and b/blogs/images/blogs/flink-cdc-to-doris/image-20211026100804091.png differ
diff --git a/blogs/images/blogs/flink-cdc-to-doris/image-20211026100943474.png b/blogs/images/blogs/flink-cdc-to-doris/image-20211026100943474.png
new file mode 100644
index 0000000..bfc3d7b
Binary files /dev/null and b/blogs/images/blogs/flink-cdc-to-doris/image-20211026100943474.png differ
diff --git a/blogs/images/blogs/flink-cdc-to-doris/image-20211026101004547.png b/blogs/images/blogs/flink-cdc-to-doris/image-20211026101004547.png
new file mode 100644
index 0000000..e458645
Binary files /dev/null and b/blogs/images/blogs/flink-cdc-to-doris/image-20211026101004547.png differ
diff --git a/blogs/images/blogs/flink-cdc-to-doris/image-20211026101203629.png b/blogs/images/blogs/flink-cdc-to-doris/image-20211026101203629.png
new file mode 100644
index 0000000..fcb5ea4
Binary files /dev/null and b/blogs/images/blogs/flink-cdc-to-doris/image-20211026101203629.png differ
diff --git a/blogs/zh-CN/datax-doris-writer.md b/blogs/zh-CN/datax-doris-writer.md
new file mode 100644
index 0000000..4877e9d
--- /dev/null
+++ b/blogs/zh-CN/datax-doris-writer.md
@@ -0,0 +1,261 @@
+---
+{
+    "title": "Apache Doris Datax DorisWriter扩展使用方法",
+    "description": "为了更好的扩展Apache doris生态,为doris用户提供更方便的数据导入,社区开发扩展支持了Datax DorisWriter,使大家更方便Datax进行数据接入.",
+    "date": "2021-11-11",
+    "metaTitle": "Apache Doris Datax DorisWriter扩展使用方法",
+    "isArticle": true,
+    "language": "zh-CN",
+    "author": "张家锋",
+    "layout": "Article",
+    "sidebar": false
+}
+---
+
+<!-- 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+DataX 是阿里云 DataWorks数据集成 的开源版本,在阿里巴巴集团内被广泛使用的离线数据同步工具/平台。DataX 实现了包括 MySQL、Oracle、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、Hologres、DRDS 等各种异构数据源之间高效的数据同步功能
+
+为了更好的扩展Apache doris生态,为doris用户提供更方便的数据导入,社区开发扩展支持了Datax DorisWriter,使大家更方便Datax进行数据接入
+
+## 1.场景
+
+这里演示介绍的使用 Doris 的 Datax 扩展 DorisWriter实现从Mysql数据定时抽取数据导入到Doris数仓表里
+
+## 2.编译 DorisWriter
+
+这个的扩展的编译可以不在 doris 的 docker 编译环境下进行,本文是在 windows 下的 WLS 下进行编译的
+
+首先从github上拉取源码
+
+```
+git clone https://github.com/apache/incubator-doris.git
+```
+
+进入到`incubator-doris/extension/DataX/` 执行编译
+
+首先执行:
+
+```shell
+sh init_env.sh
+```
+
+这个脚本主要用于构建 DataX 开发环境,他主要进行了以下操作:
+
+1. 将 DataX 代码库 clone 到本地。
+
+2. 将 `doriswriter/` 目录软链到 `DataX/doriswriter` 目录。
+
+3. 在 `DataX/pom.xml` 文件中添加 `<module>doriswriter</module>` 模块。
+
+4. 将 `DataX/core/pom.xml` 文件中的 httpclient 版本从 4.5 改为 4.5.13.
+
+   > httpclient v4.5 在处理 307 转发时有bug。
+
+这个脚本执行后,开发者就可以进入 `DataX/` 目录开始开发或编译了。因为做了软链,所以任何对 `DataX/doriswriter` 目录中文件的修改,都会反映到 `doriswriter/` 目录中,方便开发者提交代码
+
+### 2.1 开始编译
+
+这里为了加快编译速度你可以去掉一些没有用到的插件,例如下面这些:
+
+这里直接在Datax目录下的pom.xml里注释掉就行
+
+```
+hbase11xreader
+hbase094xreader
+tsdbreader
+oceanbasev10reader
+odpswriter
+hdfswriter
+adswriter
+ocswriter
+oscarwriter
+oceanbasev10writer
+```
+
+然后进入到`incubator-doris/extension/DataX/` 目录下的 Datax 目录,执行编译
+
+这里我是执行的将 Datax 编译成 tar 包,和官方的编译命令不太一样。
+
+```
+mvn -U clean package assembly:assembly -Dmaven.test.skip=true
+```
+
+![](/images/blogs/datax-doris-writer/image-20210903132250723.png)
+
+![](/images/blogs/datax-doris-writer/image-20210903132539511.png)
+
+编译完成以后,tar 包在 `Datax/target` 目录下,你可以将这tar包拷贝到你需要的地方,这里我是直接在 datax 执行测试,这里因为的 python 版本是 3.x版本,需要将 bin 目录下的三个文件换成 python 3 版本的,这个你可以去下面的地址下载:
+
+```
+https://github.com/WeiYe-Jing/datax-web/tree/master/doc/datax-web/datax-python3
+```
+
+将下载的三个文件替换 bin 目录下的文件以后,整个编译,安装就完成了
+
+## 3.数据接入
+
+这个时候我们就可以开始使用 Datax  的`doriswriter`扩展开始从Mysql(或者其他数据源)直接将数据抽取出来导入到 Doris 表中了。
+
+下面以 Mysql 数据库为例演示怎么使用 `Datax DorisWriter` 来完成 Mysql 数据库数据的抽取
+
+### 3.1 Mysql 数据库准备
+
+下面是数据库的建表脚本(mysql 8):
+
+```sql
+CREATE TABLE `order_analysis` (
+  `date` varchar(19) DEFAULT NULL,
+  `user_src` varchar(9) DEFAULT NULL,
+  `order_src` varchar(11) DEFAULT NULL,
+  `order_location` varchar(2) DEFAULT NULL,
+  `new_order` int DEFAULT NULL,
+  `payed_order` int DEFAULT NULL,
+  `pending_order` int DEFAULT NULL,
+  `cancel_order` int DEFAULT NULL,
+  `reject_order` int DEFAULT NULL,
+  `good_order` int DEFAULT NULL,
+  `report_order` int DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT
+```
+
+示例数据
+
+```sql
+INSERT INTO `sql12298540`.`order_analysis` (`date`, `user_src`, `order_src`, `order_location`, `new_order`, `payed_order`, `pending_order`, `cancel_order`, `reject_order`, `good_order`, `report_order`) VALUES ('2015-10-12 00:00:00', '广告二维码', 'Android APP', '上海', 15253, 13210, 684, 1247, 1000, 10824, 862);
+INSERT INTO `sql12298540`.`order_analysis` (`date`, `user_src`, `order_src`, `order_location`, `new_order`, `payed_order`, `pending_order`, `cancel_order`, `reject_order`, `good_order`, `report_order`) VALUES ('2015-10-14 00:00:00', '微信朋友圈H5页面', 'iOS APP', '广州', 17134, 11270, 549, 204, 224, 10234, 773);
+INSERT INTO `sql12298540`.`order_analysis` (`date`, `user_src`, `order_src`, `order_location`, `new_order`, `payed_order`, `pending_order`, `cancel_order`, `reject_order`, `good_order`, `report_order`) VALUES ('2015-10-17 00:00:00', '地推二维码扫描', 'iOS APP', '北京', 16061, 9418, 1220, 1247, 458, 13877, 749);
+INSERT INTO `sql12298540`.`order_analysis` (`date`, `user_src`, `order_src`, `order_location`, `new_order`, `payed_order`, `pending_order`, `cancel_order`, `reject_order`, `good_order`, `report_order`) VALUES ('2015-10-17 00:00:00', '微信朋友圈H5页面', '微信公众号', '武汉', 12749, 11127, 1773, 6, 5, 9874, 678);
+INSERT INTO `sql12298540`.`order_analysis` (`date`, `user_src`, `order_src`, `order_location`, `new_order`, `payed_order`, `pending_order`, `cancel_order`, `reject_order`, `good_order`, `report_order`) VALUES ('2015-10-18 00:00:00', '地推二维码扫描', 'iOS APP', '上海', 13086, 15882, 1727, 1764, 1429, 12501, 625);
+INSERT INTO `sql12298540`.`order_analysis` (`date`, `user_src`, `order_src`, `order_location`, `new_order`, `payed_order`, `pending_order`, `cancel_order`, `reject_order`, `good_order`, `report_order`) VALUES ('2015-10-18 00:00:00', '微信朋友圈H5页面', 'iOS APP', '武汉', 15129, 15598, 1204, 1295, 1831, 11500, 320);
+INSERT INTO `sql12298540`.`order_analysis` (`date`, `user_src`, `order_src`, `order_location`, `new_order`, `payed_order`, `pending_order`, `cancel_order`, `reject_order`, `good_order`, `report_order`) VALUES ('2015-10-19 00:00:00', '地推二维码扫描', 'Android APP', '杭州', 20687, 18526, 1398, 550, 213, 12911, 185);
+INSERT INTO `sql12298540`.`order_analysis` (`date`, `user_src`, `order_src`, `order_location`, `new_order`, `payed_order`, `pending_order`, `cancel_order`, `reject_order`, `good_order`, `report_order`) VALUES ('2015-10-19 00:00:00', '应用商店', '微信公众号', '武汉', 12388, 11422, 702, 106, 158, 5820, 474);
+INSERT INTO `sql12298540`.`order_analysis` (`date`, `user_src`, `order_src`, `order_location`, `new_order`, `payed_order`, `pending_order`, `cancel_order`, `reject_order`, `good_order`, `report_order`) VALUES ('2015-10-20 00:00:00', '微信朋友圈H5页面', '微信公众号', '上海', 14298, 11682, 1880, 582, 154, 7348, 354);
+INSERT INTO `sql12298540`.`order_analysis` (`date`, `user_src`, `order_src`, `order_location`, `new_order`, `payed_order`, `pending_order`, `cancel_order`, `reject_order`, `good_order`, `report_order`) VALUES ('2015-10-21 00:00:00', '地推二维码扫描', 'Android APP', '深圳', 22079, 14333, 5565, 1742, 439, 8246, 211);
+INSERT INTO `sql12298540`.`order_analysis` (`date`, `user_src`, `order_src`, `order_location`, `new_order`, `payed_order`, `pending_order`, `cancel_order`, `reject_order`, `good_order`, `report_order`) VALUES ('2015-10-22 00:00:00', 'UC浏览器引流', 'iOS APP', '上海', 28968, 18151, 7212, 2373, 1232, 10739, 578);
+
+```
+
+### 3.2 doris数据库准备
+
+下面是我上面数据表在doris对应的建表脚本
+
+```sql
+CREATE TABLE `order_analysis` (
+  `date` datetime DEFAULT NULL,
+  `user_src` varchar(30) DEFAULT NULL,
+  `order_src` varchar(50) DEFAULT NULL,
+  `order_location` varchar(10) DEFAULT NULL,
+  `new_order` int DEFAULT NULL,
+  `payed_order` int DEFAULT NULL,
+  `pending_order` int DEFAULT NULL,
+  `cancel_order` int DEFAULT NULL,
+  `reject_order` int DEFAULT NULL,
+  `good_order` int DEFAULT NULL,
+  `report_order` int DEFAULT NULL
+) ENGINE=OLAP
+DUPLICATE KEY(`date`,user_src)
+COMMENT "OLAP"
+DISTRIBUTED BY HASH(`user_src`) BUCKETS 1
+PROPERTIES (
+"replication_num" = "3",
+"in_memory" = "false",
+"storage_format" = "V2"
+);
+```
+
+### 3.3 Datax Job JSON文件
+
+创建并编辑datax job任务json文件,并保存到指定目录
+
+```json
+{
+    "job": {
+        "setting": {
+            "speed": {
+                "channel": 1
+            },
+            "errorLimit": {
+                "record": 0,
+                "percentage": 0
+            }
+        },
+        "content": [
+            {
+                "reader": {
+                    "name": "mysqlreader",
+                    "parameter": {
+                        "username": "root",
+                        "password": "zhangfeng",
+                        "column": ["date","user_src","order_src","order_location","new_order","payed_order"," pending_order"," cancel_order"," reject_order"," good_order"," report_order" ],
+                        "connection": [ { "table": [ "order_analysis" ], "jdbcUrl": [ "jdbc:mysql://localhost:3306/demo" ] } ] }
+                },
+                "writer": {
+                    "name": "doriswriter",
+                    "parameter": {
+                        "feLoadUrl": ["fe:8030"],
+                        "beLoadUrl": ["be1:8040","be1:8040","be1:8040","be1:8040","be1:8040","be1:8040"],
+                        "jdbcUrl": "jdbc:mysql://fe:9030/",
+                        "database": "test_2",
+                        "table": "order_analysis",
+                        "column": ["date","user_src","order_src","order_location","new_order","payed_order"," pending_order"," cancel_order"," reject_order"," good_order"," report_order"],
+                        "username": "root",
+                        "password": "",
+                        "postSql": [],
+                        "preSql": [],
+                        "loadProps": {
+                        },
+                        "maxBatchRows" : 10000,
+                        "maxBatchByteSize" : 104857600,
+                        "labelPrefix": "datax_doris_writer_demo_",
+                        "lineDelimiter": "\n"
+                    }
+                }
+            }
+        ]
+    }
+}
+```
+
+这块 Mysql reader 使用方式参照:
+
+```
+https://github.com/alibaba/DataX/blob/master/mysqlreader/doc/mysqlreader.md
+```
+
+doriswriter的使用及参数说明:
+
+```
+https://github.com/apache/incubator-doris/blob/master/extension/DataX/doriswriter/doc/doriswriter.md
+```
+
+## 4.执行Datax数据导入任务
+
+```python
+python bin/datax.py doris.json
+```
+
+然后就可以看到执行结果:
+
+![](/images/blogs/datax-doris-writer/image-20210903134043421.png)
+
+再去 Doris 数据库中查看你的表,数据就已经导入进去了,任务执行结束
+
+因为 Datax 的任务是要靠外部触发才能执行,这里你可以使用Linux的crontab或者海豚调度之类的来控制任务运行
diff --git a/blogs/zh-CN/doris-binlog-load.md b/blogs/zh-CN/doris-binlog-load.md
new file mode 100644
index 0000000..e1000a3
--- /dev/null
+++ b/blogs/zh-CN/doris-binlog-load.md
@@ -0,0 +1,421 @@
+---
+{
+    "title": "Apache Doris Binlog Load使用方法及示例",
+    "description": "Binlog Load提供了一种使Doris增量同步用户在Mysql数据库的对数据更新操作的CDC(Change Data Capture)功能,使用户更方便的完成Mysql数据的导入",
+    "date": "2021-11-10",
+    "metaTitle": "Apache Doris Binlog Load使用方法及示例",
+    "language": "zh-CN",
+    "isArticle": true,
+    "author": "张家锋",
+    "layout": "Article",
+    "sidebar": false
+}
+---
+<!-- 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+Binlog Load提供了一种使Doris增量同步用户在Mysql数据库的对数据更新操作的CDC(Change Data Capture)功能,使用户更方便的完成Mysql数据的导入
+
+>注意:
+>
+>该功能需要在0.15及以后的版本里使用
+
+## 1. 安装配置 Mysql 
+
+1. 安装Mysql
+
+   快速使用Docker安装配置Mysql,具体参照下面的连接
+
+   https://segmentfault.com/a/1190000021523570
+
+   如果是在物理机上安装可以参考下面的连接:
+
+   [在 CentOS 7 中安装 MySQL 8 的教程详解](https://cloud.tencent.com/developer/article/1721575)
+
+2. 开启Mysql binlog
+
+   进入 Docker 容器或者物理机上修改/etc/my.cnf 文件,在 [mysqld] 下面添加以下内容,
+
+   ```
+   log_bin=mysql_bin
+   binlog-format=Row
+   server-id=1
+   ```
+
+   然后重启Mysql
+
+   ```
+   systemctl restart mysqld
+   ```
+
+3. 创建 Mysql 表
+
+   ```sql
+   create database demo;
+   
+    CREATE TABLE `test_cdc` (
+     `id` int NOT NULL AUTO_INCREMENT,
+     `sex` TINYINT(1) DEFAULT NULL,
+     `name` varchar(20) DEFAULT NULL,
+     `address` varchar(255) DEFAULT NULL,
+     PRIMARY KEY (`id`)
+    ) ENGINE=InnoDB
+   ```
+
+
+## 2. 安装配置Canal
+
+下载canal-1.1.5: https://github.com/alibaba/canal/releases/download/canal-1.1.5/canal.deployer-1.1.5.tar.gz
+
+1. 解压Canal到指定目录:
+
+   ```shell
+   tar zxvf canal.deployer-1.1.5.tar.gz -C ./canal
+   ```
+
+2. 在conf文件夹下新建目录并重命名,作为instance的根目录,目录名你可以自己命名便于识别即可
+
+   例如我这里的命名是和我的数据库库名一致:demo
+
+   ```shell
+   vi conf/demo/instance.properties
+   ```
+
+   下面给出的是一个我的示例配置:
+
+   这里面的参数说明请参考Canal官方文档:[QuickStart ](https://github.com/alibaba/canal/wiki/QuickStart)
+
+   ```ini
+   #################################################
+   ## mysql serverId , v1.0.26+ will autoGen
+   canal.instance.mysql.slaveId=12115
+   
+   # enable gtid use true/false
+   canal.instance.gtidon=false
+   
+   # position info
+   canal.instance.master.address=10.220.146.11:3306
+   canal.instance.master.journal.name=
+   canal.instance.master.position=
+   canal.instance.master.timestamp=
+   canal.instance.master.gtid=
+   
+   # rds oss binlog
+   canal.instance.rds.accesskey=
+   canal.instance.rds.secretkey=
+   canal.instance.rds.instanceId=
+   
+   # table meta tsdb info
+   canal.instance.tsdb.enable=true
+   #canal.instance.tsdb.url=jdbc:mysql://127.0.0.1:3306/canal_tsdb
+   #canal.instance.tsdb.dbUsername=canal
+   #canal.instance.tsdb.dbPassword=canal
+   
+   #canal.instance.standby.address =
+   #canal.instance.standby.journal.name =
+   #canal.instance.standby.position =
+   #canal.instance.standby.timestamp =
+   #canal.instance.standby.gtid=
+   
+   # username/password
+   canal.instance.dbUsername=zhangfeng
+   canal.instance.dbPassword=zhangfeng800729)(*Q
+   canal.instance.connectionCharset = UTF-8
+   # enable druid Decrypt database password
+   canal.instance.enableDruid=false
+   #canal.instance.pwdPublicKey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALK4BUxdDltRRE5/zXpVEVPUgunvscYFtEip3pmLlhrWpacX7y7GCMo2/JM6LeHmiiNdH1FWgGCpUfircSwlWKUCAwEAAQ==
+   
+   # table regex
+   canal.instance.filter.regex=demo\\..*
+   # table black regex
+   canal.instance.filter.black.regex=
+   # table field filter(format: schema1.tableName1:field1/field2,schema2.tableName2:field1/field2)
+   #canal.instance.filter.field=test1.t_product:id/subject/keywords,test2.t_company:id/name/contact/ch
+   # table field black filter(format: schema1.tableName1:field1/field2,schema2.tableName2:field1/field2)
+   #canal.instance.filter.black.field=test1.t_product:subject/product_image,test2.t_company:id/name/contact/ch
+   
+   # mq config
+   #canal.mq.topic=
+   # dynamic topic route by schema or table regex
+   #canal.mq.dynamicTopic=mytest1.user,mytest2\\..*,.*\\..*
+   #canal.mq.partition=0
+   # hash partition config
+   #canal.mq.partitionsNum=3
+   #canal.mq.partitionHash=test.table:id^name,.*\\..*
+   #################################################
+   ```
+
+   
+
+3. 启动Canal
+
+     ```shell
+   sh bin/startup.sh
+   ```
+
+> 注意:canal instance user/passwd
+>
+>1.1.5 版本,在canal.properties里加上这两个配置
+>
+>canal.user = canal
+>canal.passwd = E3619321C1A937C46A0D8BD1DAC39F93B27D4458
+>
+>默认密码为canal/canal,canal.passwd的密码值可以通过select password("xxx") 来获取 
+
+4. 验证是否启动成功
+
+   ```shell
+   tail -200f logs/demo/demo.log
+   ```
+
+   ![](/images/blogs/doris-binlog-load/image-20211110145044815.png)
+
+## 3.开始同步数据
+
+### 3.1 创建Doris目标表
+
+用户需要先在Doris端创建好与Mysql端对应的目标表
+
+Binlog Load只能支持Unique类型的目标表,且必须激活目标表的Batch Delete功能。
+
+开启Batch Delete的方法可以参考`help alter table`中的批量删除功能。
+
+```sql
+CREATE TABLE `doris_mysql_binlog_demo` (
+  `id` int NOT NULL,
+  `sex` TINYINT(1),
+  `name` varchar(20),
+  `address` varchar(255) 
+) ENGINE=OLAP
+UNIQUE KEY(`id`,sex)
+COMMENT "OLAP"
+DISTRIBUTED BY HASH(`sex`) BUCKETS 1
+PROPERTIES (
+"replication_allocation" = "tag.location.default: 3",
+"in_memory" = "false",
+"storage_format" = "V2"
+);
+
+-- enable batch delete
+ALTER TABLE test_2.doris_mysql_binlog_demo ENABLE FEATURE "BATCH_DELETE";
+```
+
+
+
+### 3.1 创建同步作业
+
+#### 3.1.1 Create Sync Job 语法说明
+
+Name: 'CREATE SYNC JOB'
+Description:
+
+数据同步(Sync Job)功能,支持用户提交一个常驻的数据同步作业,通过从指定的远端地址读取Binlog日志,增量同步用户在Mysql数据库的对数据更新操作的CDC(Change Data Capture)功能。
+	
+目前数据同步作业只支持对接Canal,从Canal Server上获取解析好的Binlog数据,导入到Doris内。
+	
+用户可通过 `SHOW SYNC JOB` 查看数据同步作业状态。
+	
+语法:
+
+```	
+CREATE SYNC [db.]job_name
+ (
+ 	channel_desc, 
+ 	channel_desc
+ 	...
+ )
+binlog_desc
+```
+
+1. `job_name`
+
+	同步作业名称,是作业在当前数据库内的唯一标识,相同`job_name`的作业只能有一个在运行。
+   
+2. `channel_desc`
+
+	作业下的数据通道,用来描述mysql源表到doris目标表的映射关系。
+	
+	语法:   		
+	
+	```
+	FROM mysql_db.src_tbl INTO des_tbl
+	[partitions]
+	[columns_mapping]
+	```
+	
+	1. `mysql_db.src_tbl`
+
+        指定mysql端的数据库和源表。
+		
+	2. `des_tbl`
+
+        指定doris端的目标表,只支持Unique表,且需开启表的batch delete功能(开启方法请看help alter table的'批量删除功能')。
+	
+	3. `partitions`
+
+        指定导入目的表的哪些 partition 中。如果不指定,则会自动导入到对应的 partition 中。
+		
+        示例:
+	
+        ```
+        PARTITION(p1, p2, p3)
+        ```
+		
+	4. `column_mapping`
+
+        指定mysql源表和doris目标表的列之间的映射关系。如果不指定,FE会默认源表和目标表的列按顺序一一对应。
+		
+        不支持 col_name = expr 的形式表示列。
+		
+        示例:
+		
+        ```
+        假设目标表列为(k1, k2, v1),
+	     
+        改变列k1和k2的顺序
+        COLUMNS(k2, k1, v1)
+	     
+        忽略源数据的第四列
+        COLUMNS(k2, k1, v1, dummy_column)
+        ```
+	
+3. `binlog_desc`
+
+    用来描述远端数据源,目前仅支持canal一种。
+	
+    语法:
+	
+    ```
+    FROM BINLOG
+    (
+        "key1" = "value1", 
+        "key2" = "value2"
+    )
+    ```
+	
+	1. Canal 数据源对应的属性,以`canal.`为前缀
+
+		1. canal.server.ip: canal server的地址
+		2. canal.server.port: canal server的端口
+		3. canal.destination: instance的标识
+		4. canal.batchSize: 获取的batch大小的最大值,默认8192
+		5. canal.username: instance的用户名
+		6. canal.password: instance的密码
+		7. canal.debug: 可选,设置为true时,会将batch和每一行数据的详细信息都打印出来
+Examples:
+
+1. 简单为 `test_db` 的 `test_tbl` 创建一个名为 `job1` 的数据同步作业,连接本地的Canal服务器,对应Mysql源表 `mysql_db1.tbl1`。
+
+		CREATE SYNC `test_db`.`job1`
+		(
+			FROM `mysql_db1`.`tbl1` INTO `test_tbl `
+		)
+		FROM BINLOG 
+		(
+			"type" = "canal",
+			"canal.server.ip" = "127.0.0.1",
+			"canal.server.port" = "11111",
+			"canal.destination" = "example",
+			"canal.username" = "",
+			"canal.password" = ""
+		);
+	
+2. 为 `test_db` 的多张表创建一个名为 `job1` 的数据同步作业,一一对应多张Mysql源表,并显式的指定列映射。
+
+		CREATE SYNC `test_db`.`job1` 
+		(
+			FROM `mysql_db`.`t1` INTO `test1` COLUMNS(k1, k2, v1) PARTITIONS (p1, p2),
+			FROM `mysql_db`.`t2` INTO `test2` COLUMNS(k3, k4, v2) PARTITION p1
+		) 
+		FROM BINLOG 
+		(
+			"type" = "canal", 
+			"canal.server.ip" = "xx.xxx.xxx.xx", 
+			"canal.server.port" = "12111", 
+			"canal.destination" = "example",  
+			"canal.username" = "username", 
+			"canal.password" = "password"
+		);
+
+#### 3.1.2 开始同步mysql表里数据到Doris
+
+>注意:
+>
+>创建同步任务之前,首先要在fe.conf里配置enable_create_sync_job=true,这个默认是false不启用,否则就不能创建同步任务
+
+```
+CREATE SYNC test_2.doris_mysql_binlog_demo_job 
+(
+	FROM demo.test_cdc INTO doris_mysql_binlog_demo
+) 
+FROM BINLOG 
+(
+	"type" = "canal", 
+	"canal.server.ip" = "10.220.146.10", 
+	"canal.server.port" = "11111", 
+	"canal.destination" = "demo",  
+	"canal.username" = "canal", 
+	"canal.password" = "canal"
+);
+```
+
+#### 3.1.3 查看同步任务
+
+```sql
+SHOW SYNC JOB from test_2;
+```
+
+![](/images/blogs/doris-binlog-load/image-20211110160106602.png)
+
+#### 3.1.4 查看表里的数据
+
+```sql
+select * from doris_mysql_binlog_demo;
+```
+
+![](/images/blogs/doris-binlog-load/image-20211110160331479.png)
+
+#### 3.1.5 删除数据
+
+我们在Mysql 数据表里删除数据,然后看Doris表里的变化
+
+```
+delete from test_cdc where id in (12,13)
+```
+
+我们在去看Doris表里,id是12,13这两条数据已经被删除
+
+![](/images/blogs/doris-binlog-load/image-20211110160710709.png)
+
+#### 3.1.6 多表同步
+
+多表同步只需要像下面这样写法就可以了
+
+
+
+```sql
+CREATE SYNC test_2.doris_mysql_binlog_demo_job 
+(
+    FROM demo.test_cdc INTO doris_mysql_binlog_demo,
+    FROM demo.test_cdc_1 INTO doris_mysql_binlog_demo,
+    FROM demo.test_cdc_2 INTO doris_mysql_binlog_demo,
+    FROM demo.test_cdc_3 INTO doris_mysql_binlog_demo
+) 
+```
+
diff --git a/blogs/zh-CN/fe-load-balance.md b/blogs/zh-CN/fe-load-balance.md
new file mode 100644
index 0000000..cb68a5d
--- /dev/null
+++ b/blogs/zh-CN/fe-load-balance.md
@@ -0,0 +1,475 @@
+---
+{
+    "title": "Apache Doris FE负载均衡",
+    "description": "当部署多个 FE 节点时,用户可以在多个 FE 之上部署负载均衡层来实现 Doris 的高可用.",
+    "date": "2021-11-11",
+    "metaTitle": "Apache Doris FE负载均衡",
+    "isArticle": true,
+    "language": "zh-CN",
+    "author": "张家锋",
+    "layout": "Article",
+    "sidebar": false
+}
+---
+
+<!-- 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+当部署多个 FE 节点时,用户可以在多个 FE 之上部署负载均衡层来实现 Doris 的高可用。
+
+## 1. 代码方式
+
+自己在应用层代码进行重试和负载均衡。比如发现一个连接挂掉,就自动在其他连接上进行重试。应用层代码重试需要应用自己配置多个 doris 前端节点地址。
+
+## 2. JDBC Connector
+
+如果使用 mysql jdbc connector 来连接 Doris,可以使用 jdbc 的自动重试机制:
+
+```
+jdbc:mysql:loadbalance://[host:port],[host:port].../[database][?propertyName1][=propertyValue1][&propertyName2][=propertyValue
+```
+
+详细可以参考[Mysql官网文档](https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-usagenotes-j2ee-concepts-managing-load-balanced-connections.html)
+
+## 3. ProxySQL 方式
+
+ProxySQL是灵活强大的MySQL代理层, 是一个能实实在在用在生产环境的MySQL中间件,可以实现读写分离,支持 Query 路由功能,支持动态指定某个 SQL 进行 cache,支持动态加载配置、故障切换和一些 SQL的过滤功能。
+
+Doris 的 FE 进程负责接收用户连接和查询请求,其本身是可以横向扩展且高可用的,但是需要用户在多个 FE 上架设一层 proxy,来实现自动的连接负载均衡。
+
+### 3.1 安装ProxySQL (yum方式)
+
+```shell
+配置yum源
+# vim /etc/yum.repos.d/proxysql.repo
+[proxysql_repo]
+name= ProxySQL YUM repository
+baseurl=http://repo.proxysql.com/ProxySQL/proxysql-1.4.x/centos/\$releasever
+gpgcheck=1
+gpgkey=http://repo.proxysql.com/ProxySQL/repo_pub_key
+ 
+执行安装
+# yum clean all
+# yum makecache
+# yum -y install proxysql
+查看版本  
+# proxysql --version
+ProxySQL version 1.4.13-15-g69d4207, codename Truls
+设置开机自启动
+# systemctl enable proxysql
+# systemctl start proxysql      
+# systemctl status proxysql
+启动后会监听两个端口, 默认为6032和6033。6032端口是ProxySQL的管理端口,6033是ProxySQL对外提供服务的端口 (即连接到转发后端的真正数据库的转发端口)。
+# netstat -tunlp
+Active Internet connections (only servers)
+Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name  
+tcp        0      0 0.0.0.0:6032            0.0.0.0:*               LISTEN      23940/proxysql    
+tcp        0      0 0.0.0.0:6033            0.0.0.0:*               LISTEN
+```
+
+### 3.2 **ProxySQL 配置**
+
+ProxySQL 有配置文件 `/etc/proxysql.cnf` 和配置数据库文件`/var/lib/proxysql/proxysql.db`。**这里需要特别注意**:如果存在如果存在`"proxysql.db"`文件(在`/var/lib/proxysql`目录下),则 ProxySQL  服务只有在第一次启动时才会去读取`proxysql.cnf文件`并解析;后面启动会就不会读取`proxysql.cnf`文件了!如果想要让proxysql.cnf 文件里的配置在重启 proxysql 服务后生效(即想要让 proxysql 重启时读取并解析 proxysql.cnf配置文件),则需要先删除 `/var/lib/proxysql/proxysql.db `数据库文件,然后再重启 proxysql 服务。这样就相当于初始化启动 proxysql 服务了,会再次生产一个纯净的 proxysql.db 数据库文件(如果之前配置了 proxysql 相关路由规则等,则就会被抹掉)
+
+#### 3.2.1 查看及修改配置文件
+
+这里主要是是几个参数,在下面已经注释出来了,可以根据自己的需要进行修改
+
+```conf
+# egrep -v "^#|^$" /etc/proxysql.cnf
+datadir="/var/lib/proxysql"         #数据目录
+admin_variables=
+{
+        admin_credentials="admin:admin"  #连接管理端的用户名与密码
+        mysql_ifaces="0.0.0.0:6032"    #管理端口,用来连接proxysql的管理数据库
+}
+mysql_variables=
+{
+        threads=4                #指定转发端口开启的线程数量
+        max_connections=2048
+        default_query_delay=0
+        default_query_timeout=36000000
+        have_compress=true
+        poll_timeout=2000
+        interfaces="0.0.0.0:6033"    #指定转发端口,用于连接后端mysql数据库的,相当于代理作用
+        default_schema="information_schema"
+        stacksize=1048576
+        server_version="5.5.30"        #指定后端mysql的版本
+        connect_timeout_server=3000
+        monitor_username="monitor"
+        monitor_password="monitor"
+        monitor_history=600000
+        monitor_connect_interval=60000
+        monitor_ping_interval=10000
+        monitor_read_only_interval=1500
+        monitor_read_only_timeout=500
+        ping_interval_server_msec=120000
+        ping_timeout_server=500
+        commands_stats=true
+        sessions_sort=true
+        connect_retries_on_failure=10
+}
+mysql_servers =
+(
+)
+mysql_users:
+(
+)
+mysql_query_rules:
+(
+)
+scheduler=
+(
+)
+mysql_replication_hostgroups=
+(
+)
+```
+
+#### 3.2.2 连接 ProxySQL 管理端口测试
+
+```sql
+
+# mysql -uadmin -padmin -P6032 -hdoris01
+查看main库(默认登陆后即在此库)的global_variables表信息
+MySQL [(none)]> show databases;
++-----+---------------+-------------------------------------+
+| seq | name          | file                                |
++-----+---------------+-------------------------------------+
+| 0   | main          |                                     |
+| 2   | disk          | /var/lib/proxysql/proxysql.db       |
+| 3   | stats         |                                     |
+| 4   | monitor       |                                     |
+| 5   | stats_history | /var/lib/proxysql/proxysql_stats.db |
++-----+---------------+-------------------------------------+
+5 rows in set (0.000 sec)
+MySQL [(none)]> use main;
+Reading table information for completion of table and column names
+You can turn off this feature to get a quicker startup with -A
+ 
+Database changed
+MySQL [main]> show tables;
++--------------------------------------------+
+| tables                                     |
++--------------------------------------------+
+| global_variables                           |
+| mysql_collations                           |
+| mysql_group_replication_hostgroups         |
+| mysql_query_rules                          |
+| mysql_query_rules_fast_routing             |
+| mysql_replication_hostgroups               |
+| mysql_servers                              |
+| mysql_users                                |
+| proxysql_servers                           |
+| runtime_checksums_values                   |
+| runtime_global_variables                   |
+| runtime_mysql_group_replication_hostgroups |
+| runtime_mysql_query_rules                  |
+| runtime_mysql_query_rules_fast_routing     |
+| runtime_mysql_replication_hostgroups       |
+| runtime_mysql_servers                      |
+| runtime_mysql_users                        |
+| runtime_proxysql_servers                   |
+| runtime_scheduler                          |
+| scheduler                                  |
++--------------------------------------------+
+20 rows in set (0.000 sec)
+
+```
+
+#### 3.2.3 ProxySQL 配置后端 Doris FE
+
+
+使用 insert 语句添加主机到 mysql_servers 表中,其中:hostgroup_id 为10表示写组,为20表示读组,我们这里不需要读写分离,无所谓随便设置哪一个都可以。
+
+```sql
+[root@mysql-proxy ~]# mysql -uadmin -padmin -P6032 -h127.0.0.1
+............
+MySQL [(none)]> insert into mysql_servers(hostgroup_id,hostname,port) values(10,'192.168.9.211',9030);
+Query OK, 1 row affected (0.000 sec)
+  
+MySQL [(none)]> insert into mysql_servers(hostgroup_id,hostname,port) values(10,'192.168.9.212',9030);
+Query OK, 1 row affected (0.000 sec)
+  
+MySQL [(none)]> insert into mysql_servers(hostgroup_id,hostname,port) values(10,'192.168.9.213',9030);
+Query OK, 1 row affected (0.000 sec)
+ 
+如果在插入过程中,出现报错:
+ERROR 1045 (#2800): UNIQUE constraint failed: mysql_servers.hostgroup_id, mysql_servers.hostname, mysql_servers.port
+ 
+说明可能之前就已经定义了其他配置,可以清空这张表 或者 删除对应host的配置
+MySQL [(none)]> select * from mysql_servers;
+MySQL [(none)]> delete from mysql_servers;
+Query OK, 6 rows affected (0.000 sec)
+
+查看这3个节点是否插入成功,以及它们的状态。
+MySQL [(none)]> select * from mysql_servers\G;
+*************************** 1. row ***************************
+       hostgroup_id: 10
+           hostname: 192.168.9.211
+               port: 9030
+             status: ONLINE
+             weight: 1
+        compression: 0
+    max_connections: 1000
+max_replication_lag: 0
+            use_ssl: 0
+     max_latency_ms: 0
+            comment:
+*************************** 2. row ***************************
+       hostgroup_id: 10
+           hostname: 192.168.9.212
+               port: 9030
+             status: ONLINE
+             weight: 1
+        compression: 0
+    max_connections: 1000
+max_replication_lag: 0
+            use_ssl: 0
+     max_latency_ms: 0
+            comment:
+*************************** 3. row ***************************
+       hostgroup_id: 10
+           hostname: 192.168.9.213
+               port: 9030
+             status: ONLINE
+             weight: 1
+        compression: 0
+    max_connections: 1000
+max_replication_lag: 0
+            use_ssl: 0
+     max_latency_ms: 0
+            comment:
+6 rows in set (0.000 sec)
+  
+ERROR: No query specified
+  
+如上修改后,加载到RUNTIME,并保存到disk,下面两步非常重要,不然退出以后你的配置信息就没了,必须保存
+MySQL [(none)]> load mysql servers to runtime;
+Query OK, 0 rows affected (0.006 sec)
+  
+MySQL [(none)]> save mysql servers to disk;
+Query OK, 0 rows affected (0.348 sec)
+```
+
+#### 3.2.4 监控Doris FE节点配置
+
+添 doris fe 节点之后,还需要监控这些后端节点。对于后端多个FE高可用负载均衡环境来说,这是必须的,因为 ProxySQL 需要通过每个节点的 read_only 值来自动调整
+
+它们是属于读组还是写组。
+
+首先在后端master主数据节点上创建一个用于监控的用户名
+
+```sql
+在doris fe master主数据库节点行执行:
+# mysql -P9030 -uroot -p 
+mysql> create user monitor@'192.168.9.%' identified by 'P@ssword1!';
+Query OK, 0 rows affected (0.03 sec)
+mysql> grant ADMIN_PRIV on *.* to monitor@'192.168.9.%';
+Query OK, 0 rows affected (0.02 sec)
+ 
+然后回到mysql-proxy代理层节点上配置监控
+# mysql -uadmin -padmin -P6032 -h127.0.0.1
+MySQL [(none)]> set mysql-monitor_username='monitor';
+Query OK, 1 row affected (0.000 sec)
+ 
+MySQL [(none)]> set mysql-monitor_password='P@ssword1!';
+Query OK, 1 row affected (0.000 sec)
+ 
+修改后,加载到RUNTIME,并保存到disk
+MySQL [(none)]> load mysql variables to runtime;
+Query OK, 0 rows affected (0.001 sec)
+ 
+MySQL [(none)]> save mysql variables to disk;
+Query OK, 94 rows affected (0.079 sec)
+ 
+验证监控结果:ProxySQL监控模块的指标都保存在monitor库的log表中。
+以下是连接是否正常的监控(对connect指标的监控):
+注意:可能会有很多connect_error,这是因为没有配置监控信息时的错误,配置后如果connect_error的结果为NULL则表示正常。
+MySQL [(none)]> select * from mysql_server_connect_log;
++---------------+------+------------------+-------------------------+---------------+
+| hostname      | port | time_start_us    | connect_success_time_us | connect_error |
++---------------+------+------------------+-------------------------+---------------+
+| 192.168.9.211 | 9030 | 1548665195883957 | 762                     | NULL          |
+| 192.168.9.212 | 9030 | 1548665195894099 | 399                     | NULL          |
+| 192.168.9.213 | 9030 | 1548665195904266 | 483                     | NULL          |
+| 192.168.9.211 | 9030 | 1548665255883715 | 824                     | NULL          |
+| 192.168.9.212 | 9030 | 1548665255893942 | 656                     | NULL          |
+| 192.168.9.211 | 9030 | 1548665495884125 | 615                     | NULL          |
+| 192.168.9.212 | 9030  | 1548665495894254 | 441                     | NULL          |
+| 192.168.9.213 | 9030 | 1548665495904479 | 638                     | NULL          |
+| 192.168.9.211 | 9030 | 1548665512917846 | 487                     | NULL          |
+| 192.168.9.212 | 9030 | 1548665512928071 | 994                     | NULL          |
+| 192.168.9.213 | 9030 | 1548665512938268 | 613                     | NULL          |
++---------------+------+------------------+-------------------------+---------------+
+20 rows in set (0.000 sec)
+以下是对心跳信息的监控(对ping指标的监控)
+MySQL [(none)]> select * from mysql_server_ping_log;
++---------------+------+------------------+----------------------+------------+
+| hostname      | port | time_start_us    | ping_success_time_us | ping_error |
++---------------+------+------------------+----------------------+------------+
+| 192.168.9.211 | 9030 | 1548665195883407 | 98                   | NULL       |
+| 192.168.9.212 | 9030 | 1548665195885128 | 119                  | NULL       |
+...........
+| 192.168.9.213 | 9030 | 1548665415889362 | 106                  | NULL       |
+| 192.168.9.213 | 9030 | 1548665562898295 | 97                   | NULL       |
++---------------+------+------------------+----------------------+------------+
+110 rows in set (0.001 sec)
+ 
+read_only日志此时也为空(正常来说,新环境配置时,这个只读日志是为空的)
+MySQL [(none)]> select * from mysql_server_read_only_log;
+Empty set (0.000 sec)
+
+3个节点都在hostgroup_id=10的组中。
+现在,将刚才mysql_replication_hostgroups表的修改加载到RUNTIME生效。
+MySQL [(none)]> load mysql servers to runtime;
+Query OK, 0 rows affected (0.003 sec)
+ 
+MySQL [(none)]> save mysql servers to disk;
+Query OK, 0 rows affected (0.361 sec)
+
+现在看结果
+MySQL [(none)]> select hostgroup_id,hostname,port,status,weight from mysql_servers;
++--------------+---------------+------+--------+--------+
+| hostgroup_id | hostname      | port | status | weight |
++--------------+---------------+------+--------+--------+
+| 10           | 192.168.9.211 | 9030 | ONLINE | 1      |
+| 20           | 192.168.9.212 | 9030 | ONLINE | 1      |
+| 20           | 192.168.9.213 | 9030 | ONLINE | 1      |
++--------------+---------------+------+--------+--------+
+3 rows in set (0.000 sec)
+```
+
+#### 3.2.5 配置Doris用户
+
+上面的所有配置都是关于后端 Doris FE 节点的,现在可以配置关于 SQL 语句的,包括:发送 SQL 语句的用户、SQL 语句的路由规则、SQL 查询的缓存、SQL 语句的重写等等。
+
+本小节是 SQL 请求所使用的用户配置,例如 root 用户。这要求我们需要先在后端 Doris FE 节点添加好相关用户。这里以 root 和 doris 两个用户名为例.
+
+```sql
+首先,在Doris FE master主数据库节点上执行:
+# mysql -P9030 -uroot -p
+.........
+mysql> create user doris@'%' identified by 'P@ssword1!';
+Query OK, 0 rows affected, 1 warning (0.04 sec)
+ 
+mysql> grant ADMIN_PRIV on *.* to doris@'%';
+Query OK, 0 rows affected, 1 warning (0.03 sec)
+ 
+ 
+然后回到mysql-proxy代理层节点,配置mysql_users表,将刚才的两个用户添加到该表中。
+admin> insert into mysql_users(username,password,default_hostgroup) values('root','',10);
+Query OK, 1 row affected (0.001 sec)
+  
+admin> insert into mysql_users(username,password,default_hostgroup) values('doris','P@ssword1!',10);
+Query OK, 1 row affected (0.000 sec)
+
+加载用户到运行环境中,并将用户信息保存到磁盘
+admin> load mysql users to runtime;
+Query OK, 0 rows affected (0.001 sec)
+  
+admin> save mysql users to disk;
+Query OK, 0 rows affected (0.108 sec)
+  
+mysql_users表有不少字段,最主要的三个字段为username、password和default_hostgroup:
+-  username:前端连接ProxySQL,以及ProxySQL将SQL语句路由给MySQL所使用的用户名。
+-  password:用户名对应的密码。可以是明文密码,也可以是hash密码。如果想使用hash密码,可以先在某个MySQL节点上执行
+   select password(PASSWORD),然后将加密结果复制到该字段。
+-  default_hostgroup:该用户名默认的路由目标。例如,指定root用户的该字段值为10时,则使用root用户发送的SQL语句默认
+   情况下将路由到hostgroup_id=10组中的某个节点。
+ 
+admin> select * from mysql_users\G
+*************************** 1. row ***************************
+              username: root
+              password: 
+                active: 1
+               use_ssl: 0
+     default_hostgroup: 10
+        default_schema: NULL
+         schema_locked: 0
+transaction_persistent: 1
+          fast_forward: 0
+               backend: 1
+              frontend: 1
+       max_connections: 10000
+*************************** 2. row ***************************
+              username: doris
+              password: P@ssword1!
+                active: 1
+               use_ssl: 0
+     default_hostgroup: 10
+        default_schema: NULL
+         schema_locked: 0
+transaction_persistent: 1
+          fast_forward: 0
+               backend: 1
+              frontend: 1
+       max_connections: 10000
+2 rows in set (0.000 sec)
+  
+虽然这里没有详细介绍mysql_users表,但只有active=1的用户才是有效的用户。
+
+MySQL [(none)]> load mysql users to runtime;
+Query OK, 0 rows affected (0.001 sec)
+ 
+MySQL [(none)]> save mysql users to disk;
+Query OK, 0 rows affected (0.123 sec)
+
+这样就可以通过sql客户端,使用doris的用户名密码去连接了ProxySQL了
+```
+
+#### 3.2.6 通过 ProxySQL 连接 Doris 进行测试
+
+下面,分别使用 root 用户和 doris 用户测试下它们是否能路由到默认的 hostgroup_id=10 (它是一个写组)读数据。下面是通过转发端口 6033 连接的,连接的是转发到后端真正的数据库!
+
+```sql
+#mysql -uroot -p -P6033 -hdoris01 -e "show databases;"
+Enter password: 
+ERROR 9001 (HY000) at line 1: Max connect timeout reached while reaching hostgroup 10 after 10000ms
+这个时候发现出错,并没有转发到后端真正的doris fe上
+通过日志看到有set autocommit=0 这样开启事务
+检查配置发现:
+mysql-forward_autocommit=false
+mysql-autocommit_false_is_transaction=false
+我们这里不需要读写分离,只需要将这两个参数通过下面语句直接搞成true就可以了
+mysql> UPDATE global_variables SET variable_value='true' WHERE variable_name='mysql-forward_autocommit';
+Query OK, 1 row affected (0.00 sec)
+
+mysql> UPDATE global_variables SET variable_value='true' WHERE variable_name='mysql-autocommit_false_is_transaction';
+Query OK, 1 row affected (0.01 sec)
+
+mysql>  LOAD MYSQL VARIABLES TO RUNTIME;
+Query OK, 0 rows affected (0.00 sec)
+
+mysql> SAVE MYSQL VARIABLES TO DISK;
+Query OK, 98 rows affected (0.12 sec)
+
+然后我们在重新试一下,显示成功
+[root@doris01 ~]# mysql -udoris -pP@ssword1! -P6033 -h192.168.9.211  -e "show databases;"
+Warning: Using a password on the command line interface can be insecure.
++--------------------+
+| Database           |
++--------------------+
+| doris_audit_db     |
+| information_schema |
+| retail             |
++--------------------+
+```
+
+OK,到此就结束了,你就可以用 Mysql 客户端,JDBC 等任何连接 mysql 的方式连接 ProxySQL 去操作你的 doris 了
diff --git a/blogs/zh-CN/flink-cdc-to-doris.md b/blogs/zh-CN/flink-cdc-to-doris.md
new file mode 100644
index 0000000..d6627ea
--- /dev/null
+++ b/blogs/zh-CN/flink-cdc-to-doris.md
@@ -0,0 +1,372 @@
+---
+{
+    "title": "使用 Flink CDC 实现 MySQL 数据实时入 Apache Doris",
+    "description": "本文通过实例来演示怎么通过Flink CDC 结合Doris的Flink Connector实现从Mysql数据库中监听数据并实时入库到Doris数仓对应的表中.",
+    "date": "2021-11-11",
+    "metaTitle": "使用 Flink CDC 实现 MySQL 数据实时入 Apache Doris",
+    "isArticle": true,
+    "language": "zh-CN",
+    "author": "张家锋",
+    "layout": "Article",
+    "sidebar": false
+}
+---
+<!-- 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+本文通过实例来演示怎么通过Flink CDC 结合Doris的Flink Connector实现从Mysql数据库中监听数据并实时入库到Doris数仓对应的表中。
+
+## 1.什么是CDC
+
+CDC 是变更数据捕获(Change Data Capture)技术的缩写,它可以将源数据库(Source)的增量变动记录,同步到一个或多个数据目的(Sink)。在同步过程中,还可以对数据进行一定的处理,例如分组(GROUP BY)、多表的关联(JOIN)等。
+
+例如对于电商平台,用户的订单会实时写入到某个源数据库;A 部门需要将每分钟的实时数据简单聚合处理后保存到 Redis 中以供查询,B 部门需要将当天的数据暂存到 Elasticsearch 一份来做报表展示,C 部门也需要一份数据到 ClickHouse 做实时数仓。随着时间的推移,后续 D 部门、E 部门也会有数据分析的需求,这种场景下,传统的拷贝分发多个副本方法很不灵活,而 CDC 可以实现一份变动记录,实时处理并投递到多个目的地。
+
+### 1.1 CDC的应用场景
+
+- **数据同步:**用于备份,容灾;
+- **数据分发:**一个数据源分发给多个下游系统;
+- **数据采集:**面向数据仓库 / 数据湖的 ETL 数据集成,是非常重要的数据源。
+
+CDC 的技术方案非常多,目前业界主流的实现机制可以分为两种:
+
+- 基于查询的 CDC:
+  - 离线调度查询作业,批处理。把一张表同步到其他系统,每次通过查询去获取表中最新的数据;
+  - 无法保障数据一致性,查的过程中有可能数据已经发生了多次变更;
+  - 不保障实时性,基于离线调度存在天然的延迟。
+- 基于日志的 CDC:
+  - 实时消费日志,流处理,例如 MySQL 的 binlog 日志完整记录了数据库中的变更,可以把 binlog 文件当作流的数据源;
+  - 保障数据一致性,因为 binlog 文件包含了所有历史变更明细;
+  - 保障实时性,因为类似 binlog 的日志文件是可以流式消费的,提供的是实时数据。
+
+## 2.Flink CDC
+
+Flink在1.11版本中新增了CDC的特性,简称 改变数据捕获。名称来看有点乱,我们先从之前的数据架构来看CDC的内容。
+
+以上是之前的`mysq binlog`日志处理流程,例如 canal 监听 binlog 把日志写入到 kafka 中。而 Apache Flink 实时消费 Kakfa 的数据实现 mysql 数据的同步或其他内容等。拆分来说整体上可以分为以下几个阶段。
+
+1. mysql开启binlog
+2. canal同步binlog数据写入到kafka
+3. flink读取kakfa中的binlog数据进行相关的业务处理。
+
+整体的处理链路较长,需要用到的组件也比较多。Apache Flink CDC可以直接从数据库获取到binlog供下游进行业务计算分析
+
+### 2.1 Flink Connector Mysql CDC 2.0 特性
+
+提供 MySQL CDC 2.0,核心 feature 包括
+
+- 并发读取,全量数据的读取性能可以水平扩展;
+- 全程无锁,不对线上业务产生锁的风险;
+- 断点续传,支持全量阶段的 checkpoint。
+
+网上有测试文档显示用 TPC-DS 数据集中的 customer 表进行了测试,Flink 版本是 1.13.1,customer 表的数据量是 6500 万条,Source 并发为 8,全量读取阶段:
+
+- MySQL CDC 2.0 用时 **13** 分钟;
+- MySQL CDC 1.4 用时 **89** 分钟;
+- 读取性能提升 **6.8** 倍。
+
+## 3.什么是Doris  Flink Connector
+
+Flink Doris Connector 是 doris 社区为了方便用户使用 Flink 读写Doris数据表的一个扩展,
+
+目前 doris 支持 Flink 1.11.x ,1.12.x,1.13.x,Scala版本:2.12.x
+
+目前Flink doris connector目前控制入库通过两个参数:
+
+1. sink.batch.size	:每多少条写入一次,默认100条
+2. sink.batch.interval :每个多少秒写入一下,默认1秒
+
+这两参数同时起作用,那个条件先到就触发写doris表操作,
+
+**注意:**
+
+这里**注意**的是要启用 http v2 版本,具体在 fe.conf 中配置 `enable_http_server_v2=true`,同时因为是通过 fe http rest api 获取 be 列表,这俩需要配置的用户有 admin 权限。
+
+## 4. 用法示例
+
+### 4.1 Flink Doris Connector 编译
+
+首先我们要编译Doris的Flink connector,也可以通过下面的地址进行下载:
+
+https://github.com/hf200012/hf200012.github.io/raw/main/lib/doris-flink-1.0-SNAPSHOT.jar
+
+>注意:
+>
+>这里因为Doris 的Flink Connector 是基于Scala 2.12.x版本进行开发的,所有你在使用Flink 的时候请选择对应scala 2.12的版本,
+>
+>如果你使用上面地址下载了相应的jar,请忽略下面的编译内容部分
+
+在 doris 的 docker 编译环境 `apache/incubator-doris:build-env-1.2` 下进行编译,因为 1.3 下面的JDK 版本是 11,会存在编译问题。
+
+在 extension/flink-doris-connector/ 源码目录下执行:
+
+```
+sh build.sh
+```
+
+编译成功后,会在 `output/` 目录下生成文件 `doris-flink-1.0.0-SNAPSHOT.jar`。将此文件复制到 `Flink` 的 `ClassPath` 中即可使用 `Flink-Doris-Connector`。例如,`Local` 模式运行的 `Flink`,将此文件放入 `jars/` 文件夹下。`Yarn`集群模式运行的`Flink`,则将此文件放入预部署包中。
+
+**针对Flink 1.13.x版本适配问题**
+
+```xml
+   <properties>
+        <scala.version>2.12</scala.version>
+        <flink.version>1.11.2</flink.version>
+        <libthrift.version>0.9.3</libthrift.version>
+        <arrow.version>0.15.1</arrow.version>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <doris.home>${basedir}/../../</doris.home>
+        <doris.thirdparty>${basedir}/../../thirdparty</doris.thirdparty>
+    </properties>
+```
+
+只需要将这里的 `flink.version` 改成和你 Flink 集群版本一致,重新编辑即可
+
+### 4.2 配置Flink
+
+这里我们是通过Flink Sql Client 方式来进行操作。
+
+这里我们演示使用的软件版本:
+
+1. Mysql 8.x
+2. Apache Flink : 1.13.3
+3. Apache Doris :0.14.13.1
+
+#### 4.2.1 安装Flink
+
+首先下载和安装 Flink :
+
+https://dlcdn.apache.org/flink/flink-1.13.3/flink-1.13.3-bin-scala_2.12.tgz
+
+
+下载Flink CDC相关Jar包:
+
+https://repo1.maven.org/maven2/com/ververica/flink-connector-mysql-cdc/2.0.2/flink-connector-mysql-cdc-2.0.2.jar
+
+这里注意Flink CDC 和Flink 的版本对应关系
+
+![](/images/blogs/flink-cdc-to-doris/image-20211025170642628.png)
+
+- 将上面下载或者编译好的 Flink  Doris Connector jar包复制到 Flink 根目录下的lib目录下
+- Flink cdc的jar包也复制到 Flink 根目录下的lib目录下
+
+这里演示使用的是本地单机模式,
+
+```shell
+# wget https://dlcdn.apache.org/flink/flink-1.13.3/flink-1.13.3-bin-scala_2.12.tgz
+# tar zxvf flink-1.13.3-bin-scala_2.12.tgz 
+# cd flink-1.13.3
+# wget https://repo1.maven.org/maven2/com/ververica/flink-connector-mysql-cdc/2.0.2/flink-connector-mysql-cdc-2.0.2.jar -P ./lib/
+# wget https://github.com/hf200012/hf200012.github.io/raw/main/lib/doris-flink-1.0-SNAPSHOT.jar -P ./lib/
+```
+
+![](/images/blogs/flink-cdc-to-doris/image-20211026095513892.png)
+
+#### 4.2.2 启动Flink
+
+这里我们使用的是本地单机模式
+
+```
+# bin/start-cluster.sh
+Starting cluster.
+Starting standalonesession daemon on host doris01.
+Starting taskexecutor daemon on host doris01.
+```
+
+我们通过web访问(默认端口是8081)启动起来Flink 集群,可以看到集群正常启动
+
+![](/images/blogs/flink-cdc-to-doris/image-20211025162831632.png)
+
+### 4.3 安装Apache Doris
+
+具体安装部署Doris的方法,参照下面的连接:
+
+https://hf200012.github.io/2021/09/Apache-Doris-环境安装部署
+
+### 4.3 安装配置 Mysql 
+
+1. 安装Mysql
+
+   快速使用Docker安装配置Mysql,具体参照下面的连接
+
+   https://segmentfault.com/a/1190000021523570
+   
+2.  开启Mysql binlog
+
+   进入 Docker 容器修改/etc/my.cnf 文件,在 [mysqld] 下面添加以下内容,
+
+   ```
+   log_bin=mysql_bin
+   binlog-format=Row
+   server-id=1
+   ```
+
+   然后重启Mysql
+
+   ```
+   systemctl restart mysqld
+   ```
+
+3. 创建Mysql数据库表
+
+```sql
+ CREATE TABLE `test_cdc` (
+  `id` int NOT NULL AUTO_INCREMENT,
+  `name` varchar(255) DEFAULT NULL,
+  PRIMARY KEY (`id`)
+ ) ENGINE=InnoDB 
+```
+
+### 4.4 创建doris表
+
+```sql
+CREATE TABLE `doris_test` (
+  `id` int NULL COMMENT "",
+  `name` varchar(100) NULL COMMENT ""
+ ) ENGINE=OLAP
+ UNIQUE KEY(`id`)
+ COMMENT "OLAP"
+ DISTRIBUTED BY HASH(`id`) BUCKETS 1
+ PROPERTIES (
+ "replication_num" = "3",
+ "in_memory" = "false",
+ "storage_format" = "V2"
+ );
+```
+
+### 4.5 启动 Flink Sql Client
+
+```shell
+./bin/sql-client.sh embedded
+> set execution.result-mode=tableau;
+```
+
+![](/images/blogs/flink-cdc-to-doris/image-20211025165547903.png)
+
+#### 4.5.1 创建 Flink CDC Mysql 映射表
+
+```sql
+CREATE TABLE test_flink_cdc ( 
+  id INT, 
+  name STRING,
+  primary key(id)  NOT ENFORCED
+) WITH ( 
+  'connector' = 'mysql-cdc', 
+  'hostname' = 'localhost', 
+  'port' = '3306', 
+  'username' = 'root', 
+  'password' = 'password', 
+  'database-name' = 'demo', 
+  'table-name' = 'test_cdc' 
+);
+```
+
+执行查询创建的Mysql映射表,显示正常
+
+```
+select * from test_flink_cdc;
+```
+
+![](/images/blogs/flink-cdc-to-doris/image-20211026100505972.png)
+
+#### 4.5.2 创建Flink Doris Table 映射表
+
+使用Doris Flink Connector创建 Doris映射表
+
+```sql
+CREATE TABLE doris_test_sink (
+   id INT,
+   name STRING
+) 
+WITH (
+  'connector' = 'doris',
+  'fenodes' = 'localhost:8030',
+  'table.identifier' = 'db_audit.doris_test',
+  'sink.batch.size' = '2',
+  'sink.batch.interval'='1',
+  'username' = 'root',
+  'password' = ''
+)
+```
+
+在命令行下执行上面的语句,可以看到创建表成功,然后执行查询语句,验证是否正常
+
+```sql
+select * from doris_test_sink;
+```
+
+![](/images/blogs/flink-cdc-to-doris/image-20211026100804091.png)
+
+执行插入操作,将Mysql 里的数据通过 Flink CDC结合Doris Flink Connector方式插入到 Doris中
+
+```sql
+INSERT INTO doris_test_sink select id,name from test_flink_cdc
+```
+
+![](/images/blogs/flink-cdc-to-doris/image-20211026101004547.png)
+
+提交成功之后我们在Flink的Web界面可以看到相关的Job任务信息
+
+![](/images/blogs/flink-cdc-to-doris/image-20211026100943474.png)
+
+#### 4.5.3 向Mysql表中插入数据
+
+```sql
+INSERT INTO test_cdc VALUES (123, 'this is a update');
+INSERT INTO test_cdc VALUES (1212, '测试flink CDC');
+INSERT INTO test_cdc VALUES (1234, '这是测试');
+INSERT INTO test_cdc VALUES (11233, 'zhangfeng_1');
+INSERT INTO test_cdc VALUES (21233, 'zhangfeng_2');
+INSERT INTO test_cdc VALUES (31233, 'zhangfeng_3');
+INSERT INTO test_cdc VALUES (41233, 'zhangfeng_4');
+INSERT INTO test_cdc VALUES (51233, 'zhangfeng_5');
+INSERT INTO test_cdc VALUES (61233, 'zhangfeng_6');
+INSERT INTO test_cdc VALUES (71233, 'zhangfeng_7');
+INSERT INTO test_cdc VALUES (81233, 'zhangfeng_8');
+INSERT INTO test_cdc VALUES (91233, 'zhangfeng_9');
+```
+
+#### 4.5.4 观察Doris表的数据
+
+首先停掉Insert into这个任务,因为我是在本地单机模式,只有一个task任务,所以要停掉,然后在命令行执行查询语句才能看到数据
+
+![](/images/blogs/flink-cdc-to-doris/image-20211026101203629.png)
+
+#### 4.5.5 修改Mysql的数据
+
+重新启动Insert into任务
+
+![](/images/blogs/flink-cdc-to-doris/image-20211025182341086.png)
+
+修改Mysql表里的数据
+
+```sql
+update test_cdc set name='这个是验证修改的操作' where id =123
+```
+
+再去观察Doris表中的数据,你会发现已经修改
+
+注意这里如果要想Mysql表里的数据修改,Doris里的数据也同样修改,Doris数据表的模型要是Unique key模型,其他数据模型(Aggregate Key 和 Duplicate Key)不能进行数据的更新操作。
+
+![](/images/blogs/flink-cdc-to-doris/image-20211025182435827.png)
+
+#### 4.5.6 删除数据操作
+
+目前Doris Flink Connector 还不支持删除操作,后面计划会加上这个操作
+

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org