1. 程式人生 > >Redis Cluster 從零安裝並詳解

Redis Cluster 從零安裝並詳解

Redis 基礎安裝

基礎環境

三臺機器

OS IP
CentOS 7.4 192.168.117.135
CentOS 7.4 192.168.117.136
CentOS 7.4 192.168.117.137

下載 Redis 原始碼包

  首先在一臺機器上部署兩個不同埠的 Redis:192.168.117.135

[[email protected] tmp]# wget http://download.redis.io/releases/redis-4.0.10.tar.gz
--2018-07-02 22
:50:18-- http://download.redis.io/releases/redis-4.0.10.tar.gz Resolving download.redis.io (download.redis.io)... 109.74.203.151 Connecting to download.redis.io (download.redis.io)|109.74.203.151|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 1738465 (1.7M) [application/x-gzip] Saving to: ‘redis-4.0
.10.tar.gz100%[===========================================================================================================================================================>] 1,738,465 558KB/s in 3.0s 2018-07-02 22:50:21 (558 KB/s) - ‘redis-4.0.10.tar.gz’ saved [1738465/1738465] [[email protected]
tmp]# tar -xzvf redis-4.0.10.tar.gz

安裝Redis

[root@localhost redis-4.0.10]# make PREFIX=/usr/local/redis1 install

  出錯了:

...
MAKE hiredis
cd hiredis && make static
make[3]: Entering directory `/usr/local/tmp/redis-4.0.10/deps/hiredis'
gcc -std=c99 -pedantic -c -O3 -fPIC  -Wall -W -Wstrict-prototypes -Wwrite-strings -g -ggdb  net.c
make[3]: gcc: Command not found
make[3]: *** [net.o] Error 127
make[3]: Leaving directory `/usr/local/tmp/redis-4.0.10/deps/hiredis'
make[2]: *** [hiredis] Error 2
make[2]: Leaving directory `/usr/local/tmp/redis-4.0.10/deps'
make[1]: [persist-settings] Error 2 (ignored)
    CC adlist.o
/bin/sh: cc: command not found
make[1]: *** [adlist.o] Error 127
make[1]: Leaving directory `/usr/local/tmp/redis-4.0.10/src'
make: *** [install] Error 2

  make 編譯 Redis 原始碼包時,需要用到 gcc 外掛,我們安裝上 gcc 外掛即可

[root@localhost redis-4.0.10]# yum -y install gcc gcc-c++

  再次安裝,還是報錯:

[[email protected] redis-4.0.10]# make PREFIX=/usr/local/redis1 install
cd src && make install
make[1]: Entering directory `/usr/local/tmp/redis-4.0.10/src'
    CC Makefile.dep
make[1]: Leaving directory `/usr/local/tmp/redis-4.0.10/src'
make[1]: Entering directory `/usr/local/tmp/redis-4.0.10/src'
    CC adlist.o
In file included from adlist.c:34:0:
zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory
 #include <jemalloc/jemalloc.h>
                               ^
compilation terminated.
make[1]: *** [adlist.o] Error 1
make[1]: Leaving directory `/usr/local/tmp/redis-4.0.10/src'
make: *** [install] Error 2

  原因是 jemalloc 過載了Linux下的 ANSICmallocfree 函式。解決辦法:make 時新增引數。

[[email protected] redis-4.0.10]# make MALLOC=libc PREFIX=/usr/local/redis1 install
cd src && make install
make[1]: Entering directory `/usr/local/tmp/redis-4.0.10/src'
rm -rf redis-server redis-sentinel redis-cli redis-benchmark redis-check-rdb redis-check-aof *.o *.gcda *.gcno *.gcov redis.info lcov-html Makefile.dep dict-benchmark
(cd ../deps && make distclean)
make[2]: Entering directory `/usr/local/tmp/redis-4.0.10/deps'
(cd hiredis && make clean) > /dev/null || true
(cd linenoise && make clean) > /dev/null || true
(cd lua && make clean) > /dev/null || true
(cd jemalloc && [ -f Makefile ] && make distclean) > /dev/null || true
(rm -f .make-*)
make[2]: Leaving directory `/usr/local/tmp/redis-4.0.10/deps'
(rm -f .make-*)
echo STD=-std=c99 -pedantic -DREDIS_STATIC= >> .make-settings
echo WARN=-Wall -W -Wno-missing-field-initializers >> .make-settings
***********************此處省略***********************
    CC geohash.o
    CC geohash_helper.o
    CC childinfo.o
    CC defrag.o
    CC siphash.o
    CC rax.o
    LINK redis-server
    INSTALL redis-sentinel
    CC redis-cli.o
    LINK redis-cli
    CC redis-benchmark.o
    LINK redis-benchmark
    INSTALL redis-check-rdb
    INSTALL redis-check-aof

Hint: It's a good idea to run 'make test' ;)

    INSTALL install
    INSTALL install
    INSTALL install
    INSTALL install
    INSTALL install
make[1]: Leaving directory `/usr/local/tmp/redis-4.0.10/src'

  安裝完成,我們再在此臺機器上部署第二個 Redis,直接安裝即可

[root@localhost redis-4.0.10]# make MALLOC=libc PREFIX=/usr/local/redis2 install

  至此,一臺機器(192.168.117.135)上的兩個 Redis 安裝完成,另外兩臺機器相同操作即可

Redis Cluster 概念

這節較為無聊,想快速使用的,可以直接看下一節:Redis Cluster 部署

