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

來聊聊 Redis 哨兵如何主觀認定下線

數據庫 Redis
本文我們分析 redis 如何通過 raft 完成哨兵 leader 選舉,并完成主從節點故障轉移工作,

上一篇我們將redis哨兵初始化分析完成,接下來我們就可以開始分析redis如何通過raft完成哨兵leader選舉,并完成主從節點故障轉移工作,因為篇幅原因,關于redis故障轉移的內容將分為兩個篇章,而這篇討論的是哨兵如何完成主觀下線的判定。

一、詳解哨兵的主觀認定下線的流程

1. 簡述raft協議

在正式開始后續的文章討論前,我們先來簡單介紹一下分布式共識raft協議,這個是分布式系統中保證高可用的選舉協議。該協議將所有分布式系統的節點分為3個角色:

  • leader: 當前分布式集群中的主節點,即集群中的領導角色,負責承載當前系統中的核心業務。
  • follower: 從節點,作為leader節點的跟隨節點。
  • candidate:一旦leader發生故障被slave感知,那么這些節點會將自身角色轉為Canadian,并發起選舉,得票數最多的Canadian將轉為新的leader。

正常情況下,被選舉為leader的節點會向follower節點發送心跳,告知自己當前還未下線:

一旦follower感知到leader下線,就會將自己身份轉換為candidate,通過選舉競爭leader,每一個candidate都會給自己投一票然后向其他選舉節點獲取選票,在選舉計時時間以內,超過半數以上得票的candidate就會被選舉為新的leader節點,其余candidate收到此leader的心跳消息后身份就會轉為最新leader節點的follower:

2. redis中的raft協議與核心流程

與傳統raft協議實現有所不同,redis哨兵在未發生選舉時地位是對等并無leader和follower等概念,只有感知到監聽主節點下線時才會借助raft的協議觸發選舉,選舉出一個哨兵作為leader完成故障轉移之后,leader哨兵會再次回歸對等地位。

redis哨兵執行的生命周期還是交由時間事件定時執行,它的整體工作流程為:

  • 檢查自己所監聽的master連接情況,檢查是否與監聽的master節點斷開連接,如果發現連接斷開則進行斷線重連。
  • 再對master節點進行消息通信,這期間哨兵會發送ping與主節點保持通信,再發送info請求master最新信息。
  • 一旦發現master長時間未與自己進行心跳,則主觀視為監聽節點下線,并通過頻道告知其他哨兵獲取其他哨兵對于主節點的結果判斷。
  • 如果哨兵一致認定當前監聽節點下線,則會選舉出一個哨兵作為leader進行故障轉移,即在所有從節點中找到一個優先級最高的從節點作為新的master。

對此我我們給出程序執行的入口來查看這塊核心的主流程,可以看到serverCron定時執行的時間時間會每100ms執行一次哨兵的時間事件sentinelTimer,對此我們不妨步入sentinelTimer查看實現細節:

int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) {
//......    
    //100ms一次,如果是哨兵模式則運行哨兵的時間事件
    run_with_period(100) {
        if (server.sentinel_mode) sentinelTimer();
    }
//......
}

步入sentinelTimer,該函數會先判斷哨兵執行時間是否過長,如果發現時鐘回撥或者長時間才進行處理則觸發tilt模式,該模式下哨兵只會定期發送和接收消息,不做其他任務處理。

再調用sentinelHandleDictOfRedisInstances遍歷哨兵中的master開始開始進行我們上述所說的判斷與master連接狀態、進行通信和info消息獲取、主觀下線判斷、客觀下線判斷、故障轉移。

完成這些步驟之后,更新下一次的執行時間,可以看到redis對于這個時間設置做了一個巧妙的設計,我們都知道哨兵判定節點下線后就會發起選舉,為了避免哨兵集群所有節點同時發起選舉投票從而得到相同票數的情況而導致本輪選舉失敗而進行反復選舉的情況,redis會在哨兵本次時間事件執行完成之后,通過隨機種子調整哨兵時間下一次的執行時機,盡可能避免選舉時反復出現選票一致的情況:

對此我們也給出sentinelTimer的實現細節:

