最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入淺析Redis 集群伸縮原理

 更新時間:2021年05月15日 09:51:31   作者:LB  
Redis 集群提供了靈活的節(jié)點擴容和收縮方案。在不影響集群對外服務的情況下,可以為集群添加節(jié)點進行擴容,也可以下線部分節(jié)點進行縮容,接下來通過本文給大家分享Redis 集群伸縮原理,感興趣的朋友一起看看吧

Redis 節(jié)點分別維護自己負責的槽和對應的數據。伸縮原理:Redis 槽和對應數據在不同節(jié)點之間移動

環(huán)境:CentOS7 搭建 Redis 集群

一、集群擴容

1. 手動擴容

(1) 準備節(jié)點 9007,并加入集群

192.168.11.40:9001> cluster meet 192.168.11.40 9007

【注意】若 cluster meet 加入已存在于其它集群的節(jié)點,會導致集群合并,造成數據錯亂!。建議使用 redis-cli 的 add-node:

# 若節(jié)點已加入其它集群或包含數據,會報錯
add-node    new_host:new_port existing_host:existing_port
            --cluster-slave  # 直接添加為從節(jié)點
            --cluster-master-id <arg>  # 從節(jié)點對應的主節(jié)點id

(2) 遷移槽和數據

槽在遷移過程中集群可以正常提供讀寫服務

首先確定原有節(jié)點的哪些槽需要遷移到新節(jié)點。確保每個節(jié)點負責相似數量的槽,保證各節(jié)點的數據均勻

槽是 Redis 集群管理數據的基本單位。數據遷移是逐槽進行的

槽遷移流程:

  • 目標節(jié)點準備導入槽的數據:目標節(jié)點執(zhí)行cluster setslot {slot} importing {sourceNodeId}
  • 源節(jié)點準備遷出槽的數據:源節(jié)點執(zhí)行cluster setslot {slot} migrating {targetNodeId}
  • 獲取 count 個屬于槽 slot 的鍵:源節(jié)點執(zhí)行cluster getkeysinslot {slot} {count}
  • 遷移鍵:源節(jié)點執(zhí)行migrate {targetIp} {targetPort} "" 0 {timeout} keys {keys...},把鍵通過流水線(pipeline)機制批量遷移到目標節(jié)點。Redis3.0.6 后才支持批量遷移
  • 重復上兩步,直到槽下所有的鍵值數據遷移到目標節(jié)點
  • 向集群所有主節(jié)點通知槽被分配給目標節(jié)點:集群內所有主節(jié)點執(zhí)行cluster setslot {slot} node {targetNodeId}

內部偽代碼:

def move_slot(source,target,slot):
    # 目標節(jié)點準備導入槽
    target.cluster("setslot",slot,"importing",source.nodeId);
    # 目標節(jié)點準備全出槽
    source.cluster("setslot",slot,"migrating",target.nodeId);
    while true :
        # 批量從源節(jié)點獲取鍵
        keys = source.cluster("getkeysinslot",slot,pipeline_size);
        if keys.length == 0:
            # 鍵列表為空時,退出循環(huán)
            break;
        # 批量遷移鍵到目標節(jié)點
        source.call("migrate",target.host,target.port,"",0,timeout,"keys",keys);
        # 向集群所有主節(jié)點通知槽被分配給目標節(jié)點
        for node in nodes:
            if node.flag == "slave":
                continue;
            node.cluster("setslot",slot,"node",target.nodeId);

(3) 將 9001 的槽 4096 遷移到 9007 中

準備數據

192.168.11.40:9001> set key:test:5028 value:5028
192.168.11.40:9001> set key:test:68253 value:68253

目標節(jié)點準備工作

192.168.11.40:9007> cluster nodes
8ccdb0963411ebd05ce21952bdd4b7597825afdc 192.168.11.40:9001@19001 master - 0 1620928869000 2 connected 0-5461
bb1bb0f5f9e0ee67846ba8ec94a38da700e2e80d 192.168.11.40:9007@19007 myself,master - 0 1620928868000 0 connected
...
# 9007 準備導入槽 4096 的數據
192.168.11.40:9007> cluster setslot 4096 importing 8ccdb0963411ebd05ce21952bdd4b7597825afdc
OK
# 槽 4096 已開啟導入狀態(tài)
192.168.11.40:9007> cluster nodes
bb1bb0f5f9e0ee67846ba8ec94a38da700e2e80d 192.168.11.40:9007@19007 myself,master - 0 1620928959000 0 connected [4096-<-8ccdb0963411ebd05ce21952bdd4b7597825afdc]
...

源節(jié)點準備工作

# 9001 準備導出槽 4096 數據
192.168.11.40:9001> cluster setslot 4096 migrating bb1bb0f5f9e0ee67846ba8ec94a38da700e2e80d
OK
# 槽 4096 已開啟導出狀態(tài)
192.168.11.40:9001> cluster nodes
8ccdb0963411ebd05ce21952bdd4b7597825afdc 192.168.11.40:9001@19001 myself,master - 0 1620929179000 2 connected 0-5461 [4096->-bb1bb0f5f9e0ee67846ba8ec94a38da700e2e80d]
...

