日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

Materialize MySQL引擎:MySQL到Click House的高速公路

發布時間:2023/12/13 综合教程 54 生活家
生活随笔 收集整理的這篇文章主要介紹了 Materialize MySQL引擎:MySQL到Click House的高速公路 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

摘要:MySQL到ClickHouse數據同步原理及實踐

引言

熟悉MySQL的朋友應該都知道,MySQL集群主從間數據同步機制十分完善。令人驚喜的是,ClickHouse作為近年來炙手可熱的大數據分析引擎也可以掛載為MySQL的從庫,作為MySQL的 "協處理器" 面向OLAP場景提供高效數據分析能力。早先的方案比較直截了當,通過第三方插件將所有MySQL上執行的操作進行轉化,然后在ClickHouse端逐一回放達到數據同步。終于在2020年下半年,Yandex 公司在 ClickHouse 社區發布了MaterializeMySQL引擎,支持從MySQL全量及增量實時數據同步。MaterializeMySQL引擎目前支持 MySQL 5.6/5.7/8.0 版本,兼容 Delete/Update 語句,及大部分常用的 DDL 操作。

基礎概念

MySQL & ClickHouse

MySQL一般特指完整的MySQL RDBMS,是開源的關系型數據庫管理系統,目前屬于Oracle公司。MySQL憑借不斷完善的功能以及活躍的開源社區,吸引了越來越多的企業和個人用戶。

ClickHouse是由Yandex公司開源的面向OLAP場景的分布式列式數據庫。ClickHouse具有實時查詢,完整的DBMS及高效數據壓縮,支持批量更新及高可用。此外,ClickHouse還較好地兼容SQL語法并擁有開箱即用等諸多優點。

Row Store & Column Store

MySQL存儲采用的是Row Store,表中數據按照 Row 為邏輯存儲單元在存儲介質中連續存儲。這種存儲方式適合隨機的增刪改查操作,對于按行查詢較為友好。但如果選擇查詢的目標只涉及一行中少數幾個屬性,Row 存儲方式也不得不將所有行全部遍歷再篩選出目標屬性,當表屬性較多時查詢效率通常較低。盡管索引以及緩存等優化方案在 OLTP 場景中能夠提升一定的效率,但在面對海量數據背景的 OLAP 場景就顯得有些力不從心了。

ClickHouse 則采用的是 Column Store,表中數據按照Column為邏輯存儲單元在存儲介質中連續存儲。這種存儲方式適合采用 SIMD (Single Instruction Multiple Data) 并發處理數據,尤其在表屬性較多時查詢效率明顯提升。列存方式中物理相鄰的數據類型通常相同,因此天然適合數據壓縮從而達到極致的數據壓縮比。

使用方法

部署Master-MySQL
開啟BinLog功能:ROW模式
開啟GTID模式:解決位點同步時MySQL主從切換問題(BinLog reset導致位點失效)

# my.cnf關鍵配置
gtid_mode=ON
enforce_gtid_consistency=1
binlog_format=ROW

部署Slave-ClickHouse
獲取 ClickHouse/Master 代碼編譯安裝
推薦使用GCC-10.2.0,CMake 3.15,ninja1.9.0及以上
創建Master-MySQL中database及table

creat databases master_db;
use master_db;
CREATE TABLE IF NOT EXISTS `runoob_tbl`(
   `runoob_id` INT UNSIGNED AUTO_INCREMENT,
   `runoob_` VARCHAR(100) NOT NULL,
   `runoob_author` VARCHAR(40) NOT NULL,
   `submission_date` DATE,
   PRIMARY KEY ( `runoob_id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

# 插入幾條數據
INSERT INTO runoob_tbl (runoob_, runoob_author, submission_date) VALUES ("MySQL-learning", "Bob", NOW());
INSERT INTO runoob_tbl (runoob_, runoob_author, submission_date) VALUES ("MySQL-learning", "Tim", NOW());

創建 Slave-ClickHouse 中 MaterializeMySQL database

# 開啟materialize同步功能
SET allow_experimental_database_materialize_mysql=1;
# 創建slave庫,參數分別是("mysqld服務地址", "待同步庫名", "授權賬戶", "密碼")
CREATE DATABASE slave_db ENGINE = MaterializeMySQL('192.168.6.39:3306', 'master_db', 'root', '3306123456');

此時可以看到ClickHouse中已經有從MySQL中同步的數據了:

DESKTOP:) select * from  runoob_tbl;

SELECT *
FROM runoob_tbl

Query id: 6e2b5f3b-0910-4d29-9192-1b985484d7e3

┌─runoob_id─┬─runoob_title───┬─runoob_author─┬─submission_date─┐
│         1 │ MySQL-learning │ Bob           │      2021-01-06 │
└───────────┴────────────────┴───────────────┴─────────────────┘
┌─runoob_id─┬─runoob_title───┬─runoob_author─┬─submission_date─┐
│         2 │ MySQL-learning │ Tim           │      2021-01-06 │
└───────────┴────────────────┴───────────────┴─────────────────┘
2 rows in set. Elapsed: 0.056 sec.

工作原理

BinLog Event

MySQL中BinLog Event主要包含以下幾類:

1. MYSQL_QUERY_EVENT    -- DDL
2. MYSQL_WRITE_ROWS_EVENT -- insert
3. MYSQL_UPDATE_ROWS_EVENT -- update
4. MYSQL_DELETE_ROWS_EVENT -- delete

事務提交后,MySQL 將執行過的 SQL 處理 BinLog Event,并持久化到 BinLog 文件

ClickHouse通過消費BinLog達到數據同步,過程中主要考慮3個方面問題:

DDL兼容:由于ClickHouse和MySQL的數據類型定義有區別,DDL語句需要做相應轉換
Delete/Update 支持:引入_version字段,控制版本信息
Query 過濾:引入_sign字段,標記數據有效性

DDL操作

對比一下MySQL的DDL語句以及在ClickHouse端執行的DDL語句:

mysql> show create table runoob_tblG;
*************************** 1. row ***************************
Table: runoob_tbl
Create Table: CREATE TABLE `runoob_tbl` (
  `runoob_id` int unsigned NOT NULL AUTO_INCREMENT,
  `runoob_` varchar(100) NOT NULL,
  `runoob_author` varchar(40) NOT NULL,
  `submission_date` date DEFAULT NULL,
  PRIMARY KEY (`runoob_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
---------------------------------------------------------------
cat /metadata/slave_db/runoob_tbl.sql
ATTACH TABLE _ UUID '14dbff59-930e-4aa8-9f20-ccfddaf78077'
(
    `runoob_id` UInt32,
    `runoob_` String,
    `runoob_author` String,
    `submission_date` Nullable(Date),
    `_sign` Int8 MATERIALIZED 1,
    `_version` UInt64 MATERIALIZED 1
)
ENGINE = ReplacingMergeTree(_version)
PARTITION BY intDiv(runoob_id, 4294967)
ORDER BY tuple(runoob_id)
SETTINGS index_granularity = 8192

可以看到:

1、在DDL轉化時默認增加了2個隱藏字段:_sign(-1刪除, 1寫入) 和 _version(數據版本)
2、默認將表引擎設置為 ReplacingMergeTree,以 _version 作為 column version
3、原DDL主鍵字段 runoob_id 作為ClickHouse排序鍵和分區鍵

此外還有許多DDL處理,比如增加列、索引等,相應代碼在Parsers/MySQL 目錄下。

Delete/Update操作

Update:

# Mysql端:
UPDATE runoob_tbl set runoob_author='Mike' where runoob_id=2;

mysql> select * from runoob_tbl;
+-----------+----------------+---------------+-----------------+
| runoob_id | runoob_title   | runoob_author | submission_date |
+-----------+----------------+---------------+-----------------+
|         1 | MySQL-learning | Bob           | 2021-01-06      |
|         2 | MySQL-learning | Mike          | 2021-01-06      |
+-----------+----------------+---------------+-----------------+
2 rows in set (0.00 sec)

----------------------------------------------------------------
# ClickHouse端:
DESKTOP:) select *, _sign, _version from runoob_tbl order by runoob_id;

SELECT
    *,
    _sign,
    _version
FROM runoob_tbl
ORDER BY runoob_id ASC

Query id: c5f4db0a-eff6-4b49-a429-b55230c26301

┌─runoob_id─┬─runoob_title───┬─runoob_author─┬─submission_date─┬─_sign─┬─_version─┐
│         1 │ MySQL-learning │ Bob           │      2021-01-06 │     1 │        2 │
│         2 │ MySQL-learning │ Mike          │      2021-01-06 │     1 │        4 │
│         2 │ MySQL-learning │ Tim           │      2021-01-06 │     1 │        3 │
└───────────┴────────────────┴───────────────┴─────────────────┴───────┴──────────┘
3 rows in set. Elapsed: 0.003 sec.

可以看到,ClickHouse數據也實時同步了更新操作。

Delete:

# Mysql端
mysql> DELETE from runoob_tbl where runoob_id=2;

mysql> select * from runoob_tbl;
+-----------+----------------+---------------+-----------------+
| runoob_id | runoob_title   | runoob_author | submission_date |
+-----------+----------------+---------------+-----------------+
|         1 | MySQL-learning | Bob           | 2021-01-06      |
+-----------+----------------+---------------+-----------------+
1 row in set (0.00 sec)

----------------------------------------------------------------
# ClickHouse端
DESKTOP:) select *, _sign, _version from runoob_tbl order by runoob_id;

