日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

消息系统kafka原理解析

發布時間:2025/3/20 windows 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 消息系统kafka原理解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Kakfa起初是由LinkedIn公司開發的一個分布式的消息系統,后成為Apache的一部分,它使用Scala編寫,以可水平擴展和高吞吐率而被廣泛使用。目前越來越多的開源分布式處理系統如Cloudera、Apache Storm、Spark等都支持與Kafka集成。

一、kafka體系架構

一個典型的Kafka體系架構包括若干Producer(可以是服務器日志,業務數據,頁面前端產生的page view等等),若干broker(Kafka支持水平擴展,一般broker數量越多,集群吞吐率越高),若干Consumer (Group),以及一個Zookeeper集群。Kafka通過Zookeeper管理集群配置,選舉leader,以及在consumer group發生變化時進行rebalance。Producer使用push(推)模式將消息發布到broker,Consumer使用pull(拉)模式從broker訂閱并消費消息。

名詞解釋:

名稱

解釋

Broker

消息中間件處理節點,一個Kafka節點就是一個broker,一個或者多個Broker可以組成一個Kafka集群

Topic

Kafka根據topic對消息進行歸類,發布到Kafka集群的每條消息都需要指定一個topic

Producer

消息生產者,向Broker發送消息的客戶端

Consumer

消息消費者,從Broker讀取消息的客戶端

ConsumerGroup

每個Consumer屬于一個特定的Consumer Group,一條消息可以發送到多個不同的Consumer Group,但是一個Consumer Group中只能有一個Consumer能夠消費該消息

Partition

物理上的概念,一個topic可以分為多個partition,每個partition內部是有序的

1、Topic & Partition

一個topic可以認為一個一類消息,每個topic將被分成多個partition,每個partition在存儲層面是append log文件。任何發布到此partition的消息都會被追加到log文件的尾部,每條消息在文件中的位置稱為offset(偏移量),offset為一個long型的數字,它唯一標記一條消息。每條消息都被append到partition中,是順序寫磁盤,因此效率非常高(經驗證,順序寫磁盤效率比隨機寫內存還要高,這是Kafka高吞吐率的一個很重要的保證)。

每一條消息被發送到broker中,會根據partition規則選擇被存儲到哪一個partition。如果partition規則設置的合理,所有消息可以均勻分布到不同的partition里,這樣就實現了水平擴展。(如果一個topic對應一個文件,那這個文件所在的機器I/O將會成為這個topic的性能瓶頸,而partition解決了這個問題)。在創建topic時可以在$KAFKA_HOME/config/server.properties中指定這個partition的數量(如下所示),當然可以在topic創建之后去修改partition的數量。

# The default number of log partitions per topic. More partitions allow greater

# parallelism for consumption, but this will also result in more files across

# the brokers.

num.partitions=3

在發送一條消息時,可以指定這個消息的key,producer根據這個key和partition機制來判斷這個消息發送到哪個partition。partition機制可以通過指定producer的partition.class這一參數來指定,該class必須實現kafka.producer.Partitioner接口。

2、高可靠性存儲分析

Kafka的高可靠性的保障來源于其健壯的副本(replication)策略。通過調節其副本相關參數,可以使得Kafka在性能和可靠性之間運轉的游刃有余。Kafka從0.8.x版本開始提供partition級別的復制,replication的數量可以在$KAFKA_HOME/config/server.properties中配置(default.replication.refactor)。

這里先從Kafka文件存儲機制入手,從最底層了解Kafka的存儲細節,進而對其的存儲有個微觀的認知。之后通過Kafka復制原理和同步方式來闡述宏觀層面的概念。最后從ISR,HW,leader選舉以及數據可靠性和持久性保證等等各個維度來豐富對Kafka相關知識點的認知。

2.1、Kafka文件存儲機制

Kafka中消息是以topic進行分類的,生產者通過topic向Kafka broker發送消息,消費者通過topic讀取數據。然而topic在物理層面又能以partition為分組,一個topic可以分成若干個partition,那么topic以及partition又是怎么存儲的呢?partition還可以細分為segment,一個partition物理上由多個segment組成,那么這些segment又是什么呢?下面我們來一一揭曉。

為了便于說明問題,假設這里只有一個Kafka集群,且這個集群只有一個Kafka broker,即只有一臺物理機。在這個Kafka broker中配置($KAFKA_HOME/config/server.properties中)log.dirs=/tmp/kafka-logs,以此來設置Kafka消息文件存儲目錄,與此同時創建一個topic:topic_zzh_test,partition的數量為4($KAFKA_HOME/bin/kafka-topics.sh –create –zookeeper localhost:2181 –partitions 4 –topic topic_zzh_test –replication-factor 1)。那么我們此時可以在/tmp/kafka-logs目錄中可以看到生成了4個目錄:

drwxr-xr-x 2 root root 4096 Apr 10 16:10 topic_zzh_test-0drwxr-xr-x 2 root root 4096 Apr 10 16:10 topic_zzh_test-1drwxr-xr-x 2 root root 4096 Apr 10 16:10 topic_zzh_test-2drwxr-xr-x 2 root root 4096 Apr 10 16:10 topic_zzh_test-3

在Kafka文件存儲中,同一個topic下有多個不同的partition,每個partiton為一個目錄,partition的名稱規則為:topic名稱+有序序號,第一個序號從0開始計,最大的序號為partition數量減1,partition是實際物理上的概念,而topic是邏輯上的概念。

上面提到partition還可以細分為segment,這個segment又是什么?如果就以partition為最小存儲單位,我們可以想象當Kafka producer不斷發送消息,必然會引起partition文件的無限擴張,這樣對于消息文件的維護以及已經被消費的消息的清理帶來嚴重的影響,所以這里以segment為單位又將partition細分。每個partition(目錄)相當于一個巨型文件被平均分配到多個大小相等的segment(段)數據文件中(每個segment 文件中消息數量不一定相等)這種特性也方便old segment的刪除,即方便已被消費的消息的清理,提高磁盤的利用率。每個partition只需要支持順序讀寫就行,segment的文件生命周期由服務端配置參數(log.segment.bytes,log.roll.{ms,hours}等若干參數)決定。

segment文件由兩部分組成,分別為“.index”文件和“.log”文件,分別表示為segment索引文件和數據文件。這兩個文件的命令規則為:partition全局的第一個segment從0開始,后續每個segment文件名為上一個segment文件最后一條消息的offset值,數值大小為64位,20位數字字符長度,沒有數字用0填充,如下:

00000000000000000000.index00000000000000000000.log00000000000000170410.index00000000000000170410.log00000000000000239430.index00000000000000239430.log

以上面的segment文件為例,展示出segment:00000000000000170410的“.index”文件和“.log”文件的對應的關系,如下圖:

如上圖,“.index”索引文件存儲大量的元數據,“.log”數據文件存儲大量的消息,索引文件中的元數據指向對應數據文件中message的物理偏移地址。其中以“.index”索引文件中的元數據[3, 348]為例,在“.log”數據文件表示第3個消息,即在全局partition中表示170410+3=170413個消息,該消息的物理偏移地址為348。

那么如何從partition中通過offset查找message呢?

以上圖為例,讀取offset=170418的消息,首先查找segment文件,其中00000000000000000000.index為最開始的文件,第二個文件為00000000000000170410.index(起始偏移為170410+1=170411),而第三個文件為00000000000000239430.index(起始偏移為239430+1=239431),所以這個offset=170418就落到了第二個文件之中。其他后續文件可以依次類推,以其實偏移量命名并排列這些文件,然后根據二分查找法就可以快速定位到具體文件位置。其次根據00000000000000170410.index文件中的[8,1325]定位到00000000000000170410.log文件中的1325的位置進行讀取。

要是讀取offset=170418的消息,從00000000000000170410.log文件中的1325的位置進行讀取,那么怎么知道何時讀完本條消息,否則就讀到下一條消息的內容了?

這個就需要聯系到消息的物理結構了,消息都具有固定的物理結構,包括:offset(8 Bytes)、消息體的大小(4 Bytes)、crc32(4 Bytes)、magic(1 Byte)、attributes(1 Byte)、key length(4 Bytes)、key(K Bytes)、payload(N Bytes)等等字段,可以確定一條消息的大小,即讀取到哪里截止。

2.2、復制原理和同步方式

Kafka中topic的每個partition有一個預寫式的日志文件,雖然partition可以繼續細分為若干個segment文件,但是對于上層應用來說可以將partition看成最小的存儲單元(一個有多個segment文件拼接的“巨型”文件),每個partition都由一些列有序的、不可變的消息組成,這些消息被連續的追加到partition中。

