精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Kafka大廠高頻面試題:在保證高性能、高吞吐的同時(shí)保證高可用性

開發(fā) 前端 Kafka
Kafka的消息傳輸保障機(jī)制非常直觀。當(dāng)producer向broker發(fā)送消息時(shí),一旦這條消息被commit,由于副本機(jī)制(replication)的存在,它就不會(huì)丟失。但是如果producer發(fā)送數(shù)據(jù)給broker后,遇到的網(wǎng)絡(luò)問題而造成通信中斷,那producer就無法判斷該條消息是否已經(jīng)提交(commit)。

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

一、冪等性

1.場(chǎng)景

所謂冪等性,就是對(duì)接口的多次調(diào)用所產(chǎn)生的結(jié)果和調(diào)用一次是一致的。生產(chǎn)者在進(jìn)行重試的時(shí)候有可能會(huì)重復(fù)寫入消息,而使用Kafka的冪等性功能就可以避免這種情況。

冪等性是有條件的:

只能保證 Producer 在單個(gè)會(huì)話內(nèi)不丟不重,如果 Producer 出現(xiàn)意外掛掉再重啟是無法保證的(冪等性情況下,是無法獲取之前的狀態(tài)信息,因此是無法做到跨會(huì)話級(jí)別的不丟不重)。

冪等性不能跨多個(gè) Topic-Partition,只能保證單個(gè) partition 內(nèi)的冪等性,當(dāng)涉及多個(gè)Topic-Partition 時(shí),這中間的狀態(tài)并沒有同步。

Producer 使用冪等性的示例非常簡(jiǎn)單,與正常情況下 Producer 使用相比變化不大,只需要把Producer 的配置 enable.idempotence 設(shè)置為 true 即可,如下所示: 

  1. Properties props = new Properties();  
  2. props.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, "true");  
  3. props.put("acks""all"); // 當(dāng) enable.idempotence 為 true,這里默認(rèn)為 all  
  4. props.put("bootstrap.servers""localhost:9092");  
  5. props.put("key.serializer""org.apache.kafka.common.serialization.StringSerializer");  
  6. props.put("value.serializer""org.apache.kafka.common.serialization.StringSerializer");  
  7.  
  8. KafkaProducer producer = new KafkaProducer(props);  
  9.  
  10. producer.send(new ProducerRecord(topic, "test"); 

二、事務(wù)

1.場(chǎng)景

冪等性并不能跨多個(gè)分區(qū)運(yùn)作,而事務(wù)可以彌補(bǔ)這個(gè)缺憾,事務(wù)可以保證對(duì)多個(gè)分區(qū)寫入操作的原子性。操作的原子性是指多個(gè)操作要么全部成功,要么全部失敗,不存在部分成功部分失敗的可能。

為了實(shí)現(xiàn)事務(wù),網(wǎng)絡(luò)故障必須提供唯一的transactionalId,這個(gè)參數(shù)通過客戶端程序來進(jìn)行設(shè)定。

見代碼庫(kù):

com.heima.kafka.chapter7.ProducerTransactionSend

  1. properties.put(ProducerConfig.TRANSACTIONAL_ID_CONFIG, transactionId); 

2.前期準(zhǔn)備

事務(wù)要求生產(chǎn)者開啟冪等性特性,因此通過將transactional.id參數(shù)設(shè)置為非空從而開啟事務(wù)特性的同時(shí)需要將ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG設(shè)置為true(默認(rèn)值為true),如果顯示設(shè)置為false,則會(huì)拋出異常。

KafkaProducer提供了5個(gè)與事務(wù)相關(guān)的方法,詳細(xì)如下: 

  1. //初始化事務(wù),前提是配置了transactionalId  
  2. public void initTransactions()  
  3. //開啟事務(wù)  
  4. public void beginTransaction()  
  5. //為消費(fèi)者提供事務(wù)內(nèi)的位移提交操作  
  6. public void sendOffsetsToTransaction(Map<TopicPartition, OffsetAndMetadata> offsets, String consumerGroupId)  
  7. //提交事務(wù)  
  8. public void commitTransaction()  
  9. //終止事務(wù),類似于回滾  
  10. public void abortTransaction() 

3.案例解析

見代碼庫(kù):

  • com.heima.kafka.chapter7.ProducerTransactionSend

消息發(fā)送端 

  1. /** 
  2.     * Kafka Producer事務(wù)的使用  
  3.     */  
  4. public class ProducerTransactionSend {  
  5.     public static final String topic = "topic-transaction";  
  6.     public static final String brokerList = "localhost:9092";  
  7.     public static final String transactionId = "transactionId";  
  8.      
  9.     public static void main(String[] args) {  
  10.         Properties properties = new Properties();  
  11.         properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());  
  12.         properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());  
  13.         properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, brokerList);  
  14.         properties.put(ProducerConfig.TRANSACTIONAL_ID_CONFIG, transactionId);  
  15.          
  16.         KafkaProducer<String, String> producer = new KafkaProducer<> (properties);  
  17.          
  18.         producer.initTransactions();  
  19.         producer.beginTransaction();  
  20.          
  21.         try { 
  22.             //處理業(yè)務(wù)邏輯并創(chuàng)建ProducerRecord  
  23.             ProducerRecord<String, String> record1 = new ProducerRecord<>(topic, "msg1");  
  24.             producer.send(record1);  
  25.             ProducerRecord<String, String> record2 = new ProducerRecord<>(topic, "msg2");  
  26.             producer.send(record2);  
  27.             ProducerRecord<String, String> record3 = new ProducerRecord<>(topic, "msg3");  
  28.             producer.send(record3);  
  29.             //處理一些其它邏輯  
  30.             producer.commitTransaction();  
  31.         } catch (ProducerFencedException e) {  
  32.             producer.abortTransaction();  
  33.         } 
  34.         producer.close();  
  35.     }  

