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

久久天天躁狠狠躁老女人| 午夜精品123| 亚洲自拍欧美另类| 日韩久久精品视频| 欧美男gay| 3751色影院一区二区三区| 青青在线视频免费观看| 久久99久久| 国产精品一卡二卡| 国产91久久婷婷一区二区| 久草福利资源在线| 青青操综合网| 91精品国产高清一区二区三区| 欧美男女爱爱视频| 日本三级视频在线播放| av一二三不卡影片| 91精品国产综合久久香蕉的用户体验| 日韩av在线播| 国产国产精品| 亚洲欧美一区二区三区久久| 伊人国产精品视频| 精品网站在线| 红桃av永久久久| 国产对白在线播放| 成人不用播放器| 97精品视频在线观看自产线路二| 成人黄色片网站| 精品久久久久久久久久久久久久久久| 欧美日韩亚洲国产精品| 最近2019年中文视频免费在线观看 | 你懂的视频在线| 激情综合色综合久久| 欧美亚洲免费电影| 国产精久久久久久| 亚洲综合中文| 尤物九九久久国产精品的分类| 中国免费黄色片| 亚洲精品无播放器在线播放| 91福利小视频| 国产高清精品在线观看| 欧美性猛片xxxxx免费中国| 欧美激情在线看| 乱色588欧美| 熟妇人妻一区二区三区四区| 国产乱国产乱300精品| 91精品久久久久久久久久久久久| 日本欧美www| 久久久精品性| 欧美专区日韩视频| 午夜精品久久久久久久久久久久久蜜桃| 欧美日韩日本国产亚洲在线| 不卡中文字幕av| 欧洲第一无人区观看| 国产精品久久久久久久| 日韩在线视频观看| 91麻豆精品久久毛片一级| 精品国精品国产自在久国产应用| 亚洲天天在线日亚洲洲精| 久久无码人妻精品一区二区三区 | 久久精品在线观看视频| 国产精品传媒精东影业在线| 久久韩国免费视频| 国产又粗又硬又长又爽| 亚洲激情久久| 久久777国产线看观看精品| 538任你躁在线精品视频网站| 亚洲精品一区二区在线看| 另类色图亚洲色图| 国产亚洲第一页| 中文精品视频| 日本精品视频在线| 国产精品自拍第一页| 美女视频网站黄色亚洲| 91久久国产精品91久久性色| 国产老妇伦国产熟女老妇视频| 国产一区二区久久| 国产精品视频入口| 九色视频成人自拍| 国产精品传媒视频| 欧美久久久久久久久久久久久久| 国产伦理精品| 欧美综合在线视频| 欧美国产日韩在线视频| 国产精品玖玖玖在线资源| 亚洲男人天堂手机在线| 五月天免费网站| 激情av一区| 国产精品久久久久久久9999| 91丨九色丨丰满| 岛国一区二区在线观看| 快播亚洲色图| 老司机精品影院| 精品国产成人av| 亚洲人视频在线| 国产一区在线电影| 这里只有视频精品| 久热精品在线观看| 日本系列欧美系列| 国产精品久久一区二区三区| 成年人视频在线观看免费| 亚洲欧美一区二区三区孕妇| 91国视频在线| 精品国产乱码一区二区三区| 亚洲欧美日韩精品久久| 国产精品国产精品88| 性一交一乱一区二区洋洋av| 成人午夜小视频| 男同在线观看| 亚洲一区二区在线播放相泽| 91av俱乐部| 大型av综合网站| 精品国内亚洲在观看18黄| 日韩在线视频免费播放| 国产91精品一区二区麻豆亚洲| 欧洲久久久久久| 成人三级高清视频在线看| 67194成人在线观看| 国产jk精品白丝av在线观看| 激情六月综合| 91麻豆国产精品| 国产精品视频二区三区| 午夜精品成人在线视频| 被黑人猛躁10次高潮视频| 成人中文在线| 日韩av免费一区| 人妻一区二区三区免费| 亚洲少妇30p| 五月天av在线播放| 九九热精品视频在线观看| 久久久在线观看| 精品国精品国产自在久不卡| 国产精品色在线| 国产一级片黄色| 亚洲人成亚洲精品| 亚洲2020天天堂在线观看| 国产 欧美 自拍| 亚洲精品视频在线看| 伊人影院综合在线| 色999国产精品| 国产精品旅馆在线| 电影av一区| 色激情天天射综合网| 国产精品久久久久久久无码| 激情综合亚洲| 国产成人av一区二区三区| а√中文在线8| 欧美顶级少妇做爰| 国产中文av在线| 久久精品国产成人一区二区三区| 亚洲精品视频一区二区三区| 国产综合色区在线观看| 亚洲一区二区黄| 中文字幕人妻色偷偷久久| 国产精品无码永久免费888| 国产一二三区av| 日韩av密桃| 成人黄色在线免费| 久久日韩视频| 91精品黄色片免费大全| 91在线播放观看| 国产二区国产一区在线观看 | 亚洲日本激情| 精品无码久久久久久久动漫| 欧美巨大丰满猛性社交| 亚洲欧美第一页| 五月激情丁香网| 一区在线观看视频| 日本成人在线免费观看| 亚洲美女黄色| 欧美尤物一区| 亚洲国产天堂| 九九久久久久99精品| 少妇人妻一区二区| 在线看日韩精品电影| 午夜黄色福利视频| 国产成人小视频| av天堂永久资源网| 成人一区不卡| yellow视频在线观看一区二区| 99riav视频在线观看| 日韩精品免费在线视频观看| 日韩不卡高清视频| 亚洲欧美偷拍另类a∨色屁股| 国产高潮失禁喷水爽到抽搐| 免费在线观看成人av| 一区二区不卡在线观看| 综合伊人久久| 国产精品久久久久免费a∨| 超碰在线网址| 亚洲裸体xxxx| 国产片高清在线观看| 午夜不卡av在线| 亚洲欧美综合7777色婷婷| 成人久久视频在线观看| 奇米影音第四色| 欧美三级小说| 亚洲一区二区三区免费看| 欧美影院在线| 国产精品国产三级国产专播精品人 | 国产一精品一av一免费爽爽| 2021久久精品国产99国产精品| 丝袜美腿美女被狂躁在线观看| 欧美刺激午夜性久久久久久久| 国产精品第5页| 一区二区三区欧美久久| 国产伦理片在线观看| 风间由美性色一区二区三区| 国产成人黄色网址| 国产一区二区你懂的| 91看片淫黄大片91| 日韩国产欧美| 蜜桃欧美视频| 北条麻妃一区二区三区在线观看 | 久激情内射婷内射蜜桃| 国产精品97| 午夜午夜精品一区二区三区文| 国产福利资源一区| 亚洲在线观看视频网站| 欧美日韩伦理一区二区| 欧洲美女7788成人免费视频| 成人av影院在线观看| 日韩中文字幕视频在线| 免费黄色在线视频网站| 亚洲国产成人av在线| 国产三级按摩推拿按摩| 欧美日韩在线亚洲一区蜜芽| 69国产精品视频免费观看| 亚洲成人综合在线| 国产av无码专区亚洲av毛网站| 国产精品网曝门| 国产jk精品白丝av在线观看| 91丨porny丨在线| 国产一卡二卡三卡四卡| 国产成人av一区| 爱情岛论坛亚洲自拍| 国产精品一区二区视频| av噜噜在线观看| 久久成人久久鬼色| av污在线观看| 捆绑紧缚一区二区三区视频| 亚洲视频在线观看一区二区三区| 香蕉国产精品偷在线观看不卡| 美女日批免费视频| 99国产精品久久久久久久成人热| 亚洲乱码日产精品bd在线观看| 亚洲女同一区| 欧美另类videosbestsex日本| 天堂美国久久| 国产三级中文字幕| 欧美在线黄色| 欧美这里只有精品| 99香蕉国产精品偷在线观看| 中文字幕无码精品亚洲35| 日韩天天综合| 91看片就是不一样| 日本美女视频一区二区| 免费涩涩18网站入口| 另类欧美日韩国产在线| 天天操精品视频| 成人午夜在线播放| 一区二区视频观看| 久久老女人爱爱| 一级片久久久久| 国产精品白丝在线| 久一区二区三区| 欧美午夜激情在线| 中文字幕av影视| 日韩一区二区电影网| 日本黄色不卡视频| 国产一区二区三区日韩欧美| 日本在线免费中文字幕| 欧美日韩成人在线观看| caoporn-草棚在线视频最| 欧洲亚洲女同hd| 日本一区二区三区中文字幕| 91九色在线观看| 色狼人综合干| 一级做a爰片久久| 狠狠入ady亚洲精品经典电影| 欧美男女爱爱视频| 男人的天堂亚洲一区| 亚洲制服在线观看| 99re成人精品视频| av在线播放中文字幕| 亚洲综合色在线| 波多野结衣在线电影| 日韩三级视频在线观看| 日韩在线无毛| 色偷偷88888欧美精品久久久| 大黄网站在线观看| 国产精品成av人在线视午夜片| 美女久久精品| 欧美日韩一区二区三区在线观看免| 欧美大人香蕉在线| 免费观看美女裸体网站| 久久精品国产一区二区| av在线播放网址| 综合欧美一区二区三区| 欧美一区二区三区四| 91精品国产综合久久久蜜臀图片| 神马午夜电影一区二区三区在线观看 | 国内自拍第二页| 9久草视频在线视频精品| 最新日韩免费视频| 精品免费在线观看| 国产喷水福利在线视频| 尤物九九久久国产精品的分类| 9999在线视频| 91午夜在线播放| 精品美女视频| 免费看国产曰批40分钟| 国产精品88888| 欧美色图17p| 色哟哟一区二区三区| 高h调教冰块play男男双性文| 日韩中文字幕在线精品| 另类激情视频| 国产综合动作在线观看| 欧美在线首页| 中文字幕第88页| 国产肉丝袜一区二区| 亚洲欧美在线观看视频| 91麻豆精品国产91久久久久 | 欧美日韩电影在线观看| 国产电影一区二区| 伊人色综合久久天天五月婷| 日韩成人免费在线| 好吊日免费视频| 午夜精品免费在线| 性中国古装videossex| 另类图片亚洲另类| 欧美一区=区三区| 亚洲欧洲日本国产| 蜜臀av性久久久久蜜臀aⅴ| 最近中文字幕免费| 欧美日韩国产色| 四虎影视在线观看2413| 久久久久中文字幕2018| 136福利精品导航| 精品一区二区三区毛片| 狠狠色丁香久久婷婷综合丁香| 国产精品久久久久久成人| 欧美最新大片在线看| 在线免费看a| 国产男女猛烈无遮挡91| 999国产精品视频| 一级淫片在线观看| 亚洲免费在线观看视频| 国产成人毛毛毛片| 久久久久久久一| 偷窥自拍亚洲色图精选| 欧美丰满熟妇bbbbbb百度| 久久久久久久久久看片| 亚洲国产精品无码久久久| 亚洲日韩中文字幕| 素人啪啪色综合| 日韩人妻精品一区二区三区| 国产高清精品久久久久| 国产大片中文字幕| 日韩精品极品毛片系列视频| 色8久久影院午夜场| 一本久道久久综合| 国产精品911| 亚洲精品国产精品乱码| 亚洲欧洲成视频免费观看| 浪潮色综合久久天堂| 亚洲欧美日韩国产成人综合一二三区| 久久99国产精品久久99果冻传媒| 91麻豆免费视频网站| 精品国产一区二区三区不卡 | 国产精品一二区| 欧美h版在线| 色哟哟网站在线观看| 黑人巨大精品欧美一区二区| 国产中文字幕在线| 91免费福利视频| 在线亚洲一区| 91麻豆精品国产91久久综合| 日韩丝袜情趣美女图片| 国产精品蜜芽在线观看| 亚洲欧洲一二三| 成人午夜电影小说| 国产精品无码一区| 欧美精品日韩三级| 免费一区二区| 亚洲黄色片免费| 欧美日韩国产一中文字不卡 | 校园春色另类视频| 亚洲老女人av| 午夜视频在线观看一区二区| 国产资源在线播放| 亚洲自拍欧美色图| 日韩在线a电影| 久久精品一级片| 在线观看欧美日韩国产| 伊人久久大香线蕉av超碰| 99视频精品免费| 午夜电影一区二区| 精品国产丝袜高跟鞋| 欧美精品尤物在线|