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

vivo Pulsar 萬億級消息處理實踐(3)-KoP指標異常修復

開發
KoP提供了從Kafka到Pulsar的無縫轉換,用戶可以使用Kafka API操作Pulsar集群,保留了Kafka的廣泛用戶基礎和豐富生態系統。它使得Pulsar可以更好地與Kafka進行整合,提供更好的消息傳輸性能、更強的兼容性及可擴展性。

本文是《vivo Pulsar萬億級消息處理實踐》系列文章第3篇。

Pulsar是Apache基金會的開源分布式流處理平臺和消息中間件,它實現了Kafka的協議,可以讓使用Kafka API的應用直接遷移至Pulsar,這使得Pulsar在Kafka生態系統中更加容易被接受和使用。KoP提供了從Kafka到Pulsar的無縫轉換,用戶可以使用Kafka API操作Pulsar集群,保留了Kafka的廣泛用戶基礎和豐富生態系統。它使得Pulsar可以更好地與Kafka進行整合,提供更好的消息傳輸性能、更強的兼容性及可擴展性。vivo在使用Pulsar KoP的過程中遇到過一些問題,本篇主要分享一個分區消費指標缺失的問題。

一、問題背景

在一次版本灰度升級中,我們發現某個使用KoP的業務topic的消費速率出現了顯著下降,具體情況如下圖所示:

什么原因導致正常的升級重啟服務器會出現這個問題呢?直接查看上報采集的數據報文:

kop_server_MESSAGE_OUT{group="",partitinotallow="0",tenant="kop",topic="persistent://kop-tenant/kop-ns/service-raw-stats"} 3
kop_server_BYTES_OUT{group="",partitinotallow="0",tenant="kop",topic="persistent://kop-tenant/kop-ns/service-raw-stats"} 188

我們看到,KoP消費指標kop_server_MESSAGE

_OUT、kop_server_BYTES_OUT是有上報的,但指標數據里的group標簽變成了空串(缺少消費組名稱),分區的消費指標就無法展示了。是什么原因導致了消費組名稱缺失?

二、問題分析

1、找到問題代碼

我們去找下這個消費組名稱是在哪里獲取的,是否邏輯存在什么問題。根據druid中的kop_subscription對應的消費指標kop_server_

MESSAGE_OUT、kop_server_BYTES_OUT,找到相關代碼如下:

private void handleEntries(final List<Entry> entries,
                               final TopicPartition topicPartition,
                               final FetchRequest.PartitionData partitionData,
                               final KafkaTopicConsumerManager tcm,
                               final ManagedCursor cursor,
                               final AtomicLong cursorOffset,
                               final boolean readCommitted) {
....
        // 處理消費數據時,獲取消費組名稱
        CompletableFuture<String> groupNameFuture = requestHandler
                .getCurrentConnectedGroup()
                .computeIfAbsent(clientHost, clientHost -> {
                    CompletableFuture<String> future = new CompletableFuture<>();
                    String groupIdPath = GroupIdUtils.groupIdPathFormat(clientHost, header.clientId());
                    requestHandler.getMetadataStore()
                            .get(requestHandler.getGroupIdStoredPath() + groupIdPath)
                            .thenAccept(getResultOpt -> {
                                if (getResultOpt.isPresent()) {
                                    GetResult getResult = getResultOpt.get();
                                    future.complete(new String(getResult.getValue() == null
                                            ? new byte[0] : getResult.getValue(), StandardCharsets.UTF_8));
                                } else {
                                    // 從zk節點 /client_group_id/xxx 獲取不到消費組,消費組就是空的
                                    future.complete("");
                                }
                            }).exceptionally(ex -> {
                                future.completeExceptionally(ex);
                                return null;
                            });
                    returnfuture;
                });


        // this part is heavyweight, and we should not execute in the ManagedLedger Ordered executor thread
        groupNameFuture.whenCompleteAsync((groupName, ex) -> {
            if (ex != null) {
                log.error("Get groupId failed.", ex);
                groupName = "";
            }
.....
            // 獲得消費組名稱后,記錄消費組對應的消費指標
            decodeResult.updateConsumerStats(topicPartition,
                    entries.size(),
                    groupName,
                    statsLogger);

代碼的邏輯是,從requestHandler的currentConnectedGroup(map)中通過host獲取groupName,不存在則通過MetadataStore(帶緩存的zk存儲對象)獲取,如果zk緩存也沒有,再發起zk讀請求(路徑為/client_group_id/host-clientId)。讀取到消費組名稱后,用它來更新消費組指標。從復現的集群確定走的是這個分支,即是從metadataStore(帶緩存的zk客戶端)獲取不到對應zk節點/client_group_id/xxx。

2、查找可能導致zk節點/client_group_id/xxx節點獲取不到的原因

有兩種可能性:一是沒寫進去,二是寫進去但是被刪除了。

@Override
    protected void handleFindCoordinatorRequest(KafkaHeaderAndRequest findCoordinator,
                                                CompletableFuture<AbstractResponse> resultFuture) {
...
        // Store group name to metadata store for current client, use to collect consumer metrics.
        storeGroupId(groupId, groupIdPath)
                .whenComplete((stat, ex) -> {
                    if (ex != null) {
                        // /client_group_id/xxx節點寫入失敗
                        log.warn("Store groupId failed, the groupId might already stored.", ex);
                    }
                    findBroker(TopicName.get(pulsarTopicName))
                            .whenComplete((node, throwable) -> {
                                ....
                            });
                });
...

從代碼看到,clientId與groupId的關聯關系是通過handleFindCoordinatorRequest(FindCoordinator)寫進去的,而且只有這個方法入口。由于沒有找到warn日志,排除了第一種沒寫進去的可能性。看看刪除的邏輯:

protected void close(){
    if (isActive.getAndSet(false)) {
        ...
        currentConnectedClientId.forEach(clientId -> {
            String path = groupIdStoredPath + GroupIdUtils.groupIdPathFormat(clientHost, clientId);
            // 刪除zk上的 /client_group_id/xxx 節點
            metadataStore.delete(path, Optional.empty())
                    .whenComplete((__, ex) -> {
                        if (ex != null) {
                            if (ex.getCause() instanceof MetadataStoreException.NotFoundException) {
                                if (log.isDebugEnabled()) {
                                    log.debug("The groupId store path doesn't exist. Path: [{}]", path);
                                }
                                return;
                            }
                            log.error("Delete groupId failed. Path: [{}]", path, ex);
                            return;
                        }
                        if (log.isDebugEnabled()) {
                            log.debug("Delete groupId success. Path: [{}]", path);
                        }
                    });
        });
    }
}

刪除是在requsetHandler.close方法中執行,也就是說連接斷開就會觸發zk節點刪除。

但有幾個疑問:

  • /client_group_id/xxx 到底是干嘛用的?消費指標為什么要依賴它
  • 為什么要在handleFindCoordinatorRequest寫入?
  • 節點/client_group_id/xxx為什么要刪除,而且是在連接斷開時刪除,刪除時機是否有問題?

首先回答第1個問題,通過閱讀代碼可以知道,/client_group_id/xxx 這個zk節點是用于在不同broker實例間交換數據用的(相當redis cache),用于臨時存放IP+clientId與groupId的映射關系。由于fetch接口(拉取數據)的request沒有groupId的,只能依賴加入Group過程中的元數據,在fetch消費時才能知道當前拉數據的consumer是哪個消費組的。

3、復現

若要解決問題,最好能夠穩定地復現出問題,這樣才能確定問題的根本原因,并且確認修復是否完成。

因為節點是在requsetHandle.close方法中執行刪除,broker節點關閉會觸發連接關閉,進而觸發刪除。假設:客戶端通過brokerA發起FindCoordinator請求,寫入zk節點/client_group

_id/xxx,同時請求返回brokerB作為Coordinator,后續與brokerB進行joinGroup、syncGroup等交互確定消費關系,客戶端在brokerA、brokerB、brokerC都有分區消費。這時重啟brokerA,分區均衡到BrokerC上,但此時/client_group_id/xxx因關閉broker而斷開連接被刪除,consumer消費剛轉移到topic1-partition-1的分區就無法獲取到groupId。

按照假設,有3個broker,開啟生產和消費,通過在FindCoordinator返回前獲取node.leader()的返回節點BrokerB,關閉brokerA后,brokerC出現斷點復現,再關閉brokerC,brokerA也會復現(假設分區在brokerA與brokerC之間轉移)。

復現要幾個條件:

  1. broker數量要足夠多(不小于3個)
  2.  broker內部有zk緩存metadataCache默認為5分鐘,可以把時間調小為1毫秒,相當于沒有cache
  3.  findCoordinator返回的必須是其他broker的IP
  4.  重啟的必須是接收到findCoordinator請求那臺broker,而不是真正的coordinator,這時會從zk刪除節點
  5. 分區轉移到其他broker,這時新的broker會重新讀取zk節點數據

到此,我們基本上清楚了問題原因:連接關閉導致zk節點被刪除了,別的broker節點需要時就讀取不到了。那怎么解決?

三、問題解決

方案一

既然知道把消費者與FindCoordinator的連接進行綁定不合適的,那么是否應該把FindCoordinator寫入zk節點換成由JoinGroup寫入,斷連即刪除。

consumer統一由Coordinator管理,由于FindCoordinator接口不一定是Coordinator處理的,如果換成由Coordinator處理的JoinGroup接口是否就可以了,這樣consumer斷開與Coordinator的連接就應該刪除數據。但實現驗證時卻發現,客戶端在斷連后也不會再重連,所以沒法重新寫入zk,不符合預期。

方案二

還是由FindCoordinator寫入zk節點,但刪除改為GroupCoordinator監聽consumer斷開觸發。

因為consumer統一由Coordinator管理,它能監聽到consumer加入或者離開。GroupCoordinator的removeMemberAndUpdateGroup方法是coordinator對consumer成員管理。

private void removeMemberAndUpdateGroup(GroupMetadata group,
                                        MemberMetadata member) {
    group.remove(member.memberId());
    switch (group.currentState()) {
        case Dead:
        case Empty:
            return;
        case Stable:
        case CompletingRebalance:
            maybePrepareRebalance(group);
            break;
        case PreparingRebalance:
            joinPurgatory.checkAndComplete(new GroupKey(group.groupId()));
            break;
        default:
            break;
    }
    // 刪除 /client_group_id/xxx 節點
    deleteClientIdGroupMapping(group, member.clientHost(), member.clientId());
}

調用入口有兩個,其中handleLeaveGroup是主動離開,onExpireHeartbeat是超時被動離開,客戶端正常退出或者宕機都可以調用removeMemberAndUpdateGroup方法觸發刪除。

public CompletableFuture<Errors> handleLeaveGroup(
    String groupId,
    String memberId
) {
    return validateGroupStatus(groupId, ApiKeys.LEAVE_GROUP).map(error ->
        CompletableFuture.completedFuture(error)
    ).orElseGet(() -> {
        return groupManager.getGroup(groupId).map(group -> {
            return group.inLock(() -> {
                if (group.is(Dead) || !group.has(memberId)) {
                    return CompletableFuture.completedFuture(Errors.UNKNOWN_MEMBER_ID);
                } else {
                    ...
                
                    // 觸發刪除消費者consumer
                    removeMemberAndUpdateGroup(group, member);
                    return CompletableFuture.completedFuture(Errors.NONE);
                }
            });
        })
        ....
    });
}


void onExpireHeartbeat(GroupMetadata group,
                       MemberMetadata member,
                       long heartbeatDeadline) {
    group.inLock(() -> {
        if (!shouldKeepMemberAlive(member, heartbeatDeadline)) {
            log.info("Member {} in group {} has failed, removing it from the group",
                member.memberId(), group.groupId());
            // 觸發刪除消費者consumer
            removeMemberAndUpdateGroup(group, member);
        }
        return null;
    });
}

但這個方案有個問題是,日志運維關閉broker也會觸發一個onExpireHeartbeat事件刪除zk節點,與此同時客戶端發現Coordinator斷開了會馬上觸發FindCoordinator寫入新的zk節點,但如果刪除晚于寫入的話,會導致誤刪除新寫入的節點。我們干脆在關閉broker時,使用ShutdownHook加上shuttingdown狀態防止關閉broker時刪除zk節點,只有客戶端斷開時才刪除。

這個方案修改上線半個月后,還是出現了一個客戶端的消費指標無法上報的情況。后來定位發現,如果客戶端因FullGC出現卡頓情況,客戶端可能會先于broker觸發超時,也就是先超時的客戶端新寫入的數據被后監聽到超時的broker誤刪除了。因為寫入與刪除并不是由同一個節點處理,所以無法在進程級別做并發控制,而且也無法判斷哪次刪除對應哪次的寫入,所以用zk也是很難實現并發控制。

方案三

其實這并不是新的方案,只是在方案二基礎上優化:數據一致性檢查。

既然我們很難控制好寫入與刪除的先后順序,我們可以做數據一致性檢查,類似于交易系統里的對賬。因為GroupCoordinator是負責管理consumer成員的,維護著consumer的實時狀態,就算zk節點被誤刪除,我們也可以從consumer成員信息中恢復,重新寫入zk節點。

private void checkZkGroupMapping(){  
    for (GroupMetadata group : groupManager.currentGroups()) {  
        for (MemberMetadata memberMetadata : group.allMemberMetadata()) {  
            String clientPath = GroupIdUtils.groupIdPathFormat(memberMetadata.clientHost(), memberMetadata.clientId());  
            String zkGroupClientPath = kafkaConfig.getGroupIdZooKeeperPath() + clientPath;  
            // 查找zk中是否存在節點
            metadataStore.get(zkGroupClientPath).thenAccept(resultOpt -> {  
                if (!resultOpt.isPresent()) {  
                    // 不存在則進行補償修復
                    metadataStore.put(zkGroupClientPath, memberMetadata.groupId().getBytes(UTF\_8), Optional.empty())  
                            .thenAccept(stat -> {  
                                log.info("repaired clientId and group mapping: {}({})",  
                                        zkGroupClientPath, memberMetadata.groupId());  
                            })  
                            .exceptionally(ex -> {  
                                log.warn("repaired clientId and group mapping failed: {}({})",  
                                        zkGroupClientPath, memberMetadata.groupId());  
                                return null;  
                            });  
                }  
            }).exceptionally(ex -> {  
                log.warn("repaired clientId and group mapping failed: {} ", zkGroupClientPath, ex);  
                return null;  
            });  
        }  
    }  
}

經過方案三的優化上線,即使是歷史存在問題的消費組,個別分區消費流量指標缺少group字段的問題也得到了修復。具體效果如下圖所示:

四、總結

經過多個版本的優化和線上驗證,最終通過方案三比較完美的解決了這個消費指標問題。在分布式系統中,并發問題往往難以模擬和復現,我們也在嘗試多個版本后才找到有效的解決方案。如果您在這方面有更好的經驗或想法,歡迎提出,我們共同探討和交流。

責任編輯:龐桂玉 來源: vivo互聯網技術
相關推薦

2025-06-12 02:00:00

2025-08-14 10:01:00

vivoPulsarAnsible運維

2025-06-05 09:06:08

2022-09-14 23:14:10

vivoPulsar大數據

2023-12-06 21:44:28

RocksDBvivo

2022-05-19 09:31:50

Kafka 集群數據存儲服務端

2022-12-28 08:17:19

異常處理code

2023-01-11 21:11:37

RabbitMQRocketMQ消息中間件

2024-03-28 12:55:00

消息中間件RocketMQ

2019-11-05 17:10:19

Java開發編程語言

2018-12-25 09:44:42

2023-02-07 09:43:48

監控系統

2018-02-06 09:05:25

Java異常處理代碼

2017-06-02 10:25:26

Java異常處理

2019-12-25 10:17:53

騰訊Elasticsear開源

2022-05-12 09:39:01

HDFSvivo集群

2019-12-25 09:10:44

技術研發指標

2013-04-01 09:39:06

JavaJava異常

2023-11-01 07:01:45

2023-06-15 07:49:33

點贊
收藏

51CTO技術棧公眾號

99综合视频| 欧美第一在线视频| 国产日韩欧美激情| 国产精品视频99| 欧美亚洲日本在线| 东京久久高清| 欧美性猛交xxxx乱大交退制版| 午夜精品一区二区在线观看 | 黄色av网站在线| 蜜桃久久久久久久| 久久久久久久亚洲精品| 丰满少妇在线观看资源站| 黄色日韩网站| 亚洲一级片在线观看| 日韩一区国产在线观看| 亚洲大尺度网站| 日韩成人午夜精品| 久久久久久久久电影| 亚洲午夜精品久久久久久高潮| 免费观看亚洲视频大全| 色婷婷激情综合| 免费的一级黄色片| а天堂8中文最新版在线官网| 国产成人h网站| 国产精品久久久久9999| 久久久久久久久久久久久久久久久 | 国产在线观看一区二区三区| 国产无码精品在线观看| 欧美电影三区| 亚洲另类激情图| 又黄又爽又色的视频| 擼擼色在线看观看免费| 亚洲免费视频中文字幕| 亚洲日本无吗高清不卡| 男男激情在线| 91在线免费视频观看| 91在线播放视频| 国产精品爽爽久久| 日韩国产成人精品| 国产91免费观看| 日本在线观看视频网站| 欧美在线三级| 久久精品99久久久香蕉| 无码 人妻 在线 视频| 久久aimee| 精品成人一区二区| 天天操夜夜操很很操| 欧美天堂一区| 欧美日韩一区二区不卡| 国产男女激情视频| 精品国产免费人成网站| 欧美日韩亚洲网| 男人用嘴添女人下身免费视频| 欧美videossex另类| 亚洲精品videosex极品| 男插女免费视频| 黄色网址免费在线观看| 亚洲人成在线播放网站岛国| 成年人免费观看的视频| 黄色网页在线播放| 中文字幕一区二区三区av| 中文视频一区视频二区视频三区| 日本成人网址| 亚洲欧美激情插| 乱熟女高潮一区二区在线| 怡红院在线播放| 亚洲制服欧美中文字幕中文字幕| 精品人妻人人做人人爽| 538在线精品| 亚洲成av人片一区二区三区| 欧洲黄色一级视频| 免费亚洲电影| 欧美理论片在线| 巨乳女教师的诱惑| 国产精品chinese在线观看| 亚洲国产欧美一区二区三区同亚洲| 香港三日本8a三级少妇三级99| 免费萌白酱国产一区二区三区| 日韩精品中文字| 黄色激情小视频| 欧美激情五月| 456国产精品| 无码人妻一区二区三区线| 美洲天堂一区二卡三卡四卡视频 | 国产日韩精品一区二区三区| 亚洲伊人婷婷| 四虎av在线| 欧美日韩亚洲激情| 日本黄色福利视频| 一区二区三区欧洲区| 精品视频www| 啪啪一区二区三区| 尹人成人综合网| 国产成人综合精品在线| 国产又粗又长又黄| 91香蕉视频mp4| 浴室偷拍美女洗澡456在线| tube8在线hd| 欧美三级电影在线观看| 大桥未久恸哭の女教师| 欧美日韩国产在线观看网站| 九色成人免费视频| 欧美日韩在线视频播放| 国产成人免费视频一区| 日本高清一区| 牛牛精品视频在线| 欧美性淫爽ww久久久久无| 香蕉网在线视频| 成人情趣视频网站| 午夜精品久久久久久久99热 | 黑人巨大亚洲一区二区久| 91精品蜜臀在线一区尤物| 亚洲AV无码国产精品| 国产精品7m凸凹视频分类| 97av在线播放| www.五月激情| 国产精品每日更新| 黄色免费观看视频网站| 久久三级中文| 自拍视频国产精品| 天天做天天爱夜夜爽| 国产精品77777竹菊影视小说| 欧美日韩一区二区视频在线观看| 羞羞网站在线看| 欧美日韩一级大片网址| 大地资源二中文在线影视观看| 日韩在线精品| 国产精品444| 香蕉视频911| 亚洲午夜免费电影| 国产xxxxhd| 四季av在线一区二区三区| 欧美亚洲日本黄色| 韩国av免费在线| 亚洲免费在线播放| 亚洲精品在线视频播放| 四虎影视精品| 68精品久久久久久欧美| 蜜桃av鲁一鲁一鲁一鲁俄罗斯的 | 免费av网站在线| www.视频一区| 亚洲熟妇无码一区二区三区| 国产一区二区三区精品在线观看 | 91九色国产在线播放| 欧美一区二区三区在| 小嫩苞一区二区三区| 免费国产亚洲视频| 视频一区二区三区在线观看| 桃花岛成人影院| 亚洲欧美www| 色老头一区二区| 国产三级精品在线| 天堂av在线网站| 日韩电影在线视频| 国产自产女人91一区在线观看| 在线观看免费高清完整| 欧美日韩国产首页| 欧美美女性生活视频| 久久99国产精品免费| 尤物一区二区三区| 疯狂欧洲av久久成人av电影| 久久影院免费观看| 性生活视频软件| 亚洲成a人片综合在线| 中文字幕在线永久| 午夜亚洲性色视频| 日本一区二区在线视频| 成人国产在线| 两个人的视频www国产精品| 99在线小视频| 午夜精品久久久| 男女黄床上色视频| 美女免费视频一区二区| 国产精品h视频| 97久久综合精品久久久综合| 97在线看福利| 精品亚洲成a人片在线观看| 欧美日韩一区成人| 免看一级a毛片一片成人不卡| 成人av在线一区二区三区| 啊啊啊一区二区| 久久中文亚洲字幕| 99se婷婷在线视频观看| 亚洲精品永久免费视频| 色狠狠av一区二区三区香蕉蜜桃| 精品国精品国产自在久不卡| 五月天精品一区二区三区| 制服 丝袜 综合 日韩 欧美| 激情综合亚洲精品| 国产69精品久久久久久久| 国产成人精品三级高清久久91| 成人免费午夜电影| 国产激情在线播放| 日韩在线视频一区| 韩国中文字幕hd久久精品| 日本二三区不卡| 欧美日韩在线视频免费播放| 久久综合资源网| 国产高清999| 免费亚洲一区| 免费国产成人看片在线| 伊人久久综合影院| 91福利入口| 四虎4545www精品视频| 九九热在线精品视频| 黄网在线观看| 亚洲成人av片| 91肉色超薄丝袜脚交一区二区| 亚洲不卡一区二区三区| 免费黄色激情视频| 久久久久久久久久久电影| 日本女人黄色片| 日本v片在线高清不卡在线观看| 亚洲精品无码国产| 99精品一区| 日本一区二区三不卡| 亚洲性视频在线| 成人性生交大片免费观看嘿嘿视频| 九色porny丨入口在线| 久久国内精品一国内精品| 亚洲三级中文字幕| 欧美大片日本大片免费观看| 亚洲一卡二卡在线| 色综合一个色综合亚洲| 久久久夜色精品| 亚洲色图制服诱惑| 久操视频在线观看免费| 91蜜桃在线观看| 手机在线成人av| 国产xxx精品视频大全| 日韩成人精品视频在线观看| 日韩1区2区日韩1区2区| 黄色动漫网站入口| 伊人天天综合| 日韩精品一区在线视频| 午夜性色一区二区三区免费视频| 宅男一区二区三区| 欧美丝袜激情| 日本免费一区二区三区| 亚洲精品亚洲人成在线观看| 狠狠色综合色区| swag国产精品一区二区| 成人免费视频视频在| 亚洲精品一区二区三区中文字幕| 91精品视频观看| 狠狠久久综合| 成人午夜激情免费视频| 亚洲ww精品| 91免费综合在线| 国产精品成人3p一区二区三区| 成人av在线天堂| 国产免费av国片精品草莓男男| 成人黄色大片在线免费观看| 日韩专区视频| 亚洲一区二区三区香蕉 | 青娱乐精品视频| 国产喷水theporn| 久久99久久久欧美国产| 看看黄色一级片| 国产精品白丝jk黑袜喷水| 原创真实夫妻啪啪av| 国产精品白丝jk白祙喷水网站| 亚洲av午夜精品一区二区三区| 国产成a人亚洲精品| 一级黄色片毛片| 久久综合一区二区| 调教驯服丰满美艳麻麻在线视频| 中国av一区二区三区| 亚洲av无一区二区三区| 亚洲另类中文字| 日本在线小视频| 色噜噜狠狠色综合欧洲selulu| 在线观看中文字幕网站| 91精品国产全国免费观看| 亚洲第一天堂影院| 亚洲美女又黄又爽在线观看| 波多野结衣一区二区| 欧美乱人伦中文字幕在线| 成人性生交大片免费看在线播放| 欧美壮男野外gaytube| 91欧美精品| 超碰国产精品久久国产精品99| 美女扒开腿让男人桶爽久久动漫| 日本日本精品二区免费| 亚洲澳门在线| 人人妻人人添人人爽欧美一区| 日韩经典中文字幕一区| 免费观看黄网站| 久久五月婷婷丁香社区| 天天做夜夜爱爱爱| 五月综合激情日本mⅴ| 中国女人真人一级毛片| 日韩免费成人网| 第一福利在线| 欧美日产国产成人免费图片| 亚洲第一av| 97超碰最新| 精品国产一区探花在线观看 | 中文亚洲免费| 爱爱爱爱免费视频| caoporn国产精品| 亚洲综合图片一区| 欧美日韩一二三四五区| 国产又粗又猛视频| 日韩精品免费综合视频在线播放| 免费高清在线观看| 日本精品一区二区三区在线| 日韩有吗在线观看| 西游记1978| 国产免费成人| 日本wwww色| 国产精品美女久久福利网站| 欧美精品二区三区| 欧美一级艳片视频免费观看| 风间由美一区| 欧美性受xxxx黑人猛交| 视频在线观看免费影院欧美meiju| 日韩欧美三级电影| 一区二区三区福利| aaaaaaaa毛片| 国产精品高潮呻吟久久| 无码人妻一区二区三区线| 亚洲国产又黄又爽女人高潮的| 超碰免费在线播放| 国产乱肥老妇国产一区二| 最新国产精品视频| 男女激情无遮挡| 成人一级黄色片| 免费中文字幕日韩| 欧美性xxxxxx少妇| 免费国产在线观看| 欧美在线一级视频| 精品国产一区二区三区不卡蜜臂 | 国产精品日韩久久久| 韩国三级在线看| 亚洲欧美日韩成人高清在线一区| 在线视频 91| 中文字幕日韩精品在线| 国产精品扒开腿做爽爽爽视频软件| 久久精品国产综合精品| 亚洲成人原创| 国产精品成人免费一区久久羞羞| 亚洲免费伊人电影| 99精品久久久久久中文字幕| 久久精品99久久久久久久久| 在线不卡一区| 国产免费色视频| 国产激情偷乱视频一区二区三区| 中文字幕无码日韩专区免费 | 亚洲国产aⅴ天堂久久| 国产高潮流白浆喷水视频| 久久天堂电影网| 美女精品久久| 国产又粗又猛又爽又黄的网站| 国产高清精品在线| 久久中文字幕在线观看| 精品国产伦理网| 日本在线高清| 日本不卡一区二区三区在线观看 | 希岛爱理av一区二区三区| 中文av一区二区三区| 国产精品情趣视频| 91在线你懂的| 九九热这里只有精品免费看| 国产丝袜一区| 国产成人久久婷婷精品流白浆| 久久亚洲精品国产精品紫薇| 高潮毛片又色又爽免费| 伊人伊人伊人久久| 高清久久精品| 久久国产午夜精品理论片最新版本| 99re热视频这里只精品| 免费污污视频在线观看| 在线观看免费高清视频97| 啪啪av大全导航福利综合导航| 在线观看污视频| 99r国产精品| 伊人网av在线| 欧美日本在线视频中文字字幕| 狠狠一区二区三区| 国产自偷自偷免费一区| 日韩理论片网站| 日本高清视频网站| 国产精品久久久久久久久免费看| 亚洲成人精品| 色噜噜在线观看| 欧美伦理视频网站| 高清精品在线| 亚洲 日韩 国产第一区| 国产成人免费高清| 黄色一级视频免费看| 不卡av日日日| 国产成人调教视频在线观看| 一级做a爱视频| 欧美性极品xxxx娇小| 精品黄色免费中文电影在线播放| 久久精品日韩精品| 国产美女娇喘av呻吟久久| 日韩免费黄色片| 久久久999精品免费|