結構設計

  Redis叢集搭建的方式有多種,例如使用 ZookeeperProxy 等,但從Redis 3.0 之後版本支援 Redis Cluster 叢集,Redis Cluster採用無中心結構,每個節點儲存資料和整個叢集狀態,每個節點都和其他所有節點連線。其 Redis Cluster 架構圖如下:

Redis Cluster架構圖

高效能

  • 採用了非同步複製機制,向某個節點寫入資料時,無需等待其它節點的寫資料響應。
  • 無中心代理節點,而是將客戶端直接重定向到擁有資料的節點。
  • 對於N個 Master 節點的 Cluster ,整體效能理論上相當於單個 Redis 的效能的N倍。

高可用

  • 採用了主從複製的機制,Master 節點失效時 Slave 節點自動提升為 Master 節點。如果 Cluster 中有N個 Master 節點,每個 Master 擁有1個 Slave 節點,那麼這個 Cluster 的失效概率為 1/(2*N-1),可用概率為 1-1/(2*N-1)

高可擴充套件

  • 可支援多達1000個服務節點。隨時可以向 Cluster 中新增新節點,或者刪除現有節點。Cluster 中每個節點都與其它節點建立了相互連線。

結構特點

  • 所有的 Redis 節點彼此互聯(PING-PONG機制),內部使用二進位制協議優化傳輸速度和頻寬。
  • 節點的fail是通過叢集中超過半數的節點檢測失效時才生效。
  • 客戶端與 Redis 節點直連,不需要中間Proxy層,客戶端不需要連線叢集所有節點,連線叢集中任何一個可用節點即可。
  • Redis Cluster 把所有的物理節點對映到[0-16383] slot(雜湊槽) 上(不一定是平均分配),Cluster 負責維護node <-> slot <-> value
  • Redis 叢集預分好 16384 個雜湊槽,當需要在 Redis 叢集中放置一個 key-value 時,根據 CRC16(key) mod 16384 的值,決定將一個 key 放到哪個桶中。

主要元件

鍵分佈模型

  鍵(keys)空間有 16384slots。理論上 Redis Cluster 可以支援 16384 個 Master 節點,但是推薦的節點數量最多為 1000 個 Master 。每個 Master 節點處理這些 slots 中的一部分。如果沒有 Cluster 的重新配置,那麼 Cluster 中的 slots 的分配是穩定的。在穩定狀態下,每個 slot 被分配到唯一一個 Master 節點上,這個 Master 節點可以有一個或多個 Slave 節點,從而同樣保證了高可用。

  鍵按照下面的公式分配到某個slot中:

HASH_SLOT = CRC16(key) mod 16384

  據此,對於任意一個指定的鍵,可以知道這個鍵儲存在哪個 slot 中,從而進一步可以知道在哪個 Master 中。

鍵雜湊標記(key hash tags)

  對於形如 {XXXXXX}YYYYY 這樣的鍵,Redis 只對花括號中的部分XXXXXX進行雜湊運算。

  {redis.coe2coe.me}red{redis.coe2coe.me}green,這兩個鍵將分配到同一個 slot 中。

Cluster 結點屬性

  結點ID:Cluster 中每個節點都有一個唯一的名稱。這個名稱由一個 160bits 的隨機數的十六進位制形式來表示,這個隨機數在結點首次啟動時產生。修改結點的IP地址無需修改結點的ID,Redis Cluster 使用 gossip 協議自動檢測結點的IP和埠的變化。

Cluster 匯流排(Bus)

  Redis Cluster 的節點之間通過 Cluster 匯流排進行相互通訊。如果節點通過埠 6379 與客戶端通訊,那麼節點同時還需要通過 16379(10000+6379)與其它節點通訊。節點之間的通訊使用 Cluster匯流排協議(gossip) 進行通訊,這個協議是一種二進位制通訊協議。

Cluster拓撲

  N個節點的 Redis Cluster 中,每個節點都與 Cluster 中的每個其它節點之間建立了一個連線。N個節點的Cluster中,每個節點有 N-1個連線。整個 Cluster 為 PING/PONG 機制建立了 N*(N-1)/2 個連線。

節點握手

  Redis Cluster 中的節點A傳送 MEET 訊息通知另外一個節點B,讓節點B把節點A當做 Cluster 中的一員。如果節點A認識節點B,節點B認識節點C,那麼節點B可以傳送包含節點C資訊的 MEET 訊息給節點A,從而節點A也認識節點C了,即節點A將與節點C建立連線。

  這個機制確保了以下兩個結論的成立:

  • Redis Cluster 能夠在人工組建了一個初始網路後,最終能夠自動完成全網連線拓撲的建立。
  • Redis Cluster 能夠阻止一個 Cluster 的節點在改變IP和埠後錯誤的混入其它 Cluster。

重定向

