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

Redis 集群中如何處理非本節點的 slot

數據庫 Redis
這篇文章就來聊聊當某個節點處理到非它所負責的slot時是如何處理的,這一點很好的體現了redis對于raft協議良好的設計與實現。

我們都知道redis集群有16384個槽,它會因為我們集群個數配置的不同而分配不同的slot給各個節點,而這篇文章就來聊聊當某個節點處理到非它所負責的slot時是如何處理的,這一點很好的體現了redis對于raft協議良好的設計與實現。

一、詳解redis集群指令處理

1. 整體流程

假設我們現在集群中有個節點,每個節點各自負責一部分槽,此時我們的客戶端向節點2發起一個set指令,而該指令對應的key應該是要存放到節點1中,對此節點2的做法是查看自己所維護的節點列表是否有負責該slot的節點,如果發現了而回復給客戶端move指令,告知客戶端到指令的ip端口的節點進行鍵值對存儲:

了解完整體流程之后,我們通過源碼的方式來印證這些實現上的細節,我們都知道redis客戶端發送的指令都會被redis的processCommand處理,該函數如果發現當前是以集群的方式啟動并且符合以下兩個條件則以集群的邏輯解析這條指令:

  • 發送指令的不是master服務器。
  • 參數中帶有key。

那么redis就會調用getNodeByQuery查詢重定向的節點,如果發現查詢到的節點不是自己或者為空則調用clusterRedirectClient進行重定向處理:

int processCommand(redisClient *c) {
    //......
    //如果開啟了集群,且發送者不是master且參數帶key則步入邏輯
    if (server.cluster_enabled &&
        !(c->flags & REDIS_MASTER) &&
        !(c->flags & REDIS_LUA_CLIENT &&
          server.lua_caller->flags & REDIS_MASTER) &&
        !(c->cmd->getkeys_proc == NULL && c->cmd->firstkey == 0))
    {
        int hashslot;

        if (server.cluster->state != REDIS_CLUSTER_OK) {
         //......
        } else {
            int error_code;
            //查找可以處理的節點
            clusterNode *n = getNodeByQuery(c,c->cmd,c->argv,c->argc,&hashslot,&error_code);
            //如果為空且或者非自己,則調用clusterRedirectClient進行重定向
            if (n == NULL || n != server.cluster->myself) {
                flagTransaction(c);
                clusterRedirectClient(c,n,hashslot,error_code);
                return REDIS_OK;
            }
        }
    }

   //......
   //處理當前請求指令并返回
}

2. 詳解節點定位步驟getNodeByQuery

步入getNodeByQuery即可看到查詢的核心流程,無論是單條還是多條客戶端指令,他都會封裝成multiState結構體交由后續邏輯處理,而后續邏輯就會遍歷這些指令并計算出對應的slot,然后執行如下邏輯:

  • 如果發現定位到的節點是自己,且當前節點正在做遷移,則做個遷移標記,然后檢查當前節點是否有這個槽,如果沒有則發送ASK指令告知客戶端重定向到另一個遷移的目標槽試試看。
  • 如果對應的key沒有找到對應的槽,則直接返回當前節點。
  • 找到目標槽,直接返回MOVE指令和目標槽的信息。

對應我們給出getNodeByQuery的核心代碼段:

