• <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.000435.com | www.50077c.com | www.98698f.com | www.veb188.com | 3304uu.com | 2247rr.com | www.899621.com | www.109337.com | www.8850w1.com | www.53532.com | 66458r.com | 0638.net | 6002f.com | www.33598v.com | www.26299x.com | www.509261.com | www.5966ppp.com | www.v3305.com | j99345.am | 87578004.xyz | 33115aa.com | www.371931.com | www.0270j.com | www.xpj556677.com | www.666423.net | www.81866j.com | 3662m.com | js58881.com | www.78949u.com | www.826552.com | www.aobo194.com | www.3157s.com | www.959msc.com | www.56733m.com | bwin8d.com | 7003q.com | 38989z.com | 2443c.com | www.452801.com | www.976271.com | www.3478g.cc | www.2109v.com | www.61233c.com | www.966725.com | www.vip9587.com | www.472706.com | www.7029.com | www.61msxfpt2.com | www.67843.com | www.789sbet.net | www.3333wnsr.com | www.333222r.com | www.a3a000.net | 99306u.com | 6220yy.com | 3169a.com | d35151.com | 22556j.com | 9030x.com | hwcp.com | zb152.com | df8d.com | 111122qq.com | aa33336.com | 5589w.com | 11002229.com | 50028822.com | www.7788076.com | www.yun900.com | www.yh6001.com | www.yddc01.com | www.vns7828.com | www.pjhubei.com | www.pj25555.com | 6146o.com | www.81866n.com | www.da888yl.com | www.hj3888.com | www.32126p.net | www.pj7019.com | www.3643q.com | www.vb003.com | www.js6767g.com | www.8885554.com | www.111msc.com | www.803503.com | www.j32939.com | www.6880oo.com | www.44118k.com | www.7920i.com | www.391146.com | www.85144aa.com | www.61655r.com | www.3552u.com | www.255ak.com | www.898418.com | www.544010.com | www.178211.com | 7335u.com | 256777i.com | 0080e.com | 33318m.com | 93922b.com | wnsr8811.com | le888a.com | www.6177a.com | www.888255.com | www.hg2455.com | www.35252r.com | www.00778x.com | www.6888776.com | www.33598p.com | www.138136a.com | www.535121.com | 850.com | 0234u.com | 4647c.com | 00773q.com | 66876q.com | www.830678.com | www.hg486.com | www.91868.com | www.bwinyz22.com | www.x94600.com | www.95111w.com | www.hy5355.com | www.307816.com | dj0009.com | a82365.com | am778.cc | 67888.am | www.hg1668.com | www.cp77dd.com | www.bwinyz24.com | www.yun879.com | www.9818.cc | www.338071.com | 5003ss.com | 0524.com | wp16777.com | www.21365mm.com | www.644577.com | www.7415ee.com | www.hg77701.com | www.sygj5.com | www.091899.com | 55zz8332.com | 08159h.com | www.pu1678.com | www.88993h.com | www.9bet005.com | www.89777w.com | www.gyfc8.com | www.186371.com | 9694y.com | jjj4165.com | www.339688n.com | www.73800.com | www.1754g.com | www.16878g.com | www.324611.com | sj889.net | 655661177.com | www.365815f.com | www.1234cp.me | www.5856877.com | www.983112.com | 80368h.com | c82365.com | www.238267.com | www.1200msc.com | www.1764l.com | www.987436.com | 3405ddd.com | 47749z.com | www.hg0088.co | www.163a6.com | www.62118b.com | www.197093.com | wotuwen.com | 33115ww.com | www.9988619.com | www.33678aa.com | www.5xcv.com | yun2888.com | 3685a.com | www.hg5600.com | www.555838.com | www.66wcw.com | 67877u.com | 52599c.com | www.k0678.com | www.60886x.com | www.917787.com | 3258o.com | 5589b.com | www.hg3756.com | www.778305.com | www.lg7717.com | 9411vip.com | 1483ww.com | www.jxcp1111.com | www.3478j.cc | 4116a.com | 3121mm.com | www. | www.9356c.com | 6487xxx.com | feicai0414.com | www.hg7857.com | www.CK1432.COM | vv38648.cc | ss00558.com | www.663929.com | www.725603.com | www.168323.com | 88993.com | www.773339.cc | www.4809d.com | www.140018.com | 7032004.com | www.77537r.com | www.7920c.com | www.099836.com | 3467k.com | www.78937.com | www.58qp.cc | www.81520e.com | 36400099.com | www.877568.com | www.55228h.com | 6830.com | 1408e.com | www.dzj0770.com | www.871203.com | 80188.com | www.383050.com | www.66889.am | x48x.com | 500000710.com | www.8967g.com | www.aj3383.com | bwin8l.com | www.7830l.com | www.s98478.com | s2146.com | 876023.com | www.6805.com | www.657269.com | 3679vv.com | www.57798b.com | www.27280.cc | 3679kk.com | www.9068zz.com | www.hr1866.com | xbo198.com | 2767k.com | www.365055.bet | www.559748.com | hh1088.com | www.haomen1.com | www.983112.com | z15666.com | www.2010889.com | www.5522q.cc | qqq01234.com | www.pj98914.com | www.22csj.com | www.50989e.com | tt6824.com | 01234vvv.com | www.3844b.com | www.6832j.com | bh55234.com | www.84859.com | www.50064z.com | 85698c.com | www.pj1314.com | www.8039g.com | dzc13.com | www.hg8236.com | www.927836.com | 1592z.com | www.79500w.com | www.303467.com | 1077ddd.com | www.64566f.com | 0332.com | www.588778.com | www.66653z.com | 23815.com | www.722168.com | www.866505.com | 11bb8332.com | www.783544.com | v0099.tv | www.9068bb.com | www.86889.com | 4880x.com | www.c559cc.com | www.390500.com | 2306u.com | www.11599119.com | 8159hhh.cc | www.amdc0007.com | www.606920.com | gc.cc | www.blr1144.com | hgyz22.com | www.hd2894.com | www.769639.com | 30007w.com | www.1119yl.com | 20059.com | www.hg2809.com | www.602472.com | 88002848.com | www.89777r.com | cr288.com | www.jgj230230.com | www.206882.com | www.yh66609.com | www.52303w.com | yabo4303.com | www.47506a.com | yataibet1.com | www.274166.com | www.666937.com | 0033b.cc | www.91233s.com | z86226.com | www.10999w.com | 0708060.com | www.xaanf.com | www.526170.com | 4195p.com | www.50732y.com | ambc8899.net | www.55676l.com | 62077.net | www.1168h.com | 07377.com | www.5888868.com | www.548116.com | www.0333hg.com | www.5095z.com | 14683333.com | www.b773776.com | yyh917.com | www.56011l.com | 22207f.com | www.hg8uu.com | 2566h4.com | www.hwx688.com | 0289p.com | www.bmw8555.com | www.234827.com | www.www-66000.com | www.915422.com | www.jsw77.cc | www.899342.com | www.o1688.net | www.88cmc.com | 88665004.com | www.983jc.com | kk3385.com | www.5441j.com | 621155.com | www.15355z.com | 2373k.com | www.16878p.com | 2820s.com | www.50064f.com | wfcp777666.com | www.80075x.com | bwin8h.com | www.16878a.com | fc9818.com | www.89894x.com | 500000751.com | www.57578d.com | am3144.com | www.7793d.com | 6655734.com | www.slyl5.com | www.js7288.com | www.918795.com | www.bet1699.com | www.404099.com | www.619406.com | www.36787a.com | www.561pj.com | 8790t.com | www.cp66611.com | 7736i.com | www.js79904.com | 69440055.com | www.168749.com | 3169f.com | www.fo64.com | www.xpj2018.com | www.217880.com | www.135605.com | 988msc.com | www.8967h.com | 9694b.com | www.48330q.com | 53t.com | www.686c.com | www.365109c.com | www.178389.com | www.066983.com | 2805d.com | www.3066ll.com | 3405uu.com | www.21202u.com | 7168b.com | www.565639.com | www.rycp13.com | 99151m.com | www.bwinyz13.com | hjcp188.com | www.50052z.com | www.56733t.com | www.210883.com | www.604700.com | 54140044.com | www.237377.com | vns55.vip | www.730719.com | www.9b100.com | ff555i.com | www.88325k.com | cc00558.com | www.hy9996.com | www.hg68111.com | hg999333n.com | www.88000xpj.com | jjttj.com | www.589879.com | www.245899.com | yhsichun.vip | www.80767d.com | www.8124x.com | 20177.com | www.89677j.com | dwyl007.com | www.983888.com | www.236js.com | bwin2808.com | www.99788f.com | www.6491f.com | 033o.net | www.wns123c.com | la688.com | www.229958.com | www.27363a.com | www.8816y.com | xpj70005.com | www.2846a.com | www.a79839.com | 2851b.com | www.hg1020.net | www.6sun.com | www.19652.com | 8381dd.com | www.ya2019v.com | www.benz4422s.com | 1590.com | www.534331.com | www.995055.com | P35s.com | www.fg9907.com | www.8494x.com | 256777d.com | www.9996ee.com | www.f32126.cc | 6601wz.com | www.ag.hg3005.com | www.6020400.com | 11452288.com | www.61655x.com | www.pj8551.com | 20550371.com | www.30xw.com | www.868444.com | 47749p.com | www.544141.com | www.gm41.com | feicai0377.com | www.50732i.com | www.5517.com | www.bmcp1344.com | j15.com | www.hg6767b.com | www.hg1688.biz | jumboluck.com | www.c9478.com | www.310615.com | 168cp-x.com | www.55676a.com | swtywww.com | www.9699.us | www.774808.com | 0229422.com | 365ms.net | www.bai05.com | www.77731d.com | 56988s.vip | 883399r.com | www.16065q.com | www.h2678.com | 3435z.com | www.455745.com | www.265875.com | www.am3366.com | 40033qq.com | www.sjgc5.com | www.ly19.com | 38822211.com | 205235.com | www.37to.com | www.i92776.com | t365e.com | lehu9088.com | www.22czj.com | www.8967b.com | 1389vv.com | 1434i.com | www.965176.com | www.04567z.com | www.ao699.com | 2008.com | www.397730.com | www.hg6688.net | www.666888cc.com | qqq7570.com | aa5360.com | www.7793v.com | 5856hhh.com | www.2566y3.com | 4647099.com | www.3188888.com | 69446677.com | www.rycp163.com | 4008590.com | www.ty143.com | n888559.com | aa412dh.com | www.41518n.com | www.5504b.com | www.tyc9907.com | u8381.com | www.327536.com | www.0967004.com | www.y00888.com | 3049l.com | 5589o.com | www.237988.com | www.16065m.com | www.ljw031.com | 4066gg.com | 4488buyu.com | hg77760.com | www.29277f.com | www.9737zz.com | www.v27229.com | xx38648.com | d3410.com | www.909375.com | www.78680h.com | www.306408.com | gbhs33.com | lh66z.com | sytydn.com | www.6832q.com | www.06820k.com | www.9966145.com | 3379ll.com | 87965ww.com | www.009275.com | www.36788d.com | www.7893w38.com | www.bet365de.com | www.729133.com | www.362858.com | 4116o.com | www.yingle33.com | 66119193.com | www.pjc66.vip | 61327755.com | www.8667k.com | www.9822.com | www.000162.com | www.6805pj.com | 45637j.com | cp088s.com | www.040438.com | www.3126p.com | www.98vs88.com | www.bjd999.com | www.dwc4.com | 8290p.com | 4488ggg.com | 2140099.com | www.364688.com | www.25688m.com | www.5886nn.com | www.693suncity.com | www.6662558.com | 500000838.com | jj4119.com | 1407d.com | www.115779.com | www.072wy.com | www.hg77730.com | www.78888js.com | www.653pj.com | www.ks081.com | 8381s.com | ts698.com | changlecai.com | 68680029.com | www.745899.com | www.61655f.com | www.38775cc.com | www.dzcp1111.com | www.ty1148.com | www.333hwx.com | 9949c.com | 5622o.com | www.60886u.com | 3049f.com | www.221085.com | www.811129.com | 822.cc | www.633720.com | www.ag8820.com | qq67890.com | www.dan70.com | www.77802b.com | www.115527b.com | www.rgcp555.com | www.7764.com | www.www8181msc.com | 59599y.com | 7779d.cc | 4809h.com | 4136f.com | 3156xxx.com | 4123ii.com | 2381mm.com | www.297790.com | www.861830.com | www.5522z.cc | www.84499t.com | www.62778811.com | www.73990d.com | www.v32939.com | www.ra0008.com | www.hg7942.com | www.330099l.com | www.6635oo.com | 1634l.com | 8901k.com | 22ee8331.com | wnsr8828.com | 4590cc.com | b68080.com | 793929.com | 3559p.com | 70661.com | 89892tt.com | 38455.com | 22117c.com | 80579g.com | 4270cc.com | hd49499.com | www.43131a.com | www.273503.com | 1305004.com | www.55717u.com | www.29886v.com | 37770772.com | www.508680.com | www.690510.com | www.zr1166.com | 97987-7.com | www.946380.com | www.9737yy.com | www.86611h.com | 3938ee.com | 5360vv.com | 8030g.com | 22556i.com | 5443v.com | 22293232.com | 38345b.com | x2913.com | dafa7575.com | www.5000bjl.com | www.jh879.com | www.7435n.com | www.85770c.com | www.wns911.com | www.17848.cc | www.87680u.com | www.d27229.com | www.32666p.com | www.443709.com | www.xh1111.com | www.31809.com | www.xpj8840.com | www.yingle55.com | www.rycp047.com | www.1064e.com | www.bet63d.com | www.2021h.com | www.630468.com | www.h94600.com | www.12136ee.com | www.7239m.com | www.21202g.com | www.zuan444.com | www.853053.com | www.514377.com | www.081501.com | 1312929.com | 5309u.com | 31n.net | 8381.com | 30006.cc | 3679zz.com | r62365.com | www.www-hg127.com | 2222k0.com | 99589j.net | www.3479c.com | www.00778j.com | www.2833555.com | kk00558.com | 07074688.com | www.188393.com | www.81520s.com | www.b86hg.com | www.hq999.com | www.034044.com | www.72msxfpta.com | www.185147.com | www.7240h.com | www.52303l.com | www.965160.com | www.191380.com | xpj708.com | 5856fff.com | 01234vvv.com | j47479.com | www.hg97hg97.com | www.993456.com | www.5146z8.com | www.52062s.com | www.68689c.com | www.889489.com | www.52303a.com | 1591002.com | y3330.com | y1771.com | www.pjbeijing.com | www.894929.com | www.98698i.com | www.cc4625.com | www.9356c.com | www.517844.com | 1331ww.com | wvs8.com | l77304.com | www.hg77719.com | www.133004.com | www.7366002.com | www.454647.com | www.971291.com | 22mm8332.com | 838388h.com | 496.bet | www.365635.com | www.b2238.com | www.60886s.com | www.29277q.com | www.369052.com | 8294d.com | 93922e.com | 80878b.com | www.358955.com | www.44vn777.com | www.78949b.com | www.sha0088.com | www.a01885.com | www.82894w.com | www.365969.com | bb5144.com | 2709v.com | 84494411.com | 3807ll.com | hg0068e.com | 33889737.com | 38238d.com | 6641o.com | 22556k.com | www.vb003.com | www.4058x.com | www.29277q.com | www.78700e.com | 999p1.cc | 7334g.com | www.93818.com | www.2848aaa.com | www.zc35.com | 89777j.com | 908080d.com | www.p76888.com | www.169902.com | www.83993y.com | www.153680.com | yhw0.cc | 365vip07.win | www.488633.com | www.984708.com | www.621441.com | bcbm688.com | s2649.com | www.39111ccc.com | www.0600v.cc | www.890751.com | 2698.com | hgyz33.com | www.33354.com | www.75600w.com | www.663948.com | 1408.com | 7744uuu.com | www.67799.com | www.025155.com | www.330637.com | 2381o.com | www.668k8.com | www.85857w.com | www.68689g.com | 2418006.com | 75959s.com | www.7111n.com | www.5583066.com | www.721709.com | m82365.com | 1634e.com | www.c5c55.com | www.38381.cc | 34h35.com | 0033q.cc | www.095889.com | www.582010.com | www.111307.com | www.26299a.com | 500000511.com | 77bet.com | 3559cc.com | 3405x.com | 3668yh.com | 7744bbb.com | www.8973.cc | www.77537e.com | www.g0518.com | www.998855s.com | www.cn365c.com | www.78680u.com | 50028833.com | 50000990.com | www.622msc.com | www.34788s.com | feicai0633.com | 56988n.vip | www.1168d.com | www.tctx2.com | 7811q.com | www.888vm.com | www.47506l.com | www.499428.com | 4152s.com | www.130031.com | www.9238777.com | 0747zz.com | 3379ll.com | www.yzcp2023.com | www.fcff3.com | jjjj19927.com | www.kf5656.com | www.4102k.com | www.037211.com | 3663yh.com | www.1274uu.com | www.5854k.cc | 61788.com | www.js38123.com | www.9187o.com | 66300vip03.com | 83138t.com | www.c32kk.com? | www.888258.com | 39990066.com | www.22557712.com | www.76520p.com | 7720u.com | www.333222b.com | www.hg0083.com | zzc88.com | 923370.com | www.7334a.com | www.542998.com | x6982.com | www.77883344.com | www.caim3.com | 402d0.com | www.688222.com | www.21202b.com | pj22885.com | www.a4568.com | www.2221102.com | 3169j.com | www.yh201444.vip | www.v774477.com | 4647033.com | www.15000552959.com | www.ba501.com | lll0055.com | 1654yy.com | www.65707q.com | www.816820.com | j3410.com | ca7701.com | www.hg7575.com | www.5146z4.com | www.80065l.com | www.163136.com | 88807n.com | 3344vn77.com | www.004433.com | www.ag99365.com | www.910155.com | cp088r.com | hg0099e.com | www.b55551.com | www.k063801.com | 18438s.com | www.vip65533.com | www.6769q.com | 224940.com | www.569393a.com | www.666937.com | 26668u.com | www.80188m.com | 131hh.net | www.653508.com | www.89894j.com | 22933.com | www.1www.0079988.com | www.652162.com | 3522c.vip | www.x063801.com | 33567d.com | www.8694n.com | www.08588n.com | 4036yy.com | www.yzcp2024.com | www.96386a.com | www.330zr.com | www.0659.com | vip169.com | www.pj7608.com | www.292199.com | 11555002.com | www.633547.com | c388e.com | www.888zhenren20.com | www.513061.com | 3434qqq.com | www.300716.com | 3656ss.com | www.86778.com | www.165595.com | www.ylg3999.com | www.99677w.com | ii40033.com | www.ff55826.com | 11440.com | www.x30226.com | www.ya619.com | 35442888.com | www.cn365m.com | 6363uu.com | www.358888f.com | www.913812.com | 3379ss.com | www.55717c.com | app22299.com | www.tc8803.com | 69447799.com | www.sfwhys.com | www.949404.com | 8036mm.com | www.fg9906.com | js02749.com | www.7415g.com | 0747ss.com | www.644055.com | www.356686.com | www.v65999.com | www.8667m.com | 80850gg.com | www.4809e.com | 0055gbh.com | www.jz6988.com | 131jj.net | www.32666l.com | www.178625.com | 2jsfff.com | www.98698x.com | www.544141.com | 62222o.com | www.79500r.com | www.621410.com | v62.com | www.79500l.com | www.621416.com | 50099.com | www.ssc33.com | www.514611.com | 25288n.com | www.06jsjs.com | www.296180.com | 39990044.com | www.22vn777.com | www.022613.com | www.k444.net | www.485648.com | www.k32126.cc | www.919309.com | 78111133.com | www.66ffx.com | x86002.com | www.00840n.com | 97799p.com | www.61655d.com | 00jj8331.com | www.345452.com | weibo.com | www.0194005.com | 5337788.com | www.68070.com | q2490.com | www.89777r.com | 25288o.com | www.2418j.com | p2146.com | www.55238e.com | 00774bb.com | www.379.net | 56787wx.cc | www.77801b.com | 2805y.com | www.05500w.com | 9030b.com | www.5xcu.com | www.xsj900.com | www.901068.com | www.xpj8858.com | www.djcp007.com | www.323567.com | www.106526.com | www.e3838.com | 33775002.com | www.56655d.com |