MOVED重定向

  Redis 客戶端可以向 Cluster 中的任何一個節點,包括任何 Master 和任何 Slave 節點發起查詢。如果這個查詢只包括一個鍵,或者所有的鍵都在同一個 slot 中,那麼這個節點將繼續判斷這個 slot 是否歸自己負責。如果是歸自己負責,就直接向客戶端返回查詢結果;如果不歸自己負責,就根據本節點儲存的 slot 到節點的對映關係,找到負責這個 slot 的節點,取得其IP和埠,然後向客戶端傳送一個重定向訊息MOVED,這個訊息包含了負責這個 slot 的節點的 IP 以及這個鍵的 slot,此時客戶端需要重新向負責該 slot,即負責該鍵的新節點發起查詢。

  基於 Redis Cluster 的重定向機制,客戶端存在以下的優化途徑來降低重定向的成本,主要思路是客戶端儘可能提高節點的命中率,即儘可能確保發起查詢的鍵所對應的 slot 在查詢的節點中。

  客戶端可以自行維護一個slot到節點(IP+埠)的對映。每當收到重定向訊息時,將訊息中包含的 slot 和 IP 和埠加入到這個對映中。

  另外一種方法是在客戶端剛啟動時,以及在收到重定向訊息時,發出命令 cluster nodes 或者 cluster slots 命令,查詢 Cluster 中的 slot 和 節點 的對映關係,並儲存到客戶端本地。

Cluster 線上重新配置(live reconfiguration)

  Redis Cluster 支援在 Cluster 執行過程中動態的增加或刪除節點。增加或刪除節點的本質是 slot 在節點之間的重新分配,即將 slot 從由一個節點負責,修改為由另外一個節點負責。

  新增節點:將現有節點負責的一部分 slots 分配給新增的節點,現有節點不再負責這部分 slots。

  刪除節點:將待刪除節點負責的全部 slots 分配到其它存活的節點,待刪除節點不再負責這部分 slots。

ASK 重定向

  假設的場景:slot8 當前由節點A負責,但是正在遷移到節點B,即由節點B負責。

  客戶端連線到節點A。客戶端查詢某個位於 slot8 中的鍵,該鍵已經遷移節點B。此時節點A可以向客戶端傳送 ASKING 重定向訊息,表示客戶端本次需要重定向到節點B去查詢,但是所有後續查詢還是應該查詢節點A,因為 slot8 中的其它鍵還在節點A中,所以此時不能直接傳送 MOVED 重定向訊息。客戶端收到 ASKING 重定向訊息時顯然不應該立即據此更新其 slot 到節點的對映關係。

  當遷移完成後,節點A應該向客戶端傳送 MOVED 重定向訊息,表示 slot8 已經永久重定向到了節點B。

應用程式的 mset/mget 優化

  由於 mset/mget 命令中含有多個不同的鍵,如果這些鍵分不到很多不同的 slots 中,就有可能會分佈到不同的節點中,這會帶來很大的問題。此時應該使用鍵雜湊標記(key hash tags)方法來解決這個問題,即通過讓這寫鍵有相同的標記的方式使得這寫鍵全部位於相同的 slots 中,從而位於相同的節點中。

故障容忍度

心跳和 gossip 訊息

  Redis Cluster 持續的交換 PINGPONG 資料包。這兩種資料包的資料結構相同,都包含重要的配置資訊,唯一的不同是訊息型別欄位。PING 和 PONG 資料包統稱為心跳資料包。

  每個節點在每一秒鐘都向一定數量的其它節點發送 PING 訊息,這些節點應該向傳送 PING 的節點回復一個 PONG 訊息。節點會盡可能確保擁有每個其它節點在 NOTE_TIMEOUT / 2 秒時間內的最新資訊,否則會發送一個 PING 訊息,以確定與該節點的連線是否正常。

  假定一個 Cluster 有 301 個節點,NOTE_TIMEOUT 為60秒,那麼每30秒每個節點至少傳送300個PING,即每秒10個 PING, 整個 Cluster 每秒傳送 10 x 301 = 3010 個 PING。這個數量級的流量不應該會造成網路負擔。

故障檢測

  Redis Cluster 的故障檢測用於檢測一個 Master 節點何時變得不再有效,即不能提供服務,從而應該讓 Slave 節點提升為 Master 節點。如果提升失敗,則整個 Cluster 失效,不再接受客戶端的服務請求。

  當一個節點A向另外一個節點B傳送了 PING 訊息之後,經過 NODE_TIMEOUT 秒時間之後仍然沒有收到 PONG 應答,則節點A認為節點B失效,節點A將為該節點B設定 PFAIL 標誌。

  在 NODE_TIMEOUT * FAIL_REPORT_VALIDITY_MULT 時間內,當 Cluster 中大多數節點認為節點B失效,即設定 PFAIL 標誌時,這個 Cluster 認為節點B真的失效了,此時節點A將為節點B設定 FAIL標誌,並向所有節點發送 FAIL 訊息。

  在一些特定情況下,擁有 FAIL 標誌的節點,也可以清除掉 FAIL 標誌。

  Redis Cluster 故障檢測機制最終應該讓所有節點都一致同意某個節點處於某個確定的狀態。如果發生這樣的情況少數節點確信某個節點為 FAIL,同時有少數節點確認某個節點為非 FAIL,則 Redis Cluster 最終會處於一個確定的狀態:

  • 情況1:最終大多數節點認為該節點FAIL,該節點最終實際為FAIL。
  • 情況2:最終在 N x NODE_TIMEOUT 時間內,仍然只有少數節點將給節點標記為FAIL,此時最終會清除這個節點的FAIL標誌。

故障切換

當前世代(current epoch)

  當多個節點提供了有矛盾的資訊時,需要一種機制來決定哪個資訊是最新的資訊。在 Redis Cluster 中使用世代(epoch)這個概念來解決這個問題,它是一個64位無符號整數,相當於 Redis Cluster 中的邏輯時鐘。

  每個節點在建立時的世代為 0。當一個節點收到一條訊息時,會比較傳送者的世代與自己的世代。如果傳送者的世代較大,則使用傳送者的世代作為自己的世代。最終,Cluster 中所有節點的世代都是相同的,即那個最大的世代。

  這個世代就是當前世代。當前世代如何增加的問題,在後面會介紹。

