精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

91欧美一区二区三区| 亚洲激情一区二区| 国产成人综合欧美精品久久| 九九亚洲精品| 欧美日韩成人一区二区| 日本精品免费视频| 桃花色综合影院| 另类调教123区| 久久久久中文字幕| 中文字幕被公侵犯的漂亮人妻| 国产极品久久久久久久久波多结野| 一区在线观看视频| 国产日韩一区二区| 亚洲天堂网视频| 最新亚洲激情| 久久精品2019中文字幕| 国产十八熟妇av成人一区| 日本在线视频一区二区| 亚洲大片免费看| 亚洲精品一区二区三| 日韩一级免费毛片| 久久99精品国产麻豆婷婷洗澡| 性色av一区二区咪爱| 一本一本久久a久久| 亚洲精品动态| 精品国产一区二区三区av性色| 久久婷五月综合| 三级在线观看视频| 亚洲综合男人的天堂| 一区二区三区四区欧美日韩| 国产一区二区三区不卡在线| 99视频一区二区| 99re视频在线播放| 97精品人妻一区二区三区在线| 亚洲欧美日本国产专区一区| 久久久人成影片一区二区三区观看| 亚洲一二三四五六区| 国产不卡一区| 国产视频一区在线| 中文字幕免费高清视频| 中文一区二区三区四区| 91麻豆精品国产91久久久使用方法| 日本成人中文字幕在线| 台湾佬中文娱乐网欧美电影| 亚洲国产日日夜夜| 无码人妻精品一区二区蜜桃百度| 成码无人av片在线观看网站| 中文幕一区二区三区久久蜜桃| 欧美日韩一区二区三区在线观看免 | 性久久久久久久久久久久久久| gogo亚洲高清大胆美女人体 | 亚洲 国产 日韩 欧美| 国产精品日本欧美一区二区三区| 久久久久久久电影一区| 麻豆视频在线观看| 欧美日韩1区| 久久久久久久久久久国产| 久草免费在线观看视频| 亚洲午夜精品久久久久久app| 欧美成人黑人xx视频免费观看| 午夜爽爽爽男女免费观看| 亚洲国产精品久久久天堂| 久久精品国产精品| √天堂中文官网8在线| 亚洲国产一区二区在线观看| 久久这里只有精品99| 国产午夜手机精彩视频| 亚洲小说区图片区| 97成人精品区在线播放| av毛片在线免费观看| 日韩黄色一级片| 91精品视频在线免费观看| 99国产在线播放| 懂色av一区二区三区免费看| 国产伦精品一区二区三区照片91 | 99久久99精品久久久久久| 久久久av水蜜桃| 岛国在线视频免费看| 国产精品美女久久福利网站| 最新视频 - x88av| 成人一级福利| 欧美日韩综合在线免费观看| 亚洲免费av一区| 国产日韩三级| 一区二区三区视频免费在线观看| 少妇高潮惨叫久久久久| 欧美视频成人| 国产不卡在线观看| 国产又粗又大又爽| 99久久精品情趣| 亚洲精品在线视频观看| 日本大胆在线观看| 欧美午夜久久久| 中文字幕第100页| 97精品久久| 亚洲最新av在线| 精品无码人妻一区二区三区品| 欧美一级二区| 亚洲自拍欧美色图| 国产在线视频网站| 一区二区三区免费看视频| 农村妇女精品一二区| 欧美高清一级片| 亚洲女同精品视频| 久久久久亚洲av无码专区体验| 性久久久久久| 91精品入口蜜桃| 久草福利在线| 亚洲va欧美va人人爽| 九九热99视频| 色愁久久久久久| 九九久久综合网站| 在线观看日批视频| 91网站最新网址| 97超碰国产精品| 国产精品蜜月aⅴ在线| 日韩国产精品亚洲а∨天堂免| 欧美在线视频第一页| 在线日韩视频| 97超碰人人模人人爽人人看| 二区三区在线播放| 日韩欧美在线视频| 亚洲麻豆一区二区三区| 91精品国产自产在线观看永久∴| 欧美综合国产精品久久丁香| 国模人体一区二区| 亚洲激情六月丁香| 国产探花在线看| 日韩电影免费在线观看| 秋霞av国产精品一区| 好吊色视频一区二区| 一区二区在线观看免费| 999久久久精品视频| 精品久久久中文字幕| 国产91网红主播在线观看| 五月婷婷丁香六月| 天天做天天摸天天爽国产一区 | 久久天堂av综合合色| 欧美日韩a v| 91麻豆国产在线观看| 久久黄色片视频| 精品自拍偷拍| 国内偷自视频区视频综合| 成人乱码一区二区三区| 一区二区三区在线免费观看| 欧美性猛交xx| 欧美日韩 国产精品| 国产成人亚洲欧美| 欧洲中文在线| 亚洲аv电影天堂网| 精品无码m3u8在线观看| av在线不卡免费看| 欧美三级一级片| 免费观看不卡av| 国产成人一区二区三区小说| 99riav在线| 555夜色666亚洲国产免| 一区视频免费观看| 成人免费视频免费观看| 国产一区二区三区精彩视频| 久操国产精品| 国产精品第一区| 日本在线观看免费| 91精品国产综合久久精品app| 国产盗摄一区二区三区在线| 国产精品自拍av| 欧美亚洲日本一区二区三区| 蜜臀av免费一区二区三区| 国产精品对白刺激| 国产在线观看91| 精品美女一区二区| 一级黄色免费网站| 国产精品嫩草影院com| 中文字幕 欧美日韩| 欧美日韩亚洲国产精品| 美脚丝袜一区二区三区在线观看| 日韩一级二级| 久久这里只有精品视频首页| 隣の若妻さん波多野结衣| 精品久久久久久| 青青青视频在线播放| 国产成人自拍网| 欧美亚洲国产成人| 青青草成人影院| 粉嫩av一区二区三区免费观看| 美女高潮在线观看| 色综合伊人色综合网| 亚洲成人第一区| 91精品办公室少妇高潮对白| 波兰性xxxxx极品hd| 成人免费黄色在线| 国产超碰在线播放| 亚洲视频福利| 视频一区三区| 91精品尤物| 国产精品露脸av在线| 羞羞污视频在线观看| 亚洲天堂av在线免费| 国产夫妻性生活视频| 色久优优欧美色久优优| 国产va在线播放| 国产精品视频yy9299一区| 黑森林av导航| 久久精品国产一区二区三区免费看| 免费看欧美一级片| 日韩精品91| 久久手机视频| 成人在线tv视频| 91久久久久久久一区二区| 日本在线播放一二三区| 美日韩精品视频免费看| 国产毛片av在线| 亚洲精品99久久久久| 99er热精品视频| 欧美性三三影院| 中文字幕av影院| 亚洲成a人片在线观看中文| 国产美女久久久久久| 国产亚洲精品超碰| 中文在线永久免费观看| 国产精品白丝jk黑袜喷水| 天天插天天操天天射| 午夜在线视频一区二区区别| 成人免费在线视频播放| 小说区亚洲自拍另类图片专区| 日韩免费av一区二区三区| 国产精品久av福利在线观看| 147欧美人体大胆444| 国产第一精品| 国产精品久久久久一区二区| 欧美电影h版| 欧美做受高潮电影o| 99riav视频在线观看| 欧美激情伊人电影| 亚洲精品天堂| 欧美激情国内偷拍| 欧美人与牲禽动交com| 欧美巨乳美女视频| fc2ppv国产精品久久| 久久精品国产欧美激情| a毛片在线播放| 精品中文字幕在线观看| 性欧美videos高清hd4k| 欧美国产日韩一区二区| 欧美人与禽猛交乱配| 国内精品久久久久| 欧美日韩在线观看首页| 秋霞av国产精品一区| 高清av不卡| 国产精品av在线| 欧美极品免费| 国产精品视频精品| 全球中文成人在线| 亚洲精品日韩av| 午夜免费欧美电影| 国产美女精品在线观看| 开心激情综合| 欧美最大成人综合网| 成人激情免费视频| 成人性做爰片免费视频| 综合久久十次| 久久国产精品网| 午夜综合激情| 色国产在线视频| 国产成人在线观看免费网站| 国产xxxx视频| 久久精品视频一区二区| 最新日韩免费视频| 一区二区三区精品| 国产 欧美 日韩 在线| 色94色欧美sute亚洲线路一久| 中文精品久久久久人妻不卡| 欧美一区二区不卡视频| 免费观看国产精品| 亚洲人成欧美中文字幕| 日本在线免费网| 国内精品模特av私拍在线观看| 欧美极品影院| 91美女片黄在线观看游戏| 国产香蕉精品| 日韩一本精品| 黄色欧美日韩| 91制片厂毛片| 成人免费视频一区二区| 亚洲第一视频区| 亚洲制服丝袜一区| 黄色一级视频免费看| 日韩欧美资源站| 你懂的视频在线观看| 久久av.com| 婷婷综合六月| av色综合网| 久久人人99| 116极品美女午夜一级| 国产毛片精品一区| 中文字幕国产综合| 亚洲精品欧美专区| 加勒比在线一区| 亚洲精品一区二区三区在线观看| 午夜在线观看视频| 66m—66摸成人免费视频| 99精品在线免费观看| 日韩电影大全在线观看| 黄色av日韩| 少妇一级淫免费放| www国产精品av| 欧美久久久久久久久久久久| 欧美影院一区二区| 天天干天天摸天天操| 美女av一区二区三区| av在线不卡精品| 蜜桃视频日韩| 亚洲国产免费看| 超级砰砰砰97免费观看最新一期| 久久久.com| 日本一二三区不卡| 欧美一区在线视频| 香蕉视频在线免费看| 欧洲一区二区视频| 另类春色校园亚洲| 欧美在线观看视频免费| 国产曰批免费观看久久久| 日韩免费成人av| 色婷婷精品久久二区二区蜜臀av| 男人天堂综合网| 欧美大片大片在线播放| 欧美经典影片视频网站| 一级黄色录像免费看| 免费欧美日韩国产三级电影| 在线免费观看麻豆| 婷婷激情综合网| 日本高清视频www| 欧美激情一区二区三区高清视频 | 色老头在线一区二区三区| 99国精产品一二二线| 欧美 日韩 国产精品免费观看| 天堂视频免费看| 日本一区二区三区高清不卡| 无码一区二区三区| 亚洲毛片在线观看| 制服丝袜专区在线| 欧美黑人xxxxx| 久久久久免费| 国产毛片久久久久久久| 91福利精品第一导航| 北岛玲日韩精品一区二区三区| 国产ts一区二区| 精品国产一区二区三区| 亚洲高清免费在线观看| 亚洲天堂福利av| 精品久久久久中文慕人妻| 欧美福利视频在线观看| 久久1电影院| 久久无码高潮喷水| 久久久久久久网| 亚洲一级在线播放| 久久精品成人欧美大片| 亚洲成人偷拍| 久久久999视频| 国产婷婷色一区二区三区在线| 久久久999久久久| 久久激情视频免费观看| a看欧美黄色女同性恋| 国产99久久九九精品无码| 久久精品视频网| 99在线精品视频免费观看20| 欧美国产日产韩国视频| 亚洲精品一级二级三级| 国产嫩草在线观看| 亚洲嫩草精品久久| 人妻一区二区三区免费| 国产成人精品免费久久久久| 日韩久久视频| 韩国一区二区三区四区| 欧美视频一区二区三区…| 成人福利在线| 9a蜜桃久久久久久免费| 久久一区二区三区四区五区 | 久久久国产精品| 北京富婆泄欲对白| 在线观看亚洲专区| 国产视频中文字幕在线观看| 国内精品国语自产拍在线观看| 日产国产欧美视频一区精品| www青青草原| 亚洲欧美日韩中文在线制服| 999久久久国产999久久久| 狠狠干 狠狠操| 亚洲人精品一区| 欧美婷婷久久五月精品三区| 91美女片黄在线观看游戏| 免播放器亚洲| 538精品在线观看| 亚洲美女性视频| 亚洲不卡在线| 亚洲36d大奶网| 日韩欧美精品免费在线| 4438x成人网全国最大| 日产精品高清视频免费| 国产精品99久久久久久有的能看|