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

深度剖析:Kafka 請求是如何處理? 看完這篇文章徹底懂了!

開發 架構
相信使用過 Kafka 的朋友都知道其吞吐量可以高達百萬,但很少人理解其中的設計原理。認真讀完這篇文章,你會對Kafka Broker請求處理流程和網絡架構設計實現細節,有更加深刻的理解。

開篇三問: Kafka Broker 端網絡架構和請求處理到底是使用了哪些高大上的技術?它到底解決了什么問題?究竟是怎么解決的?

只有了解了這些, 我們才能深刻掌握 Kafka 服務端設計精髓所在,更加深刻理解一個高并發、高性能服務端架構該如何設計。

相信使用過 Kafka 的朋友都知道其吞吐量可以高達百萬,但很少人理解其中的設計原理。認真讀完這篇文章,你會對Kafka Broker請求處理流程和網絡架構設計實現細節,有更加深刻的理解。

這篇文章干貨很多,希望大家可以耐心讀完。


01 總體概述

要想理解 Kafka Broker 請求處理架構設計,我們需要從簡單請求處理模型來說起。

對于日常系統開發,我們都知道是基于 Request/Response 的模式來實現的, 對于 Kafka 來說, 無論是 Producer 端、Consumer 端 還是 Broker 端,他們之間的請求交互也都是基于「Request/Response」模式來完成的。比如,客戶端會通過網絡發送消息生產請求給 Broker,而 Broker 處理完成后,會發送對應的響應給到客戶端。

下面,我會從自我設計角度出發,如果是我們會如何設計,帶你一步步演化出來「kafka Broker 的網絡請求處理」架構。

在這個過程中,你會看到 Kafka 在處理請求的過程中會遇到哪些高性能和高并發問題,以及架構為什么要這樣演進,從而理解 Kafka 這么設計的意義和精妙之處。

02 順序處理模式

我們從最簡單的網絡編程思路處理方式講起。

因為對于 Kafka Broker 來說就是用來接收生產者發送過來的請求,那這個時候最簡單的實現大概是這樣的:

如上述代碼所示:我們可以理解 Kafka 每個服務器啟動起來后就是一個 while 循環, 不斷的 accept 生產者提交上來的請求, 然后進行處理并存儲到磁盤上,這種方式實現最簡單,也非常好理解,但是這種方式存在2個致命的缺陷?

1)請求阻塞:只能順序處理每個請求,即每個請求都必須等待前一個請求處理完畢才能得到處理。

2)吞吐量非常差:由于只能順序處理,無法并發,效率太低,所以吞吐量非常差,只適合請求發送非常不頻繁的系統。

從上面來看很明顯,如果你的 Kafka 系統請求并發量很大,意味著要處理的時間就會越久。那按照前面我們提到的 Kafka「吞吐量」的標準,這個方案遠遠無法滿足我們對高性能、高并發的要求。

那有什么更好的方案可以快速處理請求嗎?

接下來我們可以試著采取這個方案:獨立線程異步處理模式。

03 多線程異步處理模式

既然同步方式會阻塞請求,吞吐量差, 我們可以嘗試著使用獨立線程異步方式進行處理, 即經典的 connection per thread 模型, 那這個時候的實現大概是這樣的:

如上述代碼所示:同上還是一個 while 循環不斷的 accept 生產者提交上來的請求,但是這時候 Kafka 系統會為每個請求都創建一個「單獨的線程」來處理。

這個實現方案的好處就是:

1)吞吐量稍強:相對上面同步方式的方案,一定程度上極大地提高了服務器的吞吐量。

2)非阻塞:它是完全異步的,每個請求的處理都不會阻塞下一個請求。

但同樣缺陷也同樣很明顯:即為每個請求都創建線程的做法開銷很大,在某些高并發場景下會壓垮整個服務。可見,這個方案也只適用于請求發送頻率很低的業務場景。還是無法滿足我們對高性能、高并發的要求。

既然這種方案還是不能滿足, 那么我們究竟該使用什么方案來支撐高并發呢?

這個時候我們可以想想我們日常開發用到的7層負載Nginx或者Redis在處理高并發請求的時候是使用什么方案呢?

從上面啟發你可以看出,提升系統 I/O 并發性能的關鍵思路就是:事件驅動。

想必大家已經猜到了,沒錯,就是「多路復用」。那么Kafka 是不是也是采用這種方案來實現呢?

這里我們先考慮采用基于「事件驅動」的設計方案,當有事件觸發時,才會調用處理器進行數據處理。

04 Reactor 模式