上圖中有兩個新名詞:HW和LEO。這里先介紹下LEO,LogEndOffset的縮寫,表示每個partition的log最后一條Message的位置。HW是HighWatermark的縮寫,是指consumer能夠看到的此partition的位置,這個涉及到多副本的概念,這里先提及一下,下節再詳表。

言歸正傳,為了提高消息的可靠性,Kafka每個topic的partition有N個副本(replicas),其中N(大于等于1)是topic的復制因子(replica fator)的個數。Kafka通過多副本機制實現故障自動轉移,當Kafka集群中一個broker失效情況下仍然保證服務可用。在Kafka中發生復制時確保partition的日志能有序地寫到其他節點上,N個replicas中,其中一個replica為leader,其他都為follower, leader處理partition的所有讀寫請求,與此同時,follower會被動定期地去復制leader上的數據。

如下圖所示,Kafka集群中有4個broker, 某topic有3個partition,且復制因子即副本個數也為3:

Kafka提供了數據復制算法保證,如果leader發生故障或掛掉,一個新leader被選舉并被接受客戶端的消息成功寫入。Kafka確保從同步副本列表中選舉一個副本為leader,或者說follower追趕leader數據。leader負責維護和跟蹤ISR(In-Sync Replicas的縮寫,表示副本同步隊列,具體可參考下節)中所有follower滯后的狀態。當producer發送一條消息到broker后,leader寫入消息并復制到所有follower。消息提交之后才被成功復制到所有的同步副本。消息復制延遲受最慢的follower限制,重要的是快速檢測慢副本,如果follower“落后”太多或者失效,leader將會把它從ISR中刪除。

2.3、ISR

上節我們涉及到ISR (In-Sync Replicas),這個是指副本同步隊列。副本數對Kafka的吞吐率是有一定的影響,但極大的增強了可用性。默認情況下Kafka的replica數量為1,即每個partition都有一個唯一的leader,為了確保消息的可靠性,通常應用中將其值(由broker的參數offsets.topic.replication.factor指定)大小設置為大于1,比如3。 所有的副本(replicas)統稱為Assigned Replicas,即AR。ISR是AR中的一個子集,由leader維護ISR列表,follower從leader同步數據有一些延遲(包括延遲時間replica.lag.time.max.ms和延遲條數replica.lag.max.messages兩個維度, 當前最新的版本0.10.x中只支持replica.lag.time.max.ms這個維度),任意一個超過閾值都會把follower剔除出ISR, 存入OSR(Outof-Sync Replicas)列表,新加入的follower也會先存放在OSR中。AR=ISR+OSR。

Kafka 0.9.0.0版本后移除了replica.lag.max.messages參數,只保留了replica.lag.time.max.ms作為ISR中副本管理的參數。為什么這樣做呢?replica.lag.max.messages表示當前某個副本落后leader的消息數量超過了這個參數的值,那么leader就會把follower從ISR中刪除。假設設置replica.lag.max.messages=4,那么如果producer一次傳送至broker的消息數量都小于4條時,因為在leader接受到producer發送的消息之后而follower副本開始拉取這些消息之前,follower落后leader的消息數不會超過4條消息,故此沒有follower移出ISR,所以這時候replica.lag.max.message的設置似乎是合理的。但是producer發起瞬時高峰流量,producer一次發送的消息超過4條時,也就是超過replica.lag.max.messages,此時follower都會被認為是與leader副本不同步了,從而被踢出了ISR。但實際上這些follower都是存活狀態的且沒有性能問題。那么在之后追上leader,并被重新加入了ISR。于是就會出現它們不斷地剔出ISR然后重新回歸ISR,這無疑增加了無謂的性能損耗。而且這個參數是broker全局的。設置太大了,影響真正“落后”follower的移除;設置的太小了,導致follower的頻繁進出。無法給定一個合適的replica.lag.max.messages的值,故此,新版本的Kafka移除了這個參數。

注:ISR中包括:leader和follower。

上面一節還涉及到一個概念,即HW。HW俗稱高水位,HighWatermark的縮寫,取一個partition對應的ISR中最小的LEO作為HW,consumer最多只能消費到HW所在的位置。另外每個replica都有HW,leader和follower各自負責更新自己的HW的狀態。對于leader新寫入的消息,consumer不能立刻消費,leader會等待該消息被所有ISR中的replicas同步后更新HW,此時消息才能被consumer消費。這樣就保證了如果leader所在的broker失效,該消息仍然可以從新選舉的leader中獲取。對于來自內部broker的讀取請求,沒有HW的限制。

下圖詳細的說明了當producer生產消息至broker后,ISR以及HW和LEO的流轉過程:

由此可見,Kafka的復制機制既不是完全的同步復制,也不是單純的異步復制。事實上,同步復制要求所有能工作的follower都復制完,這條消息才會被commit,這種復制方式極大的影響了吞吐率。而異步復制方式下,follower異步的從leader復制數據,數據只要被leader寫入log就被認為已經commit,這種情況下如果follower都還沒有復制完,落后于leader時,突然leader宕機,則會丟失數據。而Kafka的這種使用ISR的方式則很好的均衡了確保數據不丟失以及吞吐率。

Kafka的ISR的管理最終都會反饋到Zookeeper節點上。具體位置為:/brokers/topics/[topic]/partitions/[partition]/state。目前有兩個地方會對這個Zookeeper的節點進行維護:

1. Controller來維護:Kafka集群中的其中一個Broker會被選舉為Controller,主要負責Partition管理和副本狀態管理,也會執行類似于重分配partition之類的管理任務。在符合某些特定條件下,Controller下的LeaderSelector會選舉新的leader,ISR和新的leader_epoch及controller_epoch寫入Zookeeper的相關節點中。同時發起LeaderAndIsrRequest通知所有的replicas。

2. leader來維護:leader有單獨的線程定期檢測ISR中follower是否脫離ISR, 如果發現ISR變化,則會將新的ISR的信息返回到Zookeeper的相關節點中。

2.4、數據可靠性和持久性保證

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

  • 1(默認):這意味著producer在ISR中的leader已成功收到數據并得到確認。如果leader宕機了,則會丟失數據。
  • 0:這意味著producer無需等待來自broker的確認而繼續發送下一批消息。這種情況下數據傳輸效率最高,但是數據可靠性確是最低的。
  • -1:producer需要等待ISR中的所有follower都確認接收到數據后才算一次發送完成,可靠性最高。但是這樣也不能保證數據不丟失,比如當ISR中只有leader時(前面ISR那一節講到,ISR中的成員由于某些情況會增加也會減少,最少就只剩一個leader),這樣就變成了acks=1的情況。

如果要提高數據的可靠性,在設置request.required.acks=-1的同時,也要min.insync.replicas這個參數(可以在broker或者topic層面進行設置)的配合,這樣才能發揮最大的功效。min.insync.replicas這個參數設定ISR中的最小副本數是多少,默認值為1,當且僅當request.required.acks參數設置為-1時,此參數才生效。如果ISR中的副本數少于min.insync.replicas配置的數量時,客戶端會返回異常:org.apache.kafka.common.errors.NotEnoughReplicasExceptoin: Messages are rejected since there are fewer in-sync replicas than required。

接下來對acks=1和-1的兩種情況進行詳細分析:

1. request.required.acks=1

producer發送數據到leader,leader寫本地日志成功,返回客戶端成功;此時ISR中的副本還沒有來得及拉取該消息,leader就宕機了,那么此次發送的消息就會丟失。

2. request.required.acks=-1

同步(Kafka默認為同步,即producer.type=sync)的發送模式,replication.factor>=2且min.insync.replicas>=2的情況下,不會丟失數據。

有兩種典型情況。acks=-1的情況下(如無特殊說明,以下acks都表示為參數request.required.acks),數據發送到leader, ISR的follower全部完成數據同步后,leader此時掛掉,那么會選舉出新的leader,數據不會丟失。

acks=-1的情況下,數據發送到leader后 ,部分ISR的副本同步,leader此時掛掉。比如follower1和follower2都有可能變成新的leader, producer端會得到返回異常,producer端會重新發送數據,數據可能會重復。

當然上圖中如果在leader crash的時候,follower2還沒有同步到任何數據,而且follower2被選舉為新的leader的話,這樣消息就不會重復。

注:Kafka只處理fail/recover問題,不處理Byzantine問題。