配置世代(config epoch)

  在 Slave 節點提升為 Master 節點的過程中,Slave 節點會建立一個配置世代,等於 Master 節點的當前世代,同時還要增大這個值。當所有節點同意了這個提升,即贏得 Slave 選舉時,Slave 節點將配置世代作為自己的當前世代。最終會成為 Cluster 中所有節點的當前世代。

Slave 選舉和提升

  當一個 Master 失效時,在符合以下情況時,將在該 Master 的所有 Slave 的範圍內進行選舉和提升:

  1、該 Master 為 FAIL。
  2、該 Master 失效前負責至少一個 slot。
  3、Master 和它的 Slave 之間的複製連線已經斷開。

  被選舉者的範圍:該 Master 的所有 Slaves。

  選民的範圍:所有的 Master。

  投票規則:

  1、在 NOTE_TIMEOUT * 2 時間之內,一個 Master 只能選中唯一一個 Slave,超出此時間可以再選其它Slave。目的是為了確保選舉結果唯一。
  2、世代小於當前世代的投票將被忽略。目的的是為了確保該投票不是過期的之前的選舉的投票。
  3、在符合12的前提下,投票贊成該 Slave 當選。

  獲勝規則:

  • 某個 Slave 獲得大多數的 Master 的投票。

  投票時間:

  • 在選舉開始之後的 2 * NODE_TIMEOUT 時間內投票有效。超時則選舉自動取消。下一次選舉至少在 4 * NOTE_TIMEOUT 時間之後才能舉行。

  選舉開始:

  • Slave 發出 FAILOVER_AUTH_REQUEST 訊息。

  投票:

  • Master 發出 FAILOVER_AUTH_ACK 訊息。

  在 Master 失效之後,Slave 按照以下公式計算結果決定何時開始發起選舉請求:

DELAY = 500 milliseconds + random delay between 0 and 500 milliseconds + SLAVE_RANK * 1000 milliseconds.

  其中的固定值部分,確保 Master 的 FAIL 狀態已經傳播到每個節點;隨機值部分則避免了多個 Slaves 在同一時刻發起選舉請求。

  SLAVE_RANK 由 Slave 從 Master 那裡複製了多少資料決定,複製最多的 Slave 的 RANK為 0,第 2 多的 RANK 為 1,依次類推。

  基於投票規則,最早發起投票的 Slave,最有可能獲勝。因此複製最多的 Slave 可能最先進行選舉。

slots 配置傳播

  Redis Cluster 採用兩種方式進行各個 Master 節點的 Slots 配置資訊的傳播。所謂 Slots 配置資訊,即 Master 負責儲存哪幾個 Slots。

心跳訊息

  在 PING/PONG 訊息中包含了所負責的 Slots 配置資訊。

UPDATE 訊息

  當一個節點收到 PING/PONG 訊息後,如果發現傳送者的世代小於自己的世代,則向其傳送 UPDATE 訊息,來更新其有可能已經過時的 Slots 配置資訊。如果發現傳送者的世代大於自己的世代,則用訊息中的 Slots 配置資訊更新自己的 Slots 配置資訊。

Resharding

  Redis Cluster 的 Resharding 是指在 Cluster 內的節點之間轉移 Slots 中的鍵資料,一個 Slot 之前由某個節點負責,在 Resharding 之後,可能由另外一個節點負責。

複製遷移

  Redis Cluster 在節點失效時,可能進行自動的 Slave 節點重新配置,修改了 Cluster 中部分節點的 Master-Slave 複製關係,即複製遷移

  假定場景:

  Cluster中有三個 Master 節點:A、B、C。A有1個 Slave 節點 A1,B有1個 Slave 節點B1,C有2個 Slave 節點C1和C2。A節點失效了,將A1節點提升為 Master 節點。

  考慮不進行自動的 Slave 節點的複製遷移:

  如果A失效了,則會將唯一的 Slave 節點A1提升為 Master 節點,但是它沒有 Slave 節點。這時如果A1節點又失效了,則原來A節點負責的 Slots 將失效,導致整個 cluster 不能正常工作。

  考慮進行自動的slave節點的複製遷移:

  如果A節點失效了,將唯一的 Slave 節點A1提升為 Master 節點,由於它沒有 Slave 節點,此時發現C節點有2個 Slave 節點,將其中的C2節點重新配置為A1節點的子節點。這時,Cluster 中每個 Master 節點至少有1個 Slave 節點。如果A1節點失效,可將C2節點提升為 Master。這樣的結果是提高了整個 Cluster 的可用性。

Redis Cluster 部署

部署步驟

  先前已經安裝完畢的三臺機器,每臺機器中有兩個 Redis。如下:

IP 埠號
192.168.1.135 6379
192.168.1.135 6380
192.168.1.136 7379
192.168.1.136 7380
192.168.1.137 8379
192.168.1.137 8380

  1、修改配置檔案資訊,以下需修改處:

bind 0.0.0.0                        // 測試環節,任何地址都可連線
port 6379                           // 修改成對應的埠號
daemonize yes                       // 後臺執行
pidfile /var/run/redis_6379.pid     // pid檔案
logfile "./redis.log"               // 日誌
appendonly yes                      // 開啟 aop 備份
appendfsync always                  // 每寫一條 備份 一次
cluster-enabled yes                 // 開啟 Redis Cluster 
cluster-config-file nodes-6379.conf // 記錄叢集資訊,不用手動維護,Redis Cluster 會自動維護
cluster-node-timeout 15000          // Cluster 超時時間
cluster-require-full-coverage no    // 只要有結點宕機導致16384個槽沒全被覆蓋,整個叢集就全部停止服務,所以一定要改為no

  2、依次啟動6個 Redis 例項:

[root@localhost redis1]# ./bin/redis-server redis.conf

  3、啟動完畢之後,使用 Redis 原始碼包中附帶的 Ruby 工具建立叢集。

  因為要使用 Ruby 工具,所以要先保證有 Ruby 環境,並且安裝 Redis 外掛。

[root@localhost redis-4.0.10]# yum -y install ruby ruby-devel rubygems
[root@localhost redis-4.0.10]# gem install redis

  由於網路原因,上步的 gem install redis 可能下載失敗,所以可以使用本地安裝,點選下載本地安裝檔案進行安裝。

[root@localhost redis-4.0.10]# gem install redis-3.2.1.gem
Successfully installed redis-3.2.1
Parsing documentation for redis-3.2.1
Installing ri documentation for redis-3.2.1
1 gem installed
[root@localhost redis-4.0.10]# gem list --local

*** LOCAL GEMS ***

bigdecimal (1.2.0)
io-console (0.4.2)
json (1.7.7)
psych (2.0.0)
rdoc (4.0.0)
redis (3.2.1)

   開始使用 Redis 自帶叢集管理工具建立叢集

[[email protected] redis-4.0.10]# ./src/redis-trib.rb create --replicas 1 192.168.117.135:6379 192.168.117.135:6380 192.168.117.136:7379 192.168.117.136:7380 192.168.117.137:8379 192.168.117.137:8380
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.117.135:6379
192.168.117.136:7379
192.168.117.137:8379
Adding replica 192.168.117.136:7380 to 192.168.117.135:6379
Adding replica 192.168.117.137:8380 to 192.168.117.136:7379
Adding replica 192.168.117.135:6380 to 192.168.117.137:8379
M: 670bd5ae86dae00c8cd8c3d31cd84e9faea4234a 192.168.117.135:6379
   slots:0-5460 (5461 slots) master
S: 5f6541f54bf8a7057bde3a3187701cdb617d35a6 192.168.117.135:6380
   replicates 60fd13209f9c0ef15cf7c196f1402c2643dc1b41
M: 81c6232822552e7fb9ec95b32ffad5d58f308cb4 192.168.117.136:7379
   slots:5461-10922 (5462 slots) master
S: 9925473a2e7473e2fc2fe6788f798ef6643cadec 192.168.117.136:7380
   replicates 670bd5ae86dae00c8cd8c3d31cd84e9faea4234a
M: 60fd13209f9c0ef15cf7c196f1402c2643dc1b41 192.168.117.137:8379
   slots:10923-16383 (5461 slots) master
S: cddb39f323cec35d5ef013a26219e83994113ea4 192.168.117.137:8380
   replicates 81c6232822552e7fb9ec95b32ffad5d58f308cb4
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join......
>>> Performing Cluster Check (using node 192.168.117.135:6379)
M: 670bd5ae86dae00c8cd8c3d31cd84e9faea4234a 192.168.117.135:6379
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
M: 60fd13209f9c0ef15cf7c196f1402c2643dc1b41 192.168.117.137:8379
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
S: 9925473a2e7473e2fc2fe6788f798ef6643cadec 192.168.117.136:7380
   slots: (0 slots) slave
   replicates 670bd5ae86dae00c8cd8c3d31cd84e9faea4234a
S: cddb39f323cec35d5ef013a26219e83994113ea4 192.168.117.137:8380
   slots: (0 slots) slave
   replicates 81c6232822552e7fb9ec95b32ffad5d58f308cb4
M: 81c6232822552e7fb9ec95b32ffad5d58f308cb4 192.168.117.136:7379
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
S: 5f6541f54bf8a7057bde3a3187701cdb617d35a6 192.168.117.135:6380
   slots: (0 slots) slave
   replicates 60fd13209f9c0ef15cf7c196f1402c2643dc1b41
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

  看到如 [OK] All 16384 slots covered. 的提示說明叢集建立成功。

  仔細檢視上面的日誌資訊,M:主節點。S:從節點。可以看到,自動把6個 Redis 分成了 3 個主節點和 3 個從節點,並且 3 個主節點所在伺服器是不同的,而從節點的分佈也是在三臺伺服器上各有一個,並且還不和其自己的主節點在同一個伺服器,這樣做的好處是保證了叢集的高可用性。

  4、檢視叢集

  隨便連線一個 Redis 進行檢視叢集操作,連線 Redis 記得使用 -c 引數,表示啟用叢集模式,可以使用重定向等功能。