SELECT
    *,
    _sign,
    _version
FROM runoob_tbl
ORDER BY runoob_id ASC

Query id: e9cb0574-fcd5-4336-afa3-05f0eb035d97

┌─runoob_id─┬─runoob_title───┬─runoob_author─┬─submission_date─┬─_sign─┬─_version─┐
│         1 │ MySQL-learning │ Bob           │      2021-01-06 │     1 │        2 │
└───────────┴────────────────┴───────────────┴─────────────────┴───────┴──────────┘
┌─runoob_id─┬─runoob_title───┬─runoob_author─┬─submission_date─┬─_sign─┬─_version─┐
│         2 │ MySQL-learning │ Mike          │      2021-01-06 │    -1 │        5 │
└───────────┴────────────────┴───────────────┴─────────────────┴───────┴──────────┘
┌─runoob_id─┬─runoob_title───┬─runoob_author─┬─submission_date─┬─_sign─┬─_version─┐
│         2 │ MySQL-learning │ Mike          │      2021-01-06 │     1 │        4 │
│         2 │ MySQL-learning │ Tim           │      2021-01-06 │     1 │        3 │
└───────────┴────────────────┴───────────────┴─────────────────┴───────┴──────────┘
4 rows in set. Elapsed: 0.002 sec.

可以看到,刪除id為2的行只是額外插入了_sign == -1的一行記錄,并沒有真正刪掉。

日志回放

MySQL 主從間數據同步時Slave節點將 BinLog Event 轉換成相應的SQL語句,Slave 模擬 Master 寫入。類似地,傳統第三方插件沿用了MySQL主從模式的BinLog消費方案,即將 Event 解析后轉換成 ClickHouse 兼容的 SQL 語句,然后在 ClickHouse 上執行(回放),但整個執行鏈路較長,通常性能損耗較大。不同的是,MaterializeMySQL 引擎提供的內部數據解析以及回寫方案隱去了三方插件的復雜鏈路。回放時將 BinLog Event 轉換成底層 Block 結構,然后直接寫入底層存儲引擎,接近于物理復制。此方案可以類比于將 BinLog Event 直接回放到 InnoDB 的 Page 中。

同步策略

日志回放

v20.9.1版本前是基于位點同步的,ClickHouse每消費完一批 BinLog Event,就會記錄 Event 的位點信息到 .metadata 文件:

[FavonianKong@Wsl[20:42:37]slave_db]
$ cat ./.metadata
Version:        2
Binlog File:    mysql-bin.000003
Binlog Position:355005999
Data Version:   5

這樣當 ClickHouse 再次啟動時,它會把 {‘mysql-bin.000003’, 355005999} 二元組通過協議告知 MySQL Server,MySQL 從這個位點開始發送數據:

s1> ClickHouse 發送 {‘mysql-bin.000003’, 355005999} 位點信息給 MySQL
s2> MySQL 找到本地 mysql-bin.000003 文件并定位到 355005999 偏移位置,讀取下一個 Event 發送給 ClickHouse
s3> ClickHouse 接收 binlog event 并完成同步操作
s4> ClickHouse 更新 .metadata位點

存在問題:

如果MySQL Server是一個集群,通過VIP對外服務,MaterializeMySQL創建 database 時 host 指向的是VIP,當集群主從發生切換后,{Binlog File, Binlog Position} 二元組不一定是準確的,因為BinLog可以做reset操作。

