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

面試官:10億數據如何快速插入MySQL?

數據庫 MySQL
10億條數據插入數據庫的時間影響因素非常多。包括數據庫磁盤類型、性能。數據庫分庫數量如果能切分1000個庫當然性能更快,要根據線上實際情況決策分庫和分表數量,這極大程度決定了寫入的速率。

大家好,我是君哥。

最快的速度把 10 億條數據導入到數據庫,首先需要和面試官明確一下,10 億條數據什么形式存在哪里,每條數據多大,是否有序導入,是否不能重復,數據庫是否是 MySQL?假設和面試官明確后,有如下約束:

  1. 10 億條數據,每條數據 1 Kb;
  2. 數據內容是非結構化的用戶訪問日志,需要解析后寫入到數據庫;
  3. 數據存放在 Hdfs 或 S3 分布式文件存儲里;
  4. 10 億條數據并不是 1 個大文件,而是被近似切分為 100 個文件,后綴標記順序;
  5. 要求有序導入,盡量不重復;
  6. 數據庫是 MySQL。

首先考慮 10 億數據寫到 MySQL 單表可行嗎?

數據庫單表能支持 10 億嗎?

答案是不能,單表推薦的值是 2000W 以下。這個值怎么計算出來的呢?MySQL 索引數據結構是B+樹,全量數據存儲在主鍵索引,也就是聚簇索引的葉子結點上。B+ 樹插入和查詢的性能和 B+ 樹層數直接相關,2000W 以下是 3 層索引,而 2000w 以上則可能為四層索引。

Mysql b+ 索引的葉子節點每頁大小 16 K。當前每條數據正好 1K,所以簡單理解為每個葉子節點存儲 16 條數據。b+ 索引每個非葉子節點大小也是 16K,但是其只需要存儲主鍵和指向葉子節點的指針,我們假設主鍵的類型是 BigInt,長度為 8 字節,而指針大小在 InnoDB 中設置為 6 字節,這樣一共 14 字節,這樣一個非葉子節點可以存儲 16 * 1024/14=1170。

也就是每個非葉子節點可關聯 1170 個葉子節點,每個葉子節點存儲 16 條數據。由此可得到B+樹索引層數和存儲數量的表格。2KW 以上 索引層數為 4 層,性能更差。

為了便于計算,我們可以設計單表容量在 1KW,10 億條數據共 100 個表。

如何高效的寫入數據庫

單條寫入數據庫性能比較差,可以考慮批量寫入數據庫,批量數值動態可調整。每條 1K,默認可先調整為 100 條批量寫入。

批量數據如何保證數據同時寫成功?MySQL Innodb 存儲引擎保證批量寫入事務同時成功或失敗。

寫庫時要支持重試,寫庫失敗重試寫入,如果重試 N 次后依然失敗,可考慮單條寫入 100 條到數據庫,失敗數據打印記錄,丟棄即可。

此外寫入時按照主鍵 id 順序順序寫入可以達到最快的性能,而非主鍵索引的插入則不一定是順序的,頻繁地索引結構調整會導致插入性能下降。最好不創建非主鍵索引,或者在表創建完成后再創建索引,以保證最快的插入性能。

是否需要并發寫同一個表

不能。

  1. 并發寫同一個表無法保證數據寫入時是有序的。
  2. 提高批量插入的閾值,在一定程度上增加了插入并發度。無需再并發寫入單表

MySQL存儲引擎的選擇

Myisam 比 innodb 有更好的插入性能,但失去了事務支持,批量插入時無法保證同時成功或失敗,所以當批量插入超時或失敗時,如果重試,勢必對導致一些重復數據的發生。但是為了保證更快的導入速度,可以把 myisam 存儲引擎列為計劃之一。

現階段我引用一下別人的性能測試結果:MyISAM 與 InnoDB 對比分析:

圖片圖片

從數據可以看到批量寫入明顯優于單條寫入。并且在 innodb 關閉即時刷新磁盤策略后,innodb 插入性能沒有比 myisam 差太多。

