1. 程式人生 > >redis進化五(2):redis槽道與補充操作

redis進化五(2):redis槽道與補充操作

一、redis的叢集槽道

      槽道原理丟擲2個問題:

            1、節點接收資料計算槽道號後,如何判斷當前槽道號是否歸我管?

            2、判斷不歸本節點管時,如何獲取正確管理者的資訊?

      槽道邏輯結構

            

      計算邏輯

            二進位制16384位的位序可以實現當前節點判斷槽道號管理權的邏輯;

            計算二進位制,獲取人為定義的二進位制下標號(人為定義,計算位移計算)

            每一位的下標號對應二進位制,與下標號一致的槽道號到底歸不歸當前節點管理,

            是通過下標對應的二進位制值判斷1為true ,0為false;

            特點:

                  1、每個主節點都管理一批槽道,每個主節點的16384位的二進位制不一樣

                  2、從節點和沒有槽道管理權的主節點的二進位制全是0

            模擬獲取二進位制下標和對應二進位制值的程式碼(byte):

                        

      索引陣列

            16384個元素的陣列,下標0-16383,每個下標對應的元素引用的變數

            指向記憶體中一個儲存下標對應槽道號管理者的索引節點資訊;

            

二、redis補充操作

      手動搭建:呼叫叢集命令cluster meet 節點碰撞

            注意:手動搭建叢集,登入時用-h攜帶對外訪問地址

            啟動節點:8000-8005全啟動(不清楚看前邊文章)

            

            節點握手:

                   登入任何啟動的節點;>cluster meet ip port(ip埠是其它節點資訊)

             注意:跨伺服器執行叢集的搭建,需要登入時使用對外訪問ip地址

             [[email protected]

redis-3.2.11]# redis-cli -c -p 8000 -h 192.168.10.10

             10.9.17.153:8000>cluster meet 192.168.10.10 8001

             初始化情況下,所有的握手節點都是master

             

            新增其它節點到叢集(槽道是沒有分配的)

            

            8000-8002是主節點,8003-8005是從節點。

            先為8000-8002分配槽道

            cluster addslots 槽道號:可以1個,也可以多個用空格隔開

            

            addslot執行完成後,當前節點和其他節點的共享陣列發生變動,0號元素內容替換為8000的節點資訊

            和其他所有節點的二進位制,除了8000的第0位從0變成了1,其他沒變化

            分配一個槽道後,檢視叢集info狀態,在16384個槽道完全分配完畢前,fail

            分配其他槽道的指令碼,這裡使用到shell指令碼,例如如下指令碼內容

            

            注意:上面黃色部分是一行,不需要換行。不然會失敗。

            執行shell指令碼

                  bash 8000slot.sh

            呼叫執行shell指令碼,將0-5461槽道挨個新增到當前8000節點中

            檢視叢集節點資訊,發現槽道分配完畢

            

            同理為其他兩個節點分配槽道

                   8001(5462-10922)

                   8002(10923-16383)

            

      新增從節點

  利用叢集命令cluster來搭建,必須先meet進來

            將8003登入,然後呼叫命令新增為8001的從節點

                  cluster replicate 8001的id

            

            8004,8005的操作一樣,分別掛載到8000,8002,形成三主三從的叢集結構。

      總結:redis-trib.rb命令檔案就是利用ruby語言完成上述步驟的封裝;對外提供方便的呼叫指令。

三、槽道的遷移(資料微調)

      空槽道遷移(10923槽道)

目標節點(8001)匯入槽道(目標節點中二進位制不變,陣列當前槽道的狀態變為匯入)正常狀態是stable

                  cluster setslot 10923 importing 源節點id

                              在8001上登入,執行命令,10923就是操作的槽道,importing將8001上的

                              陣列的10923元素中的槽道狀態

                              修改為匯入importing,跟著的是源節點id 8002的id

                  cluster setslot 10923 importing 28d08aa5640c9544c3732551f971ede6bb432210

                             

            源節點(8002)匯出槽道(源節點二進位制不變,陣列槽道狀態變為匯出)

                  登入8002執行遷出操作

                  cluster setslot 10923 migrating 目標節點id

                  cluster setslot 10923 migrating dec454918ff966249a35ee4b2460c61cc09da709(8001的id)

                  通過cluster nodes觀察到 8002的資訊也發生了變化

                  注意:槽道的狀態是正常,匯入,匯出,都不影響資料的插入

                  資料微調的時候,叢集不能對外提供服務;

                 資料遷移工作,在維護內若能屬於重大維護事項;

           通知所有叢集過半主節點槽道遷移了(所有的節點,資料發生變化)

                 cluster setslot 10923 node 8001的id 所有叢集節點都執行這個操作

                 將所有叢集節點通知到,10923從現在開始,歸8001所有

                  

                  

      非空槽道遷移(reshard命令不支援)

            按照以上的內容,有資料的槽道可以遷移,但是陣列儲存著map{槽道號:[keys]};

            所以,要遷移費闊能槽道,需要同步的將資料keys一併遷移;

            name 儲存在5798上,遷移5798(源節點8001)目標節點8002

            目標節點匯入槽道

                  cluster setslot 5798 importing dec454918ff966249a35ee4b2460c61cc09da709(源節點id)

            源節點匯出槽道

                  cluster setslot 5798 migrating 28d08aa5640c9544c3732551f971ede6bb432210(目標節點id)

            將槽道的資料遷移到目標節點(登入源節點遷移資料)

                  確定當前槽道包含的所有key(5798)

                  redis-cli -h 192.168.10.10 -p 8001 -c(登入8001)

                  cluster getkeysinslot 5798 5(獲取槽道儲存的陣列資訊)

                  將獲取的key值,進行遷移,從8001遷移到8002

                         migrate 192.168.10.10(目標節點) 8002 "" 0 500 keys name

                         “”:表示key的匹配;可以使用正則(需要考證)

                         0:表示遷移到目標節點的database(0-15)

                         500:連線超時毫秒數

                         keys:標籤確定遷移的key值名稱

                         name:key

                         如果有多個key:keys name1 name2 name3 name4

                         除了key-value執行遷移,map記錄{槽道:[key集合]}的內容一併遷移

           所有過半主節點通知更新資料(槽道遷移)

                  

           最後測試:

                  

