精品欧美一区二区三区在线观看 _久久久久国色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有中文| 日韩欧美视频在线| wwwxxx黄色片| 羞羞污视频在线观看| 久久先锋资源网| 亚洲精品日韩激情在线电影| 国产成人综合欧美精品久久| 999视频精品| 日韩av在线电影网| 亚洲一区日韩精品| 3344国产永久在线观看视频| 国产精品美女久久久久久久网站| 国产精品福利视频| 国产又粗又黄又爽视频| 午夜在线视频观看日韩17c| 久久综合网hezyo| 成年人在线免费看片| 福利在线一区| 欧美一级高清大全免费观看| 青青青国产在线视频| 97蜜桃久久| 一区二区三区精品在线观看| 亚洲精品无人区| 免费在线高清av| 成人激情黄色小说| 99久久久免费精品国产一区二区| 亚洲精品久久久久久久久久久久久 | 91精品久久久久久久99蜜桃| 成人黄色av片| 色呦呦久久久| 亚洲欧洲www| 日韩成人av网站| 在线观看xxx| av爱爱亚洲一区| 99在线视频首页| 99精品人妻无码专区在线视频区| 日本欧美一区二区| 国产精品极品美女粉嫩高清在线| 女人十八岁毛片| 亚洲国内自拍| 韩国精品美女www爽爽爽视频| 五月婷婷婷婷婷| 日韩片欧美片| 日韩中文字幕在线免费观看| 免费一级suv好看的国产网站 | 国产激情视频一区二区三区欧美| 91精品久久久久久久久青青| 高潮无码精品色欲av午夜福利 | 欧美一级免费在线| 亚洲国产aⅴ精品一区二区三区| 欧美日韩中文字幕精品| 韩国视频一区二区三区| 国产精品久久乐| 欧美色图天堂网| 五月天开心婷婷| 免费欧美网站| 亚洲国产精品va在线看黑人 | 日本一道高清一区二区三区| 欧美一级高清大全免费观看| 在线播放第一页| 福利片在线一区二区| 农村少妇一区二区三区四区五区 | 不卡的免费av| 精品成人一区| 日本一本a高清免费不卡| 亚洲毛片一区二区三区| 日韩二区三区四区| 国产欧美一区二区| 亚洲成熟女性毛茸茸| 成人黄色大片在线观看| 久久精品ww人人做人人爽| 四虎影视在线观看2413| 日本一区二区三区视频视频| 亚洲精品高清国产一线久久| av在线麻豆| 亚洲一区二区三区国产| 欧美 日韩 激情| 亚洲四虎影院| 欧美成人精品3d动漫h| 国产精品久久久免费观看| 精品精品久久| 欧美多人爱爱视频网站| 日韩免费视频一区二区视频在线观看| 日本成人中文字幕| 亚洲影院色无极综合| 午夜影院在线视频| 国产精品国产精品国产专区不蜜 | 日韩精品一区二| 37p粉嫩大胆色噜噜噜| 日韩一区三区| 97成人在线视频| 亚洲天堂中文网| gogo大胆日本视频一区| 亚洲国产精品久久久久婷婷老年| 日本aa在线| 欧美无人高清视频在线观看| 少妇极品熟妇人妻无码| 精品免费视频| 7777kkkk成人观看| 国产免费无遮挡| 久久久久久久电影| 欧美一级在线亚洲天堂| 噜噜噜噜噜久久久久久91| 欧美孕妇孕交| 亚洲精品高清在线观看| 999在线免费视频| www国产精品| 深夜福利91大全| 天堂中文在线网| 国产成人在线视频网站| 日韩精品久久久| 两个人看的在线视频www| 3d动漫精品啪啪| 免费网站在线高清观看| 18成人免费观看视频| 国产日韩在线精品av| 精品久久av| 亚洲成av人在线观看| 日韩av.com| 国产真实有声精品录音| 91国自产精品中文字幕亚洲| 国内精品偷拍视频| 亚洲欧美综合色| 999精彩视频| 国产日产一区| 日本欧美中文字幕| 手机福利小视频在线播放| 亚洲午夜国产一区99re久久| 亚洲黄色av片| 国产精品久久久久久影院8一贰佰 国产精品久久久久久麻豆一区软件 | 欧美三级电影一区| 香港三级日本三级| 亚洲视频日本| 成人在线观看网址| 伊人影院在线视频| 欧美一区二区视频在线观看| 羞羞在线观看视频| 麻豆极品一区二区三区| 五月天国产一区| 欧美日韩五区| 一区二区三区天堂av| 欧美成人一区二区三区四区| 2024国产精品| 一本大道熟女人妻中文字幕在线 | 裸体在线国模精品偷拍| 日产精品高清视频免费| 成人免费直播| 国产亚洲精品91在线| 中文字幕 人妻熟女| 欧美国产日本韩| 日本一二区免费| 91精品国产乱码久久久久久久| 国产热re99久久6国产精品| 伊人国产精品视频| 日本高清视频网站| 亚洲综合一区二区| 丰满人妻一区二区三区免费视频棣| 一区二区在线| 91久久大香伊蕉在人线| 伦理在线一区| 亚洲男人天堂2024| 糖心vlog精品一区二区| 国产精品久久久一本精品| 91亚洲一区二区| 国自产拍偷拍福利精品免费一| 国产精品av一区| 极品美女一区| 中文字幕在线视频日韩| 国产ts人妖调教重口男| 亚洲动漫第一页| 尤物视频最新网址| 久久精品国产一区二区三| 日本a级片在线观看| 国产精品乱战久久久| 奇米4444一区二区三区| yiren22综合网成人| 91精品欧美久久久久久动漫| 国产亚洲第一页| 久久久精品tv| 不卡的在线视频| 日韩午夜免费| 五月天亚洲综合情| 中文字幕日韩在线| 国产成人一区二区| 国产在线一区二区视频| 亚洲国产欧美一区二区丝袜黑人| 99超碰在线观看| 亚洲精品中文在线观看| 网站免费在线观看| 久久99久久久欧美国产| 少妇人妻无码专区视频| 波多野结衣av一区二区全免费观看| 91在线亚洲| 欧美激情一区二区久久久| 蜜桃视频在线播放| 欧美成人一区二区三区在线观看| 六月丁香婷婷综合| 亚洲欧美成aⅴ人在线观看| 欧美熟妇一区二区| 福利一区二区在线| 少妇一级淫免费播放| 亚洲私拍自拍| 曰韩不卡视频| 美女久久99| 国产日韩欧美一区二区| 国产精品欧美一区二区三区不卡| 国产成人小视频在线观看| xxx性欧美| 久久久精品影院| 九色在线视频蝌蚪| 精品国精品国产| 国产乱码精品一区二区| 色呦呦网站一区| 欧美一级视频免费观看| 一区二区三区四区视频精品免费 | 欧美国产在线一区| 丝瓜av网站精品一区二区| 青青草成人免费在线视频| 91精品国产91久久综合| 一区二区三区四区视频在线 | 激情五月五月婷婷| 日本在线电影一区二区三区| 欧美精品久久| 你懂的在线观看一区二区| aa成人免费视频| 日韩福利在线观看| 国产精品美女久久| 写真福利精品福利在线观看| 91sa在线看| 97人人在线视频| 午夜免费久久久久| 黄色小说在线播放| 欧美激情xxxxx| 97超碰在线公开在线看免费| 久久精品中文字幕免费mv| 午夜伦理在线| 久久精品99国产精品酒店日本 | 国产精品超碰97尤物18| 黄色片在线观看免费| 久久精品日韩一区二区三区| 日产日韩在线亚洲欧美| 国产无遮挡裸体免费视频| 亚洲欧洲日韩综合一区二区| 色欲AV无码精品一区二区久久| 国产日产欧美一区| 国产综合精品在线| 国产欧美日韩在线观看| 欧美三级视频网站| 国产精品成人在线观看| 日本黄色片免费观看| 亚洲少妇30p| 久热这里有精品| 亚洲一区二区三区精品在线| 日韩无码精品一区二区三区| 色综合欧美在线| 五月婷婷激情五月| 欧美美女一区二区三区| 99精品视频免费看| 精品国内片67194| 欧美女v视频| 亚洲欧美一区二区精品久久久| 国产午夜精品一区理论片| 在线视频日韩精品| 国产素人视频在线观看| 欧美大片在线影院| 亚洲永久av| 成人国产精品久久久| 天堂av一区| 久久综合九色综合久99| 精品日本12videosex| 中文字幕av日韩精品| 欧美黄色一级视频| av观看免费在线| 精品中文字幕一区二区小辣椒| 少妇欧美激情一区二区三区| www.av精品| 国产极品视频在线观看| 亚洲自拍与偷拍| 成人h动漫精品一区二区下载| 欧美精品粉嫩高潮一区二区| 人妻妺妺窝人体色www聚色窝 | 国产在线观看av| 久久人人97超碰精品888| 成人免费看黄| 99精彩视频| 欧美熟乱15p| av网站手机在线观看| 日韩黄色小视频| 亚洲v在线观看| 亚洲国产精品t66y| 日韩三级视频在线播放| 欧美色欧美亚洲另类二区| 人成网站在线观看| 久久精品视频在线播放| 色一区二区三区| 产国精品偷在线| 色综合色综合| 国产在线观看福利| jizz性欧美| 亚洲精品色婷婷福利天堂| 男人的天堂在线视频免费观看 | 亚洲女同性videos| 影音先锋男人资源在线| 国产精品99久久久久久www| 97超碰成人| www.午夜色| 日韩精彩视频在线观看| 国产人成视频在线观看| 亚洲欧美一区二区视频| 日韩免费av网站| 日韩av在线电影网| 久草在线视频资源| 91久久精品国产91性色| 国产99亚洲| 欧美色图另类小说| 高清不卡一区二区在线| 一区二区三区四区五区| 91福利小视频| 男女污视频在线观看| 97成人精品视频在线观看| 视频二区欧美| 欧美日韩午夜爽爽| 麻豆国产91在线播放| 黄色片在线观看免费| 色哟哟一区二区在线观看 | 久久久天堂av| 欧美一二三区视频| 亚洲电影免费观看高清完整版在线观看 | 久久久久国产精品麻豆ai换脸| 日韩精品一区二区三| 欧美精品一区二区三区蜜桃视频| 最爽无遮挡行房视频在线| 国产综合色香蕉精品| 大胆日韩av| 伊人国产在线视频| 欧美极品xxx| 国产成人精品亚洲| 中文字幕亚洲一区二区三区| 台湾成人免费视频| 日韩精品久久久| 美腿丝袜一区二区三区| 日本成人免费在线观看 | 亚洲这里只有精品| 中文一区二区在线观看| 91麻豆精品在线| 中文字幕欧美视频在线| 日本视频在线免费| 精品一区二区免费在线观看| 久久免费手机视频| 欧美美女直播网站| 91亚洲天堂| 国产精品成人一区二区三区| 亚洲视频中文| 野外性满足hd| 欧美性猛交xxxx黑人交| 在线观看av黄网站永久| 91久久国产婷婷一区二区| 亚洲色图网站| 香蕉视频污视频| 欧美性猛交丰臀xxxxx网站| 日本电影一区二区在线观看| 国产精品狠色婷| 99久久99久久精品国产片桃花| 午夜激情视频网| 亚瑟在线精品视频| 理论在线观看| 成人激情在线播放| 亚洲午夜伦理| 日韩精品电影一区二区| 欧美日本在线视频| 秋霞在线视频| 欧美日韩一区二| 久久99久久99精品免视看婷婷| 久久99久久久| 亚洲欧美一区二区三区情侣bbw | 精品国产一区二区三区麻豆免费观看完整版 | 中文字幕无码乱码人妻日韩精品| 日韩亚洲综合在线| 一级毛片精品毛片| 国产女女做受ⅹxx高潮| 1024成人网| 污视频在线免费观看| 国产精品视频在线播放| 欧美国产高潮xxxx1819| 亚洲国产欧美视频| 欧美一区二区在线播放| 蜜桃视频在线观看免费视频| 亚洲v国产v在线观看| 成人h动漫精品| 亚洲综合视频在线播放| 韩剧1988在线观看免费完整版| sdde在线播放一区二区| 少妇熟女视频一区二区三区| 欧美午夜影院一区| h片视频在线观看| 中文字幕99|