innodb_flush_log_at_trx_commit: 控制MySQL刷新數據到磁盤的策略。

  1. 默認=1,即每次事務提交都會刷新數據到磁盤,安全性最高不會丟失數據。
  2. 當配置為0、2 會每隔1s刷新數據到磁盤, 在系統宕機、mysql crash時可能丟失1s的數據。

考慮到Innodb在關閉即時刷新磁盤策略時,批量性能也不錯,所以暫定先使用innodb(如果公司MySQL集群不允許改變這個策略值,可能要使用MyIsam了。)。線上環境測試時可以重點對比兩者的插入性能。

要不要進行分庫

mysql 單庫的并發寫入是有性能瓶頸的,一般情況 5K TPS 寫入就很高了。

當前數據都采用 SSD 存儲,性能應該更好一些。但如果是 HDD 的話,雖然順序讀寫會有非常高的表現,但 HDD 無法應對并發寫入,例如每個庫10張表,假設10張表在并發寫入,每張表雖然是順序寫入,由于多個表的存儲位置不同,HDD 只有 1 個磁頭,不支持并發寫,只能重新尋道,耗時將大大增加,失去順序讀寫的高性能。所以對于 HDD 而言,單庫并發寫多個表并不是好的方案。回到 SSD 的場景,不同 SSD 廠商的寫入能力不同,對于并發寫入的能力也不同,有的支持 500M/s,有的支持 1G/s 讀寫,有的支持 8 個并發,有的支持 4 個并發。在線上實驗之前,我們并不知道實際的性能表現如何。

所以在設計上要更加靈活,需要支持以下能力:

  1. 支持配置數據庫的數量;
  2. 支持配置并發寫表的數量,(如果 MySQL 是 HDD 磁盤,只讓一張表順序寫入,其他任務等待)

通過以上配置,靈活調整線上數據庫的數量,以及寫表并發度,無論是 HDD 還是 SSD,我們系統都能支持。不論是什么廠商型號的 SSD,性能表現如何,都可調整配置,不斷獲得更高的性能。這也是后面設計的思路,不固定某一個閾值數量,都要動態可調整。

接下來聊一下文件讀取,10 億條數據,每條 1K,一共是 931G。近 1T 大文件,一般不會生成如此大的文件。所以我們默認文件已經被大致切分為 100 個文件。每個文件數量大致相同即可。為什么切割為 100 個呢?切分為 1000 個,增大讀取并發,不是可以更快導入數據庫嗎?剛才提到數據庫的讀寫性能受限于磁盤,但任何磁盤相比寫操作,讀操作都要更快。尤其是讀取時只需要從文件讀取,但寫入時 MySQL 要執行建立索引,解析 SQL、事務等等復雜的流程。所以寫的并發度最大是 100,讀文件的并發度無需超過 100。

更重要的是讀文件并發度等于分表數量,有利于簡化模型設計。即 100 個讀取任務,100 個寫入任務,對應 100 張表。

如何保證寫入數據庫有序

既然文件被切分為 100 個 10G 的小文件,可以按照文件后綴+ 在文件行號 作為記錄的唯一鍵,同時保證同一個文件的內容被寫入同一個表。例如

  1. index_90.txt 被寫入 數據庫database_9,table_0 ;
  2. index_67.txt被寫入數據庫 database_6,table_7。

這樣每個表都是有序的。整體有序通過數據庫后綴+表名后綴實現。

如何更快地讀取文件

10G的文件顯然不能一次性讀取到內存中,場景的文件讀取包括

  1. Files.readAllBytes一次性加載內內存;
  2. FileReader+ BufferedReader 逐行讀取;
  3. File+ BufferedReader;
  4. Scanner逐行讀取;
  5. Java NIO FileChannel緩沖區方式讀取

在 MAC 上,使用這幾種方式的讀取 3.4G 大小文件的性能對比

讀取方式

花費時間

Files.readAllBytes

內存爆了 OOM

FileReader+ BufferedReader 逐行讀取

11秒

File+ BufferedReader

10 秒

Scanner

57秒

Java NIO FileChannel緩沖區方式讀取

3秒

詳細的評測內容請參考:讀取文件性能比較 :https://zhuanlan.zhihu.com/p/142029812