在高性能網絡編程領域,有一個非常著名的模式——Reactor模式。那么何為「Reactor模式」,首先它是基于事件驅動的,有一個或多個并發輸入源,有一個Service Handler,有多個Request Handler;這個Service Handler會同步的將輸入的請求輪詢地分發給相應的Request Handler進行處理。

借助于 Doug Lea(就是那位讓人無限景仰的大爺)的 "Scalable IO in Java" 中講述的Reactor模式。

"Scalable IO in Java" 的地址是:

??http://gee.cs.oswego.edu/dl/cpjslides/nio.pdf ??

簡單來說,Reactor 模式特別適合應用于處理多個客戶端并發向服務器端發送請求的場景。這里借用大神 PDF 中的一幅圖來說明 Reactor 架構:

從上面這張圖中,我們可以看出多個客戶端會發送請求給到 Reactor。Reactor 有個請求分發線程 Dispatcher,也就是圖中的綠色的 Acceptor,它會將不同的請求下分發到多個工作線程中處理。

在這個架構中,Acceptor 線程只是用來進行請求分發,所以非常輕量級,因此會有很高的吞吐量。而這些工作線程可以根據實際系統負載情況動態調節系統負載能力,從而達到請求處理的平衡性。

基于上面的 Reactor 架構, 我們來看看如果是我們該如何設計 Kafka 服務端的架構?

   1)這里我們采用多路復用方案,Reactor 設計模式,并引用 Java NIO 的方式可以更好的解決上面并發請求問題。

   2)當 Client 端將請求發送到 Server 端的時候, 首先在 Server 端有個多路復用器(Selector),然后會啟動一個 Accepter 線程將 OP_CONNECT 事件注冊到多路復用器上, 主要用來監聽連接事件到來。

   3)當監聽到連接事件后,就會在多路復用器上注冊 OP_READ 事件, 這樣 Cient 端發送過來的請求, 都會被接收到。如果請求特別多的話, 我們這里進行優化, 創建一個 Read HandlePool 線程池。

   4)當 Read HandlePool 線程池接收到請求數據后,最終會交給 Handler ThreadPool 線程池進行后續處理。比如如果是生產者發送過來的請求,肯定會解析請求體,處理并最終存儲到磁盤中,待處理完后要返回處理結果狀態, 這時候就由它在多路復用器上注冊 OP_WRITE 事件來完成。這樣多路復用器遍歷到OP_WRITE 事件后就會將請求返回到 Client 端。  

   5)在上圖中我們看到在整個流程中還有一個 MessageQueue 的隊列組件存在, 為什么要加這個組件呢? 我們可以想象一下, 如果請求量非常大,直接交給 Handler ThreadPool 線程池進行處理, 可能會出現該線程池處理不過來的情況發生,如果處理不過來,也會出現阻塞瓶頸。所以這里我們在 Server 端內部也設計一個消息隊列, 起到一個緩沖的作用,Handler ThreadPool 線程池會根據自己的負載能力進行處理。

以上就是我們引用了「多路復用」的設計方案,但是 Kafka Broker 端就是這樣的架構設計方案嗎?如果我們是 Kafka 系統架構的設計者,采用這樣的架構設計方案會不會還是有什么問題,有沒有哪個環節會出現系統性能瓶頸呢?  

這是個值得思考的問題, 很考驗你的架構設計能力。

細心的讀者可能會發現:對于 Kafka 這種超高并發系統來說,一個 Selector 多路復用器是 Hold 不住的,從上圖可以得出,我們監聽這些連接、接收請求、處理響應結果都是同一個 Selector 在進行處理,很容易成為系統性能瓶頸。

接下來,我們將進一步進行優化,為了減輕當前 Selector 的處理負擔,引入另外一個Selector 處理隊列,如下圖所示:

   1)首先上圖是目前我認為最接近 Kafka Broker 真實架構設計方案的。

   2)整體架構跟上一版的類似,只不過這里多引入了一個多 Selector 處理隊列,原來的 Selector 只負責監聽連接, 這時候有讀者就會有疑問,請求量超級大的時候,一個 Selector 會不會成為瓶頸呢? 這里可以大可放心, 這時候它的工作非常單一,是完全能 hold 住的。

   3)那么對于我們接收請求、處理請求、返回狀態操作都會交由多 Selector 處理隊列,至于這里到底需要多少個 Selector,又會跟什么參數和配置有關系,我們后續再進行分析,總之這里記住有多個 Selector 就行了,這樣系統壓力就會被分散處理。

   4)另外我們要搞清楚的一點就是對于 Kafka 服務端指的是每個 Broker 節點,如果我們的服務集群總共有10個節點, 每個節點內部都是上面的這樣的架構,這樣我們就有理由相信如果采用這樣的架構設計方案,是可以支持高并發和高性能的。