導出數據

# 獲取 100 個屬于槽 4096 的鍵
192.168.11.40:9001> cluster getkeysinslot 4096 100
1) "key:test:5028"
2) "key:test:68253"
# 查看數據
192.168.11.40:9001> mget key:test:5028 key:test:68253
1) "value:5028"
2) "value:68253"
# 遷移這2個鍵:migrate 命令保證了每個鍵遷移過程的原子性
192.168.11.40:9001> migrate 192.168.11.40 9007 "" 0 5000 keys key:test:5028 key:test:68253
OK
# 再次查詢會報 ASK 錯誤:引導客戶端找到數據所在的節(jié)點
192.168.11.40:9001> mget key:test:5028 key:test:68253
(error) ASK 4096 192.168.11.40:9007

通知所有主節(jié)點:槽 4096 指派給 9007

192.168.11.40:9001> cluster setslot 4096 node bb1bb0f5f9e0ee67846ba8ec94a38da700e2e80d
192.168.11.40:9002> cluster setslot 4096 node bb1bb0f5f9e0ee67846ba8ec94a38da700e2e80d
192.168.11.40:9003> cluster setslot 4096 node bb1bb0f5f9e0ee67846ba8ec94a38da700e2e80d
192.168.11.40:9007> cluster setslot 4096 node bb1bb0f5f9e0ee67846ba8ec94a38da700e2e80d

查看最終結果

192.168.11.40:9007> cluster nodes
8ccdb0963411ebd05ce21952bdd4b7597825afdc 192.168.11.40:9001@19001 master - 0 1620931743303 7 connected 0-4095 4097-5461
bb1bb0f5f9e0ee67846ba8ec94a38da700e2e80d 192.168.11.40:9007@19007 myself,master - 0 1620931741000 8 connected 4096
...

2. 使用 redis-cli 擴容

redis-cli 提供了槽重分片功能

reshard 命令參數詳解:

reshard    host:port  # 集群內任意節(jié)點地址
           --cluster-from <arg>  # 源節(jié)點id,逗號分隔
           --cluster-to <arg>  # 目標節(jié)點id,只有一個
           --cluster-slots <arg>  # 遷移多少個槽
           --cluster-yes  # 確認執(zhí)行reshard
           --cluster-timeout <arg>  # 每次 migrate 操作的超時時間,默認 60000ms
           --cluster-pipeline <arg>  # 每次批量遷移鍵的數量,默認 10
           --cluster-replace

將 9001、9002、9003 的槽遷移到 9007,共遷移 4096 個

$ /usr/local/redis/bin/redis-cli --cluster reshard 192.168.11.40:9001
M: 8ccdb0963411ebd05ce21952bdd4b7597825afdc 192.168.11.40:9001
   slots:[0-4095],[4097-5461] (5461 slots) master
   1 additional replica(s)
M: bb1bb0f5f9e0ee67846ba8ec94a38da700e2e80d 192.168.11.40:9007
   slots:[4096] (1 slots) master
...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 4096
What is the receiving node ID? bb1bb0f5f9e0ee67846ba8ec94a38da700e2e80d
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1: 8ccdb0963411ebd05ce21952bdd4b7597825afdc
Source node #2: 5786e3237c7fa413ed22465d15be721f95e72cfa
Source node #3: 85ceb9826e8aa003169c46fb4ba115c72002d4f9
Source node #4: done
    Moving slot 0 from 8ccdb0963411ebd05ce21952bdd4b7597825afdc
    ...
    Moving slot 12287 from 85ceb9826e8aa003169c46fb4ba115c72002d4f9
Do you want to proceed with the proposed reshard plan (yes/no)? yes
Moving slot 0 from 192.168.11.40:9001 to 192.168.11.40:9007:
...
Moving slot 12287 from 192.168.11.40:9003 to 192.168.11.40:9007:

查看最終結果

192.168.11.40:9007> cluster nodes
8ccdb0963411ebd05ce21952bdd4b7597825afdc 192.168.11.40:9001@19001 master - 0 1620933907753 7 connected 1366-4095 4097-5461
5786e3237c7fa413ed22465d15be721f95e72cfa 192.168.11.40:9002@19002 master - 0 1620933906733 1 connected 6827-10922
85ceb9826e8aa003169c46fb4ba115c72002d4f9 192.168.11.40:9003@19003 master - 0 1620933905000 3 connected 12288-16383
bb1bb0f5f9e0ee67846ba8ec94a38da700e2e80d 192.168.11.40:9007@19007 myself,master - 0 1620933900000 8 connected 0-1365 4096 5462-6826 10923-12287
...

檢查節(jié)點之間槽的均衡性

$ /usr/local/redis/bin/redis-cli --cluster rebalance 192.168.11.40:9001
...
[OK] All 16384 slots covered.
*** No rebalancing needed! All nodes are within the 2.00% threshold.