由此可見 使用JavaNIO FileChannnel明顯更優,但是FileChannel的方式是先讀取固定大小緩沖區,不支持按行讀取。也無法保證緩沖區正好包括整數行數據。如果緩沖區最后一個字節正好卡在一行數據中間,還需要額外配合讀取下一批數據。如何把緩沖區變為一行行數據,比較困難。

FileInputStream fileInputStream = null;
long now = System.currentTimeMillis();
try {
       fileInputStream = new FileInputStream(file);
       FileChannel fileChannel = fileInputStream.getChannel();

       int capacity = 1 * 1024 * 1024;//1M
       ByteBuffer byteBuffer = ByteBuffer.allocate(capacity);
       StringBuffer buffer = new StringBuffer();
       int size = 0;
       while (fileChannel.read(byteBuffer) != -1) {
          //讀取后,將位置置為0,將limit置為容量, 以備下次讀入到字節緩沖中,從0開始存儲
          byteBuffer.clear();
          byte[] bytes = byteBuffer.array();
          size += bytes.length;
       }
       System.out.println("file size:" + size);
} catch (FileNotFoundException e) {
   e.printStackTrace();
} catch (IOException e) {
   e.printStackTrace();
} finally {
   //TODO close資源.
}
System.out.println("Time:" + (System.currentTimeMillis() - now));

JavaNIO 是基于緩沖區的,ByteBuffer可轉為byte數組,需要轉為字符串,并且要處理按行截斷。

但是BufferedReader JavaIO方式讀取可以天然支持按行截斷,況且性能還不錯 ,10G文件,大致只需要讀取30s,由于導入的整體瓶頸在寫入部分,即便30s讀取完,也不會影響整體性能。所以文件讀取使用BufferedReader 逐行讀取。即方案3.

如果協調讀文件任務和寫數據庫任務

這塊比較混亂,請耐心看完。

100個讀取任務,每個任務讀取一批數據,立即寫入數據庫是否可以呢?前面提到了由于數據庫并發寫入的瓶頸,無法滿足1個庫同時并發大批量寫入10個表,所以100個任務同時寫入數據庫,勢必導致每個庫同時有10個表同時在順序寫,這加劇了磁盤的并發寫壓力。為盡可能提高速度,減少磁盤并發寫入帶來的性能下降, 需要一部分寫入任務被暫停的。那么讀取任務需要限制并發度嗎?不需要。

假設寫入任務和讀取任務合并,會影響讀取任務并發度。初步計劃讀取任務和寫入任務各自處理,誰也不耽誤誰。但實際設計時發現這個方案較為困難。

最初的設想是引入Kafka,即100個讀取任務把數據投遞到Kafka,由寫入任務消費kafka寫入DB。100個讀取任務把消息投遞到Kafka,此時順序就被打亂了,如何保證有序寫入數據庫呢?我想到可以使用Kafka partition路由,即讀取任務id把同一任務的消息都路由到同一個partition,保證每個partition內有序消費。

要準備多少個分片呢?100個很明顯太多,如果partition小于100個,例如10個。那么勢必存在多個任務的消息混合在一起。如果同一個庫的多個表在一個Kafka partition,且這個數據庫只支持單表批量寫入,不支持并發寫多個表。這個庫多個表的消息混在一個分片中,由于并發度的限制,不支持寫入的表對應的消息只能被丟棄。所以這個方案既復雜,又難以實現。

所以最終放棄了Kafka方案,也暫時放棄了將讀取和寫入任務分離的方案。

最終方案簡化為 讀取任務讀一批數據,寫入一批。即任務既負責讀文件、又負責插入數據庫。

如何保證任務的可靠性

如果讀取任務進行到一半,宕機或者服務發布如何處理呢?或者數據庫故障,一直寫入失敗,任務被暫時終止,如何保證任務再次拉起時,再斷點處繼續處理,不會存在重復寫入呢?

剛才我們提到可以 為每一個記錄設置一個主鍵Id,即 文件后綴index+文件所在行號。可以通過主鍵id的方式保證寫入的冪等。

文件所在的行號,最大值 大致為 10G/1k = 10M,即10000000。拼接最大的后綴99。最大的id為990000000。

所以也無需數據庫自增主鍵ID,可以在批量插入時指定主鍵ID。