架構設計方案演進到這里,基本上已經差不多了,接下來我們看看 Kafka 真實超高并發的網絡架構是如何設計的。

05 Kafka 超高并發網絡架構

在上面 Kafka 高性能、高吞吐量架構演進的時候,我們提到了 Java NIO 以及 Reactor 設計模式。實際上,搞透了「Kafka 究竟是怎么使用 NIO 來實現網絡通信的」,不僅能讓我們掌握 Kafka 請求處理全流程處理,也能讓我們對 Reactor 設計模式有更深的理解,還能幫助我們解決很多實際問題。  

在<kafka 三高架構設計剖析> 和 <聊聊 Kafka Producer 那點事> 中也講過關于 Kafka 網絡架構,讀者可以去查閱,今天我們再次深入的對其進行剖析。

那么接下來我們就來深入剖析下 Kafka 的 NIO 通訊機制吧。

我們先從整體上看一下完整的網絡通信層架構,如下圖所示:

   1)從上圖中我們可以看出,Kafka 網絡通信架構中用到的組件主要由兩大部分構成:SocketServer 和 RequestHandlerPool。

   2)SocketServer 組件是 Kafka 超高并發網絡通信層中最重要的子模塊。它包含 Acceptor 線程、Processor 線程和 RequestChannel 等對象,都是網絡通信的重要組成部分。它主要實現了 Reactor 設計模式,主要用來處理外部多個 Clients(這里的 Clients 可能包含 Producer、Consumer 或其他 Broker)的并發請求,并負責將處理結果封裝進 Response 中,返還給 Clients。

   3)RequestHandlerPool 組件就是我們常說的 I/O 工作線程池,里面定義了若干個 I/O 線程,主要用來執行真實的請求處理邏輯。

   4)這里注意的是:跟 RequestHandler 相比, 上面所說的Acceptor、Processor 線程 還有 RequestChannel 等都不做請求處理, 它們只是請求和響應的「搬運工」。

接下來我們來具體聊聊SocketServer中的實現原理,這里先來講講:

  1. Acceptor 線程
  2. Processor 線程

以Kafka 2.5版本,源碼位置:

??https://github.com/apache/kafka/blob/2.5.0-rc3/core/src/main/scala/kafka/network/SocketServer.scala ??

1、我們先來聊聊 Acceptor 線程

在經典的 Reactor 設計模式有個 「Dispatcher」 的角色,主要用來接收外部請求并分發給下面的實際處理線程。通過上面分析我們知道在 Kafka 網絡架構設計中,這個 Dispatcher 就是「Acceptor 線程」。  

Acceptor 線程是用來接收和創建外部 TCP 連接的線程。在Broker 端每個 SocketServer 實例只會創建一個 Acceptor 線程。它的主要功能就是創建連接,并將接收到的 Request 請求傳遞給下游的 Processor 線程處理。