模擬事務(wù)回滾案例 

  1. try {  
  2.     //處理業(yè)務(wù)邏輯并創(chuàng)建ProducerRecord  
  3.     ProducerRecord<String, String> record1 = new ProducerRecord<>(topic, "msg1");  
  4.     producer.send(record1);  
  5.      
  6.     //模擬事務(wù)回滾案例  
  7.     System.out.println(1/0);  
  8.      
  9.     ProducerRecord<String, String> record2 = new ProducerRecord<>(topic, "msg2");  
  10.     producer.send(record2);  
  11.     ProducerRecord<String, String> record3 = new ProducerRecord<>(topic, "msg3");  
  12.     producer.send(record3);  
  13.     //處理一些其它邏輯  
  14.     producer.commitTransaction();  
  15. } catch (ProducerFencedException e) {  
  16.     producer.abortTransaction();  

從上面案例中,msg1發(fā)送成功之后,出現(xiàn)了異常事務(wù)進(jìn)行了回滾,則msg1消費(fèi)端也收不到消息。

三、控制器

在Kafka集群中會(huì)有一個(gè)或者多個(gè)broker,其中有一個(gè)broker會(huì)被選舉為控制器(Kafka Controller),它負(fù)責(zé)管理整個(gè)集群中所有分區(qū)和副本的狀態(tài)。當(dāng)某個(gè)分區(qū)的leader副本出現(xiàn)故障時(shí),由控制器負(fù)責(zé)為該分區(qū)選舉新的leader副本。當(dāng)檢測(cè)到某個(gè)分區(qū)的ISR集合發(fā)生變化時(shí),由控制器負(fù)責(zé)通知所有broker更新其元數(shù)據(jù)信息。當(dāng)使用kafka-topics.sh腳本為某個(gè)topic增加分區(qū)數(shù)量時(shí),同樣還是由控制器負(fù)責(zé)分區(qū)的重新分配。

Kafka中的控制器選舉的工作依賴于Zookeeper,成功競(jìng)選為控制器的broker會(huì)在Zookeeper中創(chuàng)建/controller這個(gè)臨時(shí)(EPHEMERAL)節(jié)點(diǎn),此臨時(shí)節(jié)點(diǎn)的內(nèi)容參考如下:

1.ZooInspector管理

使用zookeeper圖形化的客戶端工具(ZooInspector)提供的jar來進(jìn)行管理,啟動(dòng)如下:

  1. 定位到j(luò)ar所在目錄
  2. 運(yùn)行jar文件 java -jar zookeeper-dev-ZooInspector.jar
  3. 連接Zookeeper

  1. {"version":1,"brokerid":0,"timestamp":"1529210278988"

 

其中version在目前版本中固定為1,brokerid表示稱為控制器的broker的id編號(hào),timestamp表示競(jìng)選稱為控制器時(shí)的時(shí)間戳。

在任意時(shí)刻,集群中有且僅有一個(gè)控制器。每個(gè)broker啟動(dòng)的時(shí)候會(huì)去嘗試去讀取/controller節(jié)點(diǎn)的brokerid的值,如果讀取到brokerid的值不為-1,則表示已經(jīng)有其它broker節(jié)點(diǎn)成功競(jìng)選為控制器,所以當(dāng)前broker就會(huì)放棄競(jìng)選;如果Zookeeper中不存在/controller這個(gè)節(jié)點(diǎn),或者這個(gè)節(jié)點(diǎn)中的數(shù)據(jù)異常,那么就會(huì)嘗試去創(chuàng)建/controller這個(gè)節(jié)點(diǎn),當(dāng)前broker去創(chuàng)建節(jié)點(diǎn)的時(shí)候,也有可能其他broker同時(shí)去嘗試創(chuàng)建這個(gè)節(jié)點(diǎn),只有創(chuàng)建成功的那個(gè)broker才會(huì)成為控制器,而創(chuàng)建失敗的broker則表示競(jìng)選失敗。每個(gè)broker都會(huì)在內(nèi)存中保存當(dāng)前控制器的brokerid值,這個(gè)值可以標(biāo)識(shí)為activeControllerId。

Zookeeper中還有一個(gè)與控制器有關(guān)的/controller_epoch節(jié)點(diǎn),這個(gè)節(jié)點(diǎn)是持久(PERSISTENT)節(jié)點(diǎn),節(jié)點(diǎn)中存放的是一個(gè)整型的controller_epoch值。controller_epoch用于記錄控制器發(fā)生變更的次數(shù),即記錄當(dāng)前的控制器是第幾代控制器,我們也可以稱之為“控制器的紀(jì)元”。

controller_epoch的初始值為1,即集群中第一個(gè)控制器的紀(jì)元為1,當(dāng)控制器發(fā)生變更時(shí),沒選出一個(gè)新的控制器就將該字段值加1。每個(gè)和控制器交互的請(qǐng)求都會(huì)攜帶上controller_epoch這個(gè)字段,如果請(qǐng)求的controller_epoch值小于內(nèi)存中的controller_epoch值,則認(rèn)為這個(gè)請(qǐng)求是向已經(jīng)過期的控制器所發(fā)送的請(qǐng)求,那么這個(gè)請(qǐng)求會(huì)被認(rèn)定為無效的請(qǐng)求。如果請(qǐng)求的controller_epoch值大于內(nèi)存中的controller_epoch值,那么則說明已經(jīng)有新的控制器當(dāng)選了。由此可見,Kafka通過controller_epoch來保證控制器的唯一性,進(jìn)而保證相關(guān)操作的一致性。

具備控制器身份的broker需要比其他普通的broker多一份職責(zé),具體細(xì)節(jié)如下:

  1. 監(jiān)聽partition相關(guān)的變化。
  2. 監(jiān)聽topic相關(guān)的變化。
  3. 監(jiān)聽broker相關(guān)的變化。
  4. 從Zookeeper中讀取獲取當(dāng)前所有與topic、partition以及broker有關(guān)的信息并進(jìn)行相應(yīng)的管理。

四、可靠性保證

  1. 可靠性保證:確保系統(tǒng)在各種不同的環(huán)境下能夠發(fā)生一致的行為
  2. Kafka的保證
  3. 保證分區(qū)消息的順序如果使用同一個(gè)生產(chǎn)者往同一個(gè)分區(qū)寫入消息,而且消息B在消息A之后寫入那么Kafka可以保證消息B的偏移量比消息A的偏移量大,而且消費(fèi)者會(huì)先讀取消息A再讀取消息B
  4. 只有當(dāng)消息被寫入分區(qū)的所有同步副本時(shí)(文件系統(tǒng)緩存),它才被認(rèn)為是已提交
  5. 生產(chǎn)者可以選擇接收不同類型的確認(rèn),控制參數(shù) acks
  6. 只要還有一個(gè)副本是活躍的,那么已提交的消息就不會(huì)丟失
  7. 消費(fèi)者只能讀取已經(jīng)提交的消息

1. 失效副本

怎么樣判定一個(gè)分區(qū)是否有副本是處于同步失效狀態(tài)的呢?從Kafka 0.9.x版本開始通過唯一的一個(gè)參數(shù)replica.lag.time.max.ms(默認(rèn)大小為10,000)來控制,當(dāng)ISR中的一個(gè)follower副本滯后leader副本的時(shí)間超過參數(shù)replica.lag.time.max.ms指定的值時(shí)即判定為副本失效,需要將此follower副本剔出除ISR之外。具體實(shí)現(xiàn)原理很簡(jiǎn)單,當(dāng)follower副本將leader副本的LEO(Log End Offset,每個(gè)分區(qū)最后一條消息的位置)之前的日志全部同步時(shí),則認(rèn)為該follower副本已經(jīng)追趕上leader副本,此時(shí)更新該副本的lastCaughtUpTimeMs標(biāo)識(shí)。Kafka的副本管理器(ReplicaManager)啟動(dòng)時(shí)會(huì)啟動(dòng)一個(gè)副本過期檢測(cè)的定時(shí)任務(wù),而這個(gè)定時(shí)任務(wù)會(huì)定時(shí)檢查當(dāng)前時(shí)間與副本的lastCaughtUpTimeMs差值是否大于參數(shù)replica.lag.time.max.ms指定的值。千萬不要錯(cuò)誤地認(rèn)為follower副本只要拉取leader副本的數(shù)據(jù)就會(huì)更新lastCaughtUpTimeMs,試想當(dāng)leader副本的消息流入速度大于follower副本的拉取速度時(shí),follower副本一直不斷的拉取leader副本的消息也不能與leader副本同步,如果還將此follower副本置于ISR中,那么當(dāng)leader副本失效,而選取此follower副本為新的leader副本,那么就會(huì)有嚴(yán)重的消息丟失。

2.副本復(fù)制

Kafka 中的每個(gè)主題分區(qū)都被復(fù)制了 n 次,其中的 n 是主題的復(fù)制因子(replication factor)。這允許Kafka 在集群服務(wù)器發(fā)生故障時(shí)自動(dòng)切換到這些副本,以便在出現(xiàn)故障時(shí)消息仍然可用。Kafka 的復(fù)制是以分區(qū)為粒度的,分區(qū)的預(yù)寫日志被復(fù)制到 n 個(gè)服務(wù)器。 在 n 個(gè)副本中,一個(gè)副本作為 leader,其他副本成為 followers。顧名思義,producer 只能往 leader 分區(qū)上寫數(shù)據(jù)(讀也只能從 leader 分區(qū)上進(jìn)行),followers 只按順序從 leader 上復(fù)制日志。

一個(gè)副本可以不同步Leader有如下幾個(gè)原因 慢副本:在一定周期時(shí)間內(nèi)follower不能追趕上leader。最常見的原因之一是I / O瓶頸導(dǎo)致follower追加復(fù)制消息速度慢于從leader拉取速度。 卡住副本:在一定周期時(shí)間內(nèi)follower停止從leader拉取請(qǐng)求。follower replica卡住了是由于GC暫停或follower失效或死亡。

新啟動(dòng)副本:當(dāng)用戶給主題增加副本因子時(shí),新的follower不在同步副本列表中,直到他們完全趕上了leader日志。

如何確定副本是滯后的:

  1. replica.lag.max.messages=4 

 

在服務(wù)端現(xiàn)在只有一個(gè)參數(shù)需要配置replica.lag.time.max.ms。這個(gè)參數(shù)解釋replicas響應(yīng)partition leader的最長(zhǎng)等待時(shí)間。檢測(cè)卡住或失敗副本的探測(cè)——如果一個(gè)replica失敗導(dǎo)致發(fā)送拉取請(qǐng)求時(shí)間間隔超過replica.lag.time.max.ms。Kafka會(huì)認(rèn)為此replica已經(jīng)死亡會(huì)從同步副本列表從移除。檢測(cè)慢副本機(jī)制發(fā)生了變化——如果一個(gè)replica開始落后leader超過replica.lag.time.max.ms。Kafka會(huì)認(rèn)為太緩慢并且會(huì)從同步副本列表中移除。除非replica請(qǐng)求leader時(shí)間間隔大于replica.lag.time.max.ms,因此即使leader使流量激增和大批量寫消息。Kafka也不會(huì)從同步副本列表從移除該副本。

Leader Epoch引用

數(shù)據(jù)丟失場(chǎng)景

數(shù)據(jù)出現(xiàn)不一致場(chǎng)景

Kafka 0.11.0.0.版本解決方案

造成上述兩個(gè)問題的根本原因在于HW值被用于衡量副本備份的成功與否以及在出現(xiàn)failture時(shí)作為日志截?cái)嗟囊罁?jù),但HW值得更新是異步延遲的,特別是需要額外的FETCH請(qǐng)求處理流程才能更新,故這中間發(fā)生的任何崩潰都可能導(dǎo)致HW值的過期。鑒于這些原因,Kafka 0.11引入了leader epoch來取代HW值。Leader端多開辟一段內(nèi)存區(qū)域?qū)iT保存leader的epoch信息,這樣即使出現(xiàn)上面的兩個(gè)場(chǎng)景也能很好地規(guī)避這些問題。