如果另一個任務也需要導入數據庫呢?如何實現主鍵ID隔離,所以主鍵ID還是需要拼接taskId。例如{taskId}{fileIndex}{fileRowNumber} 轉化為Long類型。如果taskId較大,拼接后的數值過大,轉化為Long類型可能出錯。

最重要的是,如果有的任務寫入1kw,有的其他任務寫入100W,使用Long類型無法獲知每個占位符的長度,存在沖突的可能性。而如果拼接字符串{taskId}{fileIndex}{fileRowNumber} ,新增唯一索引,會導致插入性能更差,無法滿足最快導入數據的訴求。所以需要想另一個方案。

可以考慮使用Redis記錄當前任務的進度。例如Redis記錄task的進度,批量寫入數據庫成功后,更新 task進度。

INCRBY KEY_NAME INCR_AMOUNT指定當前進度增加100,例如 incrby task_offset_{taskId} 100。如果出現批量插入失敗的,則重試插入。多次失敗,則單個插入,單個更新redis。要確保Redis更新成功,可以在Redis更新時 也加上重試。

如果還不放心Redis進度和數據庫更新的一致性,可以考慮 消費 數據庫binlog,每一條記錄新增則redis + 1 。

如果任務出現中斷,則首先查詢任務的offset。然后讀取文件到指定的offset繼續 處理。

如何協調讀取任務的并發度

前面提到了為了避免單個庫插入表的并發度過高,影響數據庫性能。可以考慮限制并發度。如何做到呢?

既然讀取任務和寫入任務合并一起。那么就需要同時限制讀取任務。即每次只挑選一批讀取寫入任務執行。

在此之前需要設計一下任務表的存儲模型。

  1. bizId為了以后支持別的產品線,預設字段。默認為1,代表當前業務線。
  2. datbaseIndex 代表被分配的數據庫后綴。
  3. tableIndex 代表被分配的表名后綴
  4. parentTaskId,即總的任務id。
  5. offset可以用來記錄當前任務的進度。
  6. 10億條數據導入數據庫,切分為100個任務后,會新增100個taskId,分別處理一部分數據,即一個10G文件。
  7. status 狀態用來區分當前任務是否在執行,執行完成。

如何把任務分配給每一個節點,可以考慮搶占方式。每個任務節點都需要搶占任務,每個節點同時只能搶占1個任務。具體如何實現呢?可以考慮每個節點都啟動一個定時任務,定期掃表,掃到待執行子任務,嘗試執行該任務。

如何控制并發呢?可以使用redission的信號量。key為數據庫id,由任務負責定期輪訓,搶到名額后,就開始執行任務。將該任務狀態置為Process,任務完成后或失敗后,釋放信號量。

RedissonClient redissonClient = Redisson.create(config);
RSemaphore rSemaphore = redissonClient.getSemaphore("semaphore");
// 設置1個并發度
rSemaphore.trySetPermits(1);
rSemaphore.tryAcquire();//申請加鎖,非阻塞。

TaskTassk任務表Redisalt爭搶信號量成功定時輪訓任務開始查詢待執行的任務循環爭搶信號量修改任務狀態執行中,設置開始時間時間查詢當前進度讀取文件到從當前進度讀取文件,批量導入數據庫更新進度執行完成,釋放信號量申請下一個任務的信號量TaskTassk任務表Redis。

但是使用信號量限流有個問題,如果任務忘記釋放信號量,或者進程Crash無法釋放信號量,如何處理呢?可以考慮給信號量增加一個超時時間。那么如果任務執行過長,導致提前釋放信號量,另一個客戶單爭搶到信號量,導致兩個客戶端同時寫一個任務如何處理呢?

what,明明是將10億數據導入數據庫,怎么變成分布式鎖超時的類似問題?

實際上 Redisson 的信號量并沒有很好的辦法解決信號量超時問題,正常思維:如果任務執行過長,導致信號量被釋放,解決這個問題只需要續約就可以了,任務在執行中,只要發現快信號量過期了,就續約一段時間,始終保持信號量不過期。但是 Redission并沒有提供信號量續約的能力,怎么辦?