void sentinelTimer(void) {
    // 前置檢查事件定期任務是否因為系統負載過大或者各種原因導致時鐘回撥,或者處理過長,進入tilt模式,該模式哨兵只會定期發送和接收命令
    sentinelCheckTiltCondition();
    //監聽的master節點作為參數傳入,進行逐個通信處理
    sentinelHandleDictOfRedisInstances(sentinel.masters);
    //......
    //隨機調整執行頻率避免同時執行,確保提高選舉一次性成功的概率
    server.hz = REDIS_DEFAULT_HZ + rand() % REDIS_DEFAULT_HZ;
}

我們再次步入核心方法sentinelHandleDictOfRedisInstances它會遍歷每一個master節點,然后調用sentinelHandleRedisInstance處理每一個哨兵所監聽的master實例:

void sentinelHandleDictOfRedisInstances(dict *instances) {
     //.......
    //迭代出每一個master實例再對主節點進行處理
    di = dictGetIterator(instances);
    while((de = dictNext(di)) != NULL) {
        sentinelRedisInstance *ri = dictGetVal(de);
        //迭代并處理每一個master實例
        sentinelHandleRedisInstance(ri);
        //.......
    }
    //.......
}

步入sentinelHandleRedisInstance即可看到我們上文所說的而核心邏輯,它對于筆者上文的每一個流程都做了抽象,可以看到它會先嘗試和斷線的master建立連接,然后發送ping和info獲取master節點的確認和master實時消息,最后在檢查master是否超時未回復發起主觀下線,然后再發起客觀下線請求確認其他哨兵回復。 最后明確master節點確實下線之后再發起選舉,得出leader后由leader進行故障轉移,挑選出新的master承載核心業務。

//這個入參包含恰哨兵實例和當前主節點的從節點信息
void sentinelHandleRedisInstance(sentinelRedisInstance *ri) {
    /* ========== MONITORING HALF ============ */
    /* Every kind of instance */
    //1. 嘗試和斷連的實例重新建立連接
    sentinelReconnectInstance(ri);
    //2. 向實例發送ping和info等命令
    sentinelSendPeriodicCommands(ri);

  //......

    /* Every kind of instance */
    //3. 主觀判斷是否下線
    sentinelCheckSubjectivelyDown(ri);

    /* Masters and slaves */
    if (ri->flags & (SRI_MASTER|SRI_SLAVE)) {
        /* Nothing so far. */
    }

    /* Only masters */
    if (ri->flags & SRI_MASTER) {
        //4. 檢查其當前是否客觀下線
        sentinelCheckObjectivelyDown(ri);
        //5.  判斷是否要進行故障切換,如果要啟動故障切換,則獲取其他哨兵對于該節點的判斷
        if (sentinelStartFailoverIfNeeded(ri))
            sentinelAskMasterStateToOtherSentinels(ri,SENTINEL_ASK_FORCED);
        //6. 執行故障切換
        sentinelFailoverStateMachine(ri);
        //7. 再次獲取哨兵實例對主節點狀態的判斷
        sentinelAskMasterStateToOtherSentinels(ri,SENTINEL_NO_FLAGS);
    }
}

3. 斷線重連檢查

基于上文我們了解哨兵時間事件執行的大體流程,接下來我們會針對每一個流程進行詳細的分析,首先我們先來了解一下對于斷線重連檢查方法,對于斷線重連檢查,redis哨兵通過兩個異步的連接進行處理,它通過cc這個異步連接和master建立通信完成PING和INFO的消息發送,再通過pc處理各種廣播消息:

我們都知道redis將哨兵中每一個維護的master封裝成sentinelRedisInstance ,這其中就有cc和pc兩個連接指針,用于和當前哨兵建立連接和通信:

typedef struct sentinelRedisInstance {
    //......
    //異步發送命令的連接
    redisAsyncContext *cc; /* Hiredis context for commands. */
    //pub/sub發送通道,用于處理頻道消息的收發
    redisAsyncContext *pc; 
 //......
}

此時我們再來查看sentinelReconnectInstance方法內部,即非常直觀了解到其內部對于斷開或者為空的連接會調用redisAsyncConnectBind方法通過外部遍歷master傳入的master結構體信息發起異步連接重建:

void sentinelReconnectInstance(sentinelRedisInstance *ri) {
    if (!(ri->flags & SRI_DISCONNECTED)) return;

    /* Commands connection. */
    //如果命令指針cc為空,則進行一次異步重連
    if (ri->cc == NULL) {
     //基于外部遍歷傳入的master指針進行異步重連
        ri->cc = redisAsyncConnectBind(ri->addr->ip,ri->addr->port,REDIS_BIND_ADDR);
        //如果連接失敗則調用sentinelKillLink銷毀該連接
        if (ri->cc->err) {
            sentinelEvent(REDIS_DEBUG,"-cmd-link-reconnection",ri,"%@ #%s",
                ri->cc->errstr);
            sentinelKillLink(ri,ri->cc);
        } else {
          //......
        }
    }
   
    //檢查發布訂閱pc,如果為空則將外部傳入的master信息通過異步的方式重新和頻道建立連接
    if ((ri->flags & (SRI_MASTER|SRI_SLAVE)) && ri->pc == NULL) {
        ri->pc = redisAsyncConnectBind(ri->addr->ip,ri->addr->port,REDIS_BIND_ADDR);
        if (ri->pc->err) {
            sentinelEvent(REDIS_DEBUG,"-pubsub-link-reconnection",ri,"%@ #%s",
                ri->pc->errstr);
            sentinelKillLink(ri,ri->pc);
        } else {
            //......
          
        }
    }
  //......
}

4. 消息通信

完成連接重建之后,在所有連接正常的情況下,哨兵會檢查當前發送上次ping間隔是否超過指定間隔,如果是則通過cc指指針向master發送ping。 同理如果info消息超過發送間隔也會生成當前哨兵ip端口等基本信息通過cc通道發送給masrter:

對此我們給出命令定期發送函數sentinelSendPeriodicCommands的入口,可以看到它會依次檢查ping和hello消息的間隔邏輯,然后按需通過cc發送ping或者hello消息:

void sentinelSendPeriodicCommands(sentinelRedisInstance *ri) {
    //......
 //和其他哨兵處理的邏輯
    if ((ri->flags & SRI_SENTINEL) == 0 &&
        (ri->info_refresh == 0 ||
        (now - ri->info_refresh) > info_period))
    {
       //......
    } else if ((now - ri->last_pong_time) > ping_period) {//超過ping間隔發ping
       
        sentinelSendPing(ri);
    } else if ((now - ri->last_pub_time) > SENTINEL_PUBLISH_PERIOD) {//超過pub間隔通過cc發送當前哨兵個人信息
        sentinelSendHello(ri);
    }
}

我們步入sentinelSendPing可以看到其內部邏輯比較簡單,通過cc發送ping然后更新上次發送ping的時間戳字段last_ping_time:

int sentinelSendPing(sentinelRedisInstance *ri) {
 //通過cc異步命令接口發送ping
    int retval = redisAsyncCommand(ri->cc,
        sentinelPingReplyCallback, NULL, "PING");
      //如果得到正常響應則更新last_ping_time 
    if (retval == REDIS_OK) {
        ri->pending_commands++;
       
        if (ri->last_ping_time == 0) ri->last_ping_time = mstime();
        return 1;
    } else {
        return 0;
    }
}

同理我們給出sentinelSendHello函數,可以看到其內部會組裝當前哨兵的ip和端口以及master的地址信息通過cc發送到__sentinel__:hello這個頻道中進行廣播:

int sentinelSendHello(sentinelRedisInstance *ri) {
   //......

    /* Format and send the Hello message. */
    //將哨兵ip 端口以及master地址信息數據拼接到payload中
    snprintf(payload,sizeof(payload),
        "%s,%d,%s,%llu," /* Info about this sentinel. */
        "%s,%s,%d,%llu", /* Info about current master. */
        announce_ip, announce_port, server.runid,
        (unsigned long long) sentinel.current_epoch,
        /* --- */
        master->name,master_addr->ip,master_addr->port,
        (unsigned long long) master->config_epoch);
        //通過cc異步發送到__sentinel__:hello頻道中
    retval = redisAsyncCommand(ri->cc,
        sentinelPublishReplyCallback, NULL, "PUBLISH %s %s",
            SENTINEL_HELLO_CHANNEL,payload);
    if (retval != REDIS_OK) return REDIS_ERR;
    ri->pending_commands++;
    return REDIS_OK;
}