所謂leader epoch實(shí)際上是一對(duì)值:(epoch,offset)。epoch表示leader的版本號(hào),從0開始,當(dāng)leader變更過1次時(shí)epoch就會(huì)+1,而offset則對(duì)應(yīng)于該epoch版本的leader寫入第一條消息的位移。因此假設(shè)有兩對(duì)值:

  • (0, 0)
  • (1, 120)

則表示第一個(gè)leader從位移0開始寫入消息;共寫了120條[0, 119];而第二個(gè)leader版本號(hào)是1,從位移120處開始寫入消息。

leader broker中會(huì)保存這樣的一個(gè)緩存,并定期地寫入到一個(gè)checkpoint文件中。

避免數(shù)據(jù)丟失:

避免數(shù)據(jù)不一致

六、消息重復(fù)的場(chǎng)景及解決方案

1.生產(chǎn)者端重復(fù)

生產(chǎn)發(fā)送的消息沒有收到正確的broke響應(yīng),導(dǎo)致producer重試。

producer發(fā)出一條消息,broke落盤以后因?yàn)榫W(wǎng)絡(luò)等種種原因發(fā)送端得到一個(gè)發(fā)送失敗的響應(yīng)或者網(wǎng)絡(luò)中斷,然后producer收到一個(gè)可恢復(fù)的Exception重試消息導(dǎo)致消息重復(fù)。