不妨換個思路,我們一直在嘗試讓多個節點爭搶信號量,進而限制并發度。可以試試選取一個主節點,通過主節點輪訓任務表。分三種情況,

情況1 當前執行中數量小于并發度。

  1. 則選取id最小的待執行任務,狀態置為進行中,通知發布消息。
  2. 消費到消息的進程,申請分布式鎖,開始處理任務。處理完成釋放鎖。借助于Redission分布式鎖續約,保證任務完成前,鎖不會超時。

情況2 當前執行中數量等于并發度。

  1. 主節點嘗試 get 進行中任務是否有鎖。
  2. 如果沒有鎖,說明有任務執行失敗,此時應該重新發布任務。如果有鎖,說明有任務正在執行中。

情況3 當前執行中數量大于并發度

  1. 上報異常情況,報警,人工介入 使用主節點輪訓任務,可以減少任務的爭搶,通過kafka發布消息,接收到消息的進程處理任務。為了保證更多的節點參與消費,可以考慮增加Kafka分片數。雖然每個節點可能同時處理多個任務,但是不會影響性能,因為性能瓶頸在數據庫。

那么主節點應該如何選取呢?可以通過Zookeeper+curator 選取主節點。可靠性比較高。

10億條數據插入數據庫的時間影響因素非常多。包括數據庫磁盤類型、性能。數據庫分庫數量如果能切分1000個庫當然性能更快,要根據線上實際情況決策分庫和分表數量,這極大程度決定了寫入的速率。最后數據庫批量插入的閾值也不是一成不變的,需要不斷測試調整,以求得最佳的性能。可以按照100,1000,10000等不斷嘗試批量插入的最佳閾值。

最后總結一下幾點重要的

總結

  1. 要首先確認約束條件,才能設計方案。確定面試官主要想問的方向,例如1T文件如何切割為小文件,雖是難點,然而可能不是面試官想考察的問題。
  2. 從數據規模看,需要分庫分表,大致確定分表的規模。
  3. 從單庫的寫入瓶頸分析,判斷需要進行分庫。
  4. 考慮到磁盤對并發寫的支持力度不同,同一個庫多個表寫入的并發需要限制。并且支持動態調整,方便在線上環境調試出最優值。
  5. MySQL innodb、myisam 存儲引擎對寫入性能支持不同,也要在線上對比驗證。
  6. 數據庫批量插入的最佳閾值需要反復測試得出。
  7. 由于存在并發度限制,所以基于Kafka分離讀取任務和寫入任務比較困難。所以合并讀取任務和寫入任務。
  8. 需要Redis記錄任務執行的進度。任務失敗后,重新導入時,記錄進度,可避免數據重復問題。
  9. 分布式任務的協調工作是難點,使用Redission信號量無法解決超時續約問題。可以由主節點分配任務+分布式鎖保證任務排他寫入。主節點使用Zookeeper+Curator選取。
責任編輯:武曉燕 來源: 君哥聊技術
相關推薦

2024-03-06 09:22:23

C#數據庫判重

2024-02-19 11:49:23

JavaBitMap類型

2024-07-04 13:42:12

2025-05-12 01:55:00

MySQL存儲數據

2021-07-06 07:08:18

管控數據數倉

2020-04-24 21:41:45

MySQL數據庫插入數據

2015-08-13 10:29:12

面試面試官

2025-09-18 09:43:43

2023-02-16 08:10:40

死鎖線程

2024-04-15 08:30:53

MySQLORM框架

2025-10-31 02:00:00

2024-02-20 14:10:55

系統緩存冗余

2024-03-18 14:06:00

停機Spring服務器

2024-09-11 22:51:19

線程通訊Object

2025-03-17 00:00:00

2024-04-03 00:00:00

Redis集群代碼

2010-08-12 16:28:35

面試官

2023-11-20 10:09:59

2024-06-03 06:45:18

2025-03-26 01:25:00

MySQL優化事務
點贊
收藏

51CTO技術棧公眾號