5. 判定主觀下線

然后就開始主觀下線的檢查,可以看到redis一旦發現master長時間未與當前哨兵進行通信,亦或者在很長一段時間都被報告為從節點,則將主觀判定其下線,再通過或預運算符將ri的flags標志位注明這個master已經主觀的被認定為下線。最后通過通過 +sdown這個channel 發送主觀下線的消息,讓他們各自檢查,從而開始后續客觀下線檢查及選舉和故障轉移等操作:

對應的我們也給出sentinelCheckSubjectivelyDown函數的實現,可以我們補充弄一下down_after_period 這個是就是決定Sentinel判斷實例進入主觀下線所需的時間長度,默認情況下是30000毫秒,如果需要修改我們可以在redis.conf中用down-after-milliseconds指定:

void sentinelCheckSubjectivelyDown(sentinelRedisInstance *ri) {
   //......
   
    //如果上一次到現在的間隔elapsed 大于down_after_period ,則當前哨兵會主觀認定其下線
    if (elapsed > ri->down_after_period ||
    //或者當前哨兵認定它是master而其他報告長時間的反饋都是從節點,則當前哨兵會主觀認定其下線
        (ri->flags & SRI_MASTER &&
         ri->role_reported == SRI_SLAVE &&
         mstime() - ri->role_reported_time >
          (ri->down_after_period+SENTINEL_INFO_PERIOD*2)))
    {
       
        //通過 +sdown這個channel 發送主觀下線的消息
        if ((ri->flags & SRI_S_DOWN) == 0) {
            sentinelEvent(REDIS_WARNING,"+sdown",ri,"%@");
            //設置當前監控的master實例為主觀下線
            ri->s_down_since_time = mstime();
            ri->flags |= SRI_S_DOWN;
        }
    } else {
       //......
    }
}

二、小結

自此我們將redis哨兵主觀下線的核心流程分析完成,我們來簡單小結一下哨兵判斷主觀下線的流程:

  • 哨兵實例隨機一個hz參數作為定時器執行間隔,即執行一個哨兵定時事件sentinelTimer,
  • sentinelTimer會定期調用sentinelHandleDictOfRedisInstances遍歷檢查監控的master進行定時的交互。
  • 哨兵實例定期發送ping和hello亦或者info請求給master。
  • master超過down_after_period設置的時間沒有回應,或者其他角色長時間報告這個master已經是slave,則當前哨兵會主觀認定其下線,并將消息發送到+sdown中。
  • 結束一次定時任務后,定時器sentinelTimer執行完后設置下一次隨機執行時間,保證在主觀與客觀認定master下線后通過隨機性提升選舉的效率。
責任編輯:趙寧寧 來源: 寫代碼的SharkChili
相關推薦

2022-05-17 22:20:41

哨兵Redis機制

2025-02-24 10:07:09

Redis節點遷移集群

2025-02-19 10:27:48

哨兵Redis故障轉移

2025-03-03 10:25:10

2023-10-25 08:01:30

redis主庫服務

2021-02-01 08:28:24

Linux線程池Linux系統

2024-02-04 09:00:00

向量查詢數據檢索MyScale

2022-06-21 07:51:06

Redis高可用哨兵進程

2020-09-02 17:28:26

Spring Boot Redis集成

2024-02-21 08:19:54

2017-10-17 14:05:52

網站Redis 2Redis 3

2024-07-16 08:38:06

2021-09-30 10:59:11

DockerRedisExporter

2025-02-13 11:11:53

Redis哨兵代碼

2023-09-27 06:26:07

2024-01-01 08:46:32

2023-10-26 07:47:53

Redis哨兵集群

2019-01-28 09:32:30

跳槽員工程序員

2025-06-11 08:20:00

JVM線程代碼

2025-07-09 07:30:00

點贊
收藏

51CTO技術棧公眾號