/**
* Thread that accepts and configures new connections. There is one of these per endpoint.
*/
private[kafka] class Acceptor(val endPoint: EndPoint,
val sendBufferSize: Int,
val recvBufferSize: Int,
brokerId: Int,
connectionQuotas: ConnectionQuotas,
metricPrefix: String) extends AbstractServerThread(connectionQuotas) with KafkaMetricsGroup {
// 1. 創建底層的NIO Selector對象,用來監聽連接創建請求、讀寫請求等
private val nioSelector = NSelector.open()
// 2. Broker端創建對應的ServerSocketChannel實例,然后將Channel注冊到Selector對象上
val serverChannel = openServerSocket(endPoint.host, endPoint.port)
// 3. 創建Processor線程池
private val processors = new ArrayBuffer[Processor]()
......
/**
* Accept loop that checks for new connection attempts
*/
def run(): Unit = {
//注冊OP_ACCEPT事件
serverChannel.register(nioSelector, SelectionKey.OP_ACCEPT)
// 等待Acceptor線程啟動完成
startupComplete()
try {
// 當前使用的Processor序號,從0開始
var currentProcessorIndex = 0
while (isRunning) {
try {
// 每500毫秒獲取一次就緒I/O事件
val ready = nioSelector.select(500)
// 如果有I/O事件準備就緒
if (ready > 0) {
........
// 調用accept方法創建Socket連接
accept(key).foreach { socketChannel =>
........
// 指定由哪個Processor線程進行處理
processor = synchronized {
.........
processors(currentProcessorIndex)
}
// 更新Processor線程序號
currentProcessorIndex += 1
}
.........
}
}

這里重點看下 Acceptor 線程中三個非常關鍵且重要的屬性和方法:

1.1、nioSelector:它就是我們所熟悉的 Java NIO 庫中的 Selector 對象實例,所有網絡通信組件實現 Java NIO 機制的基礎。

1.2、processors:通過源碼我們可以知道在Acceptor 線程在初始化時,需要創建對應的 Processor 線程池。由此可以得出,Processor 線程是在 Acceptor 線程中管理和維護的。  

1.3、run方法:它是處理 Reactor 模式中分發邏輯的主要實現方法。

   1)從上述源碼中,我們可以看出 Acceptor 線程主要使用了 Java NIO 的 Selector 以及 SocketChannel 的方式循環的輪詢準備就緒的 I/O 事件。

   2)這里的 I/O 事件主要是指網絡連接創建事件即:SelectionKey.OP_ACCEPT。

   3)這樣注冊好事件后,一旦后續接收到連接請求后,Acceptor 線程就會指定一個 Processor 線程,并將該請求交給它并創建網絡連接用于后續處理。

2、接下來我們來聊聊 Processor 線程:

從上面分析我們知道 Acceptor 只是做了請求入口連接處理的,那么,真正創建網絡連接以及分發網絡請求是由 Processor 線程來完成的。

override def run(): Unit = {
// 等待Processor線程啟動完成
startupComplete()
try {
while (isRunning) {
try {
// 創建新連接
configureNewConnections()
// 發送Response
processNewResponses()
// 執行NIO poll,獲取對應SocketChannel上準備就緒的I/O操作
poll()
// 將接收到的Request放入Request隊列
processCompletedReceives()
.......
} catch {
.........
}
}
} finally {
........
}
}
........
// 默認連接對接大小
val ConnectionQueueSize = 20
// 保存要創建的新連接信息
private val newConnections = new ArrayBlockingQueue[SocketChannel](connectionQueueSize)
// 一個臨時 Response 隊列
private val inflightResponses = mutable.Map[String, RequestChannel.Response]()
// Response 隊列
private val responseQueue = new LinkedBlockingDeque[RequestChannel.Response]()

從上面 Processor 線程源碼,可以看出 Kafka 的代碼邏輯實現的非常好,各個子方法的邊界非常清楚。

這里我們就不展開源碼分析了, 更深入詳細的等到源碼分析專題再進行。我們簡單的看下 Processor 線程初始化時要做的事情。

看上面代碼最后部分,我們知道每個 Processor 線程在創建時都會創建 3 個隊列。

   1)newConnections 隊列: 它主要是用來保存要創建的新連接信息,也就是SocketChannel 對象,目前是硬編碼隊列長度大小為20。每當 Processor 線程接收到新的連接請求時,都會將對應的 SocketChannel 對象放入隊列,等到后面創建連接時,從該隊列中獲取 SocketChannel,然后注冊新的連接。

   2)inflightResponse 隊列:它是一個臨時的 Response 隊列, 當 Processor 線程將 Repsonse 返回給 Client 之后,要將 Response 放入該隊列。它存在的意義:由于有些 Response 回調邏輯要在 Response 被發送回 Request 發送方后,才能執行,因此需要暫存到臨時隊列。

   3)ResponseQueue 隊列:它主要是存放需要返回給Request 發送方的所有 Response 對象。通過源碼得知:每個 Processor 線程都會維護自己的 Response 隊列。


06 請求處理核心流程剖析

上面深入的剖析了 Kafka 超高并發網絡架構 以及 SocketServer 中的 Acceptor 線程跟 Processor 線程的實現原理, 接下來我們來將請求處理核心流程給串起來。

只有搞透這部分的實現原理,才能幫助我們有針對性的進行 Broker端請求處理的性能調優。

比如:在上面網絡架構圖,有兩個參數跟整個流程有關系,分別是num.network.threads、num.io.threads。如果我們不掌握請求處理的整個流程,就不能更好的對此進行調整,來達到更高的性能要求。

其中 num.io.threads 就是 I/O 工作線程池的大小配置,即 KafkaRequestHandlerPool 線程池,它才是「真正處理 Kafka 請求」的地方。

源碼位置:

??https://github.com/apache/kafka/blob/2.5.0-rc3/core/src/main/scala/kafka/server/KafkaRequestHandler.scala??