遷移之后所有主節(jié)點負責的槽數量差異在 2% 以內,因此集群節(jié)點數據相對均勻,無需調整

二、集群收縮

1. 遷移槽

執(zhí)行 reshard 三次,將數據平均分布到其他三個節(jié)點

2. 忘記節(jié)點

60s 內對所有節(jié)點執(zhí)行如下操作:(不建議)

# 執(zhí)行后,會將該節(jié)點加入禁用列表(持續(xù) 60s),不再向其發(fā)送 Gossip 消息
cluster forget {nodeId}

建議使用 redis-cli 的 del-node 忘記節(jié)點:

/usr/local/redis/bin/redis-cli --cluster del-node {host:port} {nodeId}

內部偽代碼

def delnode_cluster_cmd(downNode):
    # 下線節(jié)點不允許包含slots
    if downNode.slots.length != 0
        exit 1
    end
    # 向集群內節(jié)點發(fā)送cluster forget
    for n in nodes:
        if n.id == downNode.id:
            # 不能對自己做forget操作
            continue;
        # 如果下線節(jié)點有從節(jié)點則把從節(jié)點指向其他主節(jié)點
        if n.replicate && n.replicate.nodeId == downNode.id :
            # 指向擁有最少從節(jié)點的主節(jié)點
            master = get_master_with_least_replicas();
            n.cluster("replicate",master.nodeId);
        #發(fā)送忘記節(jié)點命令
        n.cluster('forget',downNode.id)
    # 節(jié)點關閉
    downNode.shutdown();

若主從節(jié)點都要下線,先下線從,避免全量復制

以上就是Redis 集群伸縮原理的詳細內容,更多關于Redis 集群原理的資料請關注腳本之家其它相關文章!

相關文章

  • Redis并發(fā)訪問問題詳細講解

    Redis并發(fā)訪問問題詳細講解

    本文主要介紹了Redis如何應對并發(fā)訪問,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-12-12
  • 基于redis 7.2.3的makefile源碼解讀學習

    基于redis 7.2.3的makefile源碼解讀學習

    這篇文章主要為大家介紹了基于redis 7.2.3的makefile源碼解讀學習,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • Redis集群的搭建圖文教程

    Redis集群的搭建圖文教程

    下面小編就為大家分享一篇Redis集群的搭建圖文教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-11-11
  • redis數據類型及應用場景知識點總結

    redis數據類型及應用場景知識點總結

    在本篇文章里小編給大家整理的是關于
    2020-02-02
  • Redis?的內存淘汰策略和過期刪除策略的區(qū)別

    Redis?的內存淘汰策略和過期刪除策略的區(qū)別

    這篇文章主要介紹了Redis?的內存淘汰策略和過期刪除策略的區(qū)別,Redis?是可以對?key?設置過期時間的,因此需要有相應的機制將已過期的鍵值對刪除,而做這個工作的就是過期鍵值刪除策略
    2022-07-07
  • redis實現存儲帖子的點贊狀態(tài)和數量的示例代碼

    redis實現存儲帖子的點贊狀態(tài)和數量的示例代碼

    使用Redis來實現點贊功能是一種高效的選擇,因為Redis是一個內存數據庫,適用于處理高并發(fā)的數據操作,這篇文章主要介紹了redis實現存儲帖子的點贊狀態(tài)和數量的示例代碼,需要的朋友可以參考下
    2023-09-09
  • 編譯安裝redisd的方法示例詳解

    編譯安裝redisd的方法示例詳解

    這篇文章主要介紹了編譯安裝redisd的方法示例詳解,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • Redis中緩存穿透/擊穿/雪崩問題和解決方法

    Redis中緩存穿透/擊穿/雪崩問題和解決方法

    大家好,本篇文章主要講的是Redis中緩存穿透/擊穿/雪崩問題和解決方法,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下哦,方便下次瀏覽
    2021-12-12
  • 淺談Redis分片集群搭建及其原理

    淺談Redis分片集群搭建及其原理

    本文主要介紹了Redis分片集群搭建及其原理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • Redis調用Lua腳本及使用場景快速掌握

    Redis調用Lua腳本及使用場景快速掌握

    Redis?是一種非常流行的內存數據庫,常用于數據緩存與高頻數據存儲。大多數開發(fā)人員可能聽說過redis可以運行?Lua?腳本,但是可能不知道redis在什么情況下需要使用到Lua腳本
    2022-03-03

最新評論

崇左市| 淅川县| 商都县| 商城县| 瓮安县| 丰宁| 博罗县| 克什克腾旗| 上林县| 隆化县| 阳新县| 宜春市| 赤壁市| 宁南县| 木里| 襄汾县| 岳西县| 惠安县| 建湖县| 杭州市| 临潭县| 柞水县| 乌兰察布市| 新巴尔虎左旗| 肇州县| 潼关县| 吉隆县| 凯里市| 杭州市| 苍梧县| 商城县| 堆龙德庆县| 定襄县| 张家川| 延长县| 怀安县| 淮北市| 娱乐| 刚察县| 蕲春县| 泸溪县|