精品福利樱桃av导航| 99精品视频在线免费观看| 色婷婷久久av| 欧美一级片在线免费观看| 国产伦久视频在线观看| 久久久亚洲精品石原莉奈| 国产精品永久免费| 日本天堂在线视频| 成人免费电影网址| 日韩精品一区二区三区老鸭窝 | 精品日韩美女的视频高清| 秋霞久久久久久一区二区| 国产精品综合在线| 国产美女一区| 欧美成人免费一级人片100| 精品人妻一区二区三区香蕉| 国产午夜亚洲精品一级在线| 色视频欧美一区二区三区| 成人国产在线看| av资源在线观看免费高清| 国产成人综合网站| 国产精品久久久久国产a级| 2018天天弄| 成人情趣视频网站| 日韩视频在线观看一区二区| 无码少妇一区二区三区芒果| 久久久123| 亚洲欧美日韩一区二区| 日韩中文字幕av在线| 免费观看的毛片| 国产一区二区在线看| 国产精品久久久av| 久久久久亚洲av成人毛片韩| 欧美成人一品| 久久精品视频亚洲| 欧美成人久久久免费播放| 欧美毛片免费观看| 欧美大胆人体bbbb| 91网址在线观看精品| 国产成人77亚洲精品www| 欧美午夜电影在线| 久久国产成人精品国产成人亚洲| 调教一区二区| 亚洲黄网站在线观看| 中文字幕中文字幕在线中一区高清| 韩国三级在线一区| 成人免费高清视频| 日本精品视频在线播放| 国产在线精品观看| 在线看片不卡| 久久精品99久久久香蕉| 精品伦精品一区二区三区视频密桃| 免费观看久久av| 亚洲国产天堂网精品网站| 中文字幕在线播放一区二区| 在线成人免费| 91精品啪在线观看国产60岁| 五月婷婷六月丁香激情| 91国内外精品自在线播放| 一本到高清视频免费精品| 日韩av片在线看| 免费h视频在线观看| 亚洲sss视频在线视频| 欧美又粗又长又爽做受| wwwww亚洲| 五月天婷婷综合| 成人在线免费观看av| av有声小说一区二区三区| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 日本视频免费观看| 久久精品一区二区国产| 国产精品成人国产乱一区| 中国精品一区二区| 极品尤物av久久免费看| 91网免费观看| 五月激情婷婷网| 久久久久久99久久久精品网站| 欧美重口乱码一区二区| 日韩免费啪啪| 一区二区激情小说| 国产成人无码精品久久久性色| 自由日本语热亚洲人| 91黄色免费看| 999热精品视频| 麻豆一区二区麻豆免费观看| 亚洲石原莉奈一区二区在线观看| 免费看的黄色录像| 欧美1级日本1级| 91精品国产91久久| 国产男人搡女人免费视频| 捆绑紧缚一区二区三区视频| 91精品天堂| 日本黄在线观看| 国产精品福利一区二区| 97超碰国产精品| 综合久久2023| 91精品免费观看| 人妻体内射精一区二区三区| 国产一区二区三区四区| 久久综合久久88| 久久久久久少妇| 国内精品伊人久久久久av一坑| 国产91亚洲精品一区二区三区| 九色视频成人自拍| 亚洲精品免费视频| 国产成人无码av在线播放dvd| 成人精品视频在线观看| 日韩电影第一页| 免费高清在线观看电视| 亚洲免费网址| 99国产超薄肉色丝袜交足的后果| 九色在线播放| 亚洲成a人在线观看| 深夜黄色小视频| 亚欧日韩另类中文欧美| 不用播放器成人网| 亚洲国产精品无码久久久| 国产成人精品一区二| 亚洲欧美日韩精品在线| 女人让男人操自己视频在线观看| 7777精品久久久大香线蕉| 久久久久久国产精品无码| 欧美日韩精选| 国产专区欧美专区| 九色在线观看| 精品久久久久久久久国产字幕| 亚洲五月激情网| av一区二区在线播放| 38少妇精品导航| 狠狠躁夜夜躁av无码中文幕| 亚洲人吸女人奶水| 色播五月综合网| 精品中文字幕一区二区三区av| 久久久久久久久爱| 国产高清不卡视频| 亚洲天堂久久久久久久| 国产理论在线播放| 国产成人精品免费视| 91国内产香蕉| 熟妇人妻中文av无码| 一区二区欧美国产| 亚洲热在线视频| 综合激情一区| 92看片淫黄大片欧美看国产片 | 在线亚洲a色| 55夜色66夜色国产精品视频| 天天爽夜夜爽夜夜爽| 亚洲第一主播视频| 国产免费一区二区三区最新6| 欧美日韩国产高清| 成人羞羞视频免费| 波多野结衣在线播放| 精品福利av导航| 日本免费观看视| 91一区一区三区| 日韩手机在线观看视频| 欧美精选视频在线观看| 国产精品女主播视频| 在线观看完整版免费| 欧美日韩一区成人| 日本黄色片免费观看| 国产黑丝在线一区二区三区| 日韩国产小视频| 国产精品xxx在线观看| 91精品国产91久久久久| 噜噜噜在线观看播放视频| 在线观看av不卡| 国产美女网站视频| 国产最新精品免费| 国产夫妻自拍一区| 天堂网av成人| 国产精品亚洲激情| bt在线麻豆视频| 亚洲国内高清视频| 销魂美女一区二区| 国产精品不卡视频| 无码人妻丰满熟妇啪啪网站| 国产精品夜夜夜| 日韩国产欧美精品| 韩国一区二区三区视频| 97香蕉久久超级碰碰高清版| 国产永久免费高清在线观看视频| 欧美日韩大陆在线| 九九热精品在线观看| 91小视频免费观看| 亚洲欧美视频二区| 精品动漫3d一区二区三区免费| 久久久久se| 亚洲伊人精品酒店| 97视频在线观看视频免费视频| eeuss影院在线播放| 日韩西西人体444www| 久久久久久少妇| 亚洲欧美二区三区| 久久久久久久久久久国产精品| 久久超碰97中文字幕| 国产一区二区在线视频播放| 99re久久最新地址获取| 国产青春久久久国产毛片| 成人福利一区二区| 久久久久国产精品免费| av福利在线播放| 亚洲精品720p| 最近中文字幕av| 午夜精品在线看| 国产性生活大片| 久久久久久99精品| 韩国三级视频在线观看| 免费久久精品视频| 欧美亚洲一二三区| 女人天堂亚洲aⅴ在线观看| 日韩色妇久久av| 久久精品亚洲成在人线av网址| 成人激情av在线| 亚洲最大网站| 久久免费高清视频| 超碰caoporn久久| 中文字幕在线看视频国产欧美在线看完整 | 免费在线观看日韩| 国产精品素人一区二区| 在线 丝袜 欧美 日韩 制服| 成熟亚洲日本毛茸茸凸凹| 久久久精品高清| 日韩国产在线观看一区| 欧美在线观看www| 亚洲伦伦在线| 欧美大黑帍在线播放| 亚欧美无遮挡hd高清在线视频| 欧美最大成人综合网| 国产精品高潮呻吟久久久久| 91嫩草国产在线观看| 国产一区二区视频在线看| 国产精品影片在线观看| 成人免费在线观看视频| 国产精品96久久久久久又黄又硬| 欧美久久天堂| 91精品国产91久久久久久吃药| 草莓视频丝瓜在线观看丝瓜18| 久久99久久99精品中文字幕| 久久精品视频观看| xxxx欧美18另类的高清| 永久av在线| xx视频.9999.com| 久久亚洲天堂| 久久精品99久久香蕉国产色戒| 毛片在线看网站| 久久精品夜夜夜夜夜久久| 无遮挡动作视频在线观看免费入口| 国产一区二区三区18 | 久热爱精品视频线路一| 国内外激情在线| 欧美日韩第一视频| 调教一区二区| 久久久亚洲成人| 色黄视频在线观看| 日本一区二区三区在线播放| 中文字幕21页在线看| 日本免费一区二区三区视频观看| 日韩伦理三区| 国产精品久久久亚洲| 欧美一区=区三区| 91久久国产精品| 亚洲一区二区三区免费| 国产一区二区免费电影| 亚洲人和日本人hd| 性欧美精品一区二区三区在线播放 | 九九热国产在线| 精品成人国产在线观看男人呻吟| 中文字幕在线观看视频网站| 色综合色狠狠综合色| 最近中文字幕av| 欧美一区二区三区在线电影| 欧美一级特黄aaaaaa| 亚洲精品一区二区三区婷婷月| аⅴ资源新版在线天堂| 久久国产天堂福利天堂| 蜜臀av在线| 秋霞av国产精品一区| 欧美xxxx性| 成人av免费在线看| 综合干狼人综合首页| 天堂av免费看| 9色精品在线| 五月婷婷六月丁香激情| 懂色一区二区三区免费观看 | 国产剧情在线观看一区| 99亚洲精品视频| 在线亚洲伦理| 日本国产一级片| 99久久综合精品| 成人18视频免费69| 精品国产鲁一鲁一区二区张丽| 中文字字幕在线观看| 欧美精品一区二区在线播放 | 亚洲免费成人av在线| 中文字幕成人一区| 99精品视频免费观看| 在线观看国产福利| 91亚洲大成网污www| 青娱乐91视频| 欧美日韩视频不卡| 天天综合永久入口| 久热精品视频在线观看| 日本免费久久| 国产一区二区三区免费不卡| 91综合视频| 无码人妻丰满熟妇区五十路百度| 国产精品一品视频| 精品亚洲aⅴ无码一区二区三区| 亚洲一区av在线| 国产精品玖玖玖| 亚洲性无码av在线| 蜜桃视频在线观看播放| 亚洲综合视频1区| 日韩精品免费| 国内外免费激情视频| 成人动漫视频在线| 国产三级国产精品国产国在线观看| 欧美自拍偷拍午夜视频| 无码精品黑人一区二区三区 | 三级成人黄色影院| 国产精品乱子乱xxxx| 午夜精品视频一区二区三区在线看| 四虎永久在线精品无码视频| 成人av电影在线| 日韩一区二区三区四区在线| 欧美日本免费一区二区三区| 国产在线观看网站| 全球成人中文在线| 日韩精品欧美大片| 午夜精品久久久久久久无码| 成人永久免费视频| 欧美日韩偷拍视频| 日韩午夜激情免费电影| 成码无人av片在线观看网站| 国产拍精品一二三| 成人精品中文字幕| 国产精品拍拍拍| 国产三级精品视频| 无码人妻丰满熟妇精品区| 亚洲精品在线观看www| 两个人看的在线视频www| 国产一区免费在线| 国产精品美女久久久| 香港三级日本三级| 欧美日韩精品国产| 男女污污视频在线观看| 热久久免费视频精品| 亚洲专区视频| 日韩精品一区二区三区不卡| 亚洲国产精品ⅴa在线观看| 一区二区自拍偷拍| 日韩中文字在线| 日韩精品一区国产| 欧美国产日韩激情| 91丨porny丨中文| 中文字幕精品无| 北条麻妃久久精品| 天堂精品久久久久| 欧美日韩二三区| 久久精品欧美一区二区三区麻豆| 无码人妻丰满熟妇精品区| 最近更新的2019中文字幕| 亚洲伦理久久| www.在线观看av| 久久久噜噜噜久久中文字幕色伊伊| 久操视频在线免费观看| 色婷婷久久一区二区| 视频一区中文字幕精品| 国产午夜大地久久| 国产欧美日韩综合精品一区二区| 一级aaaa毛片| 欧美激情影音先锋| 在线观看欧美理论a影院| 日日干夜夜操s8| 亚洲制服丝袜一区| 国内精品在线视频| 91精品啪aⅴ在线观看国产| 在线看片日韩| xxxx日本黄色| 日韩欧美国产一区二区三区| 国产在线观看www| 亚洲精品国产精品国自产| 国产成人午夜片在线观看高清观看| 全部毛片永久免费看| 日韩在线视频播放| 久久超级碰碰| 91女神在线观看| 午夜不卡av免费| 在线观看av黄网站永久| 国产精品二区三区四区| 青青国产91久久久久久| 国产精品.www| 最近2019中文字幕一页二页| 美女一区二区在线观看| 污污的视频免费| 狠狠久久亚洲欧美专区| 国产三区视频在线观看| 欧美激情国产日韩| 国产精品一区二区免费不卡|