2.5、關于HW的進一步探討

考慮上圖(即acks=-1,部分ISR副本同步)中的另一種情況,如果在Leader掛掉的時候,follower1同步了消息4,5,follower2同步了消息4,與此同時follower2被選舉為leader,那么此時follower1中的多出的消息5該做如何處理呢?

這里就需要HW的協同配合了。如前所述,一個partition中的ISR列表中,leader的HW是所有ISR列表里副本中最小的那個的LEO。類似于木桶原理,水位取決于最低那塊短板。

如上圖,某個topic的某partition有三個副本,分別為A、B、C。A作為leader肯定是LEO最高,B緊隨其后,C機器由于配置比較低,網絡比較差,故而同步最慢。這個時候A機器宕機,這時候如果B成為leader,假如沒有HW,在A重新恢復之后會做同步(makeFollower)操作,在宕機時log文件之后直接做追加操作,而假如B的LEO已經達到了A的LEO,會產生數據不一致的情況,所以使用HW來避免這種情況。

A在做同步操作的時候,先將log文件截斷到之前自己的HW的位置,即3,之后再從B中拉取消息進行同步。

如果失敗的follower恢復過來,它首先將自己的log文件截斷到上次checkpointed時刻的HW的位置,之后再從leader中同步消息。leader掛掉會重新選舉,新的leader會發送“指令”讓其余的follower截斷至自身的HW的位置然后再拉取新的消息。

當ISR中的個副本的LEO不一致時,如果此時leader掛掉,選舉新的leader時并不是按照LEO的高低進行選舉,而是按照ISR中的順序選舉。

2.6、Leader選舉

一條消息只有被ISR中的所有follower都從leader復制過去才會被認為已提交。這樣就避免了部分數據被寫進了leader,還沒來得及被任何follower復制就宕機了,而造成數據丟失。而對于producer而言,它可以選擇是否等待消息commit,這可以通過request.required.acks來設置。這種機制確保了只要ISR中有一個或者以上的follower,一條被commit的消息就不會丟失。

有一個很重要的問題是當leader宕機了,怎樣在follower中選舉出新的leader,因為follower可能落后很多或者直接crash了,所以必須確保選擇“最新”的follower作為新的leader。一個基本的原則就是,如果leader不在了,新的leader必須擁有原來的leader commit的所有消息。這就需要做一個折中,如果leader在一個消息被commit前等待更多的follower確認,那么在它掛掉之后就有更多的follower可以成為新的leader,但這也會造成吞吐率的下降。

一種非常常用的選舉leader的方式是“少數服從多數”,Kafka并不是采用這種方式。這種模式下,如果我們有2f+1個副本,那么在commit之前必須保證有f+1個replica復制完消息,同時為了保證能正確選舉出新的leader,失敗的副本數不能超過f個。這種方式有個很大的優勢,系統的延遲取決于最快的幾臺機器,也就是說比如副本數為3,那么延遲就取決于最快的那個follower而不是最慢的那個。“少數服從多數”的方式也有一些劣勢,為了保證leader選舉的正常進行,它所能容忍的失敗的follower數比較少,如果要容忍1個follower掛掉,那么至少要3個以上的副本,如果要容忍2個follower掛掉,必須要有5個以上的副本。也就是說,在生產環境下為了保證較高的容錯率,必須要有大量的副本,而大量的副本又會在大數據量下導致性能的急劇下降。這種算法更多用在Zookeeper這種共享集群配置的系統中而很少在需要大量數據的系統中使用的原因。HDFS的HA功能也是基于“少數服從多數”的方式,但是其數據存儲并不是采用這樣的方式。

實際上,leader選舉的算法非常多,比如Zookeeper的Zab、Raft以及Viewstamped Replication。而Kafka所使用的leader選舉算法更像是微軟的PacificA算法。

Kafka在Zookeeper中為每一個partition動態的維護了一個ISR,這個ISR里的所有replica都跟上了leader,只有ISR里的成員才能有被選為leader的可能(unclean.leader.election.enable=false)。在這種模式下,對于f+1個副本,一個Kafka topic能在保證不丟失已經commit消息的前提下容忍f個副本的失敗,在大多數使用場景下,這種模式是十分有利的。事實上,為了容忍f個副本的失敗,“少數服從多數”的方式和ISR在commit前需要等待的副本的數量是一樣的,但是ISR需要的總的副本的個數幾乎是“少數服從多數”的方式的一半。

上文提到,在ISR中至少有一個follower時,Kafka可以確保已經commit的數據不丟失,但如果某一個partition的所有replica都掛了,就無法保證數據不丟失了。這種情況下有兩種可行的方案:

1. 等待ISR中任意一個replica“活”過來,并且選它作為leader

2. 選擇第一個“活”過來的replica(并不一定是在ISR中)作為leader

這就需要在可用性和一致性當中作出一個簡單的抉擇。如果一定要等待ISR中的replica“活”過來,那不可用的時間就可能會相對較長。而且如果ISR中所有的replica都無法“活”過來了,或者數據丟失了,這個partition將永遠不可用。選擇第一個“活”過來的replica作為leader,而這個replica不是ISR中的replica,那即使它并不保障已經包含了所有已commit的消息,它也會成為leader而作為consumer的數據源。默認情況下,Kafka采用第二種策略,即unclean.leader.election.enable=true,也可以將此參數設置為false來啟用第一種策略。

unclean.leader.election.enable這個參數對于leader的選舉、系統的可用性以及數據的可靠性都有至關重要的影響。下面我們來分析下幾種典型的場景。

如果上圖所示,假設某個partition中的副本數為3,replica-0, replica-1, replica-2分別存放在broker0, broker1和broker2中。AR=(0,1,2),ISR=(0,1)。

設置request.required.acks=-1, min.insync.replicas=2,unclean.leader.election.enable=false。這里將broker0中的副本也稱之為broker0起初broker0為leader,broker1為follower。

· 當ISR中的replica-0出現crash的情況時,broker1選舉為新的leader[ISR=(1)],因為受min.insync.replicas=2影響,write不能服務,但是read能繼續正常服務。此種情況恢復方案:

1. 嘗試恢復(重啟)replica-0,如果能起來,系統正常;

2. 如果replica-0不能恢復,需要將min.insync.replicas設置為1,恢復write功能。

· 當ISR中的replica-0出現crash,緊接著replica-1也出現了crash, 此時[ISR=(1),leader=-1],不能對外提供服務,此種情況恢復方案:

1. 嘗試恢復replica-0和replica-1,如果都能起來,則系統恢復正常;

2. 如果replica-0起來,而replica-1不能起來,這時候仍然不能選出leader,因為當設置unclean.leader.election.enable=false時,leader只能從ISR中選舉,當ISR中所有副本都失效之后,需要ISR中最后失效的那個副本能恢復之后才能選舉leader, 即replica-0先失效,replica-1后失效,需要replica-1恢復后才能選舉leader。保守的方案建議把unclean.leader.election.enable設置為true,但是這樣會有丟失數據的情況發生,這樣可以恢復read服務。同樣需要將min.insync.replicas設置為1,恢復write功能;

3. replica-1恢復,replica-0不能恢復,這個情況上面遇到過,read服務可用,需要將min.insync.replicas設置為1,恢復write功能;

4. replica-0和replica-1都不能恢復,這種情況可以參考情形2.

· 當ISR中的replica-0, replica-1同時宕機,此時[ISR=(0,1)],不能對外提供服務,此種情況恢復方案:嘗試恢復replica-0和replica-1,當其中任意一個副本恢復正常時,對外可以提供read服務。直到2個副本恢復正常,write功能才能恢復,或者將將min.insync.replicas設置為1。

2.7、Kafka的發送模式

Kafka的發送模式由producer端的配置參數producer.type來設置,這個參數指定了在后臺線程中消息的發送方式是同步的還是異步的,默認是同步的方式,即producer.type=sync。如果設置成異步的模式,即producer.type=async,可以是producer以batch的形式push數據,這樣會極大的提高broker的性能,但是這樣會增加丟失數據的風險。如果需要確保消息的可靠性,必須要將producer.type設置為sync。

對于異步模式,還有4個配套的參數,如下:

Property

Description

queue.buffering.max.ms

默認值:5000。啟用異步模式時,producer緩存消息的時間。比如我們設置成1000時,它會緩存1s的數據再一次發送出去,這樣可以極大的增加broker吞吐量,但也會造成時效性的降低。

queue.buffering.max.messages

