精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

從實現原理來看為什么 Clone 插件比 Xtrabackup 更好用?

數據庫 其他數據庫
在 Xtrabackup 備份的過程中,可能遇到的最大的問題在于拷貝 Redo Log 的速度跟不上線上生產 Redo Log 的速度。

從 MySQL 8.0.17 版本開始,官方實現了 Clone 的功能,允許用戶通過簡單的 SQL 命令把遠端或本地的數據庫實例拷貝到其他實例后,快速拉起一個新的實例。

該功能由一些列的 WL 組成 :

  1. Clone local replica(WL#9209) :實現了數據本地 Clone。
  2. Clone remote replica(WL#9210) :在本地 Clone 的基礎上,實現了遠程 Clone。將數據保存到遠程的一個目錄中,解決跨節點部署 MySQL 的問題。
  3. Clone Remote provisioning(WL#11636) :將數據直接拷貝到需要重新初始化的 MySQL 實例中。此外這個 WL 還增加了預檢查的功能。
  4. Clone Replication Coordinates(WL#9211) :完成了獲取和保存 Clone 點位的功能,方便 Clone 實例正常的加入到集群中。
  5. Support cloning encrypted database (WL#9682) :最后一個 worklog 解決了數據加密情況下的數據拷貝問題。

本文主要初步的介紹 Clone Plugin 的原理以及和 Xtrabackup 的異同,以及整體實現的框架。

1.Xtrabackup 備份的不足

在 Xtrabackup 備份的過程中,可能遇到的最大的問題在于拷貝 Redo Log 的速度跟不上線上生產 Redo Log 的速度。

因為 Redo Log 是會循環利用的,當 CK 過后舊的 Redo Log 可能會被新的 Redo Log 覆蓋,而此時如果 Xtrabackup 沒有完成舊的 Redo Log 的拷貝,那么沒法保證備份過程中的數據一致性。

圖片圖片

圖片來源:https://www.cnblogs.com/linuxk/p/9372990.html

Redo Log 工作原理Redo Log 工作原理

2.Clone 實現的基本原理

那么在 Clone Plugin 中如何去解決這個問題? 從 WL#9209 中可以看到官方整體的設計思路。在完成 Clone 的過程中將過程分為了 5 步:

  1. INIT: The clone object is initialized identified by a locator.
  2. FILE COPY: The state changes from INIT to "FILE COPY" when snapshot_copy interface is called. Before making the state change we start "Page Tracking" at lsn "CLONE START LSN". In this state we copy all database files and send to the caller.
  3. PAGE COPY: The state changes from "FILE COPY" to "PAGE COPY" after all files are copied and sent. Before making the state change we start "Redo Archiving" at lsn  "CLONE FILE END LSN" and stop "Page Tracking". In this state, all modified pages as identified by Page IDs between "CLONE START LSN" and "CLONE FILE END LSN" are read from "buffer pool" and sent. We would sort the pages by space ID, page ID  to avoid random read(donor) and random write(recipient) as much as possible.
  4. REDO COPY: The state changes from "PAGE COPY" to "REDO COPY" after all modified pages are sent. Before making the state change we stop "Redo Archiving" at lsn "CLONE LSN". This is the LSN of the cloned database. We would also need to capture the replication coordinates at this point in future. It should be the replication coordinate of the last committed transaction up to the "CLONE LSN".  We send the redo logs from archived files in this state from "CLONE FILE END LSN" to "CLONE LSN" before moving to "Done" state.
  5. Done: The clone object is kept in this state till destroyed by snapshot_end() call.

這中間最重要的便是 :

  1. FILE COPY :跟 Xtrabackup一樣,會物理的拷貝所有的 InnoDB 表空間文件,同時會啟動一個 Page Tracking 進程監控從 CLONE START LSN 開始監控所有 InnoDB PAGE 的改動。
  2. PAGE COPY :PAGE COPY 是在 Xtrabackup 中沒有的一個階段。主要完成 2 個工作:

在完成數據庫庫文件拷貝之后,會開啟 Redo Archiving,同時停止 Page Tracking 進程(PS 開始前會做一次 checkpoint)。Redo Archiving 會從指定的 LSN 位置開始拷貝 Redo Log。

將 Page Tracking 記錄的臟頁發送到指定位置,為了保持高效,會基于 spaceid 和 page id 進行排序,盡可能確保磁盤讀寫的順序性。

  1. Redo Copy :這個階段,會加鎖獲取 Binlog 文件及當前偏移位置和 gtid_executed 信息并停止 Redo Archiving 進程。之后將所有歸檔的 Redo Log 日志文件發往目標端。

Clone 的三個重要階段Clone 的三個重要階段

3.代碼結構和調用邏輯

整體實現上分為了三個部分:

SQL/Server 層 :

  • sql/sql_lex.h
  • sql/sql_yacc.yy

增加了對 Clone 語法的支持。

  • sql_admin.cc

增加了客戶端處理 SQL(clone instance) 和服務端處理 COM_XXX 命令。

  • clone_handler.cc

增加調用 Plugin 的具體實現響應 SQL 層處理。

Plugin 插件層

  • clone_plugin.cc : plugin interface
  • clone_local.cc  : 具體的 Clone 操作。
  • clone_os.cc     : 系統層面具體的一些操作函數,包括 OS  [sendfile/read/write]。
  • clone_hton.cc   : 與存儲引擎層的接口。
  • clone_client.cc 和 clone_server.cc : Clone 的客戶端和服務端。
  • clone_status.cc : Clone 的時候的整體任務的進度和狀態。會有一個 Clone_Task_Manager 去記錄狀態信息。
  • clone_plugin.cc : Clone 插件的入口以及初始化和系統變量等內容。

插件層目錄插件層目錄

InnoDB 引擎層

  • Clone: storage/innobase/clone

clone0clone.cc     : clone task and runtime operation

clone0snapshot.cc  : snapshot management

clone0copy.cc      : copy specific methods

clone0apply.cc     : apply specific methods

clone0desc.cc      : serialized data descriptor

  • Archiver: storage/innobase/arch : Page tracing 相關的內容。
  • arch0arch.cc
  • arch0page.cc
  • arch0log.cc

本地 Clone 的函數調用棧:

Clone_Handle::process_chunk(Clone_Task*, unsigned int, unsigned int, Ha_clone_cbk*) (/mysql-8.0.33/storage/innobase/clone/clone0copy.cc:1440)
Clone_Handle::copy(unsigned int, Ha_clone_cbk*) (/mysql-8.0.33/storage/innobase/clone/clone0copy.cc:1379)
innodb_clone_copy(handlerton*, THD*, unsigned char const*, unsigned int, unsigned int, Ha_clone_cbk*) (/mysql-8.0.33/storage/innobase/clone/clone0api.cc:561)
hton_clone_copy(THD*, std::__1::vector<myclone::Locator, std::__1::allocator<myclone::Locator>>&, std::__1::vector<unsigned int, std::__1::allocator<unsigned int>>&, Ha_clone_cbk*) (/mysql-8.0.33/plugin/clone/src/clone_hton.cc:152)
myclone::Local::clone_exec() (/mysql-8.0.33/plugin/clone/src/clone_local.cc:172)
myclone::Local::clone() (/mysql-8.0.33/plugin/clone/src/clone_local.cc:73)
plugin_clone_local(THD*, char const*) (/mysql-8.0.33/plugin/clone/src/clone_plugin.cc:456)
Clone_handler::clone_local(THD*, char const*) (/mysql-8.0.33/sql/clone_handler.cc:135)
Sql_cmd_clone::execute(THD*) (/mysql-8.0.33/sql/sql_admin.cc:2017)
mysql_execute_command(THD*, bool) (/mysql-8.0.33/sql/sql_parse.cc:4714)
dispatch_sql_command(THD*, Parser_state*) (/mysql-8.0.33/sql/sql_parse.cc:5363)
dispatch_command(THD*, COM_DATA const*, enum_server_command) (/mysql-8.0.33/sql/sql_parse.cc:2050)
do_command(THD*) (/mysql-8.0.33/sql/sql_parse.cc:1439)
handle_connection(void*) (/mysql-8.0.33/sql/conn_handler/connection_handler_per_thread.cc:302)
pfs_spawn_thread(void*) (/mysql-8.0.33/storage/perfschema/pfs.cc:3042)
_pthread_start (@_pthread_start:40)

Clone 函數調用Clone 函數調用

4Page  Archiving 系統

Page Archiving 是之前 Xtrabackup 中沒有的部分,因此在這里特別介紹下整體實現的過程。

為了減少在 Clone 過程中的 Redo Log 的拷貝量,Clone 插件中使用了對 Dirty Page 進行跟蹤和收集的方法,在拷貝表空間的過程中追蹤 Dirty Page,并在 File Copy 結束的階段將 Dirty Page 打包發送到目標端。

Page Tracking 臟頁監控的方式可以有兩種實現方案:

  1. mtr 提交的時候收集。
  2. 在 purge 進程刷臟的時候收集。

為了不阻塞 MySQL 事務的提交,當前 Clone 插件選擇的是方案 2。

Purge 進程刷臟的入口是 buf\_flush\_page 函數。

buf0flu.cc
if (flush) {
    /* We are committed to flushing by the time we get here */

    mutex_enter(&buf_pool->flush_state_mutex);
....

    arch_page_sys->track_page(bpage, buf_pool->track_page_lsn, frame_lsn,
                                false);
}

在將臟頁刷回到磁盤的時候,會將需要追蹤的臟頁加入 arch\_page\_sys 中。如果在加入臟頁的過程中 block 滿了,需要開辟新的空間,會阻塞刷臟的進程。

/** Check and add page ID to archived data.
Check for duplicate page.
@param[in]      bpage           page to track
@param[in]      track_lsn       LSN when tracking started
@param[in]      frame_lsn       current LSN of the page
@param[in]      force           if true, add page ID without check */
void Arch_Page_Sys::track_page(buf_page_t *bpage, lsn_t track_lsn,
                               lsn_t frame_lsn, bool force) {
  Arch_Block *cur_blk;
  uint count = 0;
  ... ...

  /* We need to track this page. */
  arch_oper_mutex_enter();

  while (true) {
    if (m_state != ARCH_STATE_ACTIVE) {
      break;
    }
    ... ...

    cur_blk = m_data.get_block(&m_write_pos, ARCH_DATA_BLOCK);

    if (cur_blk->get_state() == ARCH_BLOCK_ACTIVE) {
      if (cur_blk->add_page(bpage, &m_write_pos)) {
        /* page added successfully. */
        break;
      }

      /* Current block is full. Move to next block. */
      cur_blk->end_write();

      m_write_pos.set_next();

      /* Writing to a new file so move to the next reset block. */
      if (m_write_pos.m_block_num % ARCH_PAGE_FILE_DATA_CAPACITY == 0) {
        Arch_Block *reset_block =
            m_data.get_block(&m_reset_pos, ARCH_RESET_BLOCK);
        reset_block->end_write();

        m_reset_pos.set_next();
      }

      os_event_set(page_archiver_thread_event);

      ++count;
      continue;

    } else if (cur_blk->get_state() == ARCH_BLOCK_INIT ||
               cur_blk->get_state() == ARCH_BLOCK_FLUSHED) {
      ut_ad(m_write_pos.m_offset == ARCH_PAGE_BLK_HEADER_LENGTH);

      cur_blk->begin_write(m_write_pos);

      if (!cur_blk->add_page(bpage, &m_write_pos)) {
        /* Should always succeed. */
        ut_d(ut_error);
      }

      /* page added successfully. */
      break;

    } else {
      bool success;
      ... ...
      /* Might release operation mutex temporarily. Need to
      loop again verifying the state. */
      success = wait_flush_archiver(cbk);
      count = success ? 0 : 2;

      continue;
    }
  }
  arch_oper_mutex_exit();
}

臟頁收集的整體入口在 Page\_Arch\_Client\_Ctx::start 和 Arch\_Page\_Sys::start。

這里需要注意的是,在開啟 Page Archiving 之前需要強制一次 checkpoint,因此如果系統處于比較高的負載(比如 IO Wait 很高)可能會導致系統卡頓。

int Page_Arch_Client_Ctx::start(bool recovery, uint64_t *start_id) {
  ... ...
  /* Start archiving. */
  err = arch_page_sys->start(&m_group, &m_last_reset_lsn, &m_start_pos,
                             m_is_durable, reset, recovery);
  ... ...
}

int Arch_Page_Sys::start(Arch_Group **group, lsn_t *start_lsn,
                         Arch_Page_Pos *start_pos, bool is_durable,
                         bool restart, bool recovery) {
   ... ...
    
   log_sys_lsn = (recovery ? m_last_lsn : log_get_lsn(*log_sys));
   /* Enable/Reset buffer pool page tracking. */
        set_tracking_buf_pool(log_sys_lsn); //  page_id
   ... ...
   auto err = start_page_archiver_background();  sp_id, page_id
   ... ...
   if (!recovery) {
    /* Request checkpoint */
    log_request_checkpoint(*log_sys, true);  checkpoint
  }
}

臟頁的歸檔由 page\_archiver\_thread 線程進行:

/** Archiver background thread */
void page_archiver_thread() {
  bool page_wait = false;

  ... ... 

  while (true) {
    /* Archive in memory data blocks to disk. */
    auto page_abort = arch_page_sys->archive(&page_wait);

    if (page_abort) {
      ib::info(ER_IB_MSG_14) << "Exiting Page Archiver";
      break;
    }

    if (page_wait) {
      /* Nothing to archive. Wait until next trigger. */
      os_event_wait(page_archiver_thread_event);
      os_event_reset(page_archiver_thread_event);
    }
  }
}

bool Arch_Page_Sys::archive(bool *wait) {
  ... ...

  db_err = flush_blocks(wait);

  if (db_err != DB_SUCCESS) {
    is_abort = true;
  }

  ... ...
  return (is_abort);
}

dberr_t Arch_Page_Sys::flush_blocks(bool *wait) {
  ... ...
  err = flush_inactive_blocks(cur_pos, end_pos);
  ... ...
}

dberr_t Arch_Page_Sys::flush_inactive_blocks(Arch_Page_Pos &cur_pos,
                                             Arch_Page_Pos end_pos) {
  
  /* Write all blocks that are ready for flushing. */
  while (cur_pos.m_block_num < end_pos.m_block_num) {
    cur_blk = m_data.get_block(&cur_pos, ARCH_DATA_BLOCK);

    err = cur_blk->flush(m_current_group, ARCH_FLUSH_NORMAL);

    if (err != DB_SUCCESS) {
      break;
    }

   ... ...
  }

  return (err);
}

在最后會調用 Arch\_Block 去歸檔臟頁。這里當把臟頁歸檔的時候也需要使用 doublewrite buffer。

/** Flush this block to the file group.
@param[in]      file_group      current archive group
@param[in]      type            flush type
@return error code. */
dberr_t Arch_Block::flush(Arch_Group *file_group, Arch_Blk_Flush_Type type) {
  ... ...
  switch (m_type) {
    case ARCH_RESET_BLOCK:
      err = file_group->write_file_header(m_data, m_size);
      break;

    case ARCH_DATA_BLOCK: {
      bool is_partial_flush = (type == ARCH_FLUSH_PARTIAL);

      /* Callback responsible for setting up file's header starting at offset 0.
      This header is left empty within this flush operation. */
      auto get_empty_file_header_cbk = [](uint64_t, byte *) {
        return DB_SUCCESS;
      };

      /* We allow partial flush to happen even if there were no pages added
      since the last partial flush as the block's header might contain some
      useful info required during recovery. */
      err = file_group->write_to_file(nullptr, m_data, m_size, is_partial_flush,
                                      true, get_empty_file_header_cbk);
      break;
    }

    default:
      ut_d(ut_error);
  }

  return (err);
}

dberr_t Arch_Group::write_to_file(Arch_File_Ctx *from_file, byte *from_buffer,
                                  uint length, bool partial_write,
                                  bool do_persist,
                                  Get_file_header_callback get_header) {
  ... ...
    if (do_persist) {
      Arch_Page_Dblwr_Offset dblwr_offset =
          (partial_write ? ARCH_PAGE_DBLWR_PARTIAL_FLUSH_PAGE
                         : ARCH_PAGE_DBLWR_FULL_FLUSH_PAGE);

      /** Write to the doublewrite buffer before writing archived data to a file.
      The source is either a file context or buffer. Caller must ensure that data
  is in single file in source file context. **/
      Arch_Group::write_to_doublewrite_file(from_file, from_buffer, write_size,
                                            dblwr_offset);
    }

   ... ...

  return (DB_SUCCESS);
}

5總結

  • Clone 功能相對于使用 Xtrabackup 拉起一個 Slave,更加的方便。
  • Clone 功能相對于 Xtrabackup,拷貝的 Redo Log 日志量更少,也更不容易遇到失敗的問題(arch\_log\_sys 會控制日志寫入以避免未歸檔的日志被覆蓋)。
  • 從源碼的分析來看,啟動 Clone 的時候會強制做一次 CK,在 Redo Log Archiving 的時候會控制日志寫入量,因此從原理上看,如果處于高負載的主庫做 Clone 操作,可能會對系統有影響。

參考

  1. 《MySQL · 引擎特性 · 初探 Clone Plugin》 http://mysql.taobao.org/monthly/2019/09/02/
  2. 《MySQL:插件回調的方式》https://greatsql.cn/blog-74-1158.html
  3. 《MySQL · 引擎特性 · clone_plugin》 http://mysql.taobao.org/monthly/2019/08/05/
  4. 《實戰 MySQL 8.0.17 Clone Plugin》https://opensource.actionsky.com/20190726-mysql/
  5. 《全網最完整的 MySQL Clone Plugin 實現原理解析》 https://zhuanlan.zhihu.com/p/433606318
  6. 《MySQL/InnoDB數據克隆插件(clone plugin)實現剖析》 https://sq.sf.163.com/blog/article/364933037836570624
責任編輯:武曉燕 來源: 愛可生開源社區
相關推薦

2024-09-04 10:44:19

2022-07-08 08:37:23

Nacos服務注冊動態配置

2022-11-10 15:32:29

2022-04-20 12:17:50

命令Batcat

2022-04-25 10:04:56

df命令Linux

2012-05-11 09:50:49

iOSAndroid移動應用

2014-03-26 10:09:14

指針指針使用

2020-08-23 18:08:29

JavaScript命名參數位置參數

2020-07-17 19:31:19

PythonR編程

2020-02-14 13:53:33

Python 開發編程語言

2022-09-05 10:01:19

VueReact

2023-11-27 17:17:52

文件搜索應用程序

2015-03-17 15:18:02

私有云公共云數據中心

2020-05-15 09:20:35

瀏覽器 Chrome Google

2021-04-22 05:39:33

微軟Edge瀏覽器

2025-07-04 01:25:00

DebianMacWindows

2021-01-25 07:14:53

Cloud DevOps云計算

2023-01-30 09:09:51

GoFramePHP數組

2021-08-31 23:33:50

AndroidiOS功能
點贊
收藏

51CTO技術棧公眾號

国产成人综合久久| 亚洲精品久久久久久下一站| 一区二区三区四区欧美日韩| 夜夜嗨av禁果av粉嫩avhd| 91一区二区| 欧美丰满一区二区免费视频| 男人的天堂avav| 国产精品九九九九| 亚洲国产精品一区制服丝袜| 亚洲人成自拍网站| 91pony九色| 精品众筹模特私拍视频| www国产成人免费观看视频 深夜成人网| 日韩av电影在线网| 欧美激情精品久久久久久免费| 精品一区二区三区中文字幕在线 | 欧美在线日韩在线| 中文字幕第二区| 亚洲国产中文在线二区三区免| 午夜久久电影网| 亚洲免费久久| 日日夜夜精品免费| 性欧美精品高清| 视频在线观看99| 日韩Av无码精品| 九七电影院97理论片久久tvb| 夜夜嗨av一区二区三区四季av| 久久久综合香蕉尹人综合网| 国产精品久久久久久在线| 国产毛片久久| 九九热这里只有在线精品视| 在线观看国产精品一区| 最新精品在线| 欧美日韩国产一级二级| 欧美亚洲日本一区二区三区| 欧洲黄色一区| 中文字幕不卡在线播放| 精品毛片久久久久久| 国产乱叫456在线| 麻豆亚洲精品| 8x拔播拔播x8国产精品| 国产又色又爽又高潮免费| 久久精品福利| 欧美一区二区三区小说| 国产在线播放观看| 成人福利在线观看视频| 欧美国产丝袜视频| 欧美久久综合性欧美| 精品久久久中文字幕人妻| 亚洲欧美日韩综合国产aⅴ| 毛片精品免费在线观看| 国产探花视频在线播放| 任我爽精品视频在线播放| 正在播放一区二区| 视频二区在线播放| 国产一区二区精品调教| 日韩欧美在线网址 | av天在线观看| 91小视频在线观看| 国产精品v欧美精品v日韩| 国产深喉视频一区二区| 国内一区二区视频| 国产精品自在线| 成人黄色免费网| 老牛嫩草一区二区三区日本| 91精品国产乱码久久久久久久久 | 自拍偷拍一区二区三区四区| 91精品影视| 色婷婷av久久久久久久| 亚洲欧洲日产国码无码久久99| xxxx另类黑人| 亚洲18色成人| 欧美精品一区免费| 涩涩涩视频在线观看| 欧美日韩在线免费| 国产超级av在线| 北岛玲heyzo一区二区| 欧美午夜激情小视频| 又粗又黑又大的吊av| 忘忧草在线影院两性视频| 欧美视频在线观看免费| 日韩一级片播放| 日本精品久久| 日韩一区二区免费视频| 欧美熟妇精品一区二区 | 99在线高清视频在线播放| 精品人妻久久久久一区二区三区| 美女mm1313爽爽久久久蜜臀| 成人h猎奇视频网站| 国产女人高潮的av毛片| 国产成人精品亚洲日本在线桃色| 国产精品一区二区三区精品| 色资源在线观看| 中文字幕高清一区| 免费看污污视频| gogo高清在线播放免费| 日韩欧美成人区| 亚洲精品视频三区| 欧美视频第一| 欧美成人精品二区三区99精品| 精品国产乱码久久久久夜深人妻| 婷婷激情久久| 中文字幕在线日韩| 黄色小视频在线免费看| 视频在线在亚洲| 成人激情视频在线| 日韩在线无毛| ㊣最新国产の精品bt伙计久久| 成人小视频在线观看免费| 亚洲性色av| 欧美年轻男男videosbes| 亚洲熟女一区二区| 欧美一区二区三| 日韩亚洲在线观看| 国产无码精品一区二区| 日本美女一区二区三区视频| 97夜夜澡人人双人人人喊| 飘雪影院手机免费高清版在线观看| 国产精品乱子久久久久| www.av中文字幕| 激情小说亚洲| 日韩精品视频免费专区在线播放| 亚洲色图27p| 国产手机视频一区二区| 91亚洲国产成人久久精品网站| 污污网站免费在线观看| 亚洲欧美激情小说另类| 一区二区传媒有限公司| 97精品资源在线观看| 国产视频精品va久久久久久| 欧美成人久久久免费播放| 99riav1国产精品视频| 91青草视频久久| porn亚洲| 色视频成人在线观看免| 国产极品一区二区| 亚洲一区 二区 三区| 韩国福利视频一区| 99热这里精品| 国产精品福利av| 成人一区二区免费视频| 午夜视频在线观看精品中文| 中文字幕亚洲自拍| 中文字幕日韩免费| 99久久99久久综合| 97超碰人人澡| 国产成人福利av| 精品国产一区久久久| 国产九色91回来了| 久久久精品蜜桃| www.国产在线视频| 亚洲精品一区二区三区在线| 久久成人av网站| 91久久精品国产91性色69| 国产视频一区在线播放| 亚洲自偷自拍熟女另类| 欧美精品密入口播放| 欧美激情视频一区| 亚洲女人18毛片水真多| 亚洲一区二区在线免费看| 三级黄色片免费观看| 欧美粗暴jizz性欧美20| 99精品99久久久久久宅男| 国产午夜精品久久久久免费视| 欧美日韩久久一区| 天天爽天天爽天天爽| 麻豆精品视频在线观看免费| 亚洲欧美日韩精品综合在线观看| 极品av在线| 亚洲欧洲激情在线| 中文字幕亚洲高清| 久久亚洲欧美国产精品乐播| 欧美韩国日本在线| 精品久久久久久久| 国产日韩欧美91| www在线视频| 亚洲精品一区二区在线观看| 国产真实夫妇交换视频| 91天堂素人约啪| 麻豆传传媒久久久爱| 精品国产一级毛片| 国产成人高清激情视频在线观看 | 国产综合福利在线| 电影在线一区| 欧美日韩dvd在线观看| 高h视频免费观看| 国产精品1024| 91九色丨porny丨国产jk| 欧美美乳视频| 国产欧美日韩免费| 午夜av在线播放| 日韩av一卡二卡| 中国黄色一级视频| 亚洲精品一卡二卡| 国产麻豆天美果冻无码视频| 视频一区二区欧美| 手机在线视频你懂的| 噜噜噜狠狠夜夜躁精品仙踪林| 国产成人精品av在线| 久cao在线| 亚洲成色999久久网站| 国产99免费视频| 亚洲精品视频在线观看网站| 中文字幕无码人妻少妇免费| 日韩国产欧美在线播放| 好色先生视频污| 91蜜桃臀久久一区二区| 国产成+人+综合+亚洲欧洲| 免费观看成人高潮| 亚洲精品久久久久久久久久久| 怡春院在线视频| 亚洲精品久久久蜜桃| 亚洲 小说 欧美 激情 另类| 国产成人精品一区二区三区四区| 在线免费视频一区| 老妇喷水一区二区三区| 国产精品无码av在线播放| 亚洲天堂久久| 四虎精品欧美一区二区免费| 波多野结衣在线观看一区二区| 精品一区在线播放| 国产精品传媒| 99视频国产精品免费观看| 国内不卡的一区二区三区中文字幕| 国产91免费看片| 亚洲女同av| 欧美亚洲国产精品| 国产美女高潮在线观看| 久久免费国产视频| 免费在线中文字幕| 欧美美女18p| 91在线中文| 久久精品在线视频| 日本电影在线观看网站| 最近2019中文字幕mv免费看| av在线二区| 一区二区福利视频| av在线播放网| 在线观看欧美成人| 成人亚洲综合天堂| 国产亚洲精品激情久久| 国产免费视频在线| 中文字幕在线亚洲| 免费看a在线观看| 久久久www成人免费精品| 黄色成人影院| 欧美精品一本久久男人的天堂| av片在线观看| 欧美极品少妇xxxxⅹ裸体艺术 | 午夜精品久久久久久久久久久久久| 国产美女福利在线观看| 国内成人精品一区| 欧美裸体视频| 国产精品成人国产乱一区| 成人在线高清| 亚洲自拍偷拍色片视频| 日韩08精品| 国新精品乱码一区二区三区18| 精品一区二区男人吃奶| 美女一区视频| 久久国产精品成人免费观看的软件| 正在播放久久| 国内一区二区三区| 国产a级一级片| 蜜臀精品一区二区三区在线观看 | 老司机成人在线| 欧美在线激情| 亚洲成av人片乱码色午夜| avav在线播放| 久久青草久久| 肉色超薄丝袜脚交| 成人午夜电影小说| 国产一二三四五区| 亚洲欧美综合另类在线卡通| 精品午夜福利视频| 91电影在线观看| 99热这里只有精品1| 日韩激情视频在线| 97视频精彩视频在线观看| 另类天堂视频在线观看| 免费一二一二在线视频| 国产热re99久久6国产精品| 96sao在线精品免费视频| 青青草成人网| 狠狠色丁香久久综合频道| 国产精品亚洲αv天堂无码| 美女久久久精品| 在线看黄色的网站| 国产精品欧美一级免费| 久久精品免费av| 欧美日韩在线直播| 天天综合永久入口| 日韩综合视频在线观看| 日韩电影免费看| 3d精品h动漫啪啪一区二区| 亚洲人成网77777色在线播放 | 日韩av一区二区三区四区| 亚洲av无码久久精品色欲| 国产欧美一区二区三区网站| 久久机热这里只有精品| 欧美三级资源在线| 午夜影院免费体验区| 久久亚洲国产成人| 日本不卡一二三| 成人毛片网站| 欧美肥老太太性生活| 人妻精品无码一区二区三区 | 少妇无套高潮一二三区| 亚洲午夜免费视频| 一区二区久久精品66国产精品| 亚洲精品xxx| 蜜桃传媒在线观看免费进入| 成人黄色av网站| 国内精品久久久久久99蜜桃| 亚洲熟妇国产熟妇肥婆| 国产成a人亚洲精品| 99鲁鲁精品一区二区三区| 在线看不卡av| 你懂的在线播放| 97免费视频在线| 91国内精品白嫩初高生| mm131午夜| 极品少妇xxxx精品少妇| 五月天精品在线| 色久优优欧美色久优优| 人人九九精品| 欧美一区二区色| 香蕉久久精品日日躁夜夜躁| 99热亚洲精品| av成人动漫在线观看| 国产精品50页| 亚洲电影天堂av| 高h视频在线播放| 国产欧美日韩一区二区三区| 红桃视频欧美| 亚洲一区二区在线免费| 亚洲va国产va欧美va观看| 日韩在线观看视频网站| 久久久久亚洲精品国产| 国产乱人伦丫前精品视频| 可以看毛片的网址| av电影一区二区| 天天操天天干视频| 日韩国产欧美精品在线| 成人影院入口| 欧洲成人一区二区| 麻豆精品新av中文字幕| 亚洲人做受高潮| 欧美一区二区高清| 青青青草视频在线| 国产伦精品一区二区三区四区视频| 亚洲高清不卡| 波多野结衣办公室33分钟| 色狠狠桃花综合| 午夜激情视频在线| 91丨九色丨国产| 日韩网站在线| 三上悠亚ssⅰn939无码播放 | 精品人妻伦一区二区三区久久| 欧美福利视频在线| 国产乱人伦丫前精品视频| 国产中文字幕在线免费观看| 久久综合资源网| 最近国语视频在线观看免费播放| 神马国产精品影院av| 国产精品美女久久久久| 久无码久无码av无码| 2020国产精品自拍| 亚洲手机在线观看| 欧美激情在线视频二区| 亚洲日产av中文字幕| 日韩在线不卡一区| 亚洲国产视频a| 免费毛片在线| 91中文字幕在线| 国产亚洲综合精品| 国产精品免费在线视频| 亚洲福利影片在线| 伦一区二区三区中文字幕v亚洲| 久久久天堂国产精品| 99久久婷婷国产综合精品| 中文字幕 视频一区| 久久免费精品日本久久中文字幕| 国产精品一区二区av交换| 免费人成视频在线播放| 欧美日韩在线第一页| www在线视频| 日本一区免费看| 粉嫩在线一区二区三区视频| 波多野结衣高清视频| 久久久久免费视频| 成人看的羞羞网站| av2014天堂网| 在线不卡欧美精品一区二区三区| 岛国av在线播放| 正在播放久久| 国产亚洲精品aa| 免费观看国产视频| 国产一区视频在线| 久久精品官网|