/**
* A thread that answers kafka requests.
*/
class KafkaRequestHandler(id: Int, //I/O線程序號
brokerId: Int, //所在Broker序號,即broker.id
val aggregateIdleMeter: Meter,
val totalHandlerThreads: AtomicInteger, //I/O線程池大小
val requestChannel: RequestChannel, //請求處理通道
apis: KafkaApis, //KafkaApis類,用于真正實現請求處理邏輯的類
time: Time) extends Runnable with Logging {
......
def run(): Unit = {
while (!stopped) {
val startSelectTime = time.nanoseconds
// 從請求隊列中獲取下一個待處理的請求
val req = requestChannel.receiveRequest(300)
val endTime = time.nanoseconds
// 統計線程空閑時間
val idleTime = endTime - startSelectTime
// 更新線程空閑百分比指標
aggregateIdleMeter.mark(idleTime / totalHandlerThreads.get)
req match {
// 當關閉線程請求處理
case RequestChannel.ShutdownRequest =>
......
// 當普通請求到來時
case request: RequestChannel.Request =>
try {
request.requestDequeueTimeNanos = endTime
// 由KafkaApis.handle方法執行相應處理邏輯
apis.handle(request)
} catch {
....
} finally {
// 釋放請求對象資源
request.releaseBuffer()
}
case null => // continue
}
}
shutdownComplete.countDown()
}
}

下面我們結合 Kafka 超高并發網絡架構圖來講解下一個完整請求處理核心流程:

   1)Clients 發送請求給 Acceptor 線程。

   2)Acceptor 線程會創建 NIO Selector 對象,并創建 ServerSocketChannel 實例,然后將Channel 和 OP_ACCEPT 事件到 Selector 多路復用器上。

   3)Acceptor 線程還會默認創建3個大小的 Processor 線程池,參數:num.network.threads, 并輪詢的將請求對象 SocketChannel 放入到連接隊列中(newConnections)。

   4)這時候連接隊列就源源不斷有請求數據了,然后不停地執行 NIO Poll, 獲取對應 SocketChannel 上已經準備就緒的 I/O 事件。

   5)Processor 線程向 SocketChannel 注冊了 OP_READ/OP_WRITE 事件,這樣 客戶端發過來的請求就會被該 SocketChannel 對象獲取到,具體就是CompleteReceives。

   6)這個時候客戶端就可以源源不斷進行請求發送了,服務端通過 Selector NIO Poll 不停的獲取準備就緒的 I/O 事件。

   7)然后根據Channel中獲取已經完成的 Receive 對象,構建 Request 對象,并將其存入到 Requestchannel 的 RequestQueue 請求隊列中 。

   8)這個時候就該 I/O 線程池上場了,KafkaRequestHandler 線程循環地從請求隊列中獲取 Request 實例,然后交由KafkaApis 的 handle 方法,執行真正的請求處理邏輯,并最終將數據存儲到磁盤中。

   9)待處理完請求后,KafkaRequestHandler 線程會將 Response 對象放入 Processor 線程的 Response 隊列。

   10)然后 Processor 線程通過 Request 中的 ProcessorID 不停地從 Response 隊列中來定位并取出 Response 對象,返還給 Request 發送方。

至此,我們深入剖析Kafka請求處理「核心流程」。

07 系統調優

搞透了 Kafka 超高并發網絡架構設計和請求處理核心流程后,我們來聊聊 Broker 端參數調優。

對 Kafka 而言,性能一般是指吞吐量和延時。所以高吞吐量、低延時是我們調優 Kafka 集群的主要目標。

Broker 端調優主要就是合理地設置 Broker 端參數值,以匹配你的生產環境。另外還有一點要說明的就是「保證服務器端和客戶端版本的一致」,做到這一點,就能獲得很多性能收益了。

num.network.threads

創建 Processor 處理網絡請求線程個數,建議設置為 Broker 當前CPU核心數*2,這個值太低經常出現網絡空閑太低而缺失副本。

num.io.threads

創建 KafkaRequestHandler 處理具體請求線程個數,建議設置為Broker磁盤個數*2。

num.replica.fetchers

建議設置為CPU核心數/4,適當提高可以提升CPU利用率及 Follower同步 Leader 數據當并行度

compression.type

建議采用lz4壓縮類型,壓縮可以提升CPU利用率同時可以減少網絡傳輸數據量。

log.flush.xxx

log.flush.scheduler.interval.ms

log.flush.interval.ms

log.flush.interval.messages

這幾個參數表示日志數據刷新到磁盤的策略,應該保持默認配置,刷盤策略讓操作系統去完成,由操作系統來決定什么時候把數據刷盤;如果設置來這個參數,可能對吞吐量影響非常大

auto.leader.rebalance.enable

表示是否開啟leader自動負載均衡,默認true;我們應該把這個參數設置為false,因為自動負載均衡不可控,可能影響集群性能和穩定。

08 總結

這里,我們一起來總結一下這篇文章的重點。

1、對于 Kafka 這樣一個優秀的服務端系統架構來說,應該遵循高可用、高性能、高并發 3 大原則。

2、本文從最簡單的網絡編程思路出發一步一步演進到 Reactor 設計模式,假設我們就是 Kafka 架構的設計者,我們該如何設計其服務端網絡架構。

