• <menu id="gyiem"><menu id="gyiem"></menu></menu>
  • <menu id="gyiem"><code id="gyiem"></code></menu>

    Kafka設計解析(四)- Kafka Consumer設計解析

    原創文章,轉載請務必將下面這段話置于文章開頭處。(已授權InfoQ中文站發布
    本文轉發自技術世界原文鏈接 http://www.luozeyang.com/2015/08/09/KafkaColumn4

    摘要

      本文主要介紹了Kafka High Level Consumer,Consumer Group,Consumer Rebalance,Low Level Consumer實現的語義,以及適用場景。以及未來版本中對High Level Consumer的重新設計–使用Consumer Coordinator解決Split Brain和Herd等問題。

    High Level Consumer

      很多時候,客戶程序只是希望從Kafka讀取數據,不太關心消息offset的處理。同時也希望提供一些語義,例如同一條消息只被某一個Consumer消費(單播)或被所有Consumer消費(廣播)。因此,Kafka Hight Level Consumer提供了一個從Kafka消費數據的高層抽象,從而屏蔽掉其中的細節并提供豐富的語義。   

    Consumer Group

      High Level Consumer將從某個Partition讀取的最后一條消息的offset存于Zookeeper中(Kafka從0.8.2版本開始同時支持將offset存于Zookeeper中與將offset存于專用的Kafka Topic中)。這個offset基于客戶程序提供給Kafka的名字來保存,這個名字被稱為Consumer Group。Consumer Group是整個Kafka集群全局的,而非某個Topic的。每一個High Level Consumer實例都屬于一個Consumer Group,若不指定則屬于默認的Group。
      Zookeeper中Consumer相關節點如下圖所示
    Consumer Zookeeper Structure
      
      很多傳統的Message Queue都會在消息被消費完后將消息刪除,一方面避免重復消費,另一方面可以保證Queue的長度比較短,提高效率。而如上文所述,Kafka并不刪除已消費的消息,為了實現傳統Message Queue消息只被消費一次的語義,Kafka保證每條消息在同一個Consumer Group里只會被某一個Consumer消費。與傳統Message Queue不同的是,Kafka還允許不同Consumer Group同時消費同一條消息,這一特性可以為消息的多元化處理提供支持。
    kafka consumer group
      
      實際上,Kafka的設計理念之一就是同時提供離線處理和實時處理。根據這一特性,可以使用Storm這種實時流處理系統對消息進行實時在線處理,同時使用Hadoop這種批處理系統進行離線處理,還可以同時將數據實時備份到另一個數據中心,只需要保證這三個操作所使用的Consumer在不同的Consumer Group即可。下圖展示了Kafka在LinkedIn的一種簡化部署模型。
    kafka sample deployment in linkedin
      
      為了更清晰展示Kafka Consumer Group的特性,筆者進行了一項測試。創建一個Topic (名為topic1),再創建一個屬于group1的Consumer實例,并創建三個屬于group2的Consumer實例,然后通過Producer向topic1發送Key分別為1,2,3的消息。結果發現屬于group1的Consumer收到了所有的這三條消息,同時group2中的3個Consumer分別收到了Key為1,2,3的消息,如下圖所示。
    kafka consumer group
      注:上圖中每個黑色區域代表一個Consumer實例,每個實例只創建一個MessageStream。實際上,本實驗將Consumer應用程序打成jar包,并在4個不同的命令行終端中傳入不同的參數運行。

    High Level Consumer Rebalance

      (本節所講述Rebalance相關內容均基于Kafka High Level Consumer)
      Kafka保證同一Consumer Group中只有一個Consumer會消費某條消息,實際上,Kafka保證的是穩定狀態下每一個Consumer實例只會消費某一個或多個特定Partition的數據,而某個Partition的數據只會被某一個特定的Consumer實例所消費。也就是說Kafka對消息的分配是以Partition為單位分配的,而非以每一條消息作為分配單元。這樣設計的劣勢是無法保證同一個Consumer Group里的Consumer均勻消費數據,優勢是每個Consumer不用都跟大量的Broker通信,減少通信開銷,同時也降低了分配難度,實現也更簡單。另外,因為同一個Partition里的數據是有序的,這種設計可以保證每個Partition里的數據可以被有序消費。
      如果某Consumer Group中Consumer(每個Consumer只創建1個MessageStream)數量少于Partition數量,則至少有一個Consumer會消費多個Partition的數據,如果Consumer的數量與Partition數量相同,則正好一個Consumer消費一個Partition的數據。而如果Consumer的數量多于Partition的數量時,會有部分Consumer無法消費該Topic下任何一條消息。
      如下例所示,如果topic1有0,1,2共三個Partition,當group1只有一個Consumer(名為consumer1)時,該 Consumer可消費這3個Partition的所有數據。
      kafka rebalance 3 partition 1 consumer
      
      增加一個Consumer(consumer2)后,其中一個Consumer(consumer1)可消費2個Partition的數據(Partition 0和Partition 1),另外一個Consumer(consumer2)可消費另外一個Partition(Partition 2)的數據。
      kafka rebalance 3 partitin 2 consumer
      
      再增加一個Consumer(consumer3)后,每個Consumer可消費一個Partition的數據。consumer1消費partition0,consumer2消費partition1,consumer3消費partition2。
      kafka rebalance 3 partition 3 consumer
      
      再增加一個Consumer(consumer4)后,其中3個Consumer可分別消費一個Partition的數據,另外一個Consumer(consumer4)不能消費topic1的任何數據。
      kafka rebalance 3 partition 4 consumer
      
      此時關閉consumer1,其余3個Consumer可分別消費一個Partition的數據。
      kafka rebalance 3 partition 3 consumer
      
      接著關閉consumer2,consumer3可消費2個Partition,consumer4可消費1個Partition。
      kafka rebalance 3 partition 2 consumer
      
      再關閉consumer3,僅存的consumer4可同時消費topic1的3個Partition。
      kafka rebalance 3 partition 1 consumer

      Consumer Rebalance的算法如下:

    • 將目標Topic下的所有Partirtion排序,存于$P_T$
    • 對某Consumer Group下所有Consumer排序,存$于C_G$,第$i$個Consumer記為$C_i$
    • $N=size(P_T)/size(C_G)$,向上取整
    • 解除$C_i$對原來分配的Partition的消費權(i從0開始)
    • 將第$i*N$到$(i+1)*N-1$個Partition分配給$C_i$

      
      目前,最新版(0.8.2.1)Kafka的Consumer Rebalance的控制策略是由每一個Consumer通過在Zookeeper上注冊Watch完成的。每個Consumer被創建時會觸發Consumer Group的Rebalance,具體啟動流程如下:

    • High Level Consumer啟動時將其ID注冊到其Consumer Group下,在Zookeeper上的路徑為/consumers/[consumer group]/ids/[consumer id]
    • /consumers/[consumer group]/ids上注冊Watch
    • /brokers/ids上注冊Watch
    • 如果Consumer通過Topic Filter創建消息流,則它會同時在/brokers/topics上也創建Watch
    • 強制自己在其Consumer Group內啟動Rebalance流程

      在這種策略下,每一個Consumer或者Broker的增加或者減少都會觸發Consumer Rebalance。因為每個Consumer只負責調整自己所消費的Partition,為了保證整個Consumer Group的一致性,當一個Consumer觸發了Rebalance時,該Consumer Group內的其它所有其它Consumer也應該同時觸發Rebalance。

      該方式有如下缺陷:

      根據Kafka社區wiki,Kafka作者正在考慮在還未發布的0.9.x版本中使用中心協調器(Coordinator)。大體思想是為所有Consumer Group的子集選舉出一個Broker作為Coordinator,由它Watch Zookeeper,從而判斷是否有Partition或者Consumer的增減,然后生成Rebalance命令,并檢查是否這些Rebalance在所有相關的Consumer中被執行成功,如果不成功則重試,若成功則認為此次Rebalance成功(這個過程跟Replication Controller非常類似)。具體方案將在后文中詳細闡述。   

    Low Level Consumer

      使用Low Level Consumer (Simple Consumer)的主要原因是,用戶希望比Consumer Group更好的控制數據的消費。比如:

    • 同一條消息讀多次
    • 只讀取某個Topic的部分Partition
    • 管理事務,從而確保每條消息被處理一次,且僅被處理一次

      與Consumer Group相比,Low Level Consumer要求用戶做大量的額外工作。

    • 必須在應用程序中跟蹤offset,從而確定下一條應該消費哪條消息
    • 應用程序需要通過程序獲知每個Partition的Leader是誰
    • 必須處理Leader的變化

      使用Low Level Consumer的一般流程如下

    • 查找到一個“活著”的Broker,并且找出每個Partition的Leader
    • 找出每個Partition的Follower
    • 定義好請求,該請求應該能描述應用程序需要哪些數據
    • Fetch數據
    • 識別Leader的變化,并對之作出必要的響應

    Consumer重新設計

      根據社區社區wiki,Kafka在0.9.*版本中,重新設計Consumer可能是最重要的Feature之一。本節會根據社區wiki介紹Kafka 0.9.*中對Consumer可能的設計方向及思路。   

    設計方向

    簡化消費者客戶端
      部分用戶希望開發和使用non-java的客戶端。現階段使用non-java發SimpleConsumer比較方便,但想開發High Level Consumer并不容易。因為High Level Consumer需要實現一些復雜但必不可少的失敗探測和Rebalance。如果能將消費者客戶端更精簡,使依賴最小化,將會極大的方便non-java用戶實現自己的Consumer。
      
    中心Coordinator
      如上文所述,當前版本的High Level Consumer存在Herd Effect和Split Brain的問題。如果將失敗探測和Rebalance的邏輯放到一個高可用的中心Coordinator,那么這兩個問題即可解決。同時還可大大減少Zookeeper的負載,有利于Kafka Broker的Scale Out。
      
    允許手工管理offset
      一些系統希望以特定的時間間隔在自定義的數據庫中管理Offset。這就要求Consumer能獲取到每條消息的metadata,例如Topic,Partition,Offset,同時還需要在Consumer啟動時得到每個Partition的Offset。實現這些,需要提供新的Consumer API。同時有個問題不得不考慮,即是否允許Consumer手工管理部分Topic的Offset,而讓Kafka自動通過Zookeeper管理其它Topic的Offset。一個可能的選項是讓每個Consumer只能選取1種Offset管理機制,這可極大的簡化Consumer API的設計和實現。
      
    Rebalance后觸發用戶指定的回調
      一些應用可能會在內存中為每個Partition維護一些狀態,Rebalance時,它們可能需要將該狀態持久化。因此該需求希望支持用戶實現并指定一些可插拔的并在Rebalance時觸發的回調。如果用戶使用手動的Offset管理,那該需求可方便得由用戶實現,而如果用戶希望使用Kafka提供的自動Offset管理,則需要Kafka提供該回調機制。

    非阻塞式Consumer API
      該需求源于那些實現高層流處理操作,如filter by, group by, join等,的系統。現階段的阻塞式Consumer幾乎不可能實現Join操作。

    ##如何通過中心Coordinator實現Rebalance
      成功Rebalance的結果是,被訂閱的所有Topic的每一個Partition將會被Consumer Group內的一個(有且僅有一個)Consumer擁有。每一個Broker將被選舉為某些Consumer Group的Coordinator。某個Cosnumer Group的Coordinator負責在該Consumer Group的成員變化或者所訂閱的Topic的Partititon變化時協調Rebalance操作。

    Consumer
      1) Consumer啟動時,先向Broker列表中的任意一個Broker發送ConsumerMetadataRequest,并通過ConsumerMetadataResponse獲取它所在Group的Coordinator信息。ConsumerMetadataRequest和ConsumerMetadataResponse的結構如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ConsumerMetadataRequest
    {
    GroupId => String
    }

    ConsumerMetadataResponse
    {
    ErrorCode => int16
    Coordinator => Broker
    }

      2)Consumer連接到Coordinator并發送HeartbeatRequest,如果返回的HeartbeatResponse沒有任何錯誤碼,Consumer繼續fetch數據。若其中包含IllegalGeneration錯誤碼,即說明Coordinator已經發起了Rebalance操作,此時Consumer停止fetch數據,commit offset,并發送JoinGroupRequest給它的Coordinator,并在JoinGroupResponse中獲得它應該擁有的所有Partition列表和它所屬的Group的新的Generation ID。此時Rebalance完成,Consumer開始fetch數據。相應Request和Response結構如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    HeartbeatRequest
    {
    GroupId => String
    GroupGenerationId => int32
    ConsumerId => String
    }

    HeartbeatResponse
    {
    ErrorCode => int16
    }

    JoinGroupRequest
    {
    GroupId => String
    SessionTimeout => int32
    Topics => [String]
    ConsumerId => String
    PartitionAssignmentStrategy => String
    }

    JoinGroupResponse
    {
    ErrorCode => int16
    GroupGenerationId => int32
    ConsumerId => String
    PartitionsToOwn => [TopicName [Partition]]
    }
    TopicName => String
    Partition => int32

    Consumer狀態機
      Consumer狀態圖
      Down:Consumer停止工作
      Start up & discover coordinator:Consumer檢測其所在Group的Coordinator。一旦它檢測到Coordinator,即向其發送JoinGroupRequest。
      Part of a group:該狀態下,Consumer已經是該Group的成員,并周期性發送HeartbeatRequest。如HeartbeatResponse包含IllegalGeneration錯誤碼,則轉換到Stopped Consumption狀態。若連接丟失,HeartbeatResponse包含NotCoordinatorForGroup錯誤碼,則轉換到Rediscover coordinator狀態。
      Rediscover coordinator:該狀態下,Consumer不停止消費而是嘗試通過發送ConsumerMetadataRequest來探測新的Coordinator,并且等待直到獲得無錯誤碼的響應。
      Stopped consumption:該狀態下,Consumer停止消費并提交offset,直到它再次加入Group。
      
      
      
    故障檢測機制
      Consumer成功加入Group后,Consumer和相應的Coordinator同時開始故障探測程序。Consumer向Coordinator發起周期性的Heartbeat(HeartbeatRequest)并等待響應,該周期為 session.timeout.ms/heartbeat.frequency。若Consumer在session.timeout.ms內未收到HeartbeatResponse,或者發現相應的Socket channel斷開,它即認為Coordinator已宕機并啟動Coordinator探測程序。若Coordinator在session.timeout.ms內沒有收到一次HeartbeatRequest,則它將該Consumer標記為宕機狀態并為其所在Group觸發一次Rebalance操作。
      Coordinator Failover過程中,Consumer可能會在新的Coordinator完成Failover過程之前或之后發現新的Coordinator并向其發送HeatbeatRequest。對于后者,新的Cooodinator可能拒絕該請求,致使該Consumer重新探測Coordinator并發起新的連接請求。如果該Consumer向新的Coordinator發送連接請求太晚,新的Coordinator可能已經在此之前將其標記為宕機狀態而將之視為新加入的Consumer并觸發一次Rebalance操作。

    Coordinator
      1)穩定狀態下,Coordinator通過上述故障探測機制跟蹤其所管理的每個Group下的每個Consumer的健康狀態。
      2)剛啟動時或選舉完成后,Coordinator從Zookeeper讀取它所管理的Group列表及這些Group的成員列表。如果沒有獲取到Group成員信息,它不會做任何事情直到某個Group中有成員注冊進來。
      3)在Coordinator完成加載其管理的Group列表及其相應的成員信息之前,它將為HeartbeatRequest,OffsetCommitRequest和JoinGroupRequests返回CoordinatorStartupNotComplete錯誤碼。此時,Consumer會重新發送請求。
      4)Coordinator會跟蹤被其所管理的任何Consumer Group注冊的Topic的Partition的變化,并為該變化觸發Rebalance操作。創建新的Topic也可能觸發Rebalance,因為Consumer可以在Topic被創建之前就已經訂閱它了。
      Coordinator發起Rebalance操作流程如下所示。
    kafka coordinator rebalance

    Coordinator狀態機
      Coordinator狀態圖
      Down:Coordinator不再擔任之前負責的Consumer Group的Coordinator
      Catch up:該狀態下,Coordinator競選成功,但還未能做好服務相應請求的準備。
      Ready:該狀態下,新競選出來的Coordinator已經完成從Zookeeper中加載它所負責管理的所有Group的metadata,并可開始接收相應的請求。
      Prepare for rebalance:該狀態下,Coordinator在所有HeartbeatResponse中返回IllegalGeneration錯誤碼,并等待所有Consumer向其發送JoinGroupRequest后轉到Rebalancing狀態。
      Rebalancing:該狀態下,Coordinator已經收到了JoinGroupRequest請求,并增加其Group Generation ID,分配Consumer ID,分配Partition。Rebalance成功后,它會等待接收包含新的Consumer Generation ID的HeartbeatRequest,并轉至Ready狀態。

    Coordinator Failover
      如前文所述,Rebalance操作需要經歷如下幾個階段
      1)Topic/Partition的改變或者新Consumer的加入或者已有Consumer停止,觸發Coordinator注冊在Zookeeper上的watch,Coordinator收到通知準備發起Rebalance操作。
      2)Coordinator通過在HeartbeatResponse中返回IllegalGeneration錯誤碼發起Rebalance操作。
      3)Consumer發送JoinGroupRequest
      4)Coordinator在Zookeeper中增加Group的Generation ID并將新的Partition分配情況寫入Zookeeper
      5)Coordinator發送JoinGroupResponse
      
      在這個過程中的每個階段,Coordinator都可能出現故障。下面給出Rebalance不同階段中Coordinator的Failover處理方式。
      1)如果Coordinator的故障發生在第一階段,即它收到Notification并未來得及作出響應,則新的Coordinator將從Zookeeper讀取Group的metadata,包含這些Group訂閱的Topic列表和之前的Partition分配。如果某個Group所訂閱的Topic數或者某個Topic的Partition數與之前的Partition分配不一致,亦或者某個Group連接到新的Coordinator的Consumer數與之前Partition分配中的不一致,新的Coordinator會發起Rebalance操作。
      2)如果失敗發生在階段2,它可能對部分而非全部Consumer發出帶錯誤碼的HeartbeatResponse。與第上面第一種情況一樣,新的Coordinator會檢測到Rebalance的必要性并發起一次Rebalance操作。如果Rebalance是由Consumer的失敗所觸發并且Cosnumer在Coordinator的Failover完成前恢復,新的Coordinator不會為此發起新的Rebalance操作。
      3)如果Failure發生在階段3,新的Coordinator可能只收到部分而非全部Consumer的JoinGroupRequest。Failover完成后,它可能收到部分Consumer的HeartRequest及另外部分Consumer的JoinGroupRequest。與第1種情況類似,它將發起新一輪的Rebalance操作。
      4)如果Failure發生在階段4,即它將新的Group Generation ID和Group成員信息寫入Zookeeper后。新的Generation ID和Group成員信息以一個原子操作一次性寫入Zookeeper。Failover完成后,Consumer會發送HeartbeatRequest給新的Coordinator,并包含舊的Generation ID。此時新的Coordinator通過在HeartbeatResponse中返回IllegalGeneration錯誤碼發起新的一輪Rebalance。這也解釋了為什么每次HeartbeatRequest中都需要包含Generation ID和Consumer ID。
      5)如果Failure發生在階段5,舊的Coordinator可能只向Group中的部分Consumer發送了JoinGroupResponse。收到JoinGroupResponse的Consumer在下次向已經失效的Coordinator發送HeartbeatRequest或者提交Offset時會檢測到它已經失敗。此時,它將檢測新的Coordinator并向其發送帶有新的Generation ID 的HeartbeatRequest。而未收到JoinGroupResponse的Consumer將檢測新的Coordinator并向其發送JoinGroupRequest,這將促使新的Coordinator發起新一輪的Rebalance。

    Kafka系列文章

    郭俊 Jason wechat
    歡迎關注作者微信公眾號【大數據架構】
    您的贊賞將支持作者繼續原創分享
    速赢彩app www.ykylc00.com | dz316.com | www.dhygw46.com | www.50064d.com | 8890852.com | www.6646.com | 55188.com | www.5095i.com | 55818x.com | www.50024m.com | www.hg9765.com | www.gczj3.com | www.gh0029.com | www.975559.com | www.pj5333.com | www.156518.com | www.0099lll.com | 22cc8331.com | www.9951331.com | sbc777.com | www.57800e.com | 5019kzc.com | www.272259.com | zhcp85.com | www.csgc3.com | www.yh8333.com | www.309388.com | www.wd00004.com | 8898555.com | www.428858.com | 17795555.com | www.9187d.com | xpj11558.com | www.1111y.cc | www.yh03456.com | baizun456.com | www.5966xxx.com | ff76669.com | www.562bbb.com | 50000977.com | www.338031.com | www.32666l.com | 518cp-9.com | www.848777q.com | 02888722.com | www.799849.com | www.365815z.com | 4195jj.com | www.hqr8888.com | 66578.com | www.9971004.com | 57877.com | www.377653.com | www.552318.com | 7508i.com | www.26299f.com | www.28758h.com | 7874.com | www.cp0014.com | 08159o.com | www.3933u.cc | www.82899.com | 15a32.net | www.hg27388.com | www.56733g.com | 1364.com | www.js99968.com | pjyunnan.com | www.310195.com | www.mgm868007.com | a87570.com | www.560251.com | www.5049o.com | tjhyncw.com | www.055520.cc | www.4212l.com | 2214t.com | www.674577.com | www.www660882.com | FuXingCai.com | www.671075.com | www.15508c.com | 93922v.com | www.345583.com | www.930210.com | 59889y.com | 5509i.com | www.2208553.com | www.pu3333.com | e1915.com | www.hh03035.com | www.00829e.com | 0343h.com | www.zcwf1.com | www.c9860.com | 3202b.com | 7720f.net | www.73990g.com | 99111ww.com | 7742bb.com | www.61655w.com | www.am7773.com | 3330168.com | www.507433.com | www.sb5507.com | 59964vv.com | 897tt.cc | www.6611d.cc | www.82409.com | 3245b.com | 2223865.com | www.3126j.com | www.808888e.com | 1479r.com | 5099ii.com | www.529106.com | www.44mgm777.com | www.67797h.com | zhcpuu.com | www.967699.com | www.b3410.com | www.ven2222.com | 84498811.com | www.364343.com | www.816801.com | www.29886v.com | kdcp5.com | www.564696.com | www.984708.com | www.jb8899.com | 3089m.com | 2544b4.com | www.766927.com | www.0012.com | www.81306b.com | 3144vip.co | 55qq8331.com | ylzz6.cc | www.66ffv.com | www.7334i.com | www.206365.com | 3678f.com | www.73166i.com | www.910056.com | www.jinniu00.com | www.amhg004.com | 2003822.com | www.160881.com | www.08588p.com | www.5446oo.com | www.2078w.com | wnsr8818.com | 390390.com | www.715777a.com | www.3846h.com | www.777753.com | 33115xx.com | 1288dd.com | www.73166a.com | www.okw2.com | www.x777678.com | www.mgdc46.com | www.hg990077.com | 83138t.com | 4255kkk.com | 3121o.com | www.loll3.com | www.683158.com | www.3122mm.com | www.yddc07.com | 1077lll.com | 0638.com | js89e.vip | www.407871.com | www.87500.com | www.908296.com | www.klcp88.com | www.1770q.com | 22883w.com | 2324zzz.com | 914910.com | 2418t.com | www.88cmc.com | www.9989569.com | www.4996fj.com | www.hg7695.com | www.emc7677.com | 4023.com | 3988722.com | 8522yyyy.com | 69111f.com | 33886556.com | www.517411.com | www.1035e.com | www.96386h.com | www.71071k.com | www.hg0180.com | www.68666v.com | 19880s.com | 40033nn.com | 9646a.com | 1665j.com | 333vn77.com | 7196cc.com | www.178389.com | www.c299.com | www.50989f.com | www.765703.com | www.2021p.com | www.hf9016.com | www.3983079.com | www.91293.com | www.1389hh.com | 98955j.com | ee444000.com | 0241t.com | 61326622.com | 5369q.com | s2894.com | www.022194.com | www.501264.com | www.911050.com | www.5953588.com | www.97jsc.com | www.3566.com | www.68993223.com | www.6678685.com | www.55676i.com | www.35252a.com | www.mgm868009.com | www.9b005.com | www.99113f.com | www.99113h.com | www.55545e.com | www.kzcs4.com | www.49f8.com | www.1994365.com | www.28557.com | www.27363g.com | www.twcp00.com | www.1705.com | www.85857z.com | www.38345s.com | www.16181z.com | www.5446ii.com | www.bwinyz38.com | www.w84e.com | www.731651.com | www.33311.com | www.35918f.com | www.3416l.com | www.794918.com | www.597933.com | www.849770.com | www.501324.com | www.50051v.com | www.77114e.com | 1665ll.com | 91019k.com | 796666.com | 39991122.com | x33i.vip | 5855kk.com | www.sb9909.com | www.a88008.com | www.341616.com | www.h9478.com | www.58665y.com | www.115527i.com | www.js89m.vip | www.46976.com | www.5854e.cc | www.556742.com | cc32355.com | js1.com | 9539012.com | 50099z.com | 0805u.com | www.008833.cc | www.pj7991.com | www.33455b.com | www.5049p.com | www.5599msc.com | www.68689h.com | www.951077.com | 56987jj.com | 1775p.com | 3950o.com | 3379rr.com | www.333133d.com | www.am5599.com | www.90544.com | www.770309.com | www.98255.com | www.550346.com | wd6662.com | 3822d.com | 9030l.com | www.91684.com | www.7111e.com | www.22ok22.com | www.022cq.cc | www.033916.com | 1770m.com | hg88000.com | www.058hx.com | www.88kjz.com | www.535.cc | www.16878h.com | www.120057.com | 49490524.com | 3568oo.com | 9539i.com | www.502414.com | www.50999.com | www.11mgm777.com | www.550424.com | 86811w.com | 4182000.com | www.lb0044.com | www.55526f.com | www.l98478.com | www.901397.com | xici.net | 68228.com | www.21365ii.com | www.450098.com | www.108011.com | www.444801.com | hg999333i.com | 2698b.com | www.77449.com | www.b35ii.com | www.27280.cc | www.50732u.com | 33382yy.com | www.514234.com | www.55526x.com | www.22365.Com | www.53911a.com | 26119g.com | www.7669e.net | www.yh8878b.com | www.29178b.com | wn99yyy.com | s7726.com | www.ylg268.com | www.894858.com | www.12455s.com | 20775511.com | 001908.com | www.xpj4494.com | www.38775ff.com | www.670209.com | t365j.com | 预览56988ee.com | www.277577.com | www.2418d.com | www.50026o.com | 3482s.com | www.pj05.com | www.9989572.com | www.025616.com | 2490i.com | www.3189001.com | www.jbb400.cc | qq365d.com | ii38648.com | www.js839.com | www.80767r.com | 56787.com | 2096x.com | www.741199b.com | www.6547.com | 810pj.com | 1cp055.com | www.lb22222.com | www.8499c.com | 998e.cc | www.laok222.com | www.7893w32.com | www.520462.com | 3405xxx.com | www.pj39991.com | www.4923t.com | 67890ppp.com | 8290v.com | www.19019f.com | www.655903.com | 5219s.com | www.ljw034.com | www.9646t.com | 3078v.com | www.ylhg7878.com | www.4996hb.com | www.385626.com | mg437733.com | www.8967v.com | www.526820.com | 80368q.com | www.yh98mm.com | www.931670.com | 4231.com | www.25msc.com | www.5441n.com | 99151j.com | www.6146f.com | www.9646k.com | 00888448.com | www.777444g.com | www.81520z.com | blr5544.com | www.ljw032.com | www.99830.cc | 915906728.com | www.2200365.com | www.500yf.com | 78808f.com | www.zx5551.com | www.972876.com | 44009193.com | www.515917.com | www.178982.com | 009900a.com | www.12136j.com | so5555.cc | www.h067.com | www.yh76o.com | 9068bb.com | www.vns7312.com | www.hr1888.com | 365spa.com | www.bet91484.com | 88447.com | www.y32126.cc | www.61233l.com | 463e8.com | www.3696699.com | www.212632.com | feicai0593.com | www.vns000.me | 4136p.com | www.259681.com | www.755874.com | 2359.com | www.fg9905.com | 0747gg.com | www.3171113.com | www.202337.com | 14891489.com | www.62118g.com | 8037zz.com | www.pj66119.com | 2924222.com | www.pj9448.com | www.808399.com | byyl.com | www.0270d.com | 2618l.com | www.005596.com | www.178726.com | www.pj8819.com | www.6832q.com | 55331ff.com | www.r999997.com | pj600600.com | www.9906488.com | 416164.com | www.ssb999.com | www.503477.com | www.63260.com | www.5854u.cc | BY30832.com | www.sx139974.com | 33599jj.com | www.js89x.vip | 8569811a.com | www.89677r.com | 66000.com | www.hg068008.com | 1319996.com | www.88399.com | 0080w.com | www.888zr61.com | www.208780.com | www.alpkylc.com | www.641477.com | www.38200c.com | www.5441i.com | 66876a.com | www.35155m.com | 0241e.com | www.76520m.com | 777818a.com | www.bet365cn.net | w86811.com | www.La166518.com | sha0000.com | www.7376.com | y68681.com | www.60123f.com | ff555b.com | www.07163x.com | 335151.com | www.1368q.cc | www.ssd1117.com | www.865065.com | www.0887788.com | www.564648.com | www.3643x.com | www.082712.com | www.77288ii.com | ooo444000.com | www.54mscc.com | 7773847.com | www.222jyh.com | 2222k20.com | www.766159.com | 51133eee.com | www.9192666.com | 83138u.com | www.006ac.com | www.0077hg.com | www.456685.com | www.838383.com | 123818.xxx | www.658300.com | 99995309.com | www.556350.com | 11662007.com | www.983jc.com | www.v3302.com | www.99677a.com | www.hg7650.com | 99840.com | www.xpj7707.com | 20055599.com | www.03czj.com | www.98599.com | 6647d.com | www.http://www.410488.com/ | 91019l.com | www.x33789.com | 66876a.com | www.533082.com | www.644234.com | yahu167.com | www.522665.com | 0747w.com | www.610026.com | www.8898hg.com | 5144.net | www.81608a.com | 7726aaa.com | www.369062.com | www.988806.com | 55229193.com | www.37377a.com | P35ll.com | www.203882.com | www.01.bet | 4018k.com | www.9356n.com | www.77537a.com | 5478z.com | www.93919.com | 339850a.com | www.235925.com | www.27363x.com | 3405fff.com | www.fyyy1.com | www.8786hg.com | 8827ttt.com | www.98528c.com | www.7274.com | 00tt8332.com | www.046161.com | www.hg0002.com | 8790y.com | www.jjssss.com | 80850kk.com | www.506739.com | www.138cpn.com | 55323d.com | www.802733.com | www.rb4440.com | 3534w.com | www.808791.com | www.bet365zh.com | 3482s.com | www.681090.com | www.c44ii.com | ylzz3338.com | www.541619.com | www.rgcp.vip | 365bet800.com | www.178761.com | www.783644.com | 1077jj.com | 50000021.com | www.72002.com | www.c6635.net | 0245e.com | www.81678s.com | www.0759563.com | y6660.com | www.590777a.com | www.l7793.com | w77304.com | www.99677a.com | www.516088.com | www.6033i.com | 86611c.com | www.bet73.com | www.dhy1114.com | bdg1166.com | www.805835.com | www.cp9538.com | feicai0358.com | 73999r.com | www.4923l.com | www.99946.com | 86611k.com | www.560652.com | www.35252e.com | www.80852.com | yyh914.com | www.99yfa.com | www.120048.com | 3434ccc.com | mw0621.com | www.61040.cc | www.jcbo13.com | 99151r.com | c3144.com | www.23579d.com | www.849suncity.com | 86811hh.com | 2229649.com | www.7239m.com | www.89790.com | m77304.com | 5004ttt.com | www.34788z.com | www.bai3322.com | 1077dd.com | j72227.com | www.w058.com | www.06617a.com | www.8n8.com | 74397777.com | www.160913.com | www.win1239.com | www.6699ok.com | vic.am | 5000008018.com | www.277ak.com | www.9737kk.com | www.7720m.com | 9007893.com | www.178167.com | www.959595.biz | www.552226.com | 6363yy.com | 64111b.com | www.361944.com | www.fg9908.com | www.008520.com | 33443885.com | ydgj1515.com | www.106280.com | www.550021p.com | www.p948p.com | www.hg988800.com | 22098m.com | x9983.com | www.022l.cc | www.u1432.com | www.1389v.com | VIPVIP.cc | 915907854.com | www.493356.com | www.ylylc08.com | www.5966ccc.com | www.hg8004.com | 01234oo.com | 760jj.cc | www.djcp009.com | www.55717l.com | www.6a222.com | www.yh17.com | 123bocai.com | 77889193.com | www.89894c.com | www.8839d.com | www.40288o.com | www.87422.com | www.fun08.net | 32365t.com | pjbuyuw.com | www.202423.com | www.37439.cc | www.xpj9.net | www.597449.com | www.63877x.com | hg77740.com | 99bo.me | 4270ss.com | www.898140.com | www.yl1981.com | www.0044xpj.net | www.hd66.am | www.bm1100.com | bet365visa.com | 00229193.com | 1389uu.com | www.am7654.com | www.0194007.com | www.4996ly.com | www.803303.com | www.hg00188.com | 8290p.com | 3568e.com | 7x3777.com | 38989s.com | www.824879.com | www.77802y.com | www.99552.com | www.n9478.com | www.flb0009.com | www.xpj1177.cc | 3222c.cc | pp3405.com | 35vv.vip | 89892vv.com | www.039079.com | www.949429.com | www.50080c.com | www.785409.com | www.4828338.com | www.0477msc.com | www.hg94777.com | www.kb7070.com | 2613z.com | 8547y.com | 88993g.com | 33331.cm | ss4675.com | 2019ii.cc | www.178362.com | www.cp7777p.com | www.2934n.com | www.88266m.com | www.4833043.com | www.30350y.com | www.0033xpj.net | www.370257.com | www.886889.com | www.9x0048.com | www.21365ss.com | www.hg8880.biz | 66066.com | 88807q.com | e86811.com | 01234qq.com | 5350com.com | 81366.com | 76886x.com | 9193.com | 22ll8332.com | 5443mm.com | 9964k.com | 9707365.com | 55p1.cc | 2132.com | 12743.com | www.41518c.com | www.218291.com | www.401280.com | www.579699.com | www.699494.com | www.898140.com | www.938625.com | www.ch8345.com | www.qbwc7.com | www.chi32.com | www.77qxc.com | www.107ak.com | www.90egg.com | www.20czj.com | www.fh7557.com | www.985579.com | www.011888aa.com | www.c129.vip | www.918795.com | www.812680.com | www.715025.com | www.606643.com | www.533508.com | www.303480.com | www.081510.com | www.26878i.com | feicai0527.com | hg999333p.com | 2222138.com | 454662.com | 6175y.com | 0015mm.com | 10524.com | 55967k.com | 3685w.com | 229649.com | 2846u.com | www.a8a8234.com | www.986686.com | www.2345sun.net | www.44477222.com | www.683012.com | www.77731o.com | www.848777w.com | www.99552jj.com | www.999999qipai.com | www.0601j.com | www.08588c.com | www.c1981.com | www.521787.com | 87578003.xyz | 2078n.com | hg999333h.com | kkk67890.com | 78332.com | 22883p.com | www.hg635.com | www.sky788.com | www.ym777.cc | www.c32.net | www.t3410.com | www.28891a.com | www.7782f.com | www.665039.com | 4136x.com | 0860n.com | 123888.me | 62222i.com | 8898111.com | www.00829r.com | www.08400.cc | www.88.net | www.68993267.com | www.7782o.com | www.525059.com | d7789.com | ff555ucom | 52599o.com | oo1331.com | www.3245r.com | www.jjjj55555.com | www.115527d.com | www.4923o.com | www.976921.com | www.063911.com | 86811v.com | 3467d.cc | 5429d.com | www.004716.com | www.5146z9.com | www.win1233.com | www.38y.com | www.081290.com | 56987ll.com | 4025s.com | 36736.com | www.11119dz.com | www.mgm868005.com | www.3978c.com | www.702392.com | p332.com | 3890p.com | 1728862.com | www.644055.com | www.8645006.com | www.50026b.com | www.354911.com | 365808.com | 11005l.com | www.yh6556.com | www.cfcp111.com | www.y98478.com | www.909935.com | 2418x.com | lc99m.com | www.4759tt.com | www.095889.com | www.52062y.com | www.cpkk9.com | 3258h.com | 4488ii.com | www.kj638.com | www.yh8396.com | www.311999.cc | www.607256.com | 32126n.net | v997c.com | www.js07888.com | www.4196z.com | www.1035s.com | 3178mm.com | 4488d.com | www.yh6979.com | www.8850w9.com | www.29277k.com | 31325i.com | 2324sss.com | www.hg0656.com | www.76060j.com | www.55545y.com | www.34788y.com | 1669d.com | 7599x.com | www.hg06661.com | www.y063801.com | www.csgc9.com | 1591qqq.com | 6389997.com | www.75499.com | www.785409.com | www.456836.com | 59599f.com | www.89422.com | www.361cp.cc | www.29277k.com | zhcp72.com | 38850077.com | www.75499.com | www.x88789.com | www.178362.com | 58222a.com | www.flb0033.com | www.06386644.com | www.aa3126.com | 33p88.cc | 20777744.com | www.3157m.com | www.xcn6.com | 4646699.com | 79964g.com | www.rg777.com | www.kc67.com | 88850aa.com | www.5170.com | www.08881.com | www.661929.com | 69446666.com | www.365815k.com | www.3507777.com | www.347177.com | k60111.com | www.833373.com | www.6678696.com | 6766xx.com | 0625a.com | www.799666h.com | www.3126o.com | 1407.cc | www.xhtd0099.com | www.0622ccc.com | www.127192.com | 62222o.com | www.js88.cc | www.8039q.com | 86155.com | www.bet365604.com | www.681183.com | www.80767v.com | wns950.com | www.721408.com | www.hm8222.com | 496.vc | www.00hg444.com | www.81520f.com | 89892tt.com | www.j223344.com | www.0622.com | 9649y.com | zhcp93.com | www.7415w.com | www.675630.com | 3890u.com | www.28003.com | www.8667s.com | 3846fff.com | www.7111r.com | www.44447375.com | 0015rr.com | www.059778.com | www.498700.com | sjxche.com | www.56520j.com | www.3301866.com | 3413377.com | www.h7788q.com | www.3978x.com | 2709h.com | www.29886l.com | www.81520n.com | bet89360.com | www.53589.com | www.49956d.com | yxkj55.com | www.688222.com | www.3416w.com | 37688f.com | www.810msc.com | www.808482.com | 9101906.com | www.9737tt.com | www.50052v.com | ss888ss888.com | www.266820.com | 1775xx.com | www.3643t.com | www.35918t.com | xpjxianlu.com | www.46615.com | www.656270.com | 159666p.com | www.00778y.com | 33115mm.com | www.pjbet444.com | www.95555w.com | 5622a.com | www.666944.com | www.560721.com | 2381qqq.com | www.56011p.com | JS1388p.com | www.58557q.com | www.c6378.com | 22299hh.com | www.4521q.com | 2013011.com | www.h32126.cc | www.fyyy4.com | 5309x.com | www.y8817.com | 80850d.com | www.20288r.com | www.626507.com | 2643v.com | www.55717w.com | 983888e.com | www.hc3301.com | www.183093.com | www.hgc333.com | www.55228b.com | 9506.com | www.16k0048.com | JS1388b.com | www.882618.com | www.683717.com | 55bb8331.com | www.sx1866.com | k58955.com | www.9737vv.com | 1077ii.com | www.ffvns.com | www.351957.com | www.pj8777.com | www.9928i.com | 87965pp.com | www.2234.so | 70082.com | www.6776ff.com | by301.com | www.cmssjm.com | www.260929.com | www.kj638.com | www.4dwj.com | 7945mm.com | www.78949j.com |