四、redis叢集的命令

      叢集

            cluster info :列印叢集的資訊

            cluster nodes :列出叢集當前已知的所有節點( node),以及這些節點的相關資訊。

節點

            cluster meet <ip> <port> :將 ip 和 port 所指定的節點新增到叢集當中,讓它成為叢集的一份子。

            cluster forget <node_id> :從叢集中移除 node_id 指定的節點(保證空槽道)

            cluster replicate <node_id> :將當前節點設定為 node_id 指定的節點的從節點。

            cluster saveconfig :將節點的配置檔案儲存到硬盤裡面。

槽(slot)

            cluster addslots <slot> [slot ...] :將一個或多個槽( slot)指派( assign)給當前節點。

            cluster delslots <slot> [slot ...] :移除一個或多個槽對當前節點的指派。

            cluster flushslots :移除指派給當前節點的所有槽,讓當前節點變成一個沒有指派任何槽的節點。

            cluster setslot <slot> node <node_id> :將槽 slot 指派給 node_id 指定的節點,如果槽已經指派給

另一個節點,那麼先讓另一個節點刪除該槽>,然後再進行指派。

            cluster setslot <slot> migrating <node_id> :將本節點的槽 slot 遷移到 node_id 指定的節點中。

            cluster setslot <slot> importing <node_id> :從 node_id 指定的節點中匯入槽 slot 到本節點。

            cluster setslot <slot> stable :取消對槽 slot 的匯入( import)或者遷移( migrate)。

            cluster keyslot <key> :計算鍵 key 應該被放置在哪個槽上。

            cluster countkeysinslot <slot> :返回槽 slot 目前包含的鍵值對數量。

            cluster getkeysinslot <slot> <count> :返回 count 個 slot 槽中的鍵  

五、雲主機

      伺服器:

            1、真實物理伺服器

                   具備各種硬體,cpu、記憶體、硬碟

            2、雲伺服器

                   雲:cloud,一群伺服器集中提供服務,需要一種虛擬的技術實現硬體資源的共享與分配

                   

相關推薦

redis進化2redis補充操作

一、redis的叢集槽道       槽道原理丟擲2個問題:             1、節點接收資料計算槽道號後,如何判斷當前槽道號是否歸我管?             2、判斷不歸本節點管時,如何獲取正確管理者的資訊?       槽道邏輯結構        

redis進化1redis叢集的安裝使用redis-cluster 及其 原理

叢集結構        特點       1、所有redis節點(包括主和從)彼此互聯(兩兩通訊),底層使用內部的二進位制傳輸協議,優化傳輸速度;         &nb

Python 影象處理 OpenCV 2畫素處理 Numpy 操作以及 Matplotlib 顯示影象

