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

Kafka的架構原理,你真的理解嗎?

開發 架構 開發工具 Kafka
Apache Kafka 最早是由 LinkedIn 開源出來的分布式消息系統,現在是 Apache 旗下的一個子項目,并且已經成為開源領域應用最廣泛的消息系統之一。

 Apache Kafka 最早是由 LinkedIn 開源出來的分布式消息系統,現在是 Apache 旗下的一個子項目,并且已經成為開源領域應用最廣泛的消息系統之一。

[[240583]]

Kafka 社區非常活躍,從 0.9 版本開始,Kafka 的標語已經從“一個高吞吐量,分布式的消息系統”改為"一個分布式流平臺"。

Kafka 和傳統的消息系統不同在于:

  • Kafka是一個分布式系統,易于向外擴展。
  • 它同時為發布和訂閱提供高吞吐量。
  • 它支持多訂閱者,當失敗時能自動平衡消費者。
  • 消息的持久化。

Kafka 和其他消息隊列的對比:

入門實例

生產者

代碼如下:

  1. import java.util.Properties; 
  2. import org.apache.kafka.clients.producer.KafkaProducer; 
  3. import org.apache.kafka.clients.producer.ProducerRecord; 
  4. public class UserKafkaProducer extends Thread 
  5.     private final KafkaProducer<Integer, String> producer; 
  6.     private final String topic; 
  7.     private final Properties props = new Properties(); 
  8.     public UserKafkaProducer(String topic) 
  9.     { 
  10.         props.put("metadata.broker.list""localhost:9092"); 
  11.         props.put("bootstrap.servers""master2:6667"); 
  12.         props.put("retries", 0); 
  13.         props.put("batch.size", 16384); 
  14.         props.put("linger.ms", 1); 
  15.         props.put("buffer.memory", 33554432); 
  16.         props.put("key.serializer""org.apache.kafka.common.serialization.StringSerializer"); 
  17.         props.put("value.serializer""org.apache.kafka.common.serialization.StringSerializer"); 
  18.         producer = new KafkaProducer<Integer, String>(props); 
  19.         this.topic = topic; 
  20.     } 
  21. @Override 
  22.     public void run() { 
  23.         int messageNo = 1; 
  24.         while (true
  25.         { 
  26.             String messageStr = new String("Message_" + messageNo); 
  27.             System.out.println("Send:" + messageStr); 
  28.             //返回的是Future<RecordMetadata>,異步發送 
  29.             producer.send(new ProducerRecord<Integer, String>(topic, messageStr)); 
  30.             messageNo++; 
  31.             try { 
  32.                 sleep(3000); 
  33.             } catch (InterruptedException e) { 
  34.                 e.printStackTrace(); 
  35.             } 
  36.         } 
  37.     } 

消費者

代碼如下:

  1. Properties props = new Properties(); 
  2. /* 定義kakfa 服務的地址,不需要將所有broker指定上 */ 
  3. props.put("bootstrap.servers""localhost:9092"); 
  4. /* 制定consumer group */ 
  5. props.put("group.id""test"); 
  6. /* 是否自動確認offset */ 
  7. props.put("enable.auto.commit""true"); 
  8. /* 自動確認offset的時間間隔 */ 
  9. props.put("auto.commit.interval.ms""1000"); 
  10. props.put("session.timeout.ms""30000"); 
  11. /* key的序列化類 */ 
  12. props.put("key.deserializer""org.apache.kafka.common.serialization.StringDeserializer"); 
  13. /* value的序列化類 */ 
  14. props.put("value.deserializer""org.apache.kafka.common.serialization.StringDeserializer"); 
  15.  /* 定義consumer */ 
  16. KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props); 
  17. /* 消費者訂閱的topic, 可同時訂閱多個 */ 
  18. consumer.subscribe(Arrays.asList("foo""bar")); 
  19.  /* 讀取數據,讀取超時時間為100ms */ 
  20. while (true) { 
  21.     ConsumerRecords<String, String> records = consumer.poll(100); 
  22.     for (ConsumerRecord<String, String> record : records) 
  23.         System.out.printf("offset = %d, key = %s, value = %s", record.offset(), record.key(), record.value()); 

Kafka 架構原理

對于 Kafka 的架構原理,我們先提出如下幾個問題:

  • Kafka 的 topic 和分區內部是如何存儲的,有什么特點?
  • 與傳統的消息系統相比,Kafka 的消費模型有什么優點?
  • Kafka 如何實現分布式的數據存儲與數據讀取?

Kafka 架構圖

Kafka 名詞解釋

在一套 Kafka 架構中有多個 Producer,多個 Broker,多個 Consumer,每個 Producer 可以對應多個 Topic,每個 Consumer 只能對應一個 Consumer Group。

整個 Kafka 架構對應一個 ZK 集群,通過 ZK 管理集群配置,選舉 Leader,以及在 Consumer Group 發生變化時進行 Rebalance。

Topic 和 Partition

在 Kafka 中的每一條消息都有一個 Topic。一般來說在我們應用中產生不同類型的數據,都可以設置不同的主題。

一個主題一般會有多個消息的訂閱者,當生產者發布消息到某個主題時,訂閱了這個主題的消費者都可以接收到生產者寫入的新消息。

Kafka 為每個主題維護了分布式的分區(Partition)日志文件,每個 Partition 在 Kafka 存儲層面是 Append Log。

任何發布到此 Partition 的消息都會被追加到 Log 文件的尾部,在分區中的每條消息都會按照時間順序分配到一個單調遞增的順序編號,也就是我們的 Offset。Offset 是一個 Long 型的數字。

我們通過這個 Offset 可以確定一條在該 Partition 下的唯一消息。在 Partition 下面是保證了有序性,但是在 Topic 下面沒有保證有序性。

在上圖中我們的生產者會決定發送到哪個 Partition:

如果沒有 Key 值則進行輪詢發送。

如果有 Key 值,對 Key 值進行 Hash,然后對分區數量取余,保證了同一個 Key 值的會被路由到同一個分區;如果想隊列的強順序一致性,可以讓所有的消息都設置為同一個 Key。

消費模型

消息由生產者發送到 Kafka 集群后,會被消費者消費。一般來說我們的消費模型有兩種:

  • 推送模型(Push)
  • 拉取模型(Pull)

基于推送模型的消息系統,由消息代理記錄消費狀態。消息代理將消息推送到消費者后,標記這條消息為已經被消費,但是這種方式無法很好地保證消費的處理語義。

比如當我們已經把消息發送給消費者之后,由于消費進程掛掉或者由于網絡原因沒有收到這條消息,如果我們在消費代理將其標記為已消費,這個消息就***丟失了。

如果我們利用生產者收到消息后回復這種方法,消息代理需要記錄消費狀態,這種不可取。

如果采用 Push,消息消費的速率就完全由消費代理控制,一旦消費者發生阻塞,就會出現問題。

Kafka 采取拉取模型(Poll),由自己控制消費速度,以及消費的進度,消費者可以按照任意的偏移量進行消費。

比如消費者可以消費已經消費過的消息進行重新處理,或者消費最近的消息等等。

網絡模型

Kafka Client:單線程 Selector

單線程模式適用于并發鏈接數小,邏輯簡單,數據量小的情況。在 Kafka 中,Consumer 和 Producer 都是使用的上面的單線程模式。

這種模式不適合 Kafka 的服務端,在服務端中請求處理過程比較復雜,會造成線程阻塞,一旦出現后續請求就會無法處理,會造成大量請求超時,引起雪崩。而在服務器中應該充分利用多線程來處理執行邏輯。

Kafka Server:多線程 Selector

在 Kafka 服務端采用的是多線程的 Selector 模型,Acceptor 運行在一個單獨的線程中,對于讀取操作的線程池中的線程都會在 Selector 注冊 Read 事件,負責服務端讀取請求的邏輯。

成功讀取后,將請求放入 Message Queue共享隊列中。然后在寫線程池中,取出這個請求,對其進行邏輯處理。

這樣,即使某個請求線程阻塞了,還有后續的線程從消息隊列中獲取請求并進行處理,在寫線程中處理完邏輯處理,由于注冊了 OP_WIRTE 事件,所以還需要對其發送響應。

高可靠分布式存儲模型

在 Kafka 中保證高可靠模型依靠的是副本機制,有了副本機制之后,就算機器宕機也不會發生數據丟失。

高性能的日志存儲

Kafka 一個 Topic 下面的所有消息都是以 Partition 的方式分布式的存儲在多個節點上。

同時在 Kafka 的機器上,每個 Partition 其實都會對應一個日志目錄,在目錄下面會對應多個日志分段(LogSegment)。

LogSegment 文件由兩部分組成,分別為“.index”文件和“.log”文件,分別表示為 Segment 索引文件和數據文件。

這兩個文件的命令規則為:Partition 全局的***個 Segment 從 0 開始,后續每個 Segment 文件名為上一個 Segment 文件***一條消息的 Offset 值,數值大小為 64 位,20 位數字字符長度,沒有數字用 0 填充。

如下,假設有 1000 條消息,每個 LogSegment 大小為 100,下面展現了 900-1000 的索引和 Log:

由于 Kafka 消息數據太大,如果全部建立索引,既占了空間又增加了耗時,所以 Kafka 選擇了稀疏索引的方式,這樣索引可以直接進入內存,加快偏查詢速度。

簡單介紹一下如何讀取數據,如果我們要讀取第 911 條數據首先***步,找到它是屬于哪一段的。

根據二分法查找到它屬于的文件,找到 0000900.index 和 00000900.log 之后,然后去 index 中去查找 (911-900) = 11 這個索引或者小于 11 最近的索引。

在這里通過二分法我們找到了索引是 [10,1367],然后我們通過這條索引的物理位置 1367,開始往后找,直到找到 911 條數據。

上面講的是如果要找某個 Offset 的流程,但是我們大多數時候并不需要查找某個 Offset,只需要按照順序讀即可。

而在順序讀中,操作系統會在內存和磁盤之間添加 Page Cache,也就是我們平常見到的預讀操作,所以我們的順序讀操作時速度很快。

但是 Kafka 有個問題,如果分區過多,那么日志分段也會很多,寫的時候由于是批量寫,其實就會變成隨機寫了,隨機 I/O 這個時候對性能影響很大。所以一般來說 Kafka 不能有太多的 Partition。

針對這一點,RocketMQ 把所有的日志都寫在一個文件里面,就能變成順序寫,通過一定優化,讀也能接近于順序讀。

大家可以思考一下:

  • 為什么需要分區,也就是說主題只有一個分區,難道不行嗎?
  • 日志為什么需要分段?

副本機制

Kafka 的副本機制是多個服務端節點對其他節點的主題分區的日志進行復制。

當集群中的某個節點出現故障,訪問故障節點的請求會被轉移到其他正常節點(這一過程通常叫 Reblance)。

Kafka 每個主題的每個分區都有一個主副本以及 0 個或者多個副本,副本保持和主副本的數據同步,當主副本出故障時就會被替代。

在 Kafka 中并不是所有的副本都能被拿來替代主副本,所以在 Kafka 的 Leader 節點中維護著一個 ISR(In Sync Replicas)集合。

翻譯過來也叫正在同步中集合,在這個集合中的需要滿足兩個條件:

  • 節點必須和 ZK 保持連接。
  • 在同步的過程中這個副本不能落后主副本太多。

另外還有個 AR(Assigned Replicas)用來標識副本的全集,OSR 用來表示由于落后被剔除的副本集合。

所以公式如下:ISR = Leader + 沒有落后太多的副本;AR = OSR+ ISR。

這里先要說下兩個名詞:HW(高水位)是 Consumer 能夠看到的此 Partition 的位置,LEO 是每個 Partition 的 Log ***一條 Message 的位置。

HW 能保證 Leader 所在的 Broker 失效,該消息仍然可以從新選舉的 Leader 中獲取,不會造成消息丟失。

當 Producer 向 Leader 發送數據時,可以通過 request.required.acks 參數來設置數據可靠性的級別:

  • 1(默認):這意味著 Producer 在 ISR 中的 Leader 已成功收到的數據并得到確認后發送下一條 Message。如果 Leader 宕機了,則會丟失數據。
  • 0:這意味著 Producer 無需等待來自 Broker 的確認而繼續發送下一批消息。這種情況下數據傳輸效率***,但是數據可靠性卻是***的。
  • -1:Producer 需要等待 ISR 中的所有 Follower 都確認接收到數據后才算一次發送完成,可靠性***。

但是這樣也不能保證數據不丟失,比如當 ISR 中只有 Leader 時(其他節點都和 ZK 斷開連接,或者都沒追上),這樣就變成了 acks = 1 的情況。

高可用模型及冪等

 在分布式系統中一般有三種處理語義:

at-least-once

至少一次,有可能會有多次。如果 Producer 收到來自 Ack 的確認,則表示該消息已經寫入到 Kafka 了,此時剛好是一次,也就是我們后面的 Exactly-once。

但是如果 Producer 超時或收到錯誤,并且 request.required.acks 配置的不是 -1,則會重試發送消息,客戶端會認為該消息未寫入 Kafka。

如果 Broker 在發送 Ack 之前失敗,但在消息成功寫入 Kafka 之后,這一次重試將會導致我們的消息會被寫入兩次。

所以消息就不止一次地傳遞給最終 Consumer,如果 Consumer 處理邏輯沒有保證冪等的話就會得到不正確的結果。

在這種語義中會出現亂序,也就是當***次 Ack 失敗準備重試的時候,但是第二消息已經發送過去了,這個時候會出現單分區中亂序的現象。

我們需要設置 Prouducer 的參數 max.in.flight.requests.per.connection,flight.requests 是 Producer 端用來保存發送請求且沒有響應的隊列,保證 Produce r端未響應的請求個數為 1。

at-most-once

如果在 Ack 超時或返回錯誤時 Producer 不重試,也就是我們講 request.required.acks = -1,則該消息可能最終沒有寫入 Kafka,所以 Consumer 不會接收消息。

exactly-once

剛好一次,即使 Producer 重試發送消息,消息也會保證最多一次地傳遞給 Consumer。該語義是最理想的,也是最難實現的。

在 0.10 之前并不能保證 exactly-once,需要使用 Consumer 自帶的冪等性保證。0.11.0 使用事務保證了。

如何實現 exactly-once

要實現 exactly-once 在 Kafka 0.11.0 中有兩個官方策略:

單 Producer 單 Topic

每個 Producer 在初始化的時候都會被分配一個唯一的 PID,對于每個唯一的 PID,Producer 向指定的 Topic 中某個特定的 Partition 發送的消息都會攜帶一個從 0 單調遞增的 Sequence Number。

在我們的 Broker 端也會維護一個維度為,每次提交一次消息的時候都會對齊進行校驗:

  • 如果消息序號比 Broker 維護的序號大一以上,說明中間有數據尚未寫入,也即亂序,此時 Broker 拒絕該消息,Producer 拋出 InvalidSequenceNumber。
  • 如果消息序號小于等于 Broker 維護的序號,說明該消息已被保存,即為重復消息,Broker 直接丟棄該消息,Producer 拋出 DuplicateSequenceNumber。
  • 如果消息序號剛好大一,就證明是合法的。

上面所說的解決了兩個問題:

  • 當 Prouducer 發送了一條消息之后失敗,Broker 并沒有保存,但是第二條消息卻發送成功,造成了數據的亂序。
  • 當 Producer 發送了一條消息之后,Broker 保存成功,Ack 回傳失敗,Producer 再次投遞重復的消息。

上面所說的都是在同一個 PID 下面,意味著必須保證在單個 Producer 中的同一個 Seesion 內,如果 Producer 掛了,被分配了新的 PID,這樣就無法保證了,所以 Kafka 中又有事務機制去保證。

事務

在 Kafka 中事務的作用是:

  • 實現 exactly-once 語義。
  • 保證操作的原子性,要么全部成功,要么全部失敗。
  • 有狀態的操作的恢復。

事務可以保證就算跨多個,在本次事務中的對消費隊列的操作都當成原子性,要么全部成功,要么全部失敗。

并且,有狀態的應用也可以保證重啟后從斷點處繼續處理,也即事務恢復。

在 Kafka 的事務中,應用程序必須提供一個唯一的事務 ID,即 Transaction ID,并且宕機重啟之后,也不會發生改變。

Transactin ID 與 PID 可能一一對應,區別在于 Transaction ID 由用戶提供,而 PID 是內部的實現對用戶透明。

為了 Producer 重啟之后,舊的 Producer 具有相同的 Transaction ID 失效,每次 Producer 通過 Transaction ID 拿到 PID 的同時,還會獲取一個單調遞增的 Epoch。

由于舊的 Producer 的 Epoch 比新 Producer 的 Epoch 小,Kafka 可以很容易識別出該 Producer 是老的,Producer 并拒絕其請求。

為了實現這一點,Kafka 0.11.0.0 引入了一個服務器端的模塊,名為 Transaction Coordinator,用于管理 Producer 發送的消息的事務性。

該 Transaction Coordinator 維護 Transaction Log,該 Log 存于一個內部的 Topic 內。

由于 Topic 數據具有持久性,因此事務的狀態也具有持久性。Producer 并不直接讀寫 Transaction Log,它與 Transaction Coordinator 通信,然后由 Transaction Coordinator 將該事務的狀態插入相應的 Transaction Log。

Transaction Log 的設計與 Offset Log 用于保存 Consumer 的 Offset 類似。

***

關于消息隊列或者 Kafka 的一些常見的面試題,通過上面的文章可以提煉出以下幾個比較經典的問題,大部分問題都可以從上面總結后找到答案:

  • 為什么使用消息隊列?消息隊列的作用是什么?
  • Kafka 的 Topic 和分區內部是如何存儲的,有什么特點?
  • 與傳統的消息系統相比,Kafka 的消費模型有什么優點?
  • Kafka 如何實現分布式的數據存儲與數據讀取?
  • Kafka 為什么比 RocketMQ 支持的單機 Partition 要少?
  • 為什么需要分區,也就是說主題只有一個分區,難道不行嗎?
  • 日志為什么需要分段?
  • Kafka 是依靠什么機制保持高可靠,高可用?
  • 消息隊列如何保證消息冪等?
  • 讓你自己設計個消息隊列,你會怎么設計,會考慮哪些方面?

作者:李釗

簡介:目前就職于美團點評餐飲生態技術部,喜歡鉆研閱讀開源源碼。招3年以上Java開發,請發送簡歷到郵箱:lizhao07@meituan.com。

責任編輯:武曉燕 來源: 咖啡拿鐵微信公眾號
相關推薦

2018-11-20 09:37:19

Java內存模型

2018-07-05 14:25:01

TCP握手原理

2021-04-23 07:27:31

內存分配CPU

2021-09-08 07:49:35

Dubbo連接控制

2018-03-21 16:19:40

MVCMVPMVVM

2022-08-14 07:14:50

Kafka零拷貝

2022-01-05 12:03:48

MySQL索引數據

2021-08-30 15:41:13

Kafka運維數據

2022-09-23 11:00:27

KafkaZookeeper機制

2019-12-30 09:28:53

Kafka集群ZooKeeper

2023-05-17 08:52:56

Java原子性可見性

2019-07-31 09:04:42

LVSNginxHAProxy

2016-06-01 15:42:58

Hadoop數據管理分布式

2020-06-29 08:32:21

高并發程序員流量

2014-04-17 16:42:03

DevOps

2020-04-17 14:25:22

Kubernetes應用程序軟件開發

2022-07-26 00:00:22

HTAP系統數據庫

2025-08-06 08:53:35

2021-11-08 10:00:19

require前端模塊

2021-07-21 10:10:14

require前端代碼
點贊
收藏

51CTO技術棧公眾號

久久婷婷丁香| 波多野结衣一区二区三区免费视频| 国产高清精品网站| 欧美激情中文网| 国产全是老熟女太爽了| 一区二区三区四区日本视频| 97超碰欧美中文字幕| 日本久久久a级免费| 长河落日免费高清观看| 国产日韩在线观看视频| 亚洲成a人v欧美综合天堂| 久久久久久国产精品mv| 一级特黄aaa大片| 亚洲毛片av| 中文字幕av一区二区| 欧美一级特黄aaa| 99爱在线观看| 中文字幕一区二区日韩精品绯色| 3d动漫啪啪精品一区二区免费| 久久久久久久久久免费视频| 亚州av日韩av| 欧美成人乱码一区二区三区| 熟女少妇在线视频播放| 免费在线看黄网站| 91麻豆免费观看| 高清国产一区| 国产精品久久久久精| 中文一区在线| 欧美黄色片免费观看| 白丝女仆被免费网站| 日韩一级淫片| 欧美美女一区二区三区| 色欲av无码一区二区人妻| 超碰在线最新| 中文字幕制服丝袜一区二区三区 | 亚洲精品乱码视频| 头脑特工队2免费完整版在线观看| 久久99精品一区二区三区| 97免费在线视频| 久久久精品视频在线| 色135综合网| 在线播放国产一区二区三区| 香蕉视频色在线观看| 成人在线不卡| 色视频成人在线观看免| 国产中文字幕二区| 波多野结衣精品| 亚洲午夜久久久| 成人在线免费高清视频| 在线免费黄色| 国产精品伦理一区二区| 日本一区二区三区在线视频 | 亚洲人成在线免费观看| 无码国产69精品久久久久网站 | 成人黄视频免费| a天堂在线观看视频| 久久se精品一区二区| 国产精品久久久久影院日本 | 欧美剧情片在线观看| 国产精品99久久免费黑人人妻| 搞黄网站在线看| 亚洲国产精品久久久久秋霞影院| 青草全福视在线| 色呦呦呦在线观看| 亚洲一二三级电影| 亚洲熟妇无码另类久久久| 欧美色图天堂| 精品国产1区2区| 一本色道无码道dvd在线观看| 欧美一级鲁丝片| 一本到高清视频免费精品| 国产成人精品视频免费看| 久草免费在线视频| 日本高清不卡在线观看| 污网站免费在线| 国产欧美视频在线| 亚洲国产精品久久久久久| 国产a级黄色片| 亚洲精华一区二区三区| 亚洲人a成www在线影院| 99精品欧美一区二区| 日韩伦理视频| 欧美激情18p| www.欧美色| 国产麻豆视频精品| 精品国产一区二区三| 免费在线超碰| 亚洲欧美日韩国产中文在线| 91麻豆天美传媒在线| 免费看电影在线| 色综合久久久久网| 在线不卡一区二区三区| 香蕉成人app| 亚洲女人天堂av| 亚洲天堂网av在线| 国产欧美不卡| 91情侣偷在线精品国产| 人妻精品一区一区三区蜜桃91| 91丝袜高跟美女视频| 亚洲国产一区二区三区在线| 777电影在线观看| 五月激情六月综合| 不用播放器的免费av| 久草在线综合| 日韩在线免费视频观看| www.99re7.com| 久久99热国产| 免费久久99精品国产自| 欧美尤物美女在线| 都市激情亚洲色图| 992kp免费看片| 亚洲区小说区图片区qvod| 久久综合伊人77777蜜臀| 日韩三级一区二区三区| 美国av一区二区| 欧美极品一区| 成人女同在线观看| 欧美图区在线视频| 熟妇高潮精品一区二区三区| 精品盗摄女厕tp美女嘘嘘| 欧美另类老女人| 中文字幕免费在线看| jvid福利写真一区二区三区| 欧美亚州在线观看| 97人人爽人人澡人人精品| 欧美日韩国产经典色站一区二区三区| a视频免费观看| 一区三区视频| 国产精品久久久久久久免费大片 | 激情五月开心婷婷| av成人资源| 久久成人在线视频| 亚洲在线视频播放| 国产区在线观看成人精品 | 欧美不卡一区二区三区四区| 亚洲最大成人网站| 亚洲国产专区| 国产99在线播放| 天堂8中文在线| 欧美一区二区福利视频| 貂蝉被到爽流白浆在线观看| 亚洲国产专区| 精品国产一区二区三区免费 | 亚洲美女在线国产| 国产福利在线免费| 欧美熟乱15p| 国产精品久久久精品| 丝袜+亚洲+另类+欧美+变态| 亚洲欧美视频在线观看视频| 男人亚洲天堂网| 免费久久久久久久久| 欧美中文在线视频| 欧美欧美欧美| 欧美亚洲免费在线一区| 91成人在线免费视频| 亚洲欧美日韩国产一区二区| 91亚色免费| xxxcom在线观看| 亚洲精品福利免费在线观看| 欧美久久久久久久久久久久| 美女精品一区二区| 中文字幕一区二区三区四区五区六区| 996久久国产精品线观看| 中文字幕亚洲一区在线观看 | 亚洲激情视频在线| 色播视频在线播放| 91麻豆免费看| 麻豆三级在线观看| 91精品天堂福利在线观看| 成人免费淫片视频软件| www.在线视频| 亚洲国产精品一区二区三区| 青青草精品在线视频| 国产999精品久久久久久| 99在线免费视频观看| 麻豆一区二区| 国产精品99久久久久久白浆小说| a天堂中文在线| 91精品国产丝袜白色高跟鞋| 欧美一级特黄高清视频| 国产精品夜夜嗨| 玩弄中年熟妇正在播放| 国产精品欧美三级在线观看| 日韩女在线观看| 国产视频中文字幕在线观看| 欧美精品在线观看一区二区| 国产精品久久久免费看| 国产成人av一区二区三区在线| 国产欧美日韩小视频| 夜夜春成人影院| 91免费视频国产| 麻豆视频在线看| 色噜噜国产精品视频一区二区 | a∨色狠狠一区二区三区| 日韩中文字幕欧美| 秋霞av鲁丝片一区二区| 日本高清成人免费播放| 日韩在线观看视频一区二区| 国产成人自拍网| 亚洲狼人综合干| 国内揄拍国内精品久久| 欧美区高清在线| 日本在线视频一区二区三区| 久久人人爽人人爽人人片av高清| 你懂得网站在线| 日韩欧美成人一区| 69av视频在线观看| 亚洲一区二区视频在线观看| 亚洲国产第一区| 国产精选一区二区三区| 久久久精品在线视频| 国产精品久久久久久| 久99久视频| 精品一区二区三区中文字幕| 性欧美视频videos6一9| 蜜桃视频网站在线| 亚洲日本aⅴ片在线观看香蕉| 国产黄色美女视频| 欧美三级三级三级| 69视频免费在线观看| 一区二区成人在线视频| 免费看污片的网站| 久久综合色播五月| 一本加勒比波多野结衣| 国产在线视频精品一区| 日韩欧美xxxx| 国产精品五区| 免费拍拍拍网站| 欧美性久久久| mm131午夜| 亚洲精品成人无限看| 日韩av电影免费观看| 日韩美女精品| 久久久久久久久久久久久久一区| 视频免费一区二区| 91欧美精品午夜性色福利在线 | 成人在线看片| 精品视频一区二区三区| 国产精品福利片| 亚洲天堂电影| 日本电影亚洲天堂| 午夜影院在线观看国产主播| 久久av.com| a视频在线播放| 九九热在线精品视频| 国产激情小视频在线| 精品国产欧美成人夜夜嗨| 国产高清免费在线播放| 亚洲欧美成人网| 女人偷人在线视频| 在线观看欧美www| yiren22亚洲综合伊人22| 亚洲欧洲自拍偷拍| aaa在线观看| xxx一区二区| 人妖欧美1区| 8050国产精品久久久久久| 白白色在线观看| 欧美中文在线观看国产| 婷婷激情一区| 国产精品综合网站| 久久九九精品视频| 丁香婷婷久久久综合精品国产| 在线日韩成人| 久久久久se| 爽成人777777婷婷| 蜜桃视频成人在线观看| 一本到12不卡视频在线dvd| 异国色恋浪漫潭| 禁久久精品乱码| 日韩精品一区二区三区不卡| 久久电影一区| 免费成人黄色大片| 成人黄色av电影| 国产成人无码精品久久二区三| 国产片一区二区三区| 欧美一区二区三区粗大| 亚洲欧美综合网| 国产系列精品av| 欧美三区在线视频| 精品国产乱码久久久久久蜜臀网站| 日韩欧美国产系列| 亚洲色图21p| 日韩中文字幕在线观看| 久久不射影院| 国产精品va在线播放| 成人豆花视频| 鲁片一区二区三区| 亚洲精彩视频| 日韩av一二三四| 国产美女视频91| 亚洲码无人客一区二区三区| 欧美精彩视频一区二区三区| 国产aaaaaaaaa| 午夜av一区二区| 一区二区三区免费在线视频| 91精品国产高清一区二区三区| 黄色一级大片在线免费看国产| 亚洲男子天堂网| 男男gaygays亚洲| 国产精品美女免费视频| eeuss鲁片一区二区三区| 欧美婷婷久久| 最新亚洲一区| 国产精品久久久久久久av福利| 99久久99久久久精品齐齐| 国产视频123区| 欧美日韩一二三四五区| 国产精品国产三级国产aⅴ| 日韩精品在线免费观看| av毛片在线看| 国产精品日韩一区| 婷婷精品在线| 久久久久免费看黄a片app| 麻豆精品久久久| 日本一区二区三区网站| 亚洲色图视频免费播放| 日韩熟女一区二区| 亚洲国产精品99| 影音先锋在线视频| 国产伦精品免费视频| 美女av一区| 大荫蒂性生交片| 极品少妇xxxx精品少妇| 人妻熟女aⅴ一区二区三区汇编| 亚洲欧美色图小说| 亚洲无码久久久久久久| 精品一区二区三区三区| 97在线视频免费观看完整版| 国产精品久久久久久久9999 | 国产精品一二三在| 色老板免费视频| 欧美高清hd18日本| 国产黄色片在线播放| 欧美性在线视频| 偷拍自拍亚洲色图| 亚洲不卡中文字幕无码| 国产91对白在线观看九色| 中文字幕在线观看2018| 欧美日韩亚州综合| √新版天堂资源在线资源| 日本三级韩国三级久久| 欧美在线导航| 中文字幕日本最新乱码视频| 国产精品一卡二卡在线观看| 1024手机在线观看你懂的| 色屁屁一区二区| www在线播放| 国产裸体写真av一区二区| 精品欧美久久| 中文字幕第17页| 综合久久给合久久狠狠狠97色| 中文字幕欧美色图| www亚洲精品| 久久69av| 成人免费播放器| 91在线小视频| 成年人视频免费| 色哟哟亚洲精品一区二区| 欧美成人毛片| 51xx午夜影福利| 岛国精品在线播放| 99久在线精品99re8热| 日韩经典中文字幕| 亚洲天堂一区二区| 精品国产无码在线| 成人性生交大合| 久久一区二区三区视频| 亚洲欧美另类中文字幕| 久久久人成影片一区二区三区在哪下载| 神马影院一区二区| 国产精品一区在线| 800av免费在线观看| 亚洲天堂2020| crdy在线观看欧美| 被灌满精子的波多野结衣| 99久久99久久久精品齐齐| 精品久久久久久久久久久国产字幕 | 日韩超碰人人爽人人做人人添| 久久国产成人精品国产成人亚洲| 26uuu精品一区二区三区四区在线| 欧美一区二区激情视频| 一区二区三区视频免费在线观看| 性欧美video另类hd尤物| 日韩亚洲欧美一区二区| 99热精品国产| 在线观看黄色网| 久久久久亚洲精品国产| 免费成人av| 乳色吐息在线观看| 色噜噜狠狠成人中文综合| 黄色网在线免费看| 久久精品综合一区| 国产最新精品精品你懂的| 国产精品变态另类虐交| 永久555www成人免费| 97久久综合精品久久久综合| 各处沟厕大尺度偷拍女厕嘘嘘| 国产精品久久久久久久午夜片| 黄频网站在线观看|