• <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.452166.com | www.324229.com | www.0752drf.com | 55899t.com | www.CK1432.COM | www.tqdc444.com | 11aa8332.com | www.8577d.cc | www.o32126.cc | 3121f.com | www.312615.com | dzc05.com | www.588980.com | www.55526q.com | 7599l.com | www.950606.com | www.35789.com | 3844w.com | www.33588w.com | www.79595.com | 8522ffff.com | www.hy5501.com | www.28686.com | 9479a2.com | www.ya248.com | www.35789.com | 3405vvv.com | www.c6569.com | www.990707.com | 36401100.com | www.244343.com | www.00618i.com | 6830e.com | 105boo.com | www.78680a.com | www.wn2058.com | k85686.com | www.2418u.com | www.87msc.com | 4022rr.com | www.26878f.com | www.xpj395.com | 3950e.com | www.602957.com | www.4136f.com | t365e.com | mgm.com | www.4323n.com | www.xpj9780.com | 3405f.com | www.403770.com | www.4996zz.com | v1647.com | hg088.cc | www.cp500.biz | www.7415vv.com | 22883p.com | r2490.com | www.8039x.com | www.cfcp777.com | 2851r.com | 38345r.com | www.3478g.cc | www.g69096.com | www.00018js.com | 131z.net | www.665010.com | www.45598w.com | www.agg066.com | 500000571.com | www.759585.com | www.91779w.com | www.h7788l.com | 0805b.com | www.202337.com | www.99094r.com | www.xpj238886.com | 88993n.com | x5505.com | www.60007d.com | www.323365.com | 3005647.com | 001122333.com | www.629021.com | www.32031p.com | www.js60a.com | 4182.com | 3559aaa.com | www.692918.com | www.w84g.com | www.23336.com | 7935t.com | 1316969.com | www.811257.com | www.8866kcd.com | www.xpj775.com | bwin8t.com | 55332007.com | www.345839.com | www.2222bj.com | www.dzcp8888.com | www.336suncity.com | 54141177.com | 98345k.com | www.444037.com | www.ag.hg3005.tw | www.8473v.com | www.b8867.com | wb099.com | wfcp999888.com | www.452166.com | www.70203d.cc | www.5446kk.com | www.2846p.com | 2997778.com | 83378z.com | x33j.vip | www.936336.com | www.6888773.com | www.20199nn.com | www.yh6118.com | 44552007.com | 436.com | 188qq44.com | www.995684.com | www.rrqp444.com | www.msc-88msc.com | www.pj9909.com | hga026.com | 33382jj.com | 66569.com | www.gyfc8.com | www.660188.com | www.35252r.com | www.51167.com | 3169p.com | so555.cc | 67877w.com | 4195aa.com | www.630367.com | www.77801n.com | www.69567s.com | www.01593.com | www.g1504.com | mry456.com | ii8159.cc | 2767f.com | 67877u.com | www.202430.com | www.hm2299.com | www.704wb.com | www.h3410.com | www.50000993.com | www.7408.cc | www.56520o.com | vns8305.com | 28288qq.com | 0286.com | 37775145.com | 9649f.com | h3410.com | www.044592.com | www.810513.com | www.23636h.com | www.86333e.com | www.478378.com | www.79500h.com | www.qxw150.com | www.2846k.com | www.hgw2088.net | k2306.com | 00773s.com | uuu4255.com | hg1088.com | 33318v.com | 01234mmm.com | 44488b.com | 517801.com | www.135580.com | www.606647.com | www.cb5288.com | www.055m.cc | www.66653s.com | www.ky1005.com | www.272259.com | www.yzqhyz.com | www.w84.com | www.4196g.com | www.b30666.com | www.8313o.com | www.ly09.com | www.4078n.com | www.98698m.com | www.1168z.com | www.5504m.com | www.998855u.com | www.331.cc | www.1274uu.com | www.hq5177.com | www.kk2444.com | www.055838.com | www.10908.com | www.wwww.6230z.com | www.1880204.com | www.hg6778.com | www.243888.com | www.01885d.com | www.3239888.com | www.jiny28.com | www.120529.com | www.k32939.com | www.hg8nn.com | www.26123hh.com | www.cn365j.com | www.331068.com | www.601709.com | www.258908.com | www.087q.com | www.7239a.com | www.22630.cc | www.743633.com | www.527990.com | www.77801i.com | zzylc4.com | 67890vv.com | 1216.com | 3775j.com | 52599b.com | 2267c.com | www.xpj7777.cc | www.87680s.com | www.90486.com | www.511838.com | www.4972l.com | www.362063.com | www.1466l.com | www.00840x.com | www.cp718.com | www.348911.com | swin2.com | 3238.com | 34f35.com | 56988q.vip | www.wn2048.com | www.jsdc878.com | www.25000c.com | www.4963ss.com | www.681183.com | www.79520b.com | www.810619.com | 80368aa.com | 61326600.com | 6487jjj.com | 55818e.com | www.xpj8898.com | www.xpj1511.com | www.986076.com | www.3846ff.com | www.50024g.com | www.763605.com | 3379y.com | 4688jt.com | 5003hh.com | 2649gg.com | www.55268ii.com | www.gssuu168.com | www.f63568.com | www.5484h.com | www.218565.com | ttt5701.com | 4340o.com | www.f67783.com | www.1010160.com | www.17784.com | www.ky1005.com | www.550264.com | 04666n.com | 36401177.com | www.hg990077.com | www.938b.cc | www.flb906.com | www.hw8877.com | bet365ok03.com | 3424222.com | ff555l.com | www.hta8888.com | www.0661777.com | www.8582cc.com | www.783500.com | 228888i.com | 04666b.com | www.k8.com | www.103111.com | www.785409.com | www.961205.com | 7003a.com | 22883q.com | www.xpj8858.com | www.7779855.com | www.88266b.com | www.196705.com | ambyc3com | 4774j.com | www.345066.com | www.97828y.vip | www.995773.com | 1859002.com | 702215.com | www.79665c.com | www.69567.com | www.901397.com | am56.cc | 8036p.com | www.wns82.com | www.0055sun.com | www.582006.com | 22225002.com | www.wns8828.com | www.caipiao88e.com | www.50052j.com | aa412dh.com | 3457.com | www.13798a.com | www.u63568.com | www.422626.com | 3678uu.com | www.365635.com | www.5203666.com | www.csgc3.com | 3967j.com | 2820r.com | www.jjjj55555.com | www.68568n.com | c1429.com | 2805s.com | www.h8822.com | www.83033d.com | 69990u.com | 7935.com | www.1139356.com | www.003hy.cc | 518cp88.com | www.hg1020.com | www.cn365c.com | www.800986.com | 8520a.com | www.56520t.com | www.32031q.com | www.278207.com | 8037hhh.com | www.vnsr388.com | www.ky1005.com | 50099d.com | 33115.com | www.848777a.com | www.cjcp600.com | 4541l.com | www.hg1810.com | www.61233m.com | 1294y.com | www.6667727.com | www.ag0234.com | www.370583.com | 56400.com | www.332010.com | www.7782f.com | ppp1915.com | www.3459r.com | www.x99678.com | 4195z.com | 6175n.com | www.60886o.com | 44tt8331.com | www.8520r.com | www.f2894.com | bet365ok03.com | 2455x.com | www.4996sx.com | www.196209.com | 70118d.com | www.4136x.com | www.203882.com | 98345l.com | www.26123dd.com | www.001036.com | y980.com | www.621051.com | 7792x.com | www.hg0128.com | www.37377u.com | 5004oo.com | www.o8867.com | www.66332d.com | 18438r.com | www.767.cc | www.902271.com | 159666x.com | www.4694e.com | www.097710.com | ss888ss888.com | www.hbet96.com | 32212s.com | www.2078x.com | www.62355.com | 3640ww.com | www.www-tm8088.com | www.480840.com | 65005h.com | www.272018.com | 365225a.com | www.362848.com | www.7793s.com | 3765.com | www.7225q.com | m2554.com | www.3459o.com | www.8667q.com | 4136w.com | www.vns6606.com | aa5443.com | www.m222999.com | www.064wy.com | hg77703.com | www.63606l.com | ddcp33.com | www.72265i.com | www.866505.com | 2019dd.cc | www.hg81999.com | 0310sands.com | www.428858.com | b9982.com | www.dwc4.com | 78117766.com | 588ccc.cc | www.179107.com | 0193377.com | www.w9819.com | 44pp8332.com | www.amzr33.com | www.808910.com | 500000477.com | www.28891h.com | 867wn.com | www.hg8rr.com | 1458r.com | www.749888.com | www.268177.com | www.xj9900.com | www.3479l.com | 80368ll.com | www.xj1992.com | xx3405.com | www.vnsr2345.com | 8015f.com | www.huangma23.com | 201.com | www.cp08.com | 3389.com | www.c559cc.com | 5446gg.com | www.671100.com | x86006.com | www.64821122.com | www.89894d.com | www.pj9654.com | www.234297.com | www.7025l.com | www.517411.com | www.ceo2018.com | www.619477.com | www.yh6556.com | www.665991.com | www.hg2087.com | www.577972.com | www.h7788b.com | www.390675.com | www.09569u.com | www.237544.com | www.0393901.com | www.78949u.com | www.hg5728.com | 18787h.com | www.4797.com | zz8159.cc | www.8967a.com | 1591kkk.com | www.3066qq.com | 5003822.com | www.63800d.com | 634.cm | www.393890.com | 77382.com | www.83309.com | jsh04.net | www.5181889.com | 23300d.com | www.48330m.com | 6fll8.com | www.5578w.com | www.4759cc.com | www.866509.com | 25288x.com | www.sss2848.com | 9464005.com | www.06820t.com | 4288oo.com | www.81233w.com | 4636699.com | www.606930.com | www.35553999.com | 1018xpj.com | www.4996jq.com | 3559jjjj.com | www.90305d.com | xxxx0123.com | www.310383.com | www.174886.com | uu1331.com | www.js38678.com | z86811.com | www.qucp1.com | www.4938t.com | 3730-90.com | www.cn365k.com | www.4759ff.com | www.339968.com | 38989w.com | www.ag3355.com | s45638.com | www.c1669.com | www.234567o.com | 2008ff.com | www.38775ss.com | 2299555.com | www.611874.com | www.65833.com | 9089.com | www.77803x.com | www.7720g.com | 65005l.com | www.huayi388.com | 8381006.com | www.801876.com | www.501333.com | 1770s.com | www.57578j.com | www.w7w7.com | 5855mm.com | www.1033.app | www.hg1233.com | 33115hh.com | www.7500666.com | 3009j.com | www.215602.com | www.88166i.com | 7720i.com | www.602472.com | www.2945d.com | 55323d.com | www.799427.com | www.xj666q.com | 66287m.com | www.bxcp66.com | www.hf7799.com | 54140088.com | www.544010.com | www.1168t.com | ylzz2224.com | www.231002.com | www.55070m.com | 2739.com | bj1111.com | www.861002.com | 9421tg15.com | ll67890.com | www.dsj11.com | www.8188zr.com | 83wns88.com | www.2934k.com | www.68683.com | rrr67890.com | www.544949.com | www.00773n.com | 7935g.com | xpj816.com | www.567111.net | www.9908633.com | 88740a.com | www.lc03.com | www.q9478.com | 998h.cc | 59964cc.com | www.hg8.vip | www.00829z.com | 7811bb.com | www.c5237.com | www.90665.com | 738055.com | 25800.com | www.83993q.com | www.53js.com | 08820088com | xpj6602.com | www.81608t.com | www.9679z.com | 4340w.com | www.346277.com | www.wns123c.com | www.817368.com | 88904747.com | www.655870.com | www.4058u.com | www.85770y.com | p838.com | www.541911.com | www.47506k.com | www.alpk88.com | 33kbk.com | www.506932.com | www.07679s.com | www.58777x.com | 30688s.com | www.61655u.com | www.004549.com | www.xpj66989.com | mr007.com | 63305a.com | www.33997d.com | www.03.bet | dd76669.com | oo38648.cc | www.901031.com | www.4546300.com | www.88993d.com | 3656xx.com | 44ee8331.com | www.35918m.com | www.79500m.com | www.4123uu.com | 8520a.com | www.202434.com | www.55545x.com | www.2005132.com | 3122zz.com | 517zb.com | www.452817.com | www.538445.com | www.4866a86.com | 1479u.com | 402d0.com | www.022194.com | www.16188a.com | www.q948q.com | www.wugou135.com | bm1103.com | 0986.com | www.103ak.com | www.666107.com | www.hg726.com | ss224.com | 3258v.com | www.239828.com | www.91233f.com | www.tyc8138.com | www.2846g.com | 704.com | nn56988.com | www.193161.com | www.68568p.com | www.bwinyz28.com | www.amh008.com | 2355k.com | 7742ee.com | 3156eee.com | www.982090.com | www.48330l.com | www.458177.com | www.j27229.com | hgwz33.com | ff555ucom | 0729.com | www.899485.com | www.37377w.com | www.4963aa.com | www.66930000.com | 2764.com | 3568ee.com | 33115zz.com | www.524677.com | www.52303k.com | www.w32031.com | www.3122vv.com | www.76543o.com | y2306.com | w7776.com | 8988ll.com | 55155e.com | www.cp689.vip | www.701wb.com | www.540640b.com | www.400131.com | www.4107t.com | 28758r.com | 4255ccc.com | pj12567.com | 8333.org | www.511059.com | www.31930.cc | www.6889772.com | www.o69096.com | www.4499666.com | www.4938i.com | 054007.com | 3522700.com | 00774ss.com | 22749.com | h88983.com | www.599160.com | www.2632i.com | www.tyc44222.com | www.40288z.com | www.143291.com | www.rycp13.com | www.js46123.com | 7168b.com | m85686.com | 3568s.com | 5008999.com | 4444.ag | 3550v.com | dytj365.com | www.342077.com | www.929709.com | www.3933n.cc | www.66376w.com | www.93gj02.com | www.78680r.com | www.ag0345.com | www.tyc723.com | www.490000.com | www.hg2258.com | www.88837p.com | www.vns6166.com | vip66656.com | 1077xxx.com | 81366v.com | 3988722.com | 4255ff.com | 3467n.cc | 30174433.com | 7570k1.com | 6261b.com | 4018tt.com | 1813k.com | y2523.com | 80060101.com | 3467y.am | 0747ss.com | 5651f.com | 44betbet365.com | 55p1.cc | 28758j.com | 50128.com | csj110.com | 911520.com | 68228t.com | w69441144.com | www.77802u.com | www.71399u.com | www.66652i.com | 6002aa.com | 61327777.com | 2373c.com | 6363i.com | 3405ddd.com | 33ydgj.com | 749304.com | 316f.cc | i32365.com | jing7779.com | 82365.com | 12121.company | 3650568.com | 67877o.com | 923250.com | ms024.com | www.1333zx.com | www.bet3651114.com | www.w30226.com | www.1770g.com | www.vns7312.com | www.6718.cc | www.hjcp0.com | www.4694k.com | www.j3123.com | www.1112yl.com | www.pj99m.com | www.86267y.com | www.2875h.com | www.848166.com | www.496689.com | www.65707v.com | qpby88.com | 1227010.com | 1259r.com | 4288r.com | 28839b.com | 22296uu.com | www.hg45888.com | www.4938s.com | www.hg833.com | www.751cp55.com | www.bet63p.com | www.68365s.com | www.1666b.com | www.44gpc.com | www.550377.com | 88904141.com | 11117893.com | 61789d.com | 315656.com | 7894i.com | www.288msc.com | www.777753.com | www.l3065.com | www.3846hh.com | www.80075t.com | www.c6096.com | www.296233.com | byj10.com | 3844r.com | 22gg8332.com | js14j.com | www.amxhtd8.com | www.618msc.com | www.1754z.com | www.6613655.com | www.c6770.com | www.50026e.com | sbc777.com | 114167.com | 5443oo.com | www.777444q.com | www.h976.com | www.2997773.com | www.50054d.com | www.591411.com | blhvip111.com | pj00.com | uu00.com | www.8124t.com | www.hx928.com | www.47506k.com | www.50788m.com | www.371935.com | 5855hh.com | js345b.com | www.892558.com | www.660077.com | www.ag3366.com | www.16001.com | www.hcw823.com | xpjgo7.com | 6766.net | www.cp127w.com | www.tyc188.com | www.3691b.com | www.aj3383.com | 3156www.com | 550111a.com | 44488k.com | www.805kj.com | www.556537.com | www.7793j.com | 88905353.com | 2146y.com | 009900.com | www.rr8866.com | www.8w08.com | www.hjin1.com | 55559193.com | 3662j.com | www.621155c.com | www.5049z.com | www.40wb.top | www.523745.com | 19991p.com | 3009g.com | www.980733.cc | www.634505.hk | www.09czj.com | 365288.bet | r67890.com | www.44488806.com | www.19019d.com | www.66621l.com | haianw.com | 5566bet.vip | www.xhtd09.com | www.28000k.com | www.39500c.com | o72227.com | 1104001.com | www.4107q.com | www.10999u.com | www.88cmc.com | 88052.net | 7141rr.com | www.5577js.com | www.y98478.com | www.401345.com | 3121g.com | www.xpj8888.cc | www.4972n.com | www.2875i.com | 02edu.com | 3045.com | www.bet445.com | www.624202.com | 9958944.com | 15a14.net | www.fh9000.com | www.777xx.cc | www.336779.com | cao618.com | www.7830e.com | www.62979.com | www.610390.com | 8722qqqq.com | www.28758f.com | www.04567s.com | www.938751.com | b9b9.com | www.262xpj.com | www.377666u.com | www.676285.com | lh66z.com | www.7830a.com | www.hx99365.com | www.135169.com | 66681q.com | www.775412.com | www.506612.com | hr915.com | 2506g.com | www.99393.com | www.qm72.com | 838388h.com | www.yy883.com | www.6sun.com | 16690088.com | 70118s.com | www.js968.com | www.014ac.com | 6647o.com | www.v0681.com | www.flb577.com | 8036nn.com | 7945kk.com | www.668cp44.com | www.898953.com | 99909o.com | www.wd00004.com | www.77801g.com | 00048w.com | www.888vip8.com | www.77783yh.com | 4379w.com | 44nn8331.com | www.57800x.com | www.367137.com | 99589.cc | www.449msc.com | www.qmkl6.com | 8hga.com | www.987msc.com | www.15259.cc | 92958b.com | www.0686888.com | www.77114n.com | ddh5152.com | www.00829b.com | www.66136.com | 0199955.com | www.33928a07.com | www.6678685.com | 01234ggg.com | www.343xpj.com | www.hg4442.com | 8520.com | www.9068uu.com | www.2418f.com | wns78.com | www.655666i.com | www.90305c.com | zhcpoo.com | www.hg6136.com | www.07163z.com | 2223847.com | www.hg55662.com | www.9cpb.com | 93922z.com | www.lfcp098.com | www.534680.com | 3301855.com | www.04567k.com | www.161763.com | 2381bbb.com | www.32031n.com | 3552h.com | www.lfg888.com | www.55885n.com | app22299.com | www.172255.com | www.589144.com | o2554.com | www.38775uu.com | 3mgmmmm.com | www.xpj88003.com | www.7793t.com | 35222dd.com | www.1196877.com | 88905353.com | www.22266638.com | www.22062a.com | 0201kk.com | www.2945d.com | www.068625.com | www.210zr.com | www.8582qq.com | js26311.com | www.045890.com | www.106396.com | www.200448.com | www.ya2019g.com | xpj5590.com | www.088tyc.com | www.047788.com | www.888ldz.com | www.39957g.com | 4255vvv.com | www.ag0456.com | 97799z.com | www.zr6668.com | www.622209.com | 2698q.com | www.15365.com | blmdc7.com | www.hg8ll.com | 01234sss.com | www.hg2788.com | www.759585.com | c51ki64.com | www.z77929.com | 1458s.com | www.673888x.com | 2848.com | www.3388ok.com | www.329477.com | www.7435g.com | www.2632z.com | 23686.com | www.vn888123.cc | js89h.vip | www.16k0048.com | 34545.com | www.640suncity.com | vwin666.com | www.js6169.com | www.398846.com | www.yl78776.com | www.158cp.com | 26444s.com | www.pjzxyl.co | 5856hhh.com | www.2848.com | 2222k.com | www.80188v.com | 563946.com |