3、通過本文的深度剖析,提升系統I/O性能的核心是基于「事件驅動」模型實現。

4、在剖析完服務端網絡架構后,我們也深度剖析了 SocketServer中兩個最重要的線程:Acceptor 線程和 Processor 線程。

5、接著我們結合 Kafka 超高并發網絡架構圖又梳理了 Kafka 請求處理核心流程。

6、最后給大家分析并做了 Broker 端系統調優的方案。 

責任編輯:龐桂玉 來源: Coder的技術之路
相關推薦

2024-12-19 08:00:00

2019-05-30 09:32:49

2019-08-01 11:04:10

Linux磁盤I

2024-07-05 11:01:13

2025-05-28 02:20:00

2017-03-10 21:04:04

Android適配

2017-03-07 15:35:26

Android適配 界面

2019-07-10 15:15:23

JVM虛擬機Java

2020-11-25 08:25:02

二叉樹節點

2024-01-17 08:18:14

RPAJava技術

2019-01-30 13:44:34

JVM內存服務器

2021-04-27 07:59:11

內聯匯編 C 語言 asm 關鍵字

2023-10-08 19:06:41

2020-11-17 07:43:24

互聯網MVC服務類

2021-02-24 07:38:50

Redis

2018-07-31 14:03:09

JVM內存數據

2017-08-09 15:07:08

大數據數據分析戶畫像

2018-06-26 16:31:45

2022-02-18 06:56:18

Wi-Fi路由器局域網

2021-10-14 06:36:38

存儲云存儲本地存儲
點贊
收藏

51CTO技術棧公眾號