解決方案:

  • 啟動(dòng)kafka的冪等性

要啟動(dòng)kafka的冪等性,無需修改代碼,默認(rèn)為關(guān)閉,需要修改配置文件:enable.idempotence=true 同時(shí)要求 ack=all 且 retries>1。

  • ack=0,不重試。

可能會(huì)丟消息,適用于吞吐量指標(biāo)重要性高于數(shù)據(jù)丟失,例如:日志收集。

消費(fèi)者端重復(fù)

根本原因

數(shù)據(jù)消費(fèi)完沒有及時(shí)提交offset到broker。

解決方案

取消自動(dòng)自動(dòng)提交

每次消費(fèi)完或者程序退出時(shí)手動(dòng)提交。這可能也沒法保證一條重復(fù)。

下游做冪等

一般的解決方案是讓下游做冪等或者盡量每消費(fèi)一條消息都記錄offset,對(duì)于少數(shù)嚴(yán)格的場(chǎng)景可能需要把offset或唯一ID,例如訂單ID和下游狀態(tài)更新放在同一個(gè)數(shù)據(jù)庫(kù)里面做事務(wù)來保證精確的一次更新或者在下游數(shù)據(jù)表里面同時(shí)記錄消費(fèi)offset,然后更新下游數(shù)據(jù)的時(shí)候用消費(fèi)位點(diǎn)做樂觀鎖拒絕掉舊位點(diǎn)的數(shù)據(jù)更新。