[root@localhost redis1]# ./bin/redis-cli -c -p 6379
127.0.0.1:6379> CLUSTER NODES
60fd13209f9c0ef15cf7c196f1402c2643dc1b41 192.168.117.137:8379@18379 master - 0 1530604479000 5 connected 10923-16383
670bd5ae86dae00c8cd8c3d31cd84e9faea4234a 192.168.117.135:6379@16379 myself,master - 0 1530604474000 1 connected 0-5460
9925473a2e7473e2fc2fe6788f798ef6643cadec 192.168.117.136:7380@17380 slave 670bd5ae86dae00c8cd8c3d31cd84e9faea4234a 0 1530604480306 4 connected
cddb39f323cec35d5ef013a26219e83994113ea4 192.168.117.137:8380@18380 slave 81c6232822552e7fb9ec95b32ffad5d58f308cb4 0 1530604477276 6 connected
81c6232822552e7fb9ec95b32ffad5d58f308cb4 192.168.117.136:7379@17379 master - 0 1530604479000 3 connected 5461-10922
5f6541f54bf8a7057bde3a3187701cdb617d35a6 192.168.117.135:6380@16380 slave 60fd13209f9c0ef15cf7c196f1402c2643dc1b41 0 1530604480000 5 connected

  也可以這樣單獨檢視主節點或者從節點

[root@localhost redis1]# ./bin/redis-cli -c -p 6379 cluster nodes | grep master
60fd13209f9c0ef15cf7c196f1402c2643dc1b41 192.168.117.137:8379@18379 master - 0 1530604808096 5 connected 10923-16383
670bd5ae86dae00c8cd8c3d31cd84e9faea4234a 192.168.117.135:6379@16379 myself,master - 0 1530604809000 1 connected 0-5460
81c6232822552e7fb9ec95b32ffad5d58f308cb4 192.168.117.136:7379@17379 master - 0 1530604810104 3 connected 5461-10922
[root@localhost redis1]# ./bin/redis-cli -c -p 6379 cluster nodes | grep slave
9925473a2e7473e2fc2fe6788f798ef6643cadec 192.168.117.136:7380@17380 slave 670bd5ae86dae00c8cd8c3d31cd84e9faea4234a 0 1530604813120 4 connected
cddb39f323cec35d5ef013a26219e83994113ea4 192.168.117.137:8380@18380 slave 81c6232822552e7fb9ec95b32ffad5d58f308cb4 0 1530604814126 6 connected
5f6541f54bf8a7057bde3a3187701cdb617d35a6 192.168.117.135:6380@16380 slave 60fd13209f9c0ef15cf7c196f1402c2643dc1b41 0 1530604816135 5 connected

  上方資訊展示說明如下:

  • 節點ID
  • IP:埠
  • 標誌:master,slave,myself,,fail,…
  • 如果是個從節點,,這裡是它的主節點的 NODE ID
  • 叢集最近一次向節點發送 PING 命令之後, 過去了多長時間還沒接到回覆。.
  • 節點最近一次返回 PONG 回覆的時間。
  • 節點的配置紀元(configuration epoch):詳細資訊請參考 Redis 叢集規範
  • 本節點的網路連線情況:例如:connected
  • 節點目前包含的槽:例如 192.168.117.135:6379 目前包含號碼為 0 至 5460 的雜湊槽。

Redis Cluster 常用命令

格式 說明
CLUSTER NODES 檢視叢集節點資訊
CLUSTER REPLICATE <master-id> 進入一個從節點 Redis,切換其主節點
CLUSTER MEET <ip:port> 發現一個新節點,新增主節點
CLUSTER FORGET <id> 忽略一個節點,前提是他不能是有 Solts 的主節點
CLUSTER FAILOVER 手動故障轉移

  CLUSTER FAILOVER 命令:

  有的時候在主節點沒有任何問題的情況下強制手動故障轉移也是很有必要的,比如想要升級主節點的 Redis 程序,我們可以通過故障轉移將其轉為 Slave 再進行升級操作來避免對叢集的可用性造成很大的影響。

  Redis 叢集使用 CLUSTER FAILOVER 命令來進行故障轉移,不過要在被轉移的主節點的從節點上執行該命令,手動故障轉移比主節點失敗自動故障轉移更加安全,因為手動故障轉移時客戶端的切換是在確保新的主節點完全複製了失敗的舊的主節點資料的前提下下發生的,所以避免了資料的丟失。

  其基本過程如下:客戶端不再連結我們淘汰的主節點,同時主節點向從節點發送複製偏移量,從節點得到複製偏移量後故障轉移開始,接著通知主節點進行配置切換,當客戶端在舊的 Master 上解鎖後重新連線到新的主節點上。

redis-trib.rb 常用命令

redis-trib.rb add-node

  • 新增主節點:redis-trib.rb add-node <new_ip:new_port> <exist_ip:exist_port>

  使用 add-node 命令來新增節點,第一個引數是新節點的地址,第二個引數是任意一個已經存在的節點的IP和埠,這樣,新節點就會新增到叢集中。

  • 新增從節點:redis-trib.rb add-node –slave <new_ip:new_port> <exist_ip:exist_port>

  此處的命令和新增一個主節點命令類似,此處並沒有指定新增的這個從節點的主節點,這種情況下系統會在其他的叢集中的主節點中隨機選取一個作為這個從節點的主節點。

  • 新增指定主節點 id 的從節點:redis-trib.rb add-node –slave –master-id <主節點id> <new_ip:new_port> <exist_ip:exist_port>

  也可以使用 CLUSTER REPLICATE 命令,這個命令也可以改變一個從節點的主節點,要在從節點中使用哦。

redis-trib del-node

  • 刪除節點:redis-trib del-node <exist_ip:exist_port> <node-id>

  第一個引數是任意一個節點的地址(確定叢集所在),第二個節點是你想要移除的節點地址。

  使用同樣的方法移除主節點,不過在移除主節點前,需要確保這個主節點是空的(無 Solts)。如果不是空的,需要將這個節點的資料重新分片到其他主節點上。

  替代移除主節點的方法是手動執行故障恢復,被移除的主節點會作為一個從節點存在,不過這種情況下不會減少叢集節點的數量,也需要重新分片資料。