![](https://cdn.geekdigging.com/opencv/opencv_header.png) 前文傳送門: [「Python 影象處理 OpenCV (1):入門」](https://www.geekdigging.com/2020/05/17/5513454552/) ## 普通

老司機帶你玩轉面試2Redis 過期策略以及快取雪崩、擊穿、穿透

![](https://cdn.geekdigging.com/Interview/mianshi_header_1.jpg) ## 前文回顧 建議前一篇文章沒看過的同學先看下前面的文章: [「老司機帶你玩轉面試(1):快取中介軟體 Redis 基礎知識以及資料持久化」](https://www.gee

Redis筆記整理Redis安裝配置數據類型操作

數據庫 NoSQL Redis [TOC] Redis筆記整理(一):Redis安裝配置與數據類型操作 Redis簡介 Redis是一個開源(BSD許可),內存存儲的數據結構服務器,可用作數據庫,高速緩存和消息隊列代理。 它支持字符串、哈希表、列表、集合、有序集合,位圖,hyperloglo

Redis筆記整理Java API使用Redis分布式集群環境搭建

數據庫 NoSQL Redis [TOC] Redis筆記整理(二):Java API使用與Redis分布式集群環境搭建 Redis Java API使用(一):單機版本Redis API使用 Redis的Java API通過Jedis來進行操作,因此首先需要Jedis的第三方庫,因為使用的是M

Redis學習筆記1Redis的說明安裝

sets cti ansi c sde pos AR bsd 學習 ash Redis學習筆記(1):Redis說明的安裝 說明 什麽是Redis REmote DIctionary Server(Redis) 是一個由Salvatore Sanfilippo寫的key-v

Redis 學習筆記redis 面試題總結

目錄: Redis 的好處 相比 memcached 的優勢 常見效能問題 記憶體淘汰策略 使用的場景 1. 使用Redis有哪些好處? (1) 速度快,因為資料存在記憶體中,類似於HashMap,HashMap的優勢就是查詢和操作的時間複雜度都是O(1) (2)

服務計算2go環境配置學習

Go語言學習 環境配置 使用yum install 使用命令sudo yum install -y golang 直接下載安裝包 環境:騰訊雲主機 Ubuntu 16.04 具體見官方文件。 首先下載安裝包:wget https://studygolang.c

程式語言的發展趨勢及未來方向2宣告式程式設計DSL

這是Anders Hejlsberg(不用介紹這是誰了吧)在比利時TechDays 2010所做的開場演講。由於最近我在部落格上關於語言的討論比較多,出於應景,也打算將Anders的演講完整地聽寫出來。在上一部分中,Anders指出語言本身在過去的數十年裡並沒有明顯的發展,並給出了他眼中程式語言發展趨勢的預測

新手學python2C語言呼叫完成資料庫操作

繼續介紹本人的python學習過程。本節介紹如何利用python呼叫c程式碼。內容還是基於音樂資訊提取的過程,架構如圖一。Python呼叫c實現的功能是利用python訪問c語言完成mysql資料庫操作。 在利用python呼叫c語言之前,我們需要首先完成c語言功能程式

Matplotlib資料視覺化2三大容器物件常用設定

  上一篇部落格中說到,matplotlib中所有畫圖元素(artist)分為兩類:基本型和容器型。容器型元素包括三種:figure、axes、axis。一次畫圖的必經流程就是先建立好figure例項,接著由figure去建立一個或者多個axes,然後通過axes例項呼叫各種方法

Spark Streaming筆記整理DS的transformationoutput操作

job watermark number 這樣的 格式 current fix work eat DStream的各種transformation Transformation Meaning map(func) 對DStream中的各個元素進行func函數操作,然後

深入學習Redis2持久化

kvm 服務器 let vm虛擬機 文件同步 8K bus lena 機制 前言 在上一篇文章中,介紹了Redis的內存模型,從這篇文章開始,將依次介紹Redis高可用相關的知識——持久化、復制(及讀寫分離)、哨兵、以及集群。 本文將先說明上述幾種技術分別解決了Redis高

JavaEE互聯網輕量級框架整合開發書籍閱讀筆記2SSM+Redis概念理解

重復 技術 理解 size 從數據 一個 ron bat 互聯網 一、SSM+Redis的結構圖 在Java互聯網中,以Spring+SpringMVC+MyBatis(SSM)作為主流框架,SSM+Redis的結構圖如下: 二、下面介紹它們各自承擔的功能: 1.S

Redis筆記整理進階操作高級部分

數據庫 NoSQL Redis [TOC] Redis筆記整理(三):進階操作與高級部分 Redis發布訂閱 Redis發布訂閱(pub/sub)是一種消息通信模式:發送者(pub)發送消息,訂閱者(sub)接收消息。 Redis客戶端可以訂閱任意數量的頻道。 下圖展示了頻道channel1,以

分布式鎖實現大型連續劇之Redis

set 但是 sss channel 時有 commands 阻塞 iss cond 前言: 單機環境下我們可以通過JAVA的Synchronized和Lock來實現進程內部的鎖,但是隨著分布式應用和集群環境的出現,系統資源的競爭從單進程多線程的競爭變成了多進程的競爭,這時

高效運維最佳實踐03Redis叢集技術及Codis實踐 (轉)

專欄介紹 “高效運維最佳實踐”是InfoQ在2015年推出的精品專欄,由觸控科技運維總監蕭田國撰寫,InfoQ總編輯崔康策劃。 前言 誠如開篇文章所言,高效運維包括管理的專業化和技術的專業化。前兩篇我們主要在說些管理相關的內容,本篇說一下技術專業化。希望讀者朋友們能適應這個轉

Spring Boot Redis和日誌

接著上篇內容繼續往下執行。 首先pom.xml 新增redis的引用,因為開始建專案沒有,自動生成redis的引用,然後手動新增進去。 新增成功以後看我們的配置檔案 新增我們的日誌類和快取 快取方法 結果: http://localhost:8080/set?key=lxh2&

Redis2-----初識Redis-----基礎redis命令

hash型別(雜湊map)HMSET mymap1 name "qingruihappy" description "suning" age "20" sex "man" sex "man" sex "man" sex "man"HMSET mymap2 name "qingruihappy" descrip