七、__consumer_offsets

_consumer_offsets是一個(gè)內(nèi)部topic,對(duì)用戶而言是透明的,除了它的數(shù)據(jù)文件以及偶爾在日志中出現(xiàn)這兩點(diǎn)之外,用戶一般是感覺不到這個(gè)topic的。不過我們的確知道它保存的是Kafka新版本consumer的位移信息。

1.何時(shí)創(chuàng)建

一般情況下,當(dāng)集群中第一有消費(fèi)者消費(fèi)消息時(shí)會(huì)自動(dòng)創(chuàng)建主題__consumer_offsets,分區(qū)數(shù)可以通過offsets.topic.num.partitions參數(shù)設(shè)定,默認(rèn)值為50,如下:

2.解析分區(qū)

見代碼庫(kù):

  1. com.heima.kafka.chapter7.ConsumerOffsetsAnalysis 

獲取所有分區(qū):

總結(jié)

本章主要講解了Kafka相關(guān)穩(wěn)定性的操作,包括冪等性、事務(wù)的處理,同時(shí)對(duì)可靠性保證與一致性保證做了講解,講解了消息重復(fù)以及解決方案。

 

責(zé)任編輯:未麗燕 來源: 今日頭條
相關(guān)推薦

2025-11-05 01:55:00

2025-07-31 04:00:00

2024-02-28 10:14:47

Redis數(shù)據(jù)硬盤

2013-03-13 10:08:17

用友UAP高可用高性能

2021-04-06 20:46:50

Kafka高可用Leader

