精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

av电影网站在线观看| 欧美激情论坛| 男人操女人的视频网站| 亚洲va欧美va人人爽成人影院| 亚洲一区日韩精品中文字幕| 欧美日韩亚洲在线| 国产熟女一区二区丰满| 国产精品久久久一区二区| 中日韩午夜理伦电影免费| 韩国三级丰满少妇高潮| 女海盗2成人h版中文字幕| 国产欧美1区2区3区| av资源一区二区| 成人午夜精品视频| 国产精品hd| 在线观看日韩av| xxxx黄色片| 国产精品久久久久久久久久久久久久久| 亚洲午夜私人影院| 在线看成人av电影| 全色精品综合影院| 国产另类ts人妖一区二区| 日韩**中文字幕毛片| 亚洲欧美一区二区三区四区五区| 国产剧情在线观看一区| 精品国精品自拍自在线| 亚洲xxx在线观看| 永久免费毛片在线播放| 亚洲国产一区视频| 99亚洲精品视频| 国产精品一区二区三区四区色| 高清国产午夜精品久久久久久| 国产日韩欧美综合| 波多野结衣不卡| 久久国产成人| 97人人做人人爱| 国产精品久久久久久久精| 欧美色女视频| 国产一区二区欧美日韩| 国产精品边吃奶边做爽| 成人看片爽爽爽| 精品久久久久一区| 亚洲综合中文网| 日韩成人18| 91精品国产色综合久久不卡电影| 亚洲精品视频导航| av亚洲一区| 欧美唯美清纯偷拍| 无码少妇一区二区三区芒果| 成人免费直播| 色婷婷国产精品久久包臀| 久久国产亚洲精品无码| 黄色激情在线播放| 欧美日韩国产色| 91视频最新入口| 丁香六月综合| 日本高清不卡在线观看| 999在线免费视频| 亚洲精品粉嫩美女一区| 欧美亚洲国产一区二区三区va| 日本成人在线免费视频| 成人精品电影在线| 欧美性色欧美a在线播放| 午夜免费高清视频| 免费成人高清在线视频| 制服丝袜亚洲色图| 精品国产一二区| 国产一区调教| 91一区二区三区在线观看| 一区二区久久久久久| 日韩欧美精品一区二区三区经典 | 一色桃子av在线| 亚洲精品久久嫩草网站秘色| 黄色三级中文字幕| 性爽视频在线| 欧美日韩成人在线一区| 亚洲一二区在线观看| 9999久久久久| 亚洲人成电影网站色…| 国产wwwwxxxx| 欧美日韩中文| 欧洲亚洲女同hd| 在线播放亚洲精品| 国产sm精品调教视频网站| 噜噜噜噜噜久久久久久91| 电影在线一区| 亚洲精品免费在线观看| 日本中文字幕在线视频观看| 午夜激情电影在线播放| 欧美日韩免费在线视频| www.四虎精品| 精品国产一区二区三区小蝌蚪| 日韩中文字幕久久| www.天天色| 日本亚洲最大的色成网站www| 91在线视频九色| 色在线免费视频| 亚洲老妇xxxxxx| 久久美女福利视频| 成人黄色理论片| 日韩毛片免费看| 欧美三级电影一区| 男男一级淫片免费播放| 成人免费在线观看av| 欧美激情一区二区三区成人| 久久午夜鲁丝片| 丁香婷婷综合激情五月色| 日韩精品伦理第一区| 欧美极品少妇videossex| 欧美三区在线观看| 国产精品三级在线观看无码| 日韩一区亚洲二区| 青青久久av北条麻妃黑人| 99在线小视频| 国产精品狼人久久影院观看方式| 2019日韩中文字幕mv| 久久影视精品| 在线观看国产精品91| 亚洲黄色三级视频| 国产麻豆一精品一av一免费| 日韩高清国产精品| 午夜影院一区| 精品国产乱码久久久久久夜甘婷婷| 99在线视频免费| 国产农村妇女毛片精品久久莱园子 | 激情视频在线播放| 久久99精品国产.久久久久| 欧美少妇一区| 韩国主播福利视频一区二区三区| 日韩精品中文字幕一区二区三区| 免费在线观看a级片| 日韩电影在线看| 美女亚洲精品| 忘忧草在线影院两性视频| 亚洲成人免费网站| 国产盗摄一区二区三区在线| 久久精品99国产精品日本| 日韩偷拍一区二区| 外国成人直播| 亚洲视频免费一区| 午夜精品免费观看| h视频网站在线观看| av在线不卡观看免费观看| 今天免费高清在线观看国语| 成人国产精品久久| 久久中文久久字幕| 国产绿帽刺激高潮对白| 亚洲天堂av一区| 日韩精品aaa| 一区二区三区四区在线观看国产日韩 | 欧美成人精品一区二区男人小说| 日韩av在线精品| 欧美bbbbbbbbbbbb精品| 久久综合色婷婷| 成人3d动漫一区二区三区| 精品一区二区三| 国产有码在线一区二区视频| 日本在线观看网站| 91精品国产麻豆国产自产在线 | 欧美日韩一区二区在线播放| 精品人妻少妇嫩草av无码| 一区二区三区福利| 欧美自拍资源在线| 成人在线观看免费播放| 精品国产一区二区三区久久狼5月| 一区二区三区日| 伊人婷婷欧美激情| 亚洲av成人精品一区二区三区| 一区二区日韩免费看| 日韩黄色影视| 成人在线日韩| 97热精品视频官网| 91精彩在线视频| 日韩一区二区中文字幕| 日本少妇激情舌吻| 国产丝袜美腿一区二区三区| 欧美日韩一区二区三区69堂| 欧美成人tv| 欧美精品尤物在线| 欧美黄色网络| 欧美黑人xxx| 国产在线网站| 日韩欧美国产一二三区| 亚洲午夜18毛片在线看| 国产精品久久久久桃色tv| 亚洲一区二区三区四区av| 天堂久久一区二区三区| 麻豆一区二区三区在线观看| 欧美福利在线播放网址导航| 国产精品视频公开费视频| 青青青国内视频在线观看软件| 亚洲欧美日韩国产中文| 国产女人18毛片水18精| 欧美日韩中文在线观看| 国产免费一区二区三区四区| av在线播放一区二区三区| 国产厕所精品在线观看| 国产成人精品视频免费| 国产美女精品在线| 欧美激情成人网| 欧美体内she精视频在线观看| 欧美亚洲另类久久综合| 在线精品自拍| 成人xvideos免费视频| 1234区中文字幕在线观看| 日韩性生活视频| 蜜桃视频在线观看视频| 精品国产乱码久久久久久夜甘婷婷 | 午夜视频在线观看免费视频| 亚洲国产精品va| 国产精品羞羞答答在线| 在线视频综合导航| 国产在线免费视频| 亚洲天堂中文字幕| 国内精品卡一卡二卡三| 成人性色生活片| 99中文字幕在线| 秋霞午夜鲁丝一区二区老狼| 亚洲 高清 成人 动漫| 欧美在线国产| 久久99国产精品一区| 国产精品嫩模av在线| 精品视频一区二区| 成人知道污网站| 99中文字幕| 国产一区二区三区| 国产在线精品成人一区二区三区| 欧美影视资讯| 国产成人精品一区二区在线| 蜜桃视频动漫在线播放| 久久久久久久久久久国产| 成人在线播放免费观看| 久久精品视频网站| 在线免费观看黄| 在线日韩中文字幕| 成人好色电影| 丝袜情趣国产精品| 五月天丁香综合久久国产| 爱高潮www亚洲精品| 999精品视频一区二区三区| 亚洲国产天堂| 亚洲自拍偷拍福利| 成人影院网站ww555久久精品| 成人在线视频网站| 成人在线啊v| 3d精品h动漫啪啪一区二区| 精品视频在线观看免费观看| 91在线网站视频| 香港久久久电影| 91一区二区三区| 国产精品99久久免费观看| 国产传媒一区| 亚洲国产国产| 日韩高清国产一区在线观看| 成人三级视频| 99久久久无码国产精品性色戒| 婷婷亚洲图片| 蜜臀精品一区二区| 亚洲精品在线二区| 农村妇女精品一二区| 久久亚洲风情| 欧美成人福利在线观看| 国产精品99久久久久久似苏梦涵 | av中文字幕免费| 日韩欧美视频在线| 天天摸夜夜添狠狠添婷婷| 亚洲片av在线| 精品51国产黑色丝袜高跟鞋| 欧美老少做受xxxx高潮| аⅴ资源天堂资源库在线| 青草热久免费精品视频| 99re久久| 成人免费在线看片| 自拍亚洲一区| 大桥未久一区二区| 国产欧美午夜| 免费成年人高清视频| 粉嫩一区二区三区在线看| 精品人妻一区二区三区香蕉| 中文久久乱码一区二区| 日韩女优一区二区| 欧美性xxxx18| 国产三级在线观看视频| 日韩精品一二三四区| 免费在线观看av网站| 国模极品一区二区三区| 国产电影一区二区三区爱妃记| 91嫩草在线视频| 老司机精品在线| 正义之心1992免费观看全集完整版| 红桃视频欧美| 一区二区在线免费看| 99精品桃花视频在线观看| 午夜三级在线观看| 欧美特级www| 99视频国产精品免费观看a| 亚洲系列中文字幕| 黄色在线看片| 国产日韩欧美一二三区| 神马久久av| 黄网站色视频免费观看| 日本欧洲一区二区| 久久久国产精品无码| 亚洲特级片在线| 婷婷激情五月综合| 亚洲电影免费观看高清完整版在线观看| 98在线视频| 日本精品久久电影| 成人春色在线观看免费网站| 丰满女人性猛交| 老司机精品久久| 亚洲第九十七页| 亚洲综合激情小说| 国产精品久久久久久久久久久久久久久久| 日韩精品中文字幕有码专区| 欧美一卡二卡| 91亚洲精品久久久| 久久高清精品| 日本老熟妇毛茸茸| 92精品国产成人观看免费| 精品少妇theporn| 日韩一卡二卡三卡四卡| 午夜老司机在线观看| 国产精品成人国产乱一区| 欧美成人专区| 黄色一级片播放| 成人性生交大片免费| 免费网站观看www在线观| 欧美高清性hdvideosex| 97电影在线| 国产精品欧美风情| 国产免费播放一区二区| 欧美 激情 在线| 久久久久久久综合狠狠综合| 欧美特黄aaaaaa| 精品视频中文字幕| 麻豆蜜桃在线观看| 久久婷婷人人澡人人喊人人爽| 亚洲狠狠婷婷| 中文字幕一区二区久久人妻网站| 亚洲一区二区精品3399| 狠狠躁夜夜躁av无码中文幕| 久久全球大尺度高清视频| 成午夜精品一区二区三区软件| 成年人深夜视频| 成人免费不卡视频| 国产情侣自拍av| 日韩精品在线影院| 欧美大胆性生话| 亚洲春色在线| 精品影视av免费| tube国产麻豆| 精品美女被调教视频大全网站| 好看的中文字幕在线播放| 国产成人av一区二区三区| 国产亚洲亚洲| 亚洲第一综合网| 91精品国产欧美一区二区| 性国产高清在线观看| 国产精品一区二区欧美黑人喷潮水| 亚洲看片一区| 亚洲黄色小说视频| 正在播放一区二区| 美女网站视频在线| 欧洲亚洲一区二区| 久久精品国产第一区二区三区| 污软件在线观看| 亚洲第一视频网| 秋霞国产精品| 欧美少妇一区二区三区| 97久久精品人人澡人人爽| 亚洲第一网站在线观看| 久久精品国产96久久久香蕉| 亚洲精品在线a| 日本黄色三级大片| 一区二区中文视频| 欧美一区二区三区黄片| 国产精品 欧美在线| 亚洲女同中文字幕| 欧美无人区码suv| 欧美久久久久免费| 国产精品一区二区日韩| 日韩av在线电影观看| 国产精品一二一区| 日韩精品在线观看免费| 久久久国产影院| 在线成人动漫av| 91性高潮久久久久久久| 色综合天天做天天爱| 国产黄色小视频在线| 久久99精品久久久久久秒播放器 | 黄色视屏免费在线观看| 精品久久久久久综合日本| 久久精品国产精品亚洲精品| 国产黄色片免费看| 久久躁日日躁aaaaxxxx| 亚洲电影一级片| 丰满人妻一区二区三区免费视频棣| 日本久久一区二区三区| 丁香花视频在线观看|