免费观看亚洲天堂| 久草在线视频福利| 麻豆国产欧美日韩综合精品二区| 日韩少妇与小伙激情| 绯色av蜜臀vs少妇| 亚洲男人av| 日韩码欧中文字| 精品国产91亚洲一区二区三区www| 精品人妻一区二区三区潮喷在线| 国产精品国产三级国产在线观看| 欧美精品一区二区不卡| 天天干在线影院| av伦理在线| 国产精品网站一区| 国严精品久久久久久亚洲影视| 五月天中文字幕| 一区二区激情| 欧美插天视频在线播放| 国产精品美女高潮无套| 亚洲一区二区三区日本久久九| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 久久久久久草| 成人福利小视频| 免费xxxx性欧美18vr| 91国内免费在线视频| 日本黄色片免费观看| 伊人久久大香线蕉| 亚洲国产精品资源| 中文字幕无码毛片免费看| 亚洲精品国产嫩草在线观看| 亚洲福利一区二区三区| 中国老女人av| 伦xxxx在线| 国产女人aaa级久久久级| 国产精品高清一区二区三区| 一级黄色片在线播放| 久久深夜福利| 欧美中文字幕视频| 日韩美女黄色片| 黄色免费成人| 大量国产精品视频| 99自拍视频在线| 欧美国产一区二区三区激情无套| 亚洲天堂色网站| 丰满少妇高潮一区二区| 天堂成人娱乐在线视频免费播放网站| 日韩精品一区二区三区视频| 久久精品国产露脸对白| 视频欧美精品| 欧美精品在线观看播放| 9久久婷婷国产综合精品性色| 成人片免费看| 色婷婷久久综合| 成人三级视频在线播放| 日本韩国欧美| 在线观看亚洲一区| 日本888xxxx| 久久日本片精品aaaaa国产| 在线观看亚洲专区| 色播五月综合网| **精品中文字幕一区二区三区| 欧美人动与zoxxxx乱| 依人在线免费视频| 青草伊人久久| 亚洲国产精品成人va在线观看| 亚洲一区二区乱码| 一区二区三区韩国免费中文网站| 亚洲无av在线中文字幕| 五月激情四射婷婷| 天天射—综合中文网| 欧美猛交免费看| 日韩xxxxxxxxx| 美女国产精品| 成人深夜直播免费观看| www.久久综合| 91色.com| 伊人久久青草| 欧美aaa免费| 婷婷久久综合九色综合伊人色| 黄色片一级视频| 全球中文成人在线| 精品久久久久久久一区二区蜜臀| 日韩www视频| 精品毛片免费观看| 美女扒开尿口让男人操亚洲视频网站| 国产小视频在线观看免费| 国产精品毛片在线| 国产欧美日韩精品丝袜高跟鞋| www天堂在线| 久久久久久夜精品精品免费| 免费观看黄色的网站| bl在线肉h视频大尺度| 在线视频综合导航| 欧美日韩一区二区区别是什么| 中国av一区| 久久九九国产精品怡红院| 日韩伦理在线视频| 韩国av一区二区| 欧美亚洲另类久久综合| av在线看片| 色一区在线观看| 无码人妻一区二区三区精品视频| 蜜臀91精品国产高清在线观看| 理论片在线不卡免费观看| 69视频免费在线观看| 国产精品一品二品| 四虎永久国产精品| 欧美人体视频xxxxx| 欧美午夜电影网| 国产老熟女伦老熟妇露脸| 欧美3p在线观看| 欧美亚洲视频一区二区| 国产夫绿帽单男3p精品视频| 久久精品在线免费观看| 精品人妻少妇一区二区| 四虎精品一区二区免费| 亚洲人成啪啪网站| 国产在线视频二区| 国产一区二区精品久久91| 欧美日韩国产综合视频在线| av色在线观看| 日韩精品一区二区在线| 久草视频手机在线| 蜜臀av在线播放一区二区三区| 久久久国产精品一区二区三区| 性欧美高清come| 欧美人成免费网站| 亚洲激情图片网| 久久久夜精品| 久久久水蜜桃| 69av成人| 精品国产乱码久久久久久闺蜜| 成人高潮免费视频| 极品少妇一区二区| 一区二区不卡在线观看| 欧美不卡高清一区二区三区| 日韩精品免费在线播放| jizz国产免费| 成人av电影在线网| 99在线观看视频免费| 日韩精品三级| 久久综合五月天| 国产精品无码一区二区桃花视频| 国产精品情趣视频| 久热精品在线观看视频| 欧美日韩老妇| 国产精品久久久久久久午夜| 黄色美女网站在线观看| 色吊一区二区三区| 亚洲性猛交xxxx乱大交| 丝袜a∨在线一区二区三区不卡| 久热国产精品视频一区二区三区| 美女视频在线免费| 亚洲男人天堂2024| www.久久久久久久| 国产精品国产a| 一区二区三区四区毛片| 欧美一区二区三区另类| 91在线精品观看| 九色porny丨入口在线| 亚洲美女激情视频| 中文字幕乱码人妻二区三区| 中文字幕电影一区| 91精品国产三级| 韩国精品一区二区三区| 国产私拍一区| 欧美精选视频一区二区| www.日韩av.com| 亚洲精品字幕在线| 欧美日韩在线影院| 国产性猛交xx乱| 国产麻豆午夜三级精品| 欧美精品自拍视频| 精品国产精品久久一区免费式| 国产在线观看91精品一区| 99热国产在线中文| 日韩成人av在线| 中文字幕在线视频第一页| 亚洲精品免费在线观看| 中文字幕第六页| 亚洲一区二区成人| 中文字幕一区二区三区最新| 99ri日韩精品视频| 国产精品mp4| 中文字幕中文字幕在线十八区 | 好看的亚洲午夜视频在线| 国产伦精品一区二区三区高清版| 在线天堂资源| 久久久精品一区| 四虎影院在线播放| 欧美日韩国产一二三| 久久婷婷国产麻豆91| 久久久噜噜噜久久中文字幕色伊伊 | 欧产日产国产精品视频 | 影音先锋制服丝袜| 国产精品一品视频| 欧美国产日韩在线播放| 中国精品18videos性欧美| 精品欧美国产| 国产一区2区在线观看| 欧美一区亚洲一区| 成人免费网站在线观看视频| 亚洲精品自在久久| 国产女人18毛片18精品| 狠狠躁夜夜躁人人躁婷婷91 | 国产原创av在线| 精品sm在线观看| 夜夜躁狠狠躁日日躁av| 精品久久久久久久久久久| 日本黄色片免费观看| 欧美国产精品中文字幕| 91九色蝌蚪porny| 国产在线视频一区二区三区| 国产精品乱码久久久久| 激情偷拍久久| 亚洲欧美一二三| 日本黄色精品| 六月婷婷久久| 国产人妖ts一区二区| 91免费精品国偷自产在线| 亚洲综合在线电影| 91极品视频在线| 欧美14一18处毛片| 超碰精品一区二区三区乱码| 成人午夜电影在线观看| 亚洲精品视频在线播放| 涩涩视频免费看| 日韩一区二区三区三四区视频在线观看| 中文字幕精品无| 色综合久久天天综合网| 18精品爽视频在线观看| 夜夜精品浪潮av一区二区三区| 久久久精品少妇| 国产精品久久久久久久久动漫| 亚洲AV无码片久久精品| 久久免费美女视频| 三级黄色片网站| caoporn国产精品| 亚洲啪av永久无码精品放毛片 | 超清av在线| 欧美激情xxxx性bbbb| 午夜av在线播放| 九九视频这里只有精品| 91中文在线| 九九热r在线视频精品| 1区2区3区在线视频| 欧美日韩不卡合集视频| 日韩伦理电影网站| 久久免费在线观看| 九色porny丨入口在线| 91高清视频免费| 欧美色网一区| 国产精品久久婷婷六月丁香| 性感美女一区二区在线观看| 国产精品久久久久久久天堂| 国产第一亚洲| 成人淫片在线看| 亚洲91网站| 九九九九精品| 国产午夜一区| 三级网在线观看| 亚洲激情婷婷| 白嫩少妇丰满一区二区| 免费在线视频一区| 国产欧美精品一二三| 国产成人在线看| 亚洲成人av免费在线观看| 国产欧美一区二区精品性 | 亚洲高清不卡在线观看| 免费观看成人毛片| 在线观看日韩高清av| 国产一区二区波多野结衣| 日韩情涩欧美日韩视频| 手机看片一区二区| 亚洲色图综合网| 毛片在线播放a| 国外视频精品毛片| 国模一区二区| 高清一区二区三区视频| 一区三区在线欧| 大桥未久一区二区| 亚洲永久网站| 中文字幕1234区| 91天堂素人约啪| 四虎影院中文字幕| 姬川优奈aav一区二区| 又污又黄的网站| 亚洲国产精品va在线看黑人| 888av在线| 国内精品久久久久久久久| 午夜激情成人网| 国产一区不卡在线观看| 精品免费在线| 青青青免费在线| 极品少妇一区二区| 国产精品无码久久久久一区二区| 亚洲人123区| 波多野结衣电车| 欧美mv日韩mv国产| av网站在线免费播放| 国内精品久久影院| 亚洲一区有码| 日本一区二区三区视频免费看| 午夜国产欧美理论在线播放| 免费激情视频在线观看| 成人av网站免费观看| 日本少妇aaa| 色婷婷av一区| 天天操天天操天天| 九九九久久国产免费| 国产精品诱惑| 美脚丝袜一区二区三区在线观看| 香蕉视频官网在线观看日本一区二区| 日韩人妻精品无码一区二区三区| 国产成人一区在线| 黑人狂躁日本娇小| 在线免费精品视频| 五月婷婷六月激情| 久久久久久91| 高清国产一区二区三区四区五区| 色播五月综合| 三级一区在线视频先锋 | 国产一级特黄a大片免费| av一区二区久久| 精品无码久久久久| 日韩一级片网站| 麻豆影院在线| 国产精品亚发布| 精品午夜久久| 不卡av免费在线| 国产丝袜在线精品| 欧美国产成人精品一区二区三区| 亚洲第一页自拍| av在线私库| 久精品国产欧美| 中文在线一区| 女同毛片一区二区三区| 五月天欧美精品| 婷婷开心激情网| 69视频在线播放| 亚洲va久久久噜噜噜久久| 欧美国产亚洲一区| 91视频观看免费| 日韩在线播放中文字幕| 精品无码久久久久久国产| 国产日韩电影| 日产精品久久久一区二区| 青青草91视频| 色婷婷粉嫩av| 欧美一区二区三区白人| 在线观看中文| 国产精品区一区二区三含羞草| 亚洲无毛电影| 欧洲一级黄色片| 色综合视频一区二区三区高清| 欧美人体大胆444www| 国产精品福利久久久| 色婷婷亚洲mv天堂mv在影片| 五月天激情播播| 亚洲乱码精品一二三四区日韩在线| 99国产精品久久久久久久成人 | 在线观看一区二区三区三州| 狠狠色综合色综合网络| 久久久久香蕉视频| 亚洲精品国产免费| 日韩国产激情| 手机在线视频你懂的| 丁香桃色午夜亚洲一区二区三区| 国产真人真事毛片| 亚洲欧美日韩视频一区| 国产91欧美| 日韩亚洲欧美视频| 国产亚洲一区二区三区四区| ,亚洲人成毛片在线播放| 欧美日韩xxx| 国产成人精品999在线观看| 天天操狠狠操夜夜操| 一区二区久久久久久| 青青草在线播放| 91免费视频网站| 国产精品嫩草99av在线| 国产性猛交xx乱| 亚洲第一天堂av| 欧美视频免费看| 少妇高潮毛片色欲ava片| 国产女同性恋一区二区| 亚洲国产www| 国产精品视频免费在线观看| 综合精品一区| 免费看黄色av| 精品国产99国产精品| 韩日精品一区| 无码粉嫩虎白一线天在线观看 | 久久综合激情网| 在线亚洲欧美视频| 看全色黄大色大片免费久久久| 尤蜜粉嫩av国产一区二区三区| 亚洲午夜av在线| 麻豆传媒在线免费看| 欧美日韩高清免费|