s1> ClickHouse 發送 {'mysql-bin.000003’, 355005999} 給集群新主 MySQL
s2> 新主 MySQL 發現本地沒有 mysql-bin.000003 文件,因為它做過 reset master 操作,binlog 文件是 mysql-bin.000001
s3> 產生錯誤復制

為了解決這個問題,v20.9.1版本后上線了 GTID 同步模式,廢棄了不安全的位點同步模式。

GTID同步

GTID模式為每個 event 分配一個全局唯一ID和序號,直接告知 MySQL 這個 GTID 即可,于是.metadata變為:

[FavonianKong@Wsl[21:30:19]slave_db]
Version:        2
Binlog File:    mysql-bin.000003
Executed GTID:  0857c24e-4755-11eb-888c-00155dfbdec7:1-783
Binlog Position:355005999
Data Version:   5

其中 0857c24e-4755-11eb-888c-00155dfbdec7 是生成 Event的主機UUID,1-783是已經同步的event區間

于是流程變為:

s1> ClickHouse 發送 GTID:0857c24e-4755-11eb-888c-00155dfbdec7:1-783 給 MySQL
s2> MySQL 根據 GTID 找到本地位點,讀取下一個 Event 發送給 ClickHouse
s3> ClickHouse 接收 BinLog Event 并完成同步操作
s4> ClickHouse 更新 .metadata GTID信息

源碼分析

概述

在最新源碼 (v20.13.1.1) 中,ClickHouse 官方對 DatabaseMaterializeMySQL 引擎的相關源碼進行了重構,并適配了 GTID 同步模式。ClickHouse 整個項目的入口 main 函數在 /ClickHouse/programs/main.cpp 文件中,主程序會根據接收指令將任務分發到 ClickHouse/programs 目錄下的子程序中處理。本次分析主要關注 Server 端 MaterializeMySQL 引擎的工作流程。

源碼目錄

與 MaterializeMySQL 相關的主要源碼路徑:

ClickHouse/src/databases/MySQL   //MaterializeMySQL存儲引擎實現
ClickHouse/src/Storages/         //表引擎實現
ClickHouse/src/core/MySQL*       //復制相關代碼
ClickHouse/src/Interpreters/     //Interpreters實現,SQL的rewrite也在這里處理
ClickHouse/src/Parsers/MySQL     //解析部分實現,DDL解析等相關處理在這里

服務端主要流程

ClickHouse 使用 POCO 網絡庫處理網絡請求,Client連接的處理邏輯在 ClickHouse/src/Server/*Handler.cpp 的 hander方法里。以TCP為例,除去握手,初始化上下文以及異常處理等相關代碼,主要邏輯可以抽象成:

// ClickHouse/src/Server/TCPHandler.cpp
TCPHandler.runImpl()
{
    ...
    while(true) {
        ...
        if (!receivePacket())  //line 184
                continue
        /// Processing Query   //line 260
        state.io = executeQuery(state.query, *query_context, ...);
    ...
}

數據同步預處理

Client發送的SQL在executeQuery函數處理,主要邏輯簡化如下:

// ClickHouse/src/Interpreters/executeQuery.cpp
static std::tuple executeQueryImpl(...)
{
    ...
    // line 354,解析器可配置
    ast = parseQuery(...); 
    ...
    // line 503, 根據語法樹生成interpreter
    auto interpreter = InterpreterFactory::get(ast, context, ...);
    ...
    // line 525, 執行器interpreter執行后返回結果
    res = interpreter->execute();
    ...
}

主要有三點:

1、解析SQL語句并生成語法樹 AST
2、InterpreterFactory 工廠類根據 AST 生成執行器
3、interpreter->execute()

跟進第三點,看看 InterpreterCreateQuery 的 excute() 做了什么:

// ClickHouse/src/Interpreters/InterpreterCreateQuery.cpp
BlockIO InterpreterCreateQuery::execute()
{
    ...
    // CREATE | ATTACH DATABASE
    if (!create.database.empty() && create.table.empty())
        // line 1133, 當使用MaterializeMySQL時,會走到這里建庫
        return createDatabase(create);  
}

這里注釋很明顯,主要執行 CREATE 或 ATTACH DATABASE,繼續跟進 createDatabase() 函數:

// ClickHouse/src/Interpreters/InterpreterCreateQuery.cpp
BlockIO InterpreterCreateQuery::createDatabase(ASTCreateQuery & create)
{
    ...
    // line 208, 這里會根據 ASTCreateQuery 參數,從 DatabaseFactory 工廠獲取數據庫對象
    // 具體可以參考 DatabasePtr DatabaseFactory::getImpl() 函數
    DatabasePtr database = DatabaseFactory::get(create, metadata_path, ...); 
    ...
    // line 253, 多態調用,在使用MaterializeMySQL時
    // 上方get函數返回的是 DatabaseMaterializeMySQL
    database->loadStoredObjects(context, ...);
}

到這里,相當于將任務分發給DatabaseMaterializeMySQL處理,接著跟蹤 loadStoredObjects 函數:

//ClickHouse/src/Databases/MySQL/DatabaseMaterializeMySQL.cpp
template
void DatabaseMaterializeMySQL::loadStoredObjects(Context & context, ...)
{
    Base::loadStoredObjects(context, has_force_restore_data_flag, force_attach);
    try
    {
        // line87, 這里啟動了materialize的同步線程
        materialize_thread.startSynchronization(); 
        started_up = true;
    }
    catch (...)
  ...
}

跟進startSynchronization() 綁定的執行函數:

// ClickHouse/src/Databases/MySQL/MaterializeMySQLSyncThread.cpp
void MaterializeMySQLSyncThread::synchronization()
{
    ...
    // 全量同步在 repareSynchronized() 進行
    if (std::optional metadata = prepareSynchronized())
    {
        while (!isCancelled())
        {
            UInt64 max_flush_time = settings->max_flush_data_time;
            BinlogEventPtr binlog_event = client.readOneBinlogEvent(...);
            {
                //增量同步偵聽binlog_envent
                if (binlog_event)
                    onEvent(buffers, binlog_event, *metadata);
            }
        }
    }
  ...
}

全量同步

MaterializeMySQLSyncThread::prepareSynchronized 負責DDL和全量同步,主要流程簡化如下:

// ClickHouse/src/Databases/MySQL/MaterializeMySQLSyncThread.cpp
std::optional MaterializeMySQLSyncThread::prepareSynchronized()
{
    while (!isCancelled())
    {
        ...
        try
        {
            //構造函數內會獲取MySQL的狀態、MySQL端的建表語句,
            MaterializeMetadata metadata(connection, ...);
            // line345, DDL相關轉換
            metadata.transaction(position, [&]() 
            {
             cleanOutdatedTables(database_name, global_context);
                dumpDataForTables(connection, metadata, global_context, ...);
            });
 
            return metadata;
        }
        ...
   }
}

ClickHouse作為MySQL從節點,在MaterializeMetadata構造函數中對MySQL端進行了一系列預處理:

1、將打開的表關閉,同時對表加上讀鎖并啟動事務
2、TablesCreateQuery通過SHOW CREATE TABLE 語句獲取MySQL端的建表語句
3、獲取到建表語句后釋放表鎖

繼續往下走,執行到 metadata.transaction() 函數,該調用傳入了匿名函數作為參數,一直跟進該函數會發現最終會執行匿名函數,也就是cleanOutdatedTables以及dumpDataForTables函數,主要看一下 dumpDataForTables 函數:

// ClickHouse/src/Databases/MySQL/MaterializeMySQLSyncThread.cpp
static inline void dumpDataForTables(...)
{
    ...
    //line293, 這里執行建表語句
    tryToExecuteQuery(..., query_context, database_name, comment); 
}

繼續跟蹤 tryToExecuteQuery 函數,會調用到 executeQueryImpl() 函數,上文提到過這個函數,但這次我們的上下文信息變了,生成的執行器發生變化,此時會進行 DDL 轉化以及 dump table 等操作:

// ClickHouse/src/Interpreters/executeQuery.cpp
static std::tuple executeQueryImpl(...)
{
    ... 
    // line 354,解析器可配置
    ast = parseQuery(...); 
    ...
    // line 503,這里跟之前上下文信息不同,生成interpreter也不同
    auto interpreter = InterpreterFactory::get(ast,context, ...);
    ...
    // line 525, 執行器interpreter執行后返回結果
    res = interpreter->execute(); 
    ...
}

此時 InterpreterFactory 返回 InterpreterExternalDDLQuery,跟進去看 execute 函數做了什么:

// ClickHouse/src/Interpreters/InterpreterExternalDDLQuery.cpp
BlockIO InterpreterExternalDDLQuery::execute()
{
    ...
    if (external_ddl_query.from->name == "MySQL")
    {
#ifdef USE_MYSQL
        ...
        // line61, 當全量復制執行DDL時,會執行到這里
        else if (...->as())
            return MySQLInterpreter::InterpreterMySQLCreateQuery(
            external_ddl_query.external_ddl, cogetIdentifierName(arguments[0]),
            getIdentifierName(arguments[1])).execute();
#endif
    }
 ...
  return BlockIO();
}

繼續跟進去看看 getIdentifierName(arguments[1])).execute() 做了什么事情:

// ClickHouse/src/Interpreters/MySQL/InterpretersMySQLDDLQuery.h
class InterpreterMySQLDDLQuery : public IInterpreter
{
    public:
    ...
    BlockIO execute() override
    {
        ...
        // line68, 把從MySQL獲取到的DDL語句進行轉化
        ASTs rewritten_queries = InterpreterImpl::getRewrittenQueries(
                   query, context, mapped_to_database, mysql_database);
 
        // line70, 這里執行轉化后的DDL語句
        for (const auto & rewritten_query : rewritten_queries)
            executeQuery(..., queryToString(rewritten_query), ...);

        return BlockIO{};
    }
    ...
}

進一步看 InterpreterImpl::getRewrittenQueries 是怎么轉化 DDL 的:

// ClickHouse/src/Interpreters/MySQL/InterpretersMySQLDDLQuery.cpp
ASTs InterpreterCreateImpl::getRewrittenQueries(...)
{
    ...
    // 檢查是否存在primary_key, 沒有直接報錯
    if (primary_keys.empty())
        throw Exception("cannot be materialized, no primary keys.", ...);
    ...
    // 添加 _sign 和 _version 列.
    auto sign_column_name = getUniqueColumnName(columns_name_and_type, "_sign");
    auto version_column_name = getUniqueColumnName(columns_name_and_type, "_version");

    // 這里悄悄把建表引擎修改成了ReplacingMergeTree
    storage->set(storage->engine, makeASTFunction("ReplacingMergeTree", ...));
    ...
    return ASTs{rewritten_query};
}

完成DDL轉換之后就會去執行新的DDL語句,完成建表操作,再回到 dumpDataForTables:

// ClickHouse/src/Databases/MySQL/MaterializeMySQLSyncThread.cpp
static inline void dumpDataForTables(...)
{
    ...
    //line293, 這里執行建表語句
    tryToExecuteQuery(..., query_context, database_name, comment);
    ...
    // line29, 這里開始 dump 數據并存放到MySQLBlockInputStream
   MySQLBlockInputStream input(connection, ...);
}

增量同步

還記得startSynchronization() 綁定的執行函數嗎?全量同步分析都是在 prepareSynchronized()進行的,那增量更新呢?

// ClickHouse/src/Databases/MySQL/MaterializeMySQLSyncThread.cpp
void MaterializeMySQLSyncThread::synchronization()
{
    ...
    // 全量同步在 repareSynchronized() 進行
    if (std::optional metadata = prepareSynchronized())
    {
        while (!isCancelled())
        {
            UInt64 max_flush_time = settings->max_flush_data_time;
            BinlogEventPtr binlog_event = client.readOneBinlogEvent(...);
            {
                //增量同步偵聽binlog_envent
                if (binlog_event)
                    onEvent(buffers, binlog_event, *metadata);
            }
        }
    }
    ...
}

可以看到,while 語句里有一個 binlog_event 的偵聽函數,用來偵聽 MySQL 端 BinLog 日志變化,一旦 MySQL 端執行相關操作,其 BinLog 日志會更新并觸發 binlog_event,增量更新主要在這里進行。

// ClickHouse/src/Databases/MySQL/MaterializeMySQLSyncThread.cpp
void MaterializeMySQLSyncThread::onEvent(Buffers & buffers, const BinlogEventPtr & receive_event, MaterializeMetadata & metadata)
{ 
    // 增量同步通過監聽binlog event實現,目前支持四種event:MYSQL_WRITE_ROWS_EVENT、
    // MYSQL_UPDATE_ROWS_EVENT、MYSQL_DELETE_ROWS_EVENT 和 MYSQL_QUERY_EVENT
    // 具體的流程可以查找對應的 onHandle 函數, 不在此詳細分析
    if (receive_event->type() == MYSQL_WRITE_ROWS_EVENT){...}
    else if (receive_event->type() == MYSQL_UPDATE_ROWS_EVENT){...}
    else if (receive_event->type() == MYSQL_DELETE_ROWS_EVENT){...}
    else if (receive_event->type() == MYSQL_QUERY_EVENT){...}
    else {/* MYSQL_UNHANDLED_EVENT*/}
}