redis-trib.rb reshard

  • 從新分片:redis-trib.rb reshard <exist_ip:exist_port>

  你只需要指定叢集中其中一個節點的地址,redis-trib 就會自動找到叢集中的其他節點。

  目前 redis-trib 只能在管理員的協助下完成重新分片的工作,要讓 redis-trib 自動將雜湊槽從一個節點移動到另一個節點,目前來說還做不到。

  **下列嘗試從 192.168.117.136:7379 主節點移動 1000 個 Solt 到主節點 192.168.117.136:7379

[[email protected] redis-4.0.10]# ./src/redis-trib.rb reshard 192.168.117.135:6379
>>> Performing Cluster Check (using node 192.168.117.135:6379)
M: 670bd5ae86dae00c8cd8c3d31cd84e9faea4234a 192.168.117.135:6379
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: 60fd13209f9c0ef15cf7c196f1402c2643dc1b41 192.168.117.137:8379
   slots: (0 slots) slave
   replicates 5f6541f54bf8a7057bde3a3187701cdb617d35a6
S: 9925473a2e7473e2fc2fe6788f798ef6643cadec 192.168.117.136:7380
   slots: (0 slots) slave
   replicates 670bd5ae86dae00c8cd8c3d31cd84e9faea4234a
S: cddb39f323cec35d5ef013a26219e83994113ea4 192.168.117.137:8380
   slots: (0 slots) slave
   replicates 81c6232822552e7fb9ec95b32ffad5d58f308cb4
M: 81c6232822552e7fb9ec95b32ffad5d58f308cb4 192.168.117.136:7379
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
M: 5f6541f54bf8a7057bde3a3187701cdb617d35a6 192.168.117.135:6380
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 1000                  # 移動 1000 個 Slot
What is the receiving node ID? 81c6232822552e7fb9ec95b32ffad5d58f308cb4     # 移動到哪個主節點
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:670bd5ae86dae00c8cd8c3d31cd84e9faea4234a                     # 從哪個主節點移動,`all`代表各個主節點平均移一點
Source node #2:done                                                         # 完成

Ready to move 1000 slots.
  Source nodes:
    M: 670bd5ae86dae00c8cd8c3d31cd84e9faea4234a 192.168.117.135:6379
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
  Destination node:
    M: 81c6232822552e7fb9ec95b32ffad5d58f308cb4 192.168.117.136:7379
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
  Resharding plan:
    Moving slot 0 from 670bd5ae86dae00c8cd8c3d31cd84e9faea4234a
    Moving slot 1 from 670bd5ae86dae00c8cd8c3d31cd84e9faea4234a
    Moving slot 2 from 670bd5ae86dae00c8cd8c3d31cd84e9faea4234a
    Moving slot 3 from 670bd5ae86dae00c8cd8c3d31cd84e9faea4234a
    Moving slot 4 from 670bd5ae86dae00c8cd8c3d31cd84e9faea4234a
    Moving slot 5 from 670bd5ae86dae00c8cd8c3d31cd84e9faea4234a
    Moving slot 6 from 670bd5ae86dae00c8cd8c3d31cd84e9faea4234a
    Moving slot 7 from 670bd5ae86dae00c8cd8c3d31cd84e9faea4234a
*****************************此處省略*****************************
    Moving slot 995 from 670bd5ae86dae00c8cd8c3d31cd84e9faea4234a
    Moving slot 996 from 670bd5ae86dae00c8cd8c3d31cd84e9faea4234a
    Moving slot 997 from 670bd5ae86dae00c8cd8c3d31cd84e9faea4234a
    Moving slot 998 from 670bd5ae86dae00c8cd8c3d31cd84e9faea4234a
    Moving slot 999 from 670bd5ae86dae00c8cd8c3d31cd84e9faea4234a
Do you want to proceed with the proposed reshard plan (yes/no)? yes                 # 繼續執行重新分片嗎?
Moving slot 0 from 192.168.117.135:6379 to 192.168.117.136:7379:
Moving slot 1 from 192.168.117.135:6379 to 192.168.117.136:7379:
Moving slot 2 from 192.168.117.135:6379 to 192.168.117.136:7379:
Moving slot 3 from 192.168.117.135:6379 to 192.168.117.136:7379:
Moving slot 4 from 192.168.117.135:6379 to 192.168.117.136:7379:
Moving slot 5 from 192.168.117.135:6379 to 
            
           

相關推薦

Redis Cluster 安裝

Redis 基礎安裝 基礎環境 三臺機器 OS IP CentOS 7.4 192.168.117.135 CentOS 7.4 192.168.117.136 CentOS 7.4 1

Linux原始碼編譯安裝程式

1.原始碼編譯概述 1.1 使用原始碼安裝軟體的優點: 獲得最新的軟體版本,及時修復bug 根據使用者需要,靈活定製軟體功能 1.2 應用場合舉例 安裝較新版本的應用程式時 當前安裝的程式無法滿足需要時  需要為應用程式新增新的功能時

java MyEclipse打包,做成exe可執行檔案,再到做成安裝檔案

           做了一個java程式,先展示給別人看或者投入使用,java的執行是建立在JDK的基礎之上的,別人沒java環境,自然不能執行,那麼問題來呢,怎麼才能讓自己的程式在沒有環境的機器上

pip安裝使用