默認值:10000。啟用異步模式時,producer緩存隊列里最大緩存的消息數量,如果超過這個值,producer就會阻塞或者丟掉消息。

queue.enqueue.timeout.ms

默認值:-1。當達到上面參數時producer會阻塞等待的時間。如果設置為0,buffer隊列滿時producer不會阻塞,消息直接被丟掉;若設置為-1,producer會被阻塞,不會丟消息。

batch.num.messages

默認值:200。啟用異步模式時,一個batch緩存的消息數量。達到這個數值時,producer才會發送消息。(每次批量發送的數量)

以batch的方式推送數據可以極大的提高處理效率,kafka producer可以將消息在內存中累計到一定數量后作為一個batch發送請求。batch的數量大小可以通過producer的參數(batch.num.messages)控制。通過增加batch的大小,可以減少網絡請求和磁盤IO的次數,當然具體參數設置需要在效率和時效性方面做一個權衡。在比較新的版本中還有batch.size這個參數。

3、高可靠性使用分析

3.1、消息傳輸保障

前面已經介紹了Kafka如何進行有效的存儲,以及了解了producer和consumer如何工作。接下來討論的是Kafka如何確保消息在producer和consumer之間傳輸。有以下三種可能的傳輸保障(delivery guarantee):

  • At most once: 消息可能會丟,但絕不會重復傳輸
  • At least once:消息絕不會丟,但可能會重復傳輸
  • Exactly once:每條消息肯定會被傳輸一次且僅傳輸一次

Kafka的消息傳輸保障機制非常直觀。當producer向broker發送消息時,一旦這條消息被commit,由于副本機制(replication)的存在,它就不會丟失。但是如果producer發送數據給broker后,遇到的網絡問題而造成通信中斷,那producer就無法判斷該條消息是否已經提交(commit)。雖然Kafka無法確定網絡故障期間發生了什么,但是producer可以retry多次,確保消息已經正確傳輸到broker中,所以目前Kafka實現的是at least once。

consumer從broker中讀取消息后,可以選擇commit,該操作會在Zookeeper中存下該consumer在該partition下讀取的消息的offset。該consumer下一次再讀該partition時會從下一條開始讀取。如未commit,下一次讀取的開始位置會跟上一次commit之后的開始位置相同。當然也可以將consumer設置為autocommit,即consumer一旦讀取到數據立即自動commit。如果只討論這一讀取消息的過程,那Kafka是確保了exactly once, 但是如果由于前面producer與broker之間的某種原因導致消息的重復,那么這里就是at least once。

考慮這樣一種情況,當consumer讀完消息之后先commit再處理消息,在這種模式下,如果consumer在commit后還沒來得及處理消息就crash了,下次重新開始工作后就無法讀到剛剛已提交而未處理的消息,這就對應于at most once了。

讀完消息先處理再commit。這種模式下,如果處理完了消息在commit之前consumer crash了,下次重新開始工作時還會處理剛剛未commit的消息,實際上該消息已經被處理過了,這就對應于at least once。

要做到exactly once就需要引入消息去重機制。

3.2 消息去重

如上一節所述,Kafka在producer端和consumer端都會出現消息的重復,這就需要去重處理。

Kafka文檔中提及GUID(Globally Unique Identifier)的概念,通過客戶端生成算法得到每個消息的unique id,同時可映射至broker上存儲的地址,即通過GUID便可查詢提取消息內容,也便于發送方的冪等性保證,需要在broker上提供此去重處理模塊,目前版本尚不支持。

針對GUID, 如果從客戶端的角度去重,那么需要引入集中式緩存,必然會增加依賴復雜度,另外緩存的大小難以界定。

不只是Kafka, 類似RabbitMQ以及RocketMQ這類商業級中間件也只保障at least once, 且也無法從自身去進行消息去重。所以我們建議業務方根據自身的業務特點進行去重,比如業務消息本身具備冪等性,或者借助Redis等其他產品進行去重處理。

3.3 高可靠性配置

Kafka提供了很高的數據冗余彈性,對于需要數據高可靠性的場景,我們可以增加數據冗余備份數(replication.factor),調高最小寫入副本數的個數(min.insync.replicas)等等,但是這樣會影響性能。反之,性能提高而可靠性則降低,用戶需要自身業務特性在彼此之間做一些權衡性選擇。

要保證數據寫入到Kafka是安全的,高可靠的,需要如下的配置:

  • topic的配置:replication.factor>=3,即副本數至少是3個;2<=min.insync.replicas<=replication.factor
  • broker的配置:leader的選舉條件unclean.leader.election.enable=false
  • producer的配置:request.required.acks=-1(all),producer.type=sync

4、BenchMark

4.1 測試環境

Kafka broker用到了4臺機器,分別為broker[0/1/2/3]配置如下:

  • CPU: 24core/2.6GHZ
  • Memory: 62G
  • Network: 4000Mb
  • OS/kernel: CentOs release 6.6 (Final)
  • Disk: 1089G
  • Kafka版本:0.10.1.0

broker端JVM參數設置:
-Xmx8G -Xms8G -server -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+CMSScavengeBeforeRemark -XX:+DisableExplicitGC -Djava.awt.headless=true -Xloggc:/apps/service/kafka/bin/../logs/kafkaServer-gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=9999

客戶端機器配置:

  • CPU: 24core/2.6GHZ
  • Memory: 3G
  • Network: 1000Mb
  • OS/kernel: CentOs release 6.3 (Final)
  • Disk: 240G
4.2 不同場景測試

場景1:測試不同的副本數、min.insync.replicas策略以及request.required.acks策略(以下簡稱acks策略)對于發送速度(TPS)的影響。

具體配置:一個producer;發送方式為sync;消息體大小為1kB;partition數為12。副本數為:1/2/4;min.insync.replicas分別為1/2/4;acks分別為-1(all)/1/0。

具體測試數據如下表(min.insync.replicas只在acks=-1時有效):

acks

replicas

min.insync.replicas

retries

TPS

-1

1

1

0

28511.3

-1

2

1

0

22359.5

-1

2

2

0

22927.4

-1

4

1

0

16193.9

-1

4

2

0

16599.9

-1

4

4

0

16680.3

0

1

N/A

0

45353.8

0

2

N/A

0

46426.5

0

4

N/A

0

46764.2

1

1

N/A

0

33950.3

1

2

N/A

0

32192.2

1

4

N/A

0

32275.9

測試結果分析:

  • 客戶端的acks策略對發送的TPS有較大的影響,TPS:acks_0 > acks_1 > ack_-1;
  • 副本數越高,TPS越低;副本數一致時,min.insync.replicas不影響TPS;
  • acks=0/1時,TPS與min.insync.replicas參數以及副本數無關,僅受acks策略的影響。

下面將partition的個數設置為1,來進一步確認下不同的acks策略、不同的min.insync.replicas策略以及不同的副本數對于發送速度的影響,詳細請看情景2和情景3。

場景2:在partition個數固定為1,測試不同的副本數和min.insync.replicas策略對發送速度的影響。

具體配置:一個producer;發送方式為sync;消息體大小為1kB;producer端acks=-1(all)。變換副本數:2/3/4; min.insync.replicas設置為:1/2/4。

測試結果如下:

replicas

min.insync.replicas

TPS

2

1

9738.8

2

2

9701.6

3

1

8999.7

3

2

9243.1

4

1

9005.8

4

2

8216.9

4

4

9092.4

測試結果分析:副本數越高,TPS越低(這點與場景1的測試結論吻合),但是當partition數為1時差距甚微。min.insync.replicas不影響TPS。

場景3:在partition個數固定為1,測試不同的acks策略和副本數對發送速度的影響。

具體配置:一個producer;發送方式為sync;消息體大小為1kB;min.insync.replicas=1。topic副本數為:1/2/4;acks: 0/1/-1。

測試結果如下:

replicas

acks

TPS

1

0

76696

2

0

57503

4

0

59367

1

1

19489

2

1

20404

4

1

18365

1

-1

18641

2

-1

9739

4

-1

9006

測試結果分析(與情景1一致):

  • 副本數越多,TPS越低;
  • 客戶端的acks策略對發送的TPS有較大的影響,TPS:acks_0 > acks_1 > ack_-1。

場景4:測試不同partition數對發送速率的影響

具體配置:一個producer;消息體大小為1KB;發送方式為sync;topic副本數為2;min.insync.replicas=2;acks=-1。partition數量設置為1/2/4/8/12。

測試結果:

測試結果分析:partition的不同會影響TPS,隨著partition的個數的增長TPS會有所增長,但并不是一直成正比關系,到達一定臨界值時,partition數量的增加反而會使TPS略微降低。

場景5:通過將集群中部分broker設置成不可服務狀態,測試對客戶端以及消息落盤的影響。

具體配置:一個producer;消息體大小1KB;發送方式為sync;topic副本數為4;min.insync.replicas設置為2;acks=-1;retries=0/100000000;partition數為12。

具體測試數據如下表:

acks

replicas

min.insync.replicas

retries

測試方法

TPS

數據落盤

出現錯誤

-1

4

2

0

發送過程中kill兩臺broker

12840

一致(部分數據可落盤,部分失敗)

錯誤1

-1

4

2

100000000

發送過程中kill兩臺broker

13870

一致(消息有重復落盤)

錯誤2

-1

4

2

100000000

發送過程中kill三臺broker,之后重啟

N/A

一致(消息有重復落盤)

錯誤2、3、4

出錯信息:

  • 錯誤1:客戶端返回異常,部分數據可落盤,部分失敗:org.apache.kafka.common.errors.NetworkException: The server disconnected before a response was received.
  • 錯誤2:[WARN]internals.Sender - Got error produce response with correlation id 19369 on topic-partition default_channel_replicas_4_1-3, retrying (999999999 attempts left). Error: NETWORK_EXCEPTION
  • 錯誤3: [WARN]internals.Sender - Got error produce response with correlation id 77890 on topic-partition default_channel_replicas_4_1-8, retrying (999999859 attempts left). Error: NOT_ENOUGH_REPLICAS
  • 錯誤4: [WARN]internals.Sender - Got error produce response with correlation id 77705 on topic-partition default_channel_replicas_4_1-3, retrying (999999999 attempts left). Error: NOT_ENOUGH_REPLICAS_AFTER_APPEND

測試結果分析:

  • kill兩臺broker后,客戶端可以繼續發送。broker減少后,partition的leader分布在剩余的兩臺broker上,造成了TPS的減小;
  • kill三臺broker后,客戶端無法繼續發送。Kafka的自動重試功能開始起作用,當大于等于min.insync.replicas數量的broker恢復后,可以繼續發送;
  • 當retries不為0時,消息有重復落盤;客戶端成功返回的消息都成功落盤,異常時部分消息可以落盤。

場景6:測試單個producer的發送延遲,以及端到端的延遲。

具體配置::一個producer;消息體大小1KB;發送方式為sync;topic副本數為4;min.insync.replicas設置為2;acks=-1;partition數為12。

測試數據及結果(單位為ms):

發送端(avg)

發送端(min)

發送端(max)

發送端(99%)

發送端(99.99%)

消費端(avg)

消費端(min)

消費端(max)

消費端(99%)

消費端(99.99%)

1.715

1

157

3

29

1.646

1

288

4

72

各場景測試總結

  • 當acks=-1時,Kafka發送端的TPS受限于topic的副本數量(ISR中),副本越多TPS越低;
  • acks=0時,TPS最高,其次為1,最差為-1,即TPS:acks_0 > acks_1 > ack_-1;
  • min.insync.replicas參數不影響TPS;
  • partition的不同會影響TPS,隨著partition的個數的增長TPS會有所增長,但并不是一直成正比關系,到達一定臨界值時,partition數量的增加反而會使TPS略微降低;
  • Kafka在acks=-1,min.insync.replicas>=1時,具有高可靠性,所有成功返回的消息都可以落盤。

參考文檔:http://blog.csdn.net/u013256816/article/details/71091774

轉載于:https://www.cnblogs.com/wcwen1990/p/7898181.html

總結

以上是生活随笔為你收集整理的消息系统kafka原理解析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