小結

MaterializeMySQL 引擎是 ClickHouse 官方2020年主推的特性,由于該特性在生產環境中屬于剛需且目前剛上線不久,整個模塊處于高速迭代的狀態,因此有許多待完善的功能。例如復制過程狀態查看以及數據的一致性校驗等。感興趣的話可參考Github上的2021-Roadmap,里面會更新一些社區最近得計劃。以上內容如有理解錯誤還請指正。

引用

ClickHouse社區文檔

ClickHouse社區源碼

MySQL實時復制與實現

MaterializeMySQL引擎分析

本文分享自華為云社區《MySQL到ClickHouse的高速公路-MaterializeMySQL引擎》,原文作者:FavonianKong 。

點擊關注,第一時間了解華為云新鮮技術~

總結

以上是生活随笔為你收集整理的Materialize MySQL引擎:MySQL到Click House的高速公路的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

色福利网| 伊人国产在线观看 | 国产精品成人国产乱一区 | 亚洲人片在线观看 | 狠狠狠狠狠狠狠狠干 | 中文字幕在线播放日韩 | 日日夜夜免费精品 | 亚洲毛片在线观看. | 亚洲精品99久久久久中文字幕 | 久久精品国产美女 | 亚洲欧美日韩中文在线 | 激情欧美xxxx| 久久久久久久久久久免费 | 精品福利在线观看 | 久久婷婷精品视频 | 久久黄页 | 天天操夜 | 日韩电影精品 | 欧美一区二区在线刺激视频 | 91一区二区三区久久久久国产乱 | 欧美贵妇性狂欢 | 中文字幕国产一区二区 | 久久免费国产精品 | 五月婷婷综合在线视频 | 色噜噜噜噜 | 国产日韩在线视频 | 日韩在线高清 | 国产精品久久久一区二区 | 成人黄色电影在线观看 | 国产精品久久中文字幕 | 成人a视频在线观看 | 国产香蕉97碰碰碰视频在线观看 | 国产一级二级在线 | 黄色av电影免费观看 | 免费看成人片 | 国产精品成人品 | 中文 一区二区 | 日韩中文字幕免费看 | 日本天天操 | 国产一级片免费观看 | 亚洲精品短视频 | 懂色av一区二区三区蜜臀 | 国内精品久久久久影院一蜜桃 | 国产精品欧美日韩 | 伊人影院在线观看 | 欧洲亚洲女同hd | 五月激情丁香婷婷 | 久久久久久久免费观看 | 欧美一区二区在线刺激视频 | 午夜在线看 | 国产在线观看国语版免费 | 国产精品18久久久久久久网站 | 超碰.com | 精品一区二区亚洲 | 日韩av一区二区在线 | 国产一区二区精品在线 | 国产欧美精品在线观看 | 日韩一区二区三免费高清在线观看 | 亚洲电影一区二区 | 成人亚洲精品久久久久 | 伊人天堂网 | 久热免费在线观看 | 91麻豆产精品久久久久久 | caobi视频| 99久久精品视频免费 | 成人福利在线观看 | 国产高清在线不卡 | 精品视频123区在线观看 | 精品欧美一区二区在线观看 | 91精品久久香蕉国产线看观看 | 久久久久久久久网站 | 久久久久久久国产精品视频 | 99综合影院在线 | 亚洲欧美精品一区 | av免费试看 | 成年人在线免费看片 | 中文字幕免费高清av | 久久久高清免费视频 | 天天操 夜夜操 | 欧美成人tv| 日本久久中文字幕 | 99精品视频在线看 | 精品国产一区二区三区在线 | 狠狠插狠狠操 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 国产精品理论在线观看 | 婷婷九九| 九九在线免费视频 | 国产伦理精品一区二区 | 日韩在线观看电影 | 在线观看国产日韩 | 91激情视频在线观看 | 国产精品久久麻豆 | 久久午夜国产精品 | 国产超碰在线 | 久久观看免费视频 | 91视频com| 色欧美88888久久久久久影院 | 97在线免费观看视频 | 美女免费视频一区 | 日韩女同一区二区三区在线观看 | 久久免费视频在线 | 2022中文字幕在线观看 | 久久精品久久久久电影 | 亚洲 欧美变态 另类 综合 | 一区在线播放 | 精品久久网 | 91视频在线网址 | 九九热视频在线 | 国产一区二区视频在线播放 | 国产色拍拍拍拍在线精品 | 中文字幕 国产视频 | 久久精品国产免费 | 日本久久高清视频 | www激情com | av 一区 二区 久久 | 波多野结衣电影久久 | 日韩欧美视频在线播放 | 97视频在线观看视频免费视频 | avove黑丝| 国产精品第| 草久热| 在线观看亚洲国产精品 | 婷婷丁香七月 | 国产在线看一区 | 伊人狠狠色丁香婷婷综合 | 一级黄色免费 | 天天插狠狠插 | 日韩特黄一级欧美毛片特黄 | 日日操日日操 | 五月天天av | av资源中文字幕 | 黄网站污 | 亚洲精品国产精品久久99 | 久久66热这里只有精品 | 瑞典xxxx性hd极品| 日韩电影精品 | 一级免费黄视频 | 天天操天天综合网 | 不卡av免费在线观看 | 国产91区 | 日韩精品首页 | 国产日韩精品一区二区 | 日日干夜夜干 | 成人免费视频免费观看 | 激情综合中文娱乐网 | 91久久精品日日躁夜夜躁国产 | 婷婷国产精品 | 91精品秘密在线观看 | 在线观看你懂的网址 | 国产一区二区高清 | 国产精品日韩欧美 | 一区在线播放 | 久久久麻豆 | 亚洲国产mv | 黄色小说视频网站 | 久久国产精品免费 | 狠狠的操| 9797在线看片亚洲精品 | www.在线观看av | 国内精品久久久久影院日本资源 | 视频 天天草 | 亚洲永久国产精品 | 国产码电影 | 亚洲精品乱码久久久久久蜜桃91 | 国产精品第二十页 | 精品国产a | 日本久久久久久久久久久 | 中文字幕一区二区三区久久 | 国产一区二区观看 | 黄色1级大片 | 亚洲国产精品久久久 | 久久精品免费电影 | 国产精品中文字幕在线 | 麻豆精品视频在线 | 波多野结衣日韩 | 四虎成人精品永久免费av | 成年人视频在线观看免费 | 国产精品美女视频 | 久久久久久草 | 日本黄色免费观看 | 亚洲视频精品 | 欧美成人精品三级在线观看播放 | 国产剧情久久 | 99久热在线精品视频观看 | 日韩在线电影观看 | h视频在线看 | 91精品视频播放 | 天天色天天 | 天天干天天天天 | 亚洲精品国精品久久99热一 | 中文字幕在线视频一区二区 | 午夜精品久久久久久久久久久久久久 | 久久av免费 | 日韩电影在线观看中文字幕 | 久久激情久久 | 人人视频网站 | 99激情网 | 福利视频一区二区 | 成人精品视频久久久久 | 成人avav| 久久色在线观看 | 欧美福利在线播放 | 黄av在线| a天堂中文在线 | 精品亚洲免a | 91在线免费视频观看 | 成人免费看视频 | 国产精品岛国久久久久久久久红粉 | 成人禁用看黄a在线 | 日日骑| 波多野结衣精品视频 | 国产精品 日韩 | 草久视频在线观看 | 2019中文 | 黄色一级大片在线免费看产 | 成人免费色 | 国产专区一 | 日韩精品视频一二三 | 亚洲狠狠操 | 狠狠黄 | 成人在线视频网 | 国产理论一区二区三区 | 免费在线观看一级片 | 免费中文字幕在线观看 | 一区二区中文字幕在线播放 | 天天草天天色 | 麻豆91网站| 午夜婷婷在线播放 | 亚洲国产欧洲综合997久久, | www.69xx | 黄色网www| 久久艹艹 | av免费在线播放 | 99免费国产 | 久草在线最新免费 | 91精品国产92久久久久 | 成年人在线播放视频 | 久久av在线播放 | av电影不卡 | 91久久偷偷做嫩草影院 | 色99导航| 国产玖玖在线 | 免费在线中文字幕 | 天天干人人 | 亚州国产精品 | 色综合久久综合中文综合网 | av成人动漫在线观看 | 国产精品久久久久久久久毛片 | 成人毛片在线观看视频 | 91香蕉国产在线观看软件 | 国产一区二区影院 | 96精品视频 | 九色精品免费永久在线 | 91尤物国产尤物福利在线播放 | 91久久久久久国产精品 | 午夜色站 | 久99久精品 | 开心激情网五月天 | 国产乱对白刺激视频在线观看女王 | 五月婷婷视频在线观看 | 精品欧美一区二区在线观看 | 激情综合电影网 | 美女久久久久久久 | 免费a级大片 | 亚洲天堂香蕉 | 久久天天躁夜夜躁狠狠85麻豆 | 91精彩在线视频 | 在线成人短视频 | 中文字幕在线看人 | 天天摸天天舔 | 日韩精品免费一区 | 中文字幕美女免费在线 | 亚洲欧美观看 | 国内揄拍国产精品 | 日韩精品一区二区三区在线播放 | 色在线网站 | 精品国产成人av在线免 | 免费视频一二三区 | 天天操偷偷干 | 日韩网站在线观看 | 欧美 亚洲 另类 激情 另类 | 91在线视频导航 | 99精品国产一区二区三区麻豆 | 国产精品99蜜臀久久不卡二区 | 欧美精品二 | 天天草天天插 | 午夜狠狠操 | 亚洲欧美激情插 | 99精品视频在线播放免费 | 亚洲精品在线观看免费 | 国产二区视频在线 | 久久久久久久国产精品 | 欧美性久久久 | 久久影院中文字幕 | 香蕉视频国产在线观看 | 99国内精品久久久久久久 | 91精品第一页 | 精品一区 精品二区 | 久久久久福利视频 | 欧美天天射 | 国产精品欧美一区二区三区不卡 | 国产中文字幕在线看 | 成片免费观看视频999 | a级国产片 | 美女视频久久 | 久久黄色片子 | 成年人国产在线观看 | 国产一区二区三区午夜 | 国产一级二级在线播放 | 亚州av一区 | 日韩在线中文字幕视频 | 很黄很色很污的网站 | 狠狠干夜夜爽 | 成人久久久久久久久久 | 欧美性天天 | 99热国产在线 | 欧美日韩中文视频 | 久久精品视频一 | 亚洲国产成人精品电影在线观看 | 区一区二区三在线观看 | 天天操人人干 | 98久久| 免费在线日韩 | 亚洲精品女 | 久久精品国产免费看久久精品 | 干天天| 免费av小说 | 91精品麻豆 | 久久久久婷 | 国产亚洲精品无 | 91热精品 | 91亚洲精品久久久蜜桃网站 | 91午夜精品| 99色在线视频 | 久久久久久美女 | 国产小视频你懂的 | 欧美激情精品久久久 | 中文字幕在线免费观看视频 | 天天婷婷| 欧洲一区二区在线观看 | 美女黄视频免费看 | 91免费的视频在线播放 | 久草免费在线视频观看 | 久久成人一区二区 | 欧美精品日韩 | 久久久久女人精品毛片九一 | 不卡精品视频 | 国产精品久久久久av福利动漫 | 在线观看亚洲视频 | 欧美国产一区二区 | 99re6热在线精品视频 | 日韩理论在线 | 亚洲波多野结衣 | 中文字幕一区二区三区久久蜜桃 | www.久久精品视频 | 久久99精品一区二区三区三区 | 91插插插网站 | 国产黄免费 | 日韩电影一区二区三区 | 美女视频是黄的免费观看 | av免费网站在线观看 | 中文伊人 | 国产精品免费在线观看视频 | 99精彩视频在线观看免费 | 国产精品二区在线观看 | 成人黄色大片在线免费观看 | 日韩欧美高清一区二区 | 久精品视频免费观看2 | 成人国产一区 | 色天天综合久久久久综合片 | www.久久色 | 91亚洲精品乱码久久久久久蜜桃 | 久久免费视屏 | 91在线看片| 日本护士三级少妇三级999 | 丁香五婷 | 中文字幕日韩有码 | 国产精品黄色影片导航在线观看 | 日本护士三级少妇三级999 | 波多野结衣在线视频免费观看 | 五月婷婷.com | 中文字幕在线观看日本 | 色视频在线免费观看 | 亚洲人av免费网站 | 九九热视频在线播放 | 国产精品美女久久久久久 | 91精品一区二区在线观看 | 久草在在线视频 | 久久久久久网址 | 青青草国产精品视频 | 精品在线视频一区二区三区 | 二区三区视频 | 亚洲精品久久久蜜桃 | 免费精品在线观看 | 成人黄色小说在线观看 | 日韩在线免费视频 | 国产99久久久国产精品成人免费 | 日韩啪啪小视频 | 丝袜网站在线观看 | 国产亚洲在线视频 | 国产理论影院 | 96亚洲精品久久久蜜桃 | 黄色av一区二区 | 中文理论片 | 国产一区精品在线观看 | 偷拍视频一区 | 亚洲精品久久久蜜桃直播 | 激情综合中文娱乐网 | 十八岁免进欧美 | 国产精品成人自产拍在线观看 | 国产精品视频内 | 999热线在线观看 | 久久电影中文字幕视频 | 亚洲电影av在线 | 亚洲国产合集 | 久久精品com | 国产日韩欧美在线 | 久久免费影院 | 亚洲激情国产精品 | 草久久久久久久 | 亚洲成人黄色 | 超碰人人舔 | 色偷偷88888欧美精品久久久 | 91亚洲精| 日韩免费网站 | 日日夜夜精品免费观看 | 久草视频手机在线 | 国产网站av | 日本少妇视频 | 正在播放国产一区 | 99视频精品免费观看, | 久久99久久精品国产 | 免费色视频网址 | 中文字幕久久精品一区 | 成人久久久久久久久 | 中文字幕第一页在线视频 | 97超碰国产在线 | 日韩电影中文,亚洲精品乱码 | 亚洲国产精品电影 | 青青久草在线视频 | 久久国产精品一区二区三区 | 激情欧美日韩一区二区 | 五月天婷婷丁香花 | 蜜桃视频日本 | 国产精品久久久久国产精品日日 | 欧美日韩一区二区在线观看 | 日韩在线国产精品 | 国产淫片免费看 | 天天拍夜夜拍 | 欧美黄色软件 | 在线成人中文字幕 | 天天干 天天摸 天天操 | 在线电影a | 亚州国产精品久久久 | 国产视频在线免费观看 | 国产xvideos免费视频播放 | 狠狠色丁香婷婷综合久久片 | 久草五月| 天堂av在线中文在线 | 婷婷天天色 | 人人爽网站 | 国产一区播放 | 精品国产99 | 免费在线电影网址大全 | 中文资源在线官网 | 激情婷婷综合网 | 国产原创在线 | 久久久精品国产免费观看一区二区 | 夜色资源站wwwcom | 中文字幕av全部资源www中文字幕在线观看 | 五月激情六月丁香 | 成人中文字幕在线 | 99久在线精品99re8热视频 | 99久久99热这里只有精品 | 国产精品每日更新 | 99久久综合精品五月天 | 精品国产精品久久 | 97色狠狠| 九九精品视频在线观看 | 日本mv大片欧洲mv大片 | 91九色成人蝌蚪首页 | 热久久免费视频精品 | 久久特级毛片 | 人人狠狠综合久久亚洲 | 色婷婷国产 | 久久精品专区 | 人人艹视频 | 亚洲精品一区中文字幕乱码 | 国内视频 | 婷婷色中文网 | 狠狠综合| 九热精品| 国产专区在线视频 | 欧美少妇影院 | 中文字幕亚洲综合久久五月天色无吗'' | av一级二级 | 狠狠色丁香婷婷 | 天天操天天玩 | 香蕉一区| 中文字幕二区在线观看 | 十八岁以下禁止观看的1000个网站 | 色婷婷精品大在线视频 | 最新av网址在线观看 | 国产精品va在线播放 | 99在线热播精品免费99热 | 日韩免费中文字幕 | 亚洲干 | 看av免费| 超碰在线99 | 国产精品久久久久久久久久久久久久 | 深爱婷婷网 | 天天插夜夜操 | 久久激情小视频 | 丁香婷婷综合色啪 | 毛片一级免费一级 | 992tv又爽又黄的免费视频 | 97免费视频在线 | 日韩在线网址 | 成人网中文字幕 | 久久久99精品免费观看乱色 | 久久久久9999亚洲精品 | 日韩精品中文字幕在线 | 在线中文字幕观看 | 亚洲欧美视频在线播放 | 国产精品久久久一区二区三区网站 | 看毛片网站| 免费h视频 | 免费久久99精品国产 | 色夜视频 | av中文国产 | 综合视频在线 | 久久视频免费 | 欧美一区日韩一区 | 中文字幕一区二区三区四区久久 | 在线天堂v | www亚洲一区| 狠狠色伊人亚洲综合网站野外 | 精品在线观看一区二区三区 | 日韩精品一区电影 | 中文av日韩| 婷婷.com| 91av电影在线观看 | 精品国产一区二区三区四区在线观看 | av色综合网 | 玖玖精品在线 | 日韩视频三区 | 欧美成人性战久久 | 久草在线资源网 | 国产精品国产自产拍高清av | 91在线免费视频观看 | 色噜噜在线观看 | 黄色精品一区二区 | 国产精品久久久视频 | www日韩在线 | 亚洲黄色成人网 | 午夜免费久久看 | 在线观看色网 | 精品99久久 | 国产成人a亚洲精品v | 成人福利在线播放 | 国产精品久久久av | 国产精品久久久久久久婷婷 | bbbb操bbbb | 天天操天天射天天爽 | 精品国产乱码一区二 | a在线观看视频 | 国产中文字幕一区二区 | 亚洲精品乱码白浆高清久久久久久 | 日韩毛片精品 | 九九精品久久久 | 欧美视频在线观看免费网址 | 国产探花在线看 | 成年人毛片在线观看 | 成人免费观看网站 | 人人澡人人爽 | 91精品一区二区三区久久久久久 | 99se视频在线观看 | 97福利视频 | 99久久久久久久久 | 午夜精品久久久99热福利 | 99国产精品一区二区 | 91专区在线观看 | 国产精品网站一区二区三区 | 911久久| 国产一级二级在线观看 | 久久精品视频在线观看 | 97超碰人人| 精品国产色 | 91天天操 | 亚洲一区二区高潮无套美女 | 国产亚洲精品综合一区91 | 日日噜噜噜噜夜夜爽亚洲精品 | 三级性生活视频 | 久久久久久久国产精品 | 这里只有精品视频在线观看 | 午夜电影 电影 | 国产色婷婷精品综合在线手机播放 | 久久国产麻豆 | 天天操夜操 | 婷婷丁香激情五月 | 五月开心六月伊人色婷婷 | 成人蜜桃 | 亚州性色| 亚洲六月丁香色婷婷综合久久 | 国产婷婷精品av在线 | 在线观看一区二区视频 | 国产精品一级视频 | 国产精品一区在线 | 国产日韩av在线 | 日韩大片在线观看 | 国产精品 日韩精品 | 免费成人黄色片 | 热99在线| 二区视频在线观看 | 狠狠操综合网 | 精品久久久久亚洲 | 日本精品久久久久 | 韩国av一区二区三区在线观看 | 五月天六月丁香 | 婷婷六月网 | 国产99在线免费 | 久久精品视频免费播放 | 国产成人精品一区一区一区 | 91精品国产99久久久久 | 久久久精品 一区二区三区 国产99视频在线观看 | 国产亚洲日本 | 99久精品 | 综合激情婷婷 | 欧美污在线观看 | 久久久久久久久久久国产精品 | 国产精品观看视频 | 久久九九九九 | 人人玩人人弄 | 日韩理论电影在线 | 国产一区在线视频 | www.夜夜爽 | 不卡的av在线 | 成人av直播 | 五月天丁香视频 | 91免费网 | 精品国产免费一区二区三区五区 | 亚洲欧洲中文日韩久久av乱码 | 97超碰人人模人人人爽人人爱 | 91天天视频| 日韩在线免费高清视频 | 91在线porny国产在线看 | 欧美国产亚洲精品久久久8v | 中文字幕av一区二区三区四区 | 日韩欧美高清视频在线观看 | 三级在线视频观看 | 日韩美女免费线视频 | 最近日本韩国中文字幕 | av日韩中文 | 国产免费黄色 | 日韩视频一区二区三区 | 久久线视频 | 国产欧美日韩视频 | 国产美女网站视频 | 精品国产乱码久久久久久天美 | 三上悠亚一区二区在线观看 | 国产 欧美 日韩 | 黄色av电影免费观看 | 超碰人人99 | 国产成在线观看免费视频 | 99这里精品 | 久久国产精品精品国产色婷婷 | 国产精品久久久久久999 | 天天草天天干天天 | 99在线观看视频网站 | 天天操天天拍 | 久久任你操 | 97国产一区 | av一区二区三区在线播放 | 亚洲美女视频网 | 婷婷婷国产在线视频 | 六月色婷| 欧美二区视频 | 亚洲日韩精品欧美一区二区 | 国产偷v国产偷∨精品视频 在线草 | 狠狠色伊人亚洲综合成人 | 成人理论在线观看 | 免费成人av在线 | 最新国产在线视频 | 亚洲精品午夜一区人人爽 | 精品国产电影 | 国产一区在线免费观看视频 | 亚洲国产影院av久久久久 | www.久艹| 九九精品视频在线看 | 欧美精品网站 | 久久婷五月 | 嫩草av在线| 综合网婷婷| 人人澡超碰碰 | 亚洲黄色网络 | 国产成人黄色 | 久久国产系列 | 视频国产 | 天天操偷偷干 | 伊人中文网 | www.91成人| 美女搞黄国产视频网站 | 欧美一级片在线观看视频 | 免费视频成人 | 国产午夜精品理论片在线 | 成人午夜电影久久影院 | 91精品国产乱码久久桃 | 视频一区在线免费观看 | 国产精品久久一 | 天天综合网在线观看 | 国产无遮挡又黄又爽在线观看 | 西西4444www大胆无视频 | 日韩毛片在线播放 | 国产日韩视频在线观看 | 亚洲一级片免费观看 | 精品视频在线播放 | 激情五月看片 | 久久视频在线看 | 国产中文视频 | 婷婷综合电影 | 黄色片亚洲 | 国产免费叼嘿网站免费 | 国产在线观看,日本 | 狠狠干中文字幕 | 久久久久久久影院 | 久久在线免费视频 | 一区二区三区高清 | 中文字幕中文字幕在线一区 | 天天射成人 | 亚洲乱码在线观看 | 狠狠色丁香婷婷综合久小说久 | 天天摸天天操天天爽 | 久久99操| 国产99久久久国产 | 免费亚洲成人 | 国产99久 | 国产精品精品久久久 | 午夜少妇av | 国产高清成人在线 | 免费av在线播放 | 午夜视频免费在线观看 | 69精品在线 | 国产精品视频全国免费观看 | 亚洲国产丝袜在线观看 | 国产精品 日韩 | 婷婷香蕉 | 亚洲欧美精品在线 | 国产精品亚洲片在线播放 | 99国产精品一区二区 | 天天操天天舔天天爽 | 五月婷婷色丁香 | 免费久久久久久久 | 日韩视频免费看 | 国产精品美女久久久久久2018 | 超碰人人在线观看 | 国产在线资源 | 亚洲国产日韩精品 | 另类老妇性bbwbbw高清 | 久久国产精品免费看 | 国产精品入口久久 | 四虎小视频 | 中文字幕一区二区三 | 国产精品久久久久久久久久ktv | 在线色资源 | 国产精品国产毛片 | 日韩精选在线 | 久久免费在线观看 | 国产精品一区二区在线看 | 伊人永久 | 在线观看视频你懂 | 超碰av在线播放 | 久久中文字幕导航 | 久久久免费观看完整版 | 久久精品综合一区 | 在线观看中文字幕亚洲 | 天天操人| 午夜久久久久久久 | 日日夜夜免费精品视频 | 成人h视频在线播放 | 国产精品成人一区 | 成人av网址大全 | 久久免费视频99 | 深爱婷婷激情 | 奇米777777| 99精品免费网 | 日韩三级免费 | 久草国产在线 | 99视频在线精品 | av网站在线观看免费 | 丁香在线观看完整电影视频 | 久久精品视频一 | 亚洲欧美精品一区 | 欧美激情精品久久久久 | 天天干人人干 | 久久在线免费视频 | 丁香久久婷婷 | 黄色免费电影网站 | 亚洲精品在线观看不卡 | 国外调教视频网站 | 久久av中文字幕片 | 丁香在线观看完整电影视频 | 国产成人精品一区二区三区在线 | 日韩中文字幕a | 天天色图 | 天天躁日日躁狠狠躁 | 中文字幕在线第一页 | 色偷偷88888欧美精品久久 | 国产一区二区久久久久 | 日韩性xxx| 99热这里只有精品国产首页 | 亚洲欧美日韩一区二区三区在线观看 | 婷婷视频在线播放 | 亚洲丁香久久久 | 国产精品专区在线 | 亚洲 中文 欧美 日韩vr 在线 | 国产精品白浆视频 | 国产最新视频在线观看 | 亚洲精品成人免费 | 日韩免费高清在线观看 | 啪啪精品 | 国产色视频网站 | 天天干天天操天天射 | 久久激情视频 久久 | 在线观看av的网站 | av免费播放 | 久久视频网 | 国产精品 美女 | 中文字幕在线看视频国产中文版 | av在线播放一区二区三区 | 狠狠躁夜夜a产精品视频 | 91福利区一区二区三区 | 亚洲精品资源在线 | 国产成人a亚洲精品 | 91色综合| 久久五月婷婷综合 | 欧美精品久久久久久久久老牛影院 | www.久久免费 | 日韩欧美视频在线播放 | 一本之道乱码区 | 欧美色综合天天久久综合精品 | 黄色毛片大全 | 久久久久北条麻妃免费看 | 人人搞人人搞 | 国产精品videoxxxx | 久久人人97超碰com | 视频一区二区免费 | 久久午夜鲁丝片 | 激情婷婷欧美 | 99日韩精品 | 国产色视频一区二区三区qq号 | 国产xx视频| 色中文字幕在线观看 | 免费午夜av | www.香蕉| 国产九色在线播放九色 | 婷婷色吧 | 一区二区三区四区在线免费观看 | 久久综合久久八八 | 日韩精品免费一区二区三区 | 成人app在线免费观看 | 国产一区久久久 | 在线视频婷婷 | 国产精品一区二区久久精品 | 中文在线字幕免费观看 | 99久久婷婷国产一区二区三区 | 玖玖在线精品 | 91在线九色 | 国精产品永久999 | 狠狠伊人 | 亚洲精品久 | 91试看 | 久久综合狠狠综合久久综合88 | 97国产超碰在线 | 狠狠的操你| 91免费试看 | 天堂网在线视频 | 精品视频在线看 | 国产精品免费看久久久8精臀av | 91黄色在线视频 | 欧美精品亚州精品 | 在线你懂的视频 | 超碰97人人干 | 激情综合交| 国产中文字幕第一页 | 久久国产热 | 久久在线免费观看 | 亚洲精品乱码久久久久久按摩 | 久久精品99精品国产香蕉 | 夜夜躁日日躁狠狠躁 | 亚洲日日日 | 91精品久久香蕉国产线看观看 | 91传媒免费在线观看 | 天天操天天玩 | 日韩高清观看 | 91精品在线麻豆 | 欧美一级日韩三级 | 日韩精品免费一区二区在线观看 | 久久久精品免费看 | 亚洲人成在线电影 | 五月香婷 | 日韩一区二区免费在线观看 | 免费成人在线网站 | 黄在线免费看 | 毛片美女网站 | 日韩国产精品久久久久久亚洲 | 中文字幕在线观看一区 | a级黄色片视频 | 美女搞黄国产视频网站 | 午夜10000 | 久草久热 | 免费av大片 | 岛国大片免费视频 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 亚洲人人爱 | 国产精品免费视频一区二区 | 久久综合九色九九 | 日韩成人免费在线 | 亚洲成a人片综合在线 | 久草视频在线资源 | 91色视频 | 少妇资源站 | 天天躁日日躁狠狠躁 | 天天插日日插 | 中文日韩在线视频 | 日韩xxx视频 | 99久久激情 | 人人精久| 中文字幕 国产专区 | 最近久乱中文字幕 | 久久久久久国产精品999 | 天天拍天天爽 | 在线午夜电影神马影院 | 亚洲国产精品电影在线观看 | 黄色成人av在线 | 国产午夜精品一区二区三区 | 午夜精品成人一区二区三区 | 国产91精品一区二区麻豆网站 | 精品免费久久久久 | 亚洲精品久久久久58 | 四虎在线永久免费观看 | 伊人色综合久久天天 | 91av视频免费观看 | 久久久精品久久日韩一区综合 | 日韩一级网站 | 特级西西444www大胆高清无视频 | 久久国产成人午夜av影院潦草 | 婷婷性综合 | 色www精品视频在线观看 | 在线看国产视频 | 99re热精品视频 | 欧美了一区在线观看 | 日本视频高清 | 久久久久久久久网站 | 九九久久视频 | 激情xxxx | 国内免费久久久久久久久久久 | 又黄又爽的免费高潮视频 | 激情视频国产 | 婷婷激情综合五月天 | 97精品国自产拍在线观看 | 中文字幕在线观看不卡 | 亚洲清纯国产 | 欧洲视频一区 | 国产精品va最新国产精品视频 | 热久久精品在线 | 天天操综合网站 | 日韩成人免费在线观看 | 日韩久久精品一区二区三区 | 波多野结衣视频一区二区 | 成人91在线| 国产无套精品久久久久久 | 最新色视频 | 国产中的精品av小宝探花 | 日韩电影一区二区在线 | 色五丁香 | 女人18片| 国产成人一级电影 | 久久免费看a级毛毛片 | 国产精品久久久久毛片大屁完整版 | 亚洲 欧美 另类人妖 | 天天草天天插 | 九九99靖品 | 欧美日韩国产区 | 久久午夜免费视频 | 国产99一区视频免费 | 国产精品一区二区三区久久 | 亚洲中字幕 | 国产精品ssss在线亚洲 | av色图天堂网 | 五月天国产精品 | 免费在线黄色av | 四虎永久免费在线观看 | 玖玖爱在线观看 | www欧美色 | 久久免费视频在线观看 | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 久久优 |