亚洲成人一品| 97超碰在线免费| 国产乱码字幕精品高清av | 黄色片在线免费看| 久久99国产精品免费| 欧美成人第一页| 亚洲精品视频大全| 综合在线影院| 亚洲黄一区二区三区| 狠狠色狠狠色综合人人| 中文字幕人妻一区二区三区视频| 女主播福利一区| 日韩av在线一区二区| 老司机久久精品| av老司机在线观看| 中文字幕日韩av资源站| 久久99精品久久久久久久青青日本| 国语对白做受69按摩| 午夜久久黄色| 在线观看久久久久久| 麻豆短视频在线观看| av在线不卡精品| 亚洲成年人影院| 在线视频不卡一区二区三区| 四虎影院在线播放| 国产成人av网站| 国产精品热视频| 日产精品久久久| 欧美视频二区| 日韩少妇与小伙激情| b站大片免费直播| 国产精品对白久久久久粗| 欧美日韩中文字幕一区二区| 国产精品无码av在线播放| www.欧美日本韩国| 亚洲国产精品高清| 欧美成人蜜桃| 五月婷婷丁香花| 国产aⅴ综合色| 亚洲一区二区久久久久久| 波多野结衣黄色| 亚洲欧美日韩国产综合精品二区| 欧美日韩电影在线观看| 91传媒免费观看| 成人毛片免费看| 亚洲色图偷窥自拍| 久久久久久久久免费看无码 | 免费国产一区| 日本黄色大片视频| 国产成人av福利| 99久久自偷自偷国产精品不卡| 亚洲一级特黄毛片| 青娱乐精品在线视频| 国产高清视频一区三区| 久久亚洲精品石原莉奈 | 97久久伊人激情网| 国产精品99无码一区二区| 欧美午夜电影在线观看| 欧美乱妇40p| 全程偷拍露脸中年夫妇| 综合激情在线| 欧美裸身视频免费观看| 99精品久久久久| 激情丁香综合| 韩国国内大量揄拍精品视频| 日本一区二区免费在线观看| 亚洲日产国产精品| 2020久久国产精品| 欧美在线观看不卡| 日韩va欧美va亚洲va久久| 国产精品美女久久久免费 | av中文在线资源| 福利一区视频在线观看| 人人干人人视频| 黄色成人小视频| 91精品黄色片免费大全| 日本wwwxx| 老司机在线精品视频| 精品视频—区二区三区免费| 色一情一交一乱一区二区三区| 成人av国产| 欧美大奶子在线| 日韩欧美a级片| 日韩一区精品视频| 成人精品在线观看| 六月丁香综合网| 久久精品人人做| 爱爱爱视频网站| 波多野结衣在线高清| 色老头久久综合| 日韩av加勒比| 欧美男男freegayvideosroom| 亚洲天堂免费观看| 成人免费视频网站入口::| 国产精品激情电影| 国产成人久久久| 国产女人高潮时对白| 91在线视频网址| 一区二区不卡在线| 55av亚洲| 91精品国产综合久久精品图片| youjizz.com国产| 精品一区二区三区中文字幕老牛| 久久国产精品久久久| 欧美精品韩国精品| 国产精品一二三四区| 蜜桃久久精品乱码一区二区| 九义人在线观看完整免费版电视剧| 一个色在线综合| 在线免费观看视频黄| swag国产精品一区二区| 中文字幕精品网| 色播视频在线播放| 国产尤物一区二区| 亚洲国产精品久久久久婷婷老年| 大香伊人中文字幕精品| 欧美日韩国产成人在线91| 一二三不卡视频| 午夜精品偷拍| 91久久综合亚洲鲁鲁五月天| 欧美美女搞黄| 亚洲国产视频直播| 老司机久久精品| 国产欧美久久一区二区三区| 久久免费观看视频| av手机免费看| 国产精品伦一区| 欧美日韩一区二区在线免费观看| 中文字幕一区二区三区四区久久| 视频直播国产精品| 国产嫩bbwbbw高潮| av在线一区二区三区| 高清无码一区二区在线观看吞精| 粉嫩av一区二区三区四区五区| 亚洲精品美女久久久久| 欧美人与禽zozzo禽性配| 免费观看在线色综合| 欧美连裤袜在线视频| 日本黄色免费在线| 亚洲韩国青草视频| 日本熟伦人妇xxxx| 成人一二三区视频| 青青草国产免费| aiai久久| 欧美华人在线视频| www精品国产| 一区二区三区在线观看网站| 中文字幕第22页| 国产精品久久久久蜜臀| 国产主播精品在线| 欧美精品电影| 欧美丰满少妇xxxbbb| 亚洲视频重口味| 久久国产精品99精品国产| 亚洲精品一品区二品区三品区| 日韩伦理三区| 亚洲最新av网址| 最近中文字幕在线观看视频| 国产日韩欧美a| 亚洲xxxx2d动漫1| 99精品在线观看| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 久久96国产精品久久99软件| 一个人www视频在线免费观看| 日韩精品中文在线观看| 亚洲熟妇无码乱子av电影| 久久久国产精品不卡| 亚洲 中文字幕 日韩 无码| 日韩成人影院| 91老司机在线| 黄色在线看片| 日韩精品高清在线观看| 日韩精品一区不卡| 国产精品成人免费在线| 一个人看的视频www| 在线欧美三区| 日本公妇乱淫免费视频一区三区| 99久久综合国产精品二区| 日韩视频在线免费| 性生活免费网站| 精品久久香蕉国产线看观看gif| 熟女少妇一区二区三区| 久久精品99国产国产精| 欧洲精品在线播放| 在线日韩网站| 成人在线免费观看视视频| 俺来俺也去www色在线观看| 亚洲老板91色精品久久| 97人人爽人人爽人人爽| 亚洲www啪成人一区二区麻豆| 黑人巨大精品欧美| 久久se精品一区二区| 日韩免费视频播放| 久久美女视频| 久久爱av电影| 精品国产一区二区三区2021| 欧美亚洲成人xxx| 毛片av在线| 亚洲精品国产美女| 一级片在线免费观看视频| 亚洲一区二区三区四区中文字幕| 一区二区黄色片| 国产精品一卡二| 成年人免费大片| 好吊视频一区二区三区四区| 日本在线高清视频一区| 综合伊人久久| 国产欧美日韩精品专区| 超碰在线视屏| 美女少妇精品视频| 国产高清一级毛片在线不卡| 精品国精品自拍自在线| 一级片aaaa| 色天天综合久久久久综合片| 久久免费视频99| 国产精品欧美精品| av直播在线观看| 国产91精品免费| 日本国产一级片| 视频在线观看一区二区三区| 国产成人在线小视频| 欧美岛国激情| 欧洲国产精品| 琪琪久久久久日韩精品| 91视频最新| www.久久热| 国产精品久久久久免费a∨大胸| 3344国产永久在线观看视频| 久久亚洲成人精品| 1区2区3区在线观看| 亚洲欧美中文字幕在线一区| 手机看片福利永久| 精品国产一区二区三区久久影院| 国产人妻精品一区二区三区| 欧美日韩一区二区三区不卡| 精品无码一区二区三区的天堂| 精品国产91久久久| 国产极品美女高潮无套嗷嗷叫酒店| 亚洲视频免费看| 欧美xxxooo| 国产精品美女久久福利网站| 国产成人一区二区在线观看| 久久毛片高清国产| 性少妇bbw张开| 91麻豆swag| 亚洲一级中文字幕| 久久久99久久精品欧美| 欧美狂猛xxxxx乱大交3| 26uuu亚洲综合色欧美| 国产ts丝袜人妖系列视频| 99久久夜色精品国产网站| 水蜜桃av无码| 99re6这里只有精品视频在线观看| 伊人久久一区二区三区| 99麻豆久久久国产精品免费| 亚洲蜜桃精久久久久久久久久久久| 成a人片亚洲日本久久| 捆绑凌虐一区二区三区| 91在线视频播放| a级大片在线观看| 国产无人区一区二区三区| 五月婷六月丁香| 亚洲视频免费观看| 豆国产97在线 | 亚洲| 精品美女永久免费视频| 日韩在线视频不卡| 欧美日韩欧美一区二区| 99国产精品久久久久久久成人| 欧美一区二区三区视频| 粉嫩av一区二区夜夜嗨| 日韩成人在线视频观看| 国产色在线 com| zzijzzij亚洲日本成熟少妇| 午夜小视频在线观看| 91精品国产高清久久久久久久久 | 国产精品久久久久久久龚玥菲 | 欧美污视频久久久| 久久免费精品视频在这里| 黄色免费高清视频| 亚洲欧洲日本一区二区三区| 男女曰b免费视频| 狠狠久久亚洲欧美| 国产女人18毛片水真多18| 久久精品在线观看| 麻豆天美蜜桃91| 欧美性69xxxx肥| 国产理论片在线观看| 亚洲国产天堂网精品网站| 波多野结衣一区二区| 欧美成人合集magnet| 伊人久久国产| 亚洲aa在线观看| 美女网站一区| 丰满人妻一区二区三区53号| 免费久久99精品国产自在现线| 手机版av在线| 99久久er热在这里只有精品15| 国产又粗又黄又猛| 亚洲国产成人va在线观看天堂| 国产真人无遮挡作爱免费视频| 日韩一区二区在线看| 欧美中文在线| 欧美国产亚洲视频| yiren22亚洲综合| 久久99国产精品| 午夜性色一区二区三区免费视频| 能在线观看的av| 国产大片一区二区| 四虎成人免费影院| 精品毛片网大全| www国产一区| www.日韩视频| 亚洲第一二三四区| 国产一区在线免费观看| 88国产精品视频一区二区三区| 欧美 日韩精品| 国产不卡视频在线播放| 秋霞欧美一区二区三区视频免费| 大桥未久av一区二区三区| 国产xxxx孕妇| 日韩资源在线观看| 欧美影视资讯| 蜜桃狠狠色伊人亚洲综合网站| 亚洲天堂男人| 国产xxxxhd| 中文字幕一区二区三区蜜月| 中文字幕免费观看| 国产视频精品免费播放| ririsao久久精品一区| 91天堂在线观看| 五月久久久综合一区二区小说| 精品久久久久久中文字幕2017| 91首页免费视频| 日本少妇裸体做爰| 精品国产自在久精品国产| 国产视频在线播放| 成人性生交大片免费观看嘿嘿视频| 成人av资源电影网站| 欧美精品性生活| 日本一区二区三区久久久久久久久不 | 蜜芽tv福利在线视频| 97成人超碰免| 色综合久久中文| 欧美色图另类小说| 99精品欧美一区二区三区综合在线| 免费观看一级视频| 亚洲第一天堂无码专区| 97蜜桃久久| 欧美激情国产日韩| 男女av一区三区二区色多| 欧美大片免费播放器| 精品久久久香蕉免费精品视频| 色婷婷av一区二区三区之e本道| 性视频1819p久久| 日韩欧美天堂| 国产精品亚洲二区在线观看| 久久精品一区八戒影视| 国产成人a v| 中文字幕在线成人| 91成人精品观看| 免费看日本黄色| 99久久国产综合精品色伊| 欧美特黄aaaaaa| 国产亚洲精品高潮| 亚洲网站免费| 国内少妇毛片视频| av不卡免费在线观看| 9i精品福利一区二区三区| 国产一区二区三区在线观看视频 | 国产一区二区三区高清| 亚洲专区欧美专区| 色欲AV无码精品一区二区久久 | 尤物av一区二区| 国产香蕉在线观看| 日本一欧美一欧美一亚洲视频| 日本欧美国产| 久久久久亚洲av无码专区首jn| 午夜影院久久久| 二区三区在线| 亚洲精品欧美日韩专区| 亚洲一区二区三区四区五区午夜 | 有坂深雪av一区二区精品| 天天射天天色天天干| 国产成人一区二区三区| 外国成人免费视频| 男女一区二区三区| 欧美图区在线视频| 国产乱码在线| 日本成人三级| 国产成人精品免费在线| 免费的毛片视频| 两个人的视频www国产精品| 久久亚洲道色| 国产原创精品在线| 亚洲成a天堂v人片| 欧美三级理伦电影| 精品蜜桃传媒| 国产在线精品免费av| 精品国产乱子伦| 欧美激情一级精品国产|