午夜精品一区二区三区免费视频 | 亚洲日本欧美在线 | 天堂av网址| 不卡中文字幕av | 中文字幕丝袜 | 免费在线激情电影 | av品善网 | 最近免费中文字幕mv在线视频3 | 麻豆视频免费入口 | 久久精品国产精品亚洲 | 日韩在线观看视频网站 | 91系列在线 | 久久男人影院 | 久久久九色精品国产一区二区三区 | 免费网站污 | 亚洲欧美日本一区二区三区 | 在线成人一区二区 | 亚洲精品欧美专区 | 国产成人无码AⅤ片在线观 日韩av不卡在线 | 精品视频999 | 亚洲一片黄 | 婷婷色av| 久久久久二区 | 国产一区在线观看视频 | 久久久高清免费视频 | 精品一区二区免费 | 免费一级片在线 | 亚洲欧洲av | 丝袜美女在线观看 | 国产精品一区二区三区四区在线观看 | 天天视频色| 一级精品视频在线观看宜春院 | 久久精品视频在线观看 | 日韩最新在线视频 | 91精品国产91久久久久久三级 | 五月天婷婷狠狠 | www.国产精品 | 中文字幕在线观看一区 | 美女久久网站 | 狠狠操.com | 麻豆久久精品 | 色偷偷88欧美精品久久久 | 国产视频 亚洲精品 | 色鬼综合网 | 亚洲精品视频免费在线 | 亚洲草视频 | 亚洲人成免费网站 | 亚洲成av人电影 | 人人狠狠综合久久亚洲 | 在线视频 日韩 | 97精品超碰一区二区三区 | 亚洲国产精品成人精品 | 中文字幕中文字幕在线中文字幕三区 | 成人免费在线播放 | 久久激情片 | a天堂最新版中文在线地址 久久99久久精品国产 | 久久久国产一区二区三区四区小说 | 999精品网| 久久国产热视频 | 国产又粗又猛又爽又黄的视频免费 | 最近日本韩国中文字幕 | 久久99热久久99精品 | 国产精品区免费视频 | 久久五月精品 | 成人91在线 | 人人插人人做 | 精品一区二区在线看 | 96在线 | 人人澡人人澡人人 | 91精品久久久久久综合五月天 | 免费观看一区 | 天堂久久电影网 | 九九视频这里只有精品 | 日日干网 | 91在线影视 | 亚洲黄色成人av | 欧美日韩激情视频8区 | 亚洲人成影院在线 | 日韩高清网站 | 色婷婷av在线| 天天综合网久久综合网 | 久久成人午夜 | 中文字幕在线观看免费 | 狠狠干 狠狠操 | 国内精品久久久久久久97牛牛 | 久久国产精品免费一区 | 成人午夜片av在线看 | 一区二区三区四区五区在线 | 国产乱码精品一区二区三区介绍 | 97精品国产97久久久久久免费 | 丝袜精品视频 | 国内揄拍国内精品 | 婷婷丁香狠狠爱 | 国产视频一区二区在线 | 国产亚洲成av人片在线观看桃 | 在线免费观看av网站 | 99久久婷婷国产精品综合 | 奇米导航| av资源免费在线观看 | 91麻豆网 | 福利一区二区 | www.av中文字幕.com | 在线免费观看亚洲视频 | www.av免费| 久久好看免费视频 | av在线之家电影网站 | 国产在线精品一区二区三区 | 91污视频在线 | 中文字幕在线久一本久 | 在线观看的黄色 | 24小时日本在线www免费的 | 国产视频1区2区3区 久久夜视频 | 亚洲视频一级 | 国产视频欧美视频 | 日本深夜福利视频 | 国产一区视频在线播放 | 欧美一级爽| 亚洲福利精品 | 97精品久久人人爽人人爽 | 91亚洲精品久久久中文字幕 | 国产裸体永久免费视频网站 | 婷婷开心久久网 | 98久久| 97成人在线观看 | 国产成人精品午夜在线播放 | 99re亚洲国产精品 | 免费看色的网站 | 少妇bbbb搡bbbb桶 | 亚洲国产操 | 在线观看中文 | 午夜.dj高清免费观看视频 | 日本精品久久久久中文字幕5 | 国产精品综合av一区二区国产馆 | 人人看人人做人人澡 | 国产成年人av | 免费看一级片 | 国产最新精品视频 | 亚洲国产日韩在线 | 亚洲国产播放 | 99久久久久成人国产免费 | 综合亚洲视频 | 久久影院中文字幕 | av电影免费在线看 | 国产精品小视频网站 | 色综合久久88 | 欧美久久久| 国产精品18毛片一区二区 | 91av亚洲| 成人精品影视 | 国产视频在线观看一区 | 日韩午夜高清 | 国色天香在线观看 | 国产专区日韩专区 | 麻豆精品传媒视频 | 国产资源中文字幕 | 亚洲精品在线观 | 亚洲激精日韩激精欧美精品 | 天天躁天天狠天天透 | 中文字幕乱码在线播放 | 成人国产精品免费观看 | 伊人五月天| 99国产一区二区三精品乱码 | 天天操天天操天天 | 亚洲成年人在线播放 | 综合精品在线 | 99在线免费视频 | 欧美狠狠色 | 精品在线二区 | 国产精品女人网站 | 中文字幕在线资源 | 视色网站| 久久av网址| 亚洲高清免费在线 | 免费看污的网站 | 97视频免费在线看 | 九九视频网 | 国产私拍在线 | 精品在线观看国产 | 日韩字幕在线观看 | 亚洲精品动漫久久久久 | 人人干在线观看 | 手机看国产毛片 | 亚洲精品动漫久久久久 | 韩日电影在线观看 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 懂色av一区二区在线播放 | 精品久久久久国产免费第一页 | 在线亚洲人成电影网站色www | 国产精品一区二区av | 天天草天天爽 | 国产流白浆高潮在线观看 | 色婷婷天天干 | 久久久久免费精品国产小说色大师 | 久久国产精品成人免费浪潮 | av电影不卡在线 | 色婷婷国产精品一区在线观看 | 国产成人av一区二区三区在线观看 | 久久成人国产精品一区二区 | 国产不卡av在线 | 亚洲一区尤物 | 免费在线观看黄网站 | 最近在线中文字幕 | 91在线一区二区 | 亚洲精品国产成人av在线 | 99精品在这里 | 日韩一区二区免费播放 | 午夜精品视频一区 | 最近中文字幕mv免费高清在线 | 国产视频在线观看一区 | 国产精品久久久久久久久久了 | 91视频啪| 婷婷在线免费观看 | 国产一区免费在线观看 | 色综合天天射 | 亚洲一级电影在线观看 | 91精品对白一区国产伦 | 久久一区二区免费视频 | 国产精品综合久久久久久 | 在线成人欧美 | 欧美性极品xxxx娇小 | 五月天婷婷视频 | 欧美美女激情18p | 91成人破解版 | 综合网成人 | 99久久精品无免国产免费 | 婷婷久久婷婷 | 久久伦理电影网 | 精品日韩视频 | 亚洲专区视频在线观看 | www.亚洲精品 | 国产一区欧美一区 | 精品在线观 | 超碰97网站| 中文字幕视频在线播放 | 欧美色就是色 | 97国产超碰在线 | 日韩电影中文,亚洲精品乱码 | 日韩精品影视 | 国产精品1区2区在线观看 | 91精品国产九九九久久久亚洲 | 亚洲日本韩国一区二区 | 久久精品亚洲国产 | 91在线视频免费播放 | 国产一区二区电影在线观看 | 美女在线观看网站 | 国产精品久久久久久久久免费看 | 草久在线观看视频 | 久久国产精品电影 | 国产日韩在线一区 | 99色精品视频| 中文字幕在线观看一区二区三区 | 亚洲激情在线播放 | 亚洲天堂精品视频在线观看 | 亚洲午夜精品在线观看 | 久久福利小视频 | 久久视频在线免费观看 | 探花系列在线 | 国产福利精品在线观看 | www.午夜 | 99c视频在线 | 亚洲激精日韩激精欧美精品 | 91精品视频一区二区三区 | 天天天天天天天天操 | 日韩3区 | 午夜精品电影一区二区在线 | 91精品国产三级a在线观看 | 久久综合久久伊人 | 九九热久久免费视频 | 成人在线视频免费观看 | 国产免费观看av | 五月婷婷综合在线 | 久久成人国产精品一区二区 | 亚洲 欧洲av | 国产精品久久久久国产a级 激情综合中文娱乐网 | 最新高清无码专区 | 成人va在线观看 | 亚洲欧美视频一区二区三区 | 色亚洲网| 天天插天天爽 | 99久久久国产免费 | 国产精品美女视频网站 | 欧美不卡在线 | a色网站| 三上悠亚在线免费 | av成人免费在线 | 伊人久久在线观看 | 国产成人精品网站 | 日韩成人在线一区二区 | 国产亚洲情侣一区二区无 | 久久五月天色综合 | 91综合视频在线观看 | 国产一级电影在线 | 成人免费看电影 | 精品欧美小视频在线观看 | 808电影 | 香蕉久久国产 | 亚洲激情在线视频 | 在线观看亚洲精品 | 国产精品成人一区二区三区吃奶 | 黄色动态图xx | 视频国产一区二区三区 | 一区二区三区四区五区六区 | 丁香六月av| 成人在线免费观看视视频 | 免费黄色av. | 国产精品亚洲成人 | 国产在线污 | 日韩电影在线视频 | 日韩在线观看网站 | 日韩专区 在线 | 玖玖爱免费视频 | 一区二区av | 国产精品毛片一区视频播 | 2023av在线| 综合久久2023| 国产精品久久电影网 | 成人av视屏 | 久久综合99 | 久久久久久久电影 | 91在线观| 免费手机黄色网址 | 福利一区视频 | 欧洲av在线| 高清有码中文字幕 | 国产在线一线 | 美女网站色在线观看 | 国产特黄色片 | 亚色视频在线观看 | 久久婷婷网 | 中文字幕电影在线 | 操操操影院| 亚洲婷婷伊人 | 一级黄色片在线 | 精品五月天 | 久久精品影视 | 欧美一区二区免费在线观看 | 一色av| 91精品国产91久久久久福利 | 国产成人亚洲精品自产在线 | 免费黄色网址大全 | 999在线视频 | 色综合天天 | 在线观看国产v片 | 色婷婷狠狠操 | 月丁香婷婷 | 国产精品18久久久久白浆 | 天天操天天摸天天射 | 久久精品久久精品久久39 | 日韩网站视频 | 成人理论电影 | av大片免费 | 人人爽影院 | 99视频在线精品免费观看2 | 在线观看香蕉视频 | 中文字幕av全部资源www中文字幕在线观看 | 最新日韩在线观看 | 在线国产一区二区三区 | 四虎永久免费在线观看 | 中文字幕乱码电影 | 美女网站视频一区 | 国产成本人视频在线观看 | 中文字幕在线观看2018 | 国产淫片免费看 | 国产激情小视频在线观看 | 天天干亚洲| 欧美另类视频 | 六月丁香伊人 | 久久久久欠精品国产毛片国产毛生 | 久99久久| 99精品视频在线播放免费 | av资源免费看 | 国产精品免费久久久久影院仙踪林 | 综合色影院 | 91片黄在线观 | 午夜国产一区 | 天天曰| 精品不卡av| 色狠狠操 | 日韩美精品视频 | 在线观看视频日韩 | 中文字幕在线观看视频一区二区三区 | 天天操天天操天天操 | 国产小视频免费观看 | 最近中文字幕国语免费高清6 | 在线观看免费av网站 | 欧美最猛性xxx | 91黄色在线观看 | 欧美一区二区伦理片 | 中文字幕视频免费观看 | 美女国产免费 | 黄在线免费看 | 久久视频这里有久久精品视频11 | 黄色一级大片在线观看 | 婷婷丁香社区 | 欧美日本国产在线观看 | 国产美女精品视频 | 日日爱av | 国产精品嫩草影视久久久 | 欧美极品xxx | 美女黄视频免费看 | 成人黄色小视频 | 日韩高清av在线 | 黄色tv视频| 日韩视频一区二区三区 | 精品久久久一区二区 | 韩国av免费在线观看 | 国产精品男女视频 | 一区二区久久 | 久久草草影视免费网 | 久久综合久久久久88 | 亚洲aⅴ乱码精品成人区 | 国产精品专区h在线观看 | 久久av一区二区三区亚洲 | 天天操天天色天天射 | 六月丁香激情综合色啪小说 | 色婷婷成人网 | 97国产一区二区 | 天天草天天色 | 97视频人人澡人人爽 | 久草网站在线观看 | 国产福利精品一区二区 | 国产精品一区二区精品视频免费看 | 婷婷丁香在线观看 | 亚洲三级毛片 | 国产91大片 | 中文字幕一区在线观看视频 | 国产精品免费久久久 | 亚洲一区日韩 | 国产美女视频免费观看的网站 | 97中文字幕 | 在线不卡中文字幕播放 | 色视频网页 | 中文在线最新版天堂 | 中文字幕亚洲国产 | 天天操夜夜爱 | 国产精品高潮呻吟久久av无 | 色婷婷综合久久久久 | 伊人婷婷网 | 免费看短 | 五月婷婷播播 | 在线久热 | 97视频在线看 | 激情婷婷亚洲 | 久久综合色影院 | 国产亚洲精品久久久久久无几年桃 | 毛片精品免费在线观看 | 在线黄网站 | 亚洲欧美日韩精品久久奇米一区 | 91自拍91 | www178ccom视频在线 | 亚洲国产资源 | 日韩高清在线一区二区 | 99这里只有久久精品视频 | 黄色最新网址 | 丁香视频在线观看 | 日本精品在线视频 | 99tvdz@gmail.com| 在线观看免费成人 | 亚洲精品乱码久久久久久 | www日韩欧美 | 91手机电视 | 婷婷五月在线视频 | 日本免费久久高清视频 | 久久久视屏 | 国产精品久久久久国产a级 激情综合中文娱乐网 | 我要看黄色一级片 | 精品国偷自产国产一区 | 超碰九九 | 天天操夜夜逼 | 狠狠做六月爱婷婷综合aⅴ 日本高清免费中文字幕 | 国产精品久久久久久久电影 | 激情小说网站亚洲综合网 | 免费在线一区二区 | 射九九 | 日韩动漫免费观看高清完整版在线观看 | 国产精品99久久99久久久二8 | 九九视频精品免费 | 久久99精品久久久久久秒播蜜臀 | 中文字幕在线播放av | 日韩精品亚洲专区在线观看 | 日日夜夜天天久久 | www.99热精品 | 国产一区二区三区 在线 | 天天曰天天射 | 国产精品久免费的黄网站 | 人人澡人人爱 | 伊人影院av | 在线免费观看视频一区 | 四虎影视成人永久免费观看亚洲欧美 | 久久伦理电影 | 久久视频这里只有精品 | 在线亚洲欧美日韩 | 欧美污网站 | 欧美日韩精品二区第二页 | 久久免费国产视频 | 色欧美成人精品a∨在线观看 | 日本激情动作片免费看 | 亚洲欧洲精品一区二区 | 亚洲欧洲xxxx | 亚洲色图美腿丝袜 | 最新精品视频在线 | 欧美一二在线 | 91热这里只有精品 | 欧美成人精品在线 | 永久精品视频 | 久久97超碰| adc在线观看 | 国产黄色成人av | 五月天婷亚洲天综合网鲁鲁鲁 | 久久激情网站 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 91视频免费网址 | 色老板在线视频 | 欧美 亚洲 另类 激情 另类 | 狠狠色丁香婷婷综合 | 精品久久综合 | 91精品国自产在线观看欧美 | 久久久久久久久久久久av | 日日躁夜夜躁aaaaxxxx | 91人人揉日日捏人人看 | 精品亚洲成人 | 国产亚洲aⅴaaaaaa毛片 | 日韩在线免费观看视频 | av蜜桃在线| 九九热精品国产 | 久久久久久久久久久久久久av | 国产亚洲精品久久久久秋 | 国产专区视频在线观看 | 国产高清黄 | 日韩av综合网站 | 免费瑟瑟网站 | 日本女人的性生活视频 | 色综合天天狠天天透天天伊人 | 极品国产91在线网站 | 黄色www免费 | 四虎影视国产精品免费久久 | 亚洲天堂网视频在线观看 | 99热在线看| 亚洲乱亚洲乱妇 | 国产精品白丝jk白祙 | 9999国产精品 | 亚洲香蕉在线观看 | 日韩国产精品久久久久久亚洲 | 91在线成人 | 国产精品美女久久久久久网站 | 五月婷婷开心中文字幕 | 国产不卡在线视频 | 国产在线精 | 黄色免费网站 | 日韩av看片 | 成人av电影在线观看 | 中文资源在线观看 | 六月色丁香| 日韩电影在线观看中文字幕 | 九九热国产 | 国产色女 | 一本一本久久aa综合精品 | 黄色片视频免费 | 最近中文字幕久久 | 欧美成人h版在线观看 | 久久久精品小视频 | 久草在线最新视频 | 亚洲男男gⅴgay双龙 | 麻豆激情电影 | 精品亚洲va在线va天堂资源站 | 色综合久久精品 | 中文字幕在线观看免费高清完整版 | 成人亚洲欧美 | 成人黄色av网站 | 午夜精品福利在线 | 国产精品精品视频 | av综合av | 久久视频在线观看免费 | 久久久国产99久久国产一 | 国产一级在线 | 久久久夜色 | 国产精品原创视频 | 久久爽久久爽久久av东京爽 | 91毛片在线观看 | 黄色资源在线观看 | 91最新网址在线观看 | 色资源网在线观看 | 99色视频在线 | 2019精品手机国产品在线 | 日本性生活免费看 | 狠狠狠色 | 不卡av电影在线观看 | 久久久精品午夜 | 天天干天天操av | 一区二区视频在线播放 | 久久久免费精品 | 国产成人av福利 | 成人三级视频 | 中文在线a在线 | 久久久精品视频网站 | 国产日韩欧美在线观看视频 | 99免费在线观看视频 | 久久成人欧美 | 国产成人免费精品 | 日本黄色一级电影 | 99国产精品久久久久久久久久 | 日本精品二区 | 久久久受www免费人成 | 国产理论一区二区三区 | 免费视频xnxx com | 97在线看 | 婷婷丁香视频 | 国产欧美日韩视频 | 欧美一区影院 | 在线免费高清 | 久久国产香蕉视频 | 色婷婷狠狠五月综合天色拍 | 波多野结衣精品 | 亚洲第二色 | 九九精品视频在线 | 人人草人人做 | 欧美黄色软件 | 天堂在线免费视频 | 欧美成人影音 | 中文字幕高清免费日韩视频在线 | 国产资源精品在线观看 | 日韩欧美一区二区三区视频 | 西西www4444大胆视频 | 一区二区三区福利 | 国产一区在线免费观看 | 国产成人61精品免费看片 | 丁香婷婷在线观看 | 国产黑丝一区二区 | 超碰在线最新地址 | 国产成人精品av | 狠狠狠狠狠狠天天爱 | 久久99免费观看 | 国产群p视频 | 免费在线观看黄色网 | 夜夜干夜夜 | 国产精品美女久久久久久久久 | 免费视频黄色 | 国产成人精品久 | 国产精品亚洲a | 私人av | 午夜精品久久久久久久久久 | 婷婷深爱五月 | 免费国产黄线在线观看视频 | 精品久久片| 欧美视频日韩 | 精品亚洲欧美一区 | 久久久国产毛片 | 深爱五月网 | 麻豆一精品传二传媒短视频 | 久久综合中文字幕 | 免费久久99精品国产 | 精品一区电影国产 | 日韩精品一区二区三区视频播放 | 在线 欧美 日韩 | 福利视频一区二区 | 久9在线 | 久久久色 | 日韩福利在线观看 | 久久五月天色综合 | 欧美国产日韩一区二区三区 | 国产在线视频在线观看 | 日韩在线三区 | www.夜色.com | 色www.| 国产精品久久久久久影院 | 91桃色在线观看视频 | 国产污视频在线观看 | 久久理论视频 | 日韩二区在线观看 | 久久8| 国产视频综合在线 | 91在线超碰| 亚洲国产黄色片 | 美女福利视频网 | 久久久久久久免费 | 国产不卡视频 | 国产精品成人av在线 | 久久免费激情视频 | 精品a级片| 欧美精品一区二区三区四区在线 | 国产精品3区 | 天天操天天弄 | 天天舔天天射天天操 | 成人永久在线 | 久久国产热视频 | 开心激情婷婷 | 麻花豆传媒mv在线观看 | 亚洲综合国产精品 | 美女网站色| 91在线麻豆 | 伊人婷婷 | 免费在线观看av不卡 | 欧美做受高潮 | 特级大胆西西4444www | 久久字幕 | 精品国产乱码久久久久久久 | 亚洲四虎在线 | 伊人天堂av| 国产精品aⅴ | 久久精品电影院 | 日日夜夜操操 | 国产涩涩网站 | 免费人人干 | 天天鲁一鲁摸一摸爽一爽 | 一区免费视频 | 午夜精品一区二区三区免费视频 | 4438全国亚洲精品观看视频 | 99视频网站| 国产在线成人 | 免费看黄视频 | 黄色免费网站 | 中文字幕一区二 | 亚洲精选久久 | 中文字幕乱码电影 | 欧美激情综合五月色丁香小说 | 中文字幕亚洲综合久久五月天色无吗'' | 黄色一级免费网站 | 在线看岛国av | 狠狠色丁香婷婷综合 | 天堂视频一区 | 丁香花在线观看视频在线 | 狠狠躁夜夜a产精品视频 | 国产xxxx | 欧美va在线观看 | 91精品久 | 91久久奴性调教 | 精品久久电影 | 国产成人精品午夜在线播放 | 国产日本在线观看 | 成人免费网站在线观看 | 狠狠操操网| 不卡国产在线 | 免费看特级毛片 | 亚洲人成影院在线 | 狠狠操影视 | 日韩久久精品一区二区 | 欧美一区二区三区在线视频观看 | 人人添人人澡 | 热久久视久久精品18亚洲精品 | 日日操日日插 | 日韩影视大全 | 四虎成人精品永久免费av | av高清在线观看 | 13日本xxxxxⅹxxx20 | 热久久影视 | 欧美国产一区在线 | 四虎在线视频免费观看 | 九九九九免费视频 | 国产精品女主播一区二区三区 | 亚洲视频电影在线 | 日韩专区在线 | 成人午夜电影在线 | 免费观看特级毛片 | 欧美日韩午夜在线 | 久久久www成人免费精品张筱雨 | 天天拍天天草 | 久久久精品欧美一区二区免费 | 国产精品久久久久久久久久久久午 | 国产日韩中文字幕 | 久久综合丁香 | 亚洲va欧洲va国产va不卡 | 国产四虎在线 | www.黄色| 天天操狠狠操 | 国产一区二区精品91 | 国产一级免费观看视频 | 婷婷在线色 | 能在线看的av | 亚洲精品久久久久久久不卡四虎 | 午夜12点 | 亚洲国产精品成人va在线观看 | 日本在线成人 | 日韩一区在线播放 | 97超碰人人模人人人爽人人爱 | 久久经典国产视频 | 毛片一级免费一级 | 黄色小说网站在线 | 亚洲成av人片在线观看无 | 国产精品欧美激情在线观看 | 亚洲精品在线观看不卡 | 国产精品久久久久久久久久白浆 | 久久艹人人| 免费看片在线观看 | 成人在线一区二区三区 | 亚洲欧美成人综合 | 色婷婷五| 国产一二区在线观看 | 青青久草在线视频 | 久久精品中文字幕一区二区三区 | 久久综合九色综合久99 | 亚洲综合情 | 天天干天天草天天爽 | 一级一片免费视频 | 国产精品理论视频 | 一区二区视频在线看 | 亚洲国产成人在线 | 99久久精品免费看国产免费软件 | 国产精品乱码在线 | 国产视频观看 | 国产亚洲成人网 | 五月婷婷激情综合 | 人人射人人爽 | 伊香蕉大综综综合久久啪 | 久色婷婷 | 国产中文字幕一区 | 久久久99精品免费观看 | 天天曰天天曰 | 日韩专区视频 | 天天综合天天做 | 欧美激情综合五月 | 久久久久久久久久久黄色 | 天天综合91 | 狠狠色狠狠色综合日日小说 | 国产一区二区三区免费在线观看 | 国产精品福利久久久 | 色婷婷av一区 | 欧美日韩视频 | 久草视频一区 | 日本性生活一级片 | 国产aaa免费视频 | 美女久久久久 | 国产精品福利午夜在线观看 | 成人免费在线视频观看 | 51久久夜色精品国产麻豆 | 亚州国产精品视频 | 顶级欧美色妇4khd | 婷婷丁香激情 | 黄色在线免费观看网址 | 久久久久一区二区三区 | 91porny九色在线播放 | 波多在线视频 | 黄色成人在线观看 | 超碰在线人人 | 免费成人在线观看 | 四虎伊人 | 色综合久久久久久中文网 | 97看片网 | 制服丝袜天堂 | 日色在线视频 | 99精品在线| 操久在线 | 国产成人精品一区二区三区福利 | 国产乱码精品一区二区蜜臀 | 日韩中文在线观看 | 伊人午夜 | 国产精品一区二区在线播放 | 日本少妇视频 | 日韩18p| 在线视频免费观看 | 97爱爱爱| 亚洲国产成人精品电影在线观看 | 精品在线一区二区 | 欧美男同网站 | 久久久污 | 三级动图 | 久久综合九色综合97婷婷女人 | 欧美国产三区 | 亚洲视频在线观看免费 | 国产精品成人久久久久久久 | 六月色婷婷 | 东方av在| 国产一线二线三线在线观看 | 久久视频这里有久久精品视频11 | 欧美亚洲免费在线一区 | 97超碰成人 | 成人在线你懂得 | 午夜精品福利一区二区三区蜜桃 | 毛片的网址 | 午夜精品视频一区二区三区在线看 | 亚洲精品综合一二三区在线观看 | 久久久精品网 | 麻豆影视在线播放 | 欧美成人亚洲 | 亚洲激情综合 | www.久久久com | 国产高清综合 | 四虎成人精品永久免费av | 日韩精品2区 | 深爱激情综合 | 欧美一级片免费在线观看 | 狠狠色丁香婷婷综合最新地址 | www.天天成人国产电影 | 激情综合网婷婷 | a天堂最新版中文在线地址 久久99久久精品国产 | 亚洲 欧美变态 另类 综合 | 在线观看av不卡 | 国产一区影院 | 久草免费资源 | 欧美性大胆 | 91aaa在线观看 | 国产美女精品在线 | 久久亚洲美女 | 精品国产一二三四区 | 成人av一区二区在线观看 | 久草在线视频新 | 99视频黄| 色网站在线免费观看 | 99热只有精品在线观看 | 九色精品免费永久在线 | 久久免费高清视频 | 色91av| 亚洲国产日韩精品 | 欧美一区影院 | 国产精品婷婷午夜在线观看 | 人人插人人玩 | 一级片在线 | 蜜臀av在线一区二区三区 | 久久久国产毛片 | 操操综合网 | 亚洲成人国产 | 深爱激情av | 91精品国产99久久久久久红楼 | avcom在线| 久久中文字幕在线视频 | 九九久久国产 | 天天玩夜夜操 | 天天综合天天做天天综合 | 久草网在线视频 | 97色资源 | 麻豆91精品 | 久久免费视频在线观看30 | 欧美成人一二区 | 国产一级免费av | 中文字幕久久久精品 | 天天干天天操 | 天天色天天艹 | 久久久999免费视频 日韩网站在线 | 黄免费网站 | 亚洲乱码精品 | 国产丝袜 | 日韩成人高清在线 | 国产精品一区二区 91 | 日韩精品久久久久久久电影99爱 | 色资源二区在线视频 | 97在线超碰| 五月天最新网址 | 免费在线观看av网址 | 欧美午夜理伦三级在线观看 | 久草在线视频网 | 人人插人人做 | 99久久精品国产一区 | 五月婷香蕉久色在线看 | 深夜免费小视频 | 91超在线 | 亚洲精品小区久久久久久 | 在线看片视频 | 91传媒视频在线观看 | 毛片精品免费在线观看 | 最近日本韩国中文字幕 | 美女国内精品自产拍在线播放 | 人人添人人澡 | 超碰在线最新 | 国产福利一区二区三区视频 | 久久综合狠狠综合 | 国产精品女人久久久 | 特级毛片网站 | 久久国产精品影片 | 欧美精品乱码99久久影院 | 久久99久久久久久 | 一区在线观看 | 91最新国产 | 91在线看视频免费 | 亚洲视频综合 | 亚洲成aⅴ人在线观看 | 香蕉视频免费看 | 久久精品9 | 精品 一区 在线 | 狠狠狠狠狠狠狠狠干 | 99国产一区二区三精品乱码 | 特片网久久| 成人黄视频| 在线电影a | 久久久人| 国产精品专区h在线观看 | 人人澡人人草 | 在线成人观看 | www.天天色.com| 99精品免费观看 | 综合色天天| 九九爱免费视频在线观看 | 丁香六月在线观看 | 在线视频专区 | 日韩三级视频在线观看 | 夜夜躁日日躁 | 国产精品综合久久久久 | 亚洲国产免费看 | 国产精品入口a级 | 97成人在线免费视频 | 久草视频在线免费看 | 夜添久久精品亚洲国产精品 | 在线免费观看国产 | 91亚洲国产成人 | 日日躁你夜夜躁你av蜜 | 四虎国产免费 | 深爱激情久久 | 欧美精品久| 精品久久久久久综合 | 深爱婷婷网 |