2021-09-10 13:06:45

HDFS底層Hadoop

2022-02-27 14:37:53

MySQL主備數(shù)據(jù)

2024-02-27 09:48:25

Redis集群數(shù)據(jù)庫(kù)

2025-10-09 01:22:00

2025-03-10 11:48:22

項(xiàng)目服務(wù)設(shè)計(jì)

2012-07-04 11:21:07

OpenStack

2019-07-02 08:38:45

NginxTomcatKeepalived

2012-09-04 13:43:31

SQL Server

2013-08-28 10:30:39

vSphere

2020-03-18 09:00:06

SQL Server云計(jì)算數(shù)據(jù)庫(kù)

2019-10-17 09:23:49

Kafka高性能架構(gòu)

2020-01-07 16:16:57

Kafka開源消息系統(tǒng)

2021-05-24 09:28:41

軟件開發(fā) 技術(shù)

2013-12-04 09:52:50

hadoop

2010-12-31 14:36:15

ExchangeSer
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

不卡的av影片| 男人天堂av在线播放| 成人av在线播放| 亚洲一区中文在线| 精品国产一区二区三区日日嗨 | 亚洲电影影音先锋| 亚洲第一网中文字幕| 六月丁香婷婷激情| 久草中文在线观看| 99久久久国产精品| 国产综合久久久久| 黄色片视频网站| 99久久99视频只有精品| 亚洲精品一区在线观看| 污片在线免费看| av蜜臀在线| 亚洲欧洲日韩在线| 久久国产精品 国产精品| 中文字幕乱码一区二区| 好吊日精品视频| 最近2019中文字幕一页二页 | 玖玖玖电影综合影院| 黄色成人在线播放| 在线观看免费黄色片| 飘雪影院手机免费高清版在线观看| 久久99精品国产麻豆不卡| 国语自产偷拍精品视频偷| 性爱在线免费视频| 亚洲精品国产动漫| 亚洲成人亚洲激情| xxx中文字幕| 日本少妇一区| 欧美日韩中文字幕日韩欧美| 日韩欧美一级在线| 在线观看美女网站大全免费| 91丨porny丨户外露出| 亚洲自拍av在线| 中文字幕人妻精品一区| 奶水喷射视频一区| 国模精品视频一区二区| 放荡的美妇在线播放| 日韩欧美综合| 亚洲最新av在线网站| 国产精品300页| 粉嫩一区二区三区四区公司1| 91国产精品成人| 国产麻花豆剧传媒精品mv在线| 丁香花电影在线观看完整版| 亚洲精品久久久蜜桃| 伊人av成人| 一级毛片视频在线观看| 久久久青草青青国产亚洲免观| 国产亚洲一区二区三区在线播放 | 99re99热| 秋霞a级毛片在线看| 国产欧美精品在线观看| 欧美精品一区在线| 飘雪影视在线观看免费观看| www激情久久| 久久精品五月婷婷| 色哟哟在线观看| 久久综合九色综合97婷婷| 精品国产_亚洲人成在线| 欧美一级淫片免费视频魅影视频| 国产精品一区二区三区99| 92国产精品久久久久首页| 国产精品视频a| 国产毛片精品国产一区二区三区| 亚洲综合色av| 成人免费视频国产| 成人国产精品视频| 玛丽玛丽电影原版免费观看1977| 日韩av地址| 久久久精品黄色| 亚洲电影网站| 99福利在线| 亚洲综合视频网| 男女视频网站在线观看| 欧美裸体视频| 欧美性感一类影片在线播放| www.成年人| 成人春色在线观看免费网站| 日韩成人av在线| 国产伦精品一区二区三区视频女| 秋霞欧美视频| 欧美成人午夜影院| 国产做受高潮漫动| 蜜臀久久久99精品久久久久久| 国产有码一区二区| 韩国av免费在线| 久久久久久久久久看片| 日韩欧美亚洲区| gogogogo高清视频在线| 亚洲国产成人porn| 午夜激情在线观看视频| 精品午夜视频| 亚洲男人的天堂网站| 日本黄色片免费观看| 日韩亚洲国产精品| 国产在线a不卡| 无码精品人妻一区二区三区影院| 欧美激情中文字幕| 欧美a级免费视频| 欧美日韩视频免费观看| 欧美一区二区在线观看| 亚洲欧美视频在线播放| 91久久夜色精品国产按摩| 久久免费成人精品视频| 欧美另类高清videos的特点| 成人动漫在线一区| 一区二区三区欧美成人| 精品三级久久| 欧美一区二区精品久久911| 黄色在线观看av| 亚洲视频电影在线| 国产精品激情自拍| 日韩中文字幕免费观看| 国产精品久久久久久久久动漫| 97超碰在线人人| 亚洲一区二区av| 国产一区二区三区欧美| 国产无套在线观看| 国内精品不卡在线| 视频一区国产精品| 日本不卡1234视频| 日韩视频一区二区三区| 精品一区二区三孕妇视频| 在线亚洲精品| 国产精品初高中精品久久| 1769视频在线播放免费观看| 一本色道久久综合亚洲91| 亚洲黄色小说在线观看| 99精品综合| 国产精品三级美女白浆呻吟| 日本天堂影院在线视频| 亚洲一线二线三线视频| 999热精品视频| 久久亚洲专区| 国产精品青草久久久久福利99| 五月天婷婷激情网| 亚洲成人精品一区二区| 日本xxxx免费| 欧美fxxxxxx另类| 亚洲自拍在线观看| jizzjizz亚洲| 欧美成人免费网站| 免费中文字幕视频| 福利一区二区在线观看| 丰满人妻一区二区三区53号| 999精品嫩草久久久久久99| 爽爽爽爽爽爽爽成人免费观看| 日日噜噜噜噜人人爽亚洲精品| 99久久精品免费看国产免费软件| 欧美视频在线观看视频| 国产精品中文字幕制服诱惑| 久久人人看视频| 欧美一区二区公司| 香蕉乱码成人久久天堂爱免费| 一本色道久久hezyo无码| 在线中文字幕亚洲| 国产精品国产精品| www.超碰在线| 亚洲欧美日韩区| 中文精品久久久久人妻不卡| 国产精品卡一卡二| 两性午夜免费视频| 伊人久久亚洲热| 裸模一区二区三区免费| 欧美123区| www.xxxx精品| www.久久伊人| 精品日韩美女的视频高清| 内射中出日韩无国产剧情| 丝袜亚洲另类欧美综合| 亚洲不卡1区| 四虎精品一区二区免费| 另类色图亚洲色图| 人妻一区二区三区四区| 欧美性猛xxx| 成人黄色短视频| 丁香婷婷综合五月| 国产性xxxx18免费观看视频| 波多野结衣在线观看一区二区| 成人做爰www免费看视频网站| 在线观看男女av免费网址| 亚洲国产日韩欧美在线99| 神马久久久久久久| 亚洲特级片在线| 毛茸茸free性熟hd| 日本中文一区二区三区| 亚洲五码在线观看视频| 亚洲成人一品| 亚洲va欧美va国产综合久久| 超碰在线网站| 中文字幕亚洲综合久久| 亚洲欧美国产高清va在线播放| 一本色道a无线码一区v| 日本免费网站视频| 99久久精品国产观看| 久热精品在线播放| 亚洲欧洲一区| 中文字幕99| 亚洲欧洲美洲国产香蕉| 成人午夜在线观看| 成人性生活视频| 欧美日本高清视频| 九色在线免费| 精品国产免费人成电影在线观看四季 | 国产伦精品一区二区三区四区| 亚洲成av人片一区二区三区| 91导航在线观看| 91视频观看免费| 欧美一级片在线免费观看| 视频一区国产视频| 日韩精品在线视频免费观看| 欧美日韩中字| 极品校花啪啪激情久久| 成人豆花视频| 国产精品无av码在线观看| 波多野结衣乳巨码无在线观看| 日韩网站在线观看| 免费人成在线观看网站| 日韩精品一区二区在线| 在线观看日韩一区二区| 欧美性猛交xxxx偷拍洗澡| 欧美人妻精品一区二区免费看| 国产精品久久久久久久第一福利| 蜜桃精品一区二区| 成人国产精品视频| 国产精品日日摸夜夜爽| 国产综合成人久久大片91| 在线观看av日韩| 久久精品人人| 免费无码国产v片在线观看| 在线国产日韩| 大伊香蕉精品视频在线| 午夜精品偷拍| 久久亚洲a v| 欧美一区网站| 99视频精品全部免费看| 欧美成人激情| 香蕉久久夜色| 93在线视频精品免费观看| 日韩精品不卡| 三区四区不卡| 正在播放国产精品| 日韩久久精品| 亚洲亚洲精品三区日韩精品在线视频| 狠狠综合久久av一区二区蜜桃| 久久青青草原| 国模精品一区| 在线综合视频网站| 欧美一区成人| 人人干视频在线| av成人天堂| 国产精品宾馆在线精品酒店| 麻豆成人精品| 亚洲一二三区av| 久久国产精品72免费观看| 色噜噜狠狠永久免费| 九九视频精品免费| 日韩a一级欧美一级| 国产精品一区二区果冻传媒| 伊人久久久久久久久| 国产成人精品影视| 亚洲国产一区二区三区在线| 极品国产人妖chinesets亚洲人妖 激情亚洲另类图片区小说区 | 欧美日韩国产综合久久| 亚洲一区精品在线观看| 69av一区二区三区| 亚洲AV无码一区二区三区性 | 国产色婷婷国产综合在线理论片a| 欧美电影在线观看网站| 91亚洲永久免费精品| 中文字幕区一区二区三| 国产一区二区三区黄| 你懂的一区二区三区| 亚洲一区三区| 国产精品久久| 波多野结衣作品集| 寂寞少妇一区二区三区| 成人在线观看一区二区| 26uuu国产在线精品一区二区| 潮喷失禁大喷水aⅴ无码| 亚洲乱码一区二区三区在线观看| 国产一级在线免费观看| 日韩欧美在线字幕| 国产原创中文av| 亚洲国产小视频在线观看| 九九热视频在线观看| 久久精品视频在线| 欧美精品videosex| 国产福利视频一区| 香蕉成人app| 欧美午夜视频在线| 91精品国产成人观看| 国产精品久久中文字幕| 久久精品国产网站| 玖玖爱在线精品视频| 国产精品亲子伦对白| 国产福利久久久| 欧美日韩免费一区二区三区| 欧美天堂在线视频| 日韩在线观看av| 三上悠亚激情av一区二区三区| 114国产精品久久免费观看| 九九免费精品视频在线观看| 五月天色婷婷综合| 国产精品婷婷| 国产伦理在线观看| 欧美国产激情一区二区三区蜜月| 久久久久亚洲av无码专区 | 日本一区福利在线| 免费成人进口网站| 日韩国产在线观看| 中文字幕人妻一区二区三区| 中文字幕一区二区三中文字幕| 91av在线免费视频| 欧美一三区三区四区免费在线看| 免费人成在线观看网站| 国内精品久久影院| 日本免费一区二区三区视频| 亚洲精品9999| 久久精品导航| 国产精品揄拍100视频| 亚洲国产日日夜夜| 国产xxxxxx| 日韩色av导航| 麻豆久久久久| 色一情一区二区三区四区| 99成人在线| 天天躁日日躁狠狠躁av| 亚洲精品久久久久久国产精华液| 国产一区二区三区视频免费观看| 一本色道久久88精品综合| 中文不卡1区2区3区| 国内精品一区二区| 一区二区三区在线| 四虎1515hh.com| 亚洲免费看黄网站| 国产三级午夜理伦三级| x99av成人免费| 国产精品3区| 潘金莲一级淫片aaaaa免费看| 久久精品99久久久| 激情无码人妻又粗又大| 欧美日韩一区二区三区不卡| avtt亚洲| 91精品国产综合久久香蕉最新版| 日韩在线观看| 国产永久免费网站| 亚洲天堂2014| www日本高清| 高清视频欧美一级| 国内精品偷拍| 黄www在线观看| 久久久精品综合| 久久这里只有精品9| 最近2019年手机中文字幕| 91精品福利观看| 久久综合久久久久| 成人午夜激情影院| 国产情侣自拍av| 在线国产精品视频| 亚洲国产精选| 欧美大黑帍在线播放| av中文一区二区三区| 亚洲免费在线观看av| 亚洲男女性事视频| 日韩av黄色| 大胆欧美熟妇xx| 91影院在线观看| 国产99久久久久久免费看| 日韩专区在线观看| 影音先锋欧美激情| www黄色av| 中文字幕中文字幕在线一区| 国产农村老头老太视频| 久久久久久97| 国产伦精品一区二区三区视频| 亚洲免费黄色网| 亚洲不卡在线观看| 国产在线中文字幕| 91免费综合在线| 国产美女一区| 三级黄色免费观看| 亚洲第一精品福利| 亚洲精品555| 日韩伦理在线免费观看| 国产日韩亚洲欧美综合| h片在线免费看| 欧美在线视频免费播放| 99精品视频在线观看播放| www.com日本| 欧美日韩视频专区在线播放| 女同视频在线观看| 色狠狠久久av五月综合|| 国产成都精品91一区二区三| 激情五月婷婷网| 欧美精品九九久久|