nds ons oot nim 格式 itl row str file pip類似RedHat裏面的yum,安裝Python包非常方便。本節詳細介紹pip的安裝、以及使用方法。 1、pip下載安裝 1.1 pip下載 # wget https://pypi.py

saltstack 安裝配置

saltstackSaltStack是一個服務器基礎架構集中化管理平臺,具備配置管理、遠程執行、監控等功能,一般可以理解為簡化版的puppet和加強版的func。SaltStack基於Python語言實現,結合輕量級消息隊列(ZeroMQ)與python第三方模塊(Pyzmq、PyCrypto、Pyjinji

轉載:centos安裝gitlab

smtp發送郵件 下載 ror mage package nload git clone 輸入 clas 原文地址:http://blog.csdn.net/jiangtao_st/article/details/73612298 一, 服務器快速搭建gitlab方法 可以

CentOS安裝流程

菜鳥取經路之linux系統安裝 對於剛剛接觸Linux的人們來說,遇到的第一個問題便是如何快速安裝一個Linux系統。我初次接觸 Linux時也是摸索許久才安裝成功。鑒於此,今天就給大家帶來完整詳細的Linux安裝過程。一、準備安裝所需的軟件 1、VMwareWorkstation

redis 下key的過期時間 :expire

編寫 抽樣 通過 字符串 n) 開發包 有序集合 memcache jedis Redis是一個開源的Key-Value數據緩存,和Memcached類似。 Redis多種類型的value,包括string(字符串)、list(鏈表)、set(集合)、zset(sort

基於Ubuntu系統XAMPP環境安裝以及DVWA滲透測試系統安裝的不能再了)

dmi 文件移動 unzip line 配置 isp round ads 開始     首先這是X勺年人生第二次博,用來記錄一下轉折於我而言。做個簡介,這個Ubuntu是linux的一種吧,然     然後這個Ubuntu是我剛簡單安裝(在虛擬機上)沒有經過任何配置,從頭

LNMP編譯安裝之nginx安裝--圖文

star bin software tcp firewall onf nload b- 編譯安裝 LNMP編譯安裝之nginx安裝--圖文詳解 1、前言 本次安裝采用源碼安裝,主要資源包從官網下載,次要依賴則使用yum進行安裝,本篇只涉及nginx的安裝,不涉及nginx

NFS服務器原理和安裝配置附案例演練

隨機選擇 span 通訊 操作系統 不同 網絡 定義 重新啟動 exportfs NFS服務器原理和安裝配置詳解附案例演練 1、什麽是NFS服務器   NFS就是Network File System的縮寫,它最大的功能就是可以通過網絡,讓不同的機器、不同的操作系統可以共享

linux--系統啟動及安裝過程

linux啟動先通過一張圖來簡單了解下整個系統啟動的流程,整個過程基本可以分為POST-->BIOS-->MBR(GRUB)-->Kernel-->Init-->Runlevel本文出自 “運維自動化” 博客,請務必保留此出處http://shower.blog.51cto.co

CentOS 7系統KVM虛擬機安裝過程

選項 安裝 svm roc 支持 linu 系統 kvm flags 一、如何安裝KVM 這裏我是在Windows系統中使用VMware Workstaion安裝了一臺Linux的虛擬機來進行KVM的安裝操作的。首先,我們需要了解我們安裝的Linux系統的CPU是否支持KV

CentOS7安裝步驟

con 選項 htm a13 圖形化 per -h esc b2c 準備環境 1.虛擬機 VMware Workstation 2.Centos7-64位安裝包 ( CentOS-6.7-x86_64-bin-DVD1.iso ) 開始安裝 進入安裝初

Redis持久化方式RDB與AOF

redis持久化 rdb aof 優勢 管理參數 前言Redis提供了兩種數據存儲方式,分別是:cache-only && persistence;cache-only顧名知義,是用與緩存服務的,數據在服務器終止後將消失,在此模式下將不存在"數據恢復"的方式,是一種安全性低

淺入深獨立ip網站域名惡意解析的解決方案

網站 pos 靜態 tac 規則 來源 代碼 功能 解析 立IP空間的好處想必大家都能耳熟聞詳,穩定性強,利於seo等讓大家選擇了鼎峰網絡香港獨立IP空間。那麽, 網站獨享服務器IP地址,獨立IP空間利於百度收錄和權重的積累、不受牽連、穩定性強等諸多優勢為一身。然而,這些優

redis --linux系統下載安裝 運行redis

cmd 地址 技術 str 指令 找到 publish 關閉 特性 redis安裝 Redis 簡介 Redis 是完全開源免費的,遵守BSD協議,是一個高性能的key-value數據庫。 Redis 與其他 key - value 緩存產品有以下三個特點: Redi

maven安裝教程

repo osi arc 默認 jdk7 div 執行 eagle bsp 一、準備工作 1、確定電腦上已經成功安裝jdk7.0以上版本 2、win10操作系統 3、mav

虛擬機 CentOS 7安裝步驟

CentOS 7VMware workstation 14 安裝步驟詳解1、下載VMware workstation 14(本人使用的此軟件目前最新版本VMware workstation 14版本) 附下載地址:http://rj

delphi 組件安裝教程

當前 範例 默認目錄 成功 ftw build 作用 cto proe 學習安裝組件的最好方法,就是自己編寫一個組件並安裝一遍,然後就真正明白其中的原理了。 本例,編寫了兩個BPL, dclSimpleEdit.bpl 與 SimpleLabel.bpl ,其中,dcl