clusterNode *getNodeByQuery(redisClient *c, struct redisCommand *cmd, robj **argv, int argc, int *hashslot, int *error_code) {
    //......
    //如果是exec命令則用客戶端的multiState封裝這些命令
    if (cmd->proc == execCommand) {
        /* If REDIS_MULTI flag is not set EXEC is just going to return an
         * error. */
        if (!(c->flags & REDIS_MULTI)) return myself;
        ms = &c->mstate;
    } else {
       //如果不是exec則自己創建一個multiState封裝這單條指令保證后續邏輯一致
        ms = &_ms;
        _ms.commands = &mc;
        //命令個數1
        _ms.count = 1;
        //命令參數
        mc.argv = argv;
        //命令參數個數
        mc.argc = argc;
        //對應的命令
        mc.cmd = cmd;
    }

    
    //遍歷multiState中的命令
    for (i = 0; i < ms->count; i++) {
        struct redisCommand *mcmd;
        robj **margv;
        int margc, *keyindex, numkeys, j;
  //解析出命令、參數個數、參數
        mcmd = ms->commands[i].cmd;
        margc = ms->commands[i].argc;
        margv = ms->commands[i].argv;
        //解析出key以及個數
        keyindex = getKeysFromCommand(mcmd,margv,margc,&numkeys);
        for (j = 0; j < numkeys; j++) {
            //拿到key
            robj *thiskey = margv[keyindex[j]];
            //計算slot
            int thisslot = keyHashSlot((char*)thiskey->ptr,
                                       sdslen(thiskey->ptr));

            if (firstkey == NULL) {
             
                firstkey = thiskey;
                slot = thisslot;
                //拿著計算的slot定位到對應的節點
                n = server.cluster->slots[slot];

                
                //如果定位到的節點就是當前節點正在做遷出或者遷入,則migrating_slot/importing_slot設置為1
                if (n == myself &&
                    server.cluster->migrating_slots_to[slot] != NULL)
                {
                    migrating_slot = 1;
                } else if (server.cluster->importing_slots_from[slot] != NULL) {
                    importing_slot = 1;
                }
            } else {
               //......
            }

           
            //如果正在做遷出或者嵌入,且當前找不到當前db找不到key的位置,則missing_keys++意為某個key可能正在被遷移中所以沒有命中
            if ((migrating_slot || importing_slot) &&
                lookupKeyRead(&server.db[0],thiskey) == NULL)
            {
                missing_keys++;
            }
        }
        getKeysFreeResult(keyindex);
    }

   
    //所有key都沒有對應節點,直接返回當前節點
    if (n == NULL) return myself;

    //......
    //正在遷出且這個key在當前節點沒有被命中,則將error_code設置為ask,并返回遷出的節點信息,告知客戶端到返回節點嘗試指令
    if (migrating_slot && missing_keys) {
        if (error_code) *error_code = REDIS_CLUSTER_REDIR_ASK;
        return server.cluster->migrating_slots_to[slot];
    }

    //......
    //返回其他節點,error_code設置為move
    if (n != myself && error_code) *error_code = REDIS_CLUSTER_REDIR_MOVED;
    return n;
}

3. 結果告知客戶端

上述流程發現處理的節點不是自己之后,調用clusterRedirectClient進行重定向,如果是REDIS_CLUSTER_REDIR_MOVED則告知客戶端這些slot后續直接找重定向節點處理就好了,后續無需找自己。若是REDIS_CLUSTER_REDIR_ASK則說明當前節點正處于數據遷移到目標節點,你可以到遷移的節點進行請求,后續再次發起請求是還是找當前節點看看能否出去,如果不能在進行重定向:

void clusterRedirectClient(redisClient *c, clusterNode *n, int hashslot, int error_code) {
    //......
    if(......){
    //......
    } else if (error_code == REDIS_CLUSTER_REDIR_MOVED ||
               error_code == REDIS_CLUSTER_REDIR_ASK)
    {
        //返回move命令告知要移動到的節點后續直接到move的,如果是ask則返回正在遷往的節點地址,是臨時措施,下次客戶端還會找當前節點
        addReplySds(c,sdscatprintf(sdsempty(),
            "-%s %d %s:%d\r\n",
            (error_code == REDIS_CLUSTER_REDIR_ASK) ? "ASK" : "MOVED",
            hashslot,n->ip,n->port));
    } else {
        redisPanic("getNodeByQuery() unknown error.");
    }
}

二、小結

這篇文章比較精簡,我們通過源碼的方式簡單的剖析了去中心化的redis如何在不同節點處理不同槽的請求,大體過程比較簡單:

  • 接收并處理客戶端傳入的key指令操作。
  • 通過getNodeByQuery獲取key對應的slot所屬節點。
  • 如果是當前節點的slot直接處理。
  • 如果不是則查看是否正在遷出,如果是則返回ask讓客戶端到別的節點試試看,反之進入步驟5。
  • 如果定位的slot對應的節點是別的節點則直接用move指令重定向客戶端,讓客戶端到另一個節點詢問結果。
責任編輯:趙寧寧 來源: 寫代碼的SharkChili
相關推薦

2024-09-11 20:05:56

2024-04-16 13:32:57

2018-11-21 12:27:21

JavaScript 貨幣值區域

2024-12-25 10:24:31

2023-03-09 12:21:38

2011-04-11 17:10:16

Oracle

2019-11-08 08:00:00

ASP .NETASP .NET Cocookie

2021-08-18 08:20:14

SQL除數統計

2012-07-30 09:35:10

項目管理

2020-05-18 10:52:10

集群SessionRedis

2019-08-15 10:20:19

云計算技術安全

2025-07-01 01:55:00

Redis集群模式

2022-08-08 13:45:12

Redis面試Hash

2013-03-20 11:01:37

Redis客戶端連接

2021-03-24 10:40:26

Python垃圾語言

2011-01-21 16:27:43

NagiosSendmail

2012-12-12 09:49:41

2020-12-29 09:11:33

LinuxLinux內核

2017-03-13 13:21:34

Git處理大倉庫

2011-12-15 12:32:19

JavaNIO
點贊
收藏

51CTO技術棧公眾號

亚洲大尺度网站| aaaaa一级片| 黄页网站大全在线免费观看| 久久综合视频网| 国产精品日韩专区| 久久精品一级片| 国产成人一区| 日韩免费性生活视频播放| 国产亚洲精品网站| 伊人春色在线观看| 亚洲国产激情av| 国产精品一 二 三| 国产永久免费视频| 午夜亚洲性色视频| 欧美成人一二三| 舐め犯し波多野结衣在线观看| 国产极品粉嫩福利姬萌白酱| 国产福利片在线| 成人午夜又粗又硬又大| 91精品久久久久久久久久入口| 日本a在线观看| 国产精品黑丝在线播放| 精品中文视频在线| 在线精品视频播放| 国产精久久一区二区| 在线观看日韩电影| 免费看的黄色大片| 国产偷倩在线播放| 亚洲美女在线国产| 一本一道久久a久久精品综合| 天天躁日日躁狠狠躁喷水| 国产精品资源网| 成人高h视频在线| 国产精品免费无遮挡无码永久视频| 亚洲精品少妇| 欧美激情在线一区| 国产一级理论片| 欧美va天堂在线| 久久精品小视频| 99热99这里只有精品| 精品一区二区三| 亚洲网站在线观看| 欧洲女同同性吃奶| 中文字幕精品影院| 亚洲精品一二区| 在线免费观看黄色小视频| 老汉色老汉首页av亚洲| 亚洲成人xxx| 无码精品一区二区三区在线播放| 都市激情久久| 亚洲国产精品久久91精品| 污污内射在线观看一区二区少妇| 国产精品乱战久久久| 欧美精品一区二区三区视频 | 欧美日韩大片在线观看| 中文字幕一区二区av| 久久视频在线直播| 久久久无码一区二区三区| 欧美精品综合| 久久人人爽人人| 国产在线观看黄色| 水野朝阳av一区二区三区| 国产成人精品在线视频| 综合久久中文字幕| 极品少妇xxxx精品少妇| 成人国产1314www色视频| 国产 欧美 自拍| 99re这里都是精品| 色综合久久久久久久久五月| 黄色av网站在线看| 国产精品福利影院| 欧美高清中文字幕| 欧美xxxx做受欧美88bbw| 午夜精品久久久久久久99樱桃| 91九色在线观看视频| 在线成人视屏 | 婷婷夜色潮精品综合在线| 成熟丰满熟妇高潮xxxxx视频| 欧洲亚洲两性| 777亚洲妇女| 一级黄色片毛片| 国产麻豆一区二区三区精品视频| www.欧美三级电影.com| 久久久久久国产精品免费播放| 香蕉视频成人在线观看| 国产精品偷伦免费视频观看的| 国产极品999| 久久久国产精品午夜一区ai换脸| 熟妇熟女乱妇乱女网站| av免费不卡| 欧美三级电影精品| 精品久久久久一区二区| 久久亚洲专区| 91av在线看| 国产精品久久影视| 91视视频在线观看入口直接观看www | 国产乱码久久久久久| 久久婷婷av| 国产精品sss| 五月天婷婷在线视频| 亚洲国产视频网站| 在线观看免费av网址| 欧美亚洲大陆| 久久99亚洲热视| 国产美女www爽爽爽| 不卡一区在线观看| 裸体大乳女做爰69| 欧美日韩国产网站| 亚洲国产精久久久久久 | 成人h视频在线观看| a√在线中文网新版址在线| 亚洲成人自拍偷拍| 成人性生交视频免费观看| 欧美猛男同性videos| 欧美激情一区二区三区高清视频 | 精品调教chinesegay| 91精品国产闺蜜国产在线闺蜜| 性色一区二区三区| 国产精品传媒毛片三区| 成人在线免费看片| 欧美日韩一区 二区 三区 久久精品 | 在线免费观看中文字幕| 99国产精品99久久久久久| 国产成人一二三区| 国产精品一区免费在线| 少妇高潮久久久久久潘金莲| 亚洲黄网在线观看| 91香蕉国产在线观看软件| 久久男人资源站| 日韩精品成人| 久久综合网hezyo| 国产精品女人久久久| 国产精品―色哟哟| 日本999视频| 国产精品免费不| 国产精品69av| 国产高清在线| 在线亚洲+欧美+日本专区| 五月婷婷综合在线观看| 黄色欧美成人| 国产在线资源一区| 九九色在线视频| 日韩精品一区二区三区swag| 欧美又粗又大又长| 成人中文字幕电影| 日韩视频在线视频| 蜜臀av一区| 日韩av三级在线观看| 可以在线观看的av网站| 色成人在线视频| 久久久久久久毛片| 日本中文字幕一区二区有限公司| 亚洲国产欧美日韩| 欧美爱爱视频| 美女精品久久久| 成人毛片视频免费看| 午夜精品免费在线观看| 播金莲一级淫片aaaaaaa| 狂野欧美一区| 中文字幕欧美日韩一区二区| 国产精品亚洲欧美日韩一区在线| 久久成人18免费网站| 亚洲精品第五页| 精品免费在线观看| 青娱乐国产视频| 精品一区二区三区视频在线观看| 久久久久亚洲av无码专区喷水| 日韩一区二区三区精品视频第3页| 欧美丰满少妇xxxxx| 五月婷婷伊人网| 欧美伊人久久大香线蕉综合69| av片在线免费看| 国产福利电影一区二区三区| 欧美精品一区免费| 精品一级毛片| 成人综合av网| 日日av拍夜夜添久久免费| www.亚洲天堂| 神马一区二区三区| 欧美调教femdomvk| 精品午夜福利在线观看| 久久精品一区蜜桃臀影院| 亚洲午夜精品一区| 亚洲精品日韩久久| 亚洲在线不卡| 欧美黑人做爰爽爽爽| 国产精品一区二区三| 97在线超碰| 亚洲欧美国产制服动漫| 国产露脸国语对白在线| 午夜精品久久久久久久久久| www.xx日本| 91在线国内视频| 亚洲黄色av片| 欧美亚洲三级| 日韩欧美猛交xxxxx无码| 不卡中文一二三区| 精品国产一区二区三区四区精华| 啪啪av大全导航福利综合导航| 国内久久久精品| 黄色免费网站在线观看| 亚洲欧美激情在线视频| 亚洲av无码一区二区三区dv| 欧美日韩一区二区三区视频| 91精品国产乱码久久久张津瑜 | 波多野结衣 作品| 日本在线电影一区二区三区| 国产精品久久九九| 成人污版视频| 国产精品爽爽爽| 韩日精品一区二区| 午夜精品免费视频| 亚洲性图自拍| 最新国产精品拍自在线播放| 免费在线性爱视频| 亚洲国产精品热久久| 精品人妻一区二区三区蜜桃 | 外国成人免费视频| 日韩高清专区| 亚洲综合图色| 精品国产一区二区三区四区精华 | 久久日韩粉嫩一区二区三区| wwwxx日本| 国产精品自拍一区| 精品人妻一区二区三| 激情欧美一区二区三区在线观看| 免费看污污网站| 美女精品网站| 国产福利视频在线播放| 国产欧美精品| 777777av| 亚洲影院一区| 国产a级一级片| 亚洲综合精品| 黄色片久久久久| 亚洲永久视频| 欧美成人精品欧美一级乱| 亚洲美女黄色| 777精品久无码人妻蜜桃| 在线成人亚洲| 一二三四视频社区在线| 99热在线精品观看| 丰满少妇久久久| 9久re热视频在线精品| www国产精品内射老熟女| 99精品久久| 欧美日韩中文在线视频| 老司机午夜精品视频在线观看| 国产精彩免费视频| 日本va欧美va欧美va精品| 在线看的黄色网址| 国产毛片精品一区| 黄页网站在线看| 99这里只有精品| 一级黄色片大全| 国产精品麻豆久久久| 国产美女久久久久久| 亚洲线精品一区二区三区| 日本天堂网在线观看| 色综合一区二区三区| 中文天堂在线资源| 欧美肥妇毛茸茸| www.黄色一片| 日韩电视剧免费观看网站| 国产www.大片在线| 美女少妇精品视频| 麻豆视频在线观看免费网站黄| 国产精品aaaa| 美女精品久久| 久久久久久国产精品免费免费| 精品久久美女| 可以在线看黄的网站| 国产精品免费看| 91精品无人成人www| 成人黄色一级视频| 中文字幕在线观看免费高清| 综合激情成人伊人| 免费观看成人毛片| 欧美欧美午夜aⅴ在线观看| 亚洲第一精品网站| 亚洲色图国产精品| 视频在线观看入口黄最新永久免费国产| 欧美激情在线播放| 久久99国产精品二区高清软件| 不卡一卡2卡3卡4卡精品在| 蜜桃成人av| 高清无码一区二区在线观看吞精| 国产精品一页| 精产国品一区二区三区| 久久久久久久久久久电影| 亚洲天堂一级片| 欧美性猛交xxxx富婆弯腰| av加勒比在线| 中文字幕av一区中文字幕天堂| 欧美日韩色网| 国产日韩欧美成人| 亚洲免费成人av在线| 今天免费高清在线观看国语| 久久综合伊人| 亚洲av人人澡人人爽人人夜夜| 国产精品萝li| 香蕉污视频在线观看| 精品av久久707| 黄色免费在线观看| 国产精品亚洲自拍| 妖精视频一区二区三区 | 美女网站色91| 欧美 日本 国产| 亚洲综合成人在线视频| 亚洲系列在线观看| 亚洲色在线视频| 久久久男人天堂| 懂色av一区二区三区在线播放| 色综合久久一区二区三区| av免费中文字幕| 99视频在线观看一区三区| 在线观看成人毛片| 56国语精品自产拍在线观看| 高清av在线| 欧美一级黄色影院| 成人av电影免费在线播放| 懂色av粉嫩av蜜臀av一区二区三区| 色综合色狠狠综合色| 丰满少妇在线观看bd| 美女视频久久黄| 国产日韩在线观看视频| 在线天堂一区av电影| 免费不卡在线观看| 国产精品免费无码| 欧美在线观看一二区| 成年人视频在线观看免费| 日本成熟性欧美| 伊人久久大香线蕉综合网蜜芽| 日本午夜激情视频| 91视频一区二区| 久久精品无码av| 亚洲欧美国产精品| 美女写真久久影院| 台湾成人av| 麻豆精品一二三| 成人18视频免费69| 欧美情侣在线播放| 国产日产一区二区三区| 亚洲一区二区三区成人在线视频精品 | 性欧美精品一区二区三区在线播放 | 色欧美88888久久久久久影院| 欧洲亚洲在线| 国产精品69av| 国产精品久久久久久久免费观看| 一区二区三区四区毛片| 日韩一区欧美小说| 国产黄色片免费| 91av福利视频| 国产精品入口久久| 国产九九在线视频| 亚洲欧美日韩综合aⅴ视频| a天堂中文在线观看| 九九精品在线播放| 精品久久对白| www.色就是色| 亚洲狠狠丁香婷婷综合久久久| 亚洲精品无码专区| 26uuu久久噜噜噜噜| 成人区精品一区二区婷婷| 午夜激情视频网| 午夜精品一区二区三区三上悠亚 | 日韩精品欧美大片| 成人性生生活性生交12| 亚洲天堂a在线| 亚洲第一视频在线| 日本精品久久久久影院| 99久久亚洲精品蜜臀| 午夜性福利视频| 一本大道久久a久久精二百| 精品麻豆一区二区三区| 国产一区二区中文字幕免费看| 久久狠狠婷婷| 国产探花在线免费观看| 日韩av在线影院| 亚洲青青一区| aa在线观看视频| 国产精品第一页第二页第三页| 女人18毛片水真多18精品| 国产精品久久久久久亚洲影视| 国内自拍视频一区二区三区 | 久久密一区二区三区| 黄色国产在线视频| 欧美日韩视频一区二区| 久草在线资源站资源站| 亚洲高清视频一区二区| 成人av一区二区三区| 亚洲熟妇无码久久精品| 韩国精品久久久999| 亚洲精彩视频| 国产黄色大片免费看| 精品粉嫩超白一线天av| 欧美xxxx网站| 久久婷婷国产91天堂综合精品| 亚洲国产欧美日韩另类综合| 毛片在线播放a|