手把手帶你實(shí)現(xiàn)分布式緩存 Redis 集群搭建!

來(lái)源:https://www.cnblogs.com/esofar/p/10486621.html
作者:Esofar

Redis 集群簡(jiǎn)介

Redis Cluster 即 Redis 集群,是 Redis 官方在
3.0 版本推出的一套分布式存儲(chǔ)方案。完全去中心化,由多個(gè)節(jié)點(diǎn)組成,所有節(jié)點(diǎn)彼此互聯(lián)。Redis
客戶端可以直接連接任何一節(jié)點(diǎn)獲取集群中的鍵值對(duì),不需要中間代理,如果該節(jié)點(diǎn)不存在用戶所指定的鍵值,其內(nèi)部會(huì)自動(dòng)把客戶端重定向到鍵值所在的節(jié)點(diǎn)。

Redis 集群是一個(gè)網(wǎng)狀結(jié)構(gòu),每個(gè)節(jié)點(diǎn)都通過(guò) TCP 連接跟其他每個(gè)節(jié)點(diǎn)連接。在一個(gè)有 N 個(gè)節(jié)點(diǎn)的集群中,每個(gè)節(jié)點(diǎn)都有 N-1 個(gè)流出的 TCP
連接,和 N-1 個(gè)流入的連接,這些 TCP 連接會(huì)永久保持。

image

Redis Cluster 同其他分布式存儲(chǔ)系統(tǒng)一樣,主要具備以下兩個(gè)功能:

數(shù)據(jù)分區(qū)

Redis 集群會(huì)將用戶數(shù)據(jù)分散保存至各個(gè)節(jié)點(diǎn)中,突破單機(jī) Redis 內(nèi)存最大存儲(chǔ)容量。集群引入了 哈希槽 slot 的概念,其搭建完成后會(huì)生
16384 個(gè)哈希槽 slot ,同時(shí)會(huì)根據(jù)節(jié)點(diǎn)的數(shù)量大致均等的將 16384 個(gè)哈希槽映射到不同的節(jié)點(diǎn)上。當(dāng)用戶存儲(chǔ) key-value
時(shí),集群會(huì)先對(duì) key 進(jìn)行 CRC16 校驗(yàn)然后對(duì) 16384 取模來(lái)決定 key-value
放置哪個(gè)槽,從而實(shí)現(xiàn)自動(dòng)分割數(shù)據(jù)到不同的節(jié)點(diǎn)上。

數(shù)據(jù)冗余

Redis 集群支持主從復(fù)制和故障恢復(fù)。集群使用了主從復(fù)制模型,每個(gè)主節(jié)點(diǎn) master 應(yīng)至少有一個(gè)從節(jié)點(diǎn) slave
。假設(shè)某個(gè)主節(jié)點(diǎn)故障,其所有子節(jié)點(diǎn)會(huì)廣播一個(gè)數(shù)據(jù)包給集群里的其他主節(jié)點(diǎn)來(lái)請(qǐng)求選票,一旦某個(gè)從節(jié)點(diǎn)收到了大多數(shù)主節(jié)點(diǎn)的回應(yīng),那么它就贏得了選舉,被推選為主節(jié)點(diǎn),負(fù)責(zé)處理之前舊的主節(jié)點(diǎn)負(fù)責(zé)的哈希槽。

關(guān)于 Redis Cluster 詳細(xì)介紹以及實(shí)現(xiàn)原理請(qǐng)參見(jiàn) Redis Cluster 教程 和 Redis Cluster 規(guī)范 ,在此不再贅述。

下載 & 安裝 Redis

實(shí)驗(yàn)環(huán)境信息
Linux 版本:CentOS Linux release 7.4.1708
Redis 版本:5.0.3

先在服務(wù)器或虛擬機(jī)中安裝一個(gè)單機(jī) Redis,如果已安裝可以跳過(guò)本節(jié),未安裝過(guò)的正好學(xué)習(xí)下。

進(jìn)入 Redis 待安裝目錄。

    cd /usr/local

下載、解壓 Redis 源代碼壓縮包。

    wget http://download.redis.io/releases/redis-5.0.3.tar.gz    
    tar -zxvf redis-5.0.3.tar.gz

然后進(jìn)入解壓后的目錄并使用 make 命令執(zhí)行編譯安裝 Redis。

    cd redis-5.0.3
    make && make install

不要高興,因?yàn)槟銟O有可能會(huì)遇到因?yàn)? GCC 編譯器未安裝導(dǎo)致編譯失敗的情況。不要著急,請(qǐng)順序執(zhí)行如下命令。

    yum -y install gcc
    make distclean
    make && make install

Redis 基于 C 語(yǔ)言開(kāi)發(fā),故編譯源碼需要 GCC(Linux下的一個(gè)編譯器,這里需要用來(lái)編譯 .c
文件)的支持。如機(jī)器上未安裝需要先執(zhí)行命令 yum -y install gcc 安裝 GCC 編譯工具,然后 make distclean 清除之前生成的文件,最后 make && make install 重新編譯安裝。

最終出現(xiàn)類似下文輸出則表示 Redis 安裝成功。

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

        INSTALL install
        INSTALL install
        INSTALL install
        INSTALL install
        INSTALL install
    make[1]: 離開(kāi)目錄“/usr/local/redis-5.0.3/src”

如果源碼編譯無(wú)誤且執(zhí)行結(jié)果正確, make install 命令會(huì)將程序安裝至系統(tǒng)預(yù)設(shè)的可執(zhí)行文件存放路徑,一般是 /usr/local/bin 目錄,可以通過(guò)如下終端輸出確認(rèn)。當(dāng)然,也可以使用 make install PREFIX=<path> 命令安裝到指定路徑。

    [root@localhost bin]# cd /usr/local/bin
    [root@localhost bin]# ls -l
    總用量 32672
    -rwxr-xr-x. 1 root root 4367328 3月   6 06:11 redis-benchmark
    -rwxr-xr-x. 1 root root 8092024 3月   6 06:11 redis-check-aof
    -rwxr-xr-x. 1 root root 8092024 3月   6 06:11 redis-check-rdb
    -rwxr-xr-x. 1 root root 4802696 3月   6 06:11 redis-cli
    lrwxrwxrwx. 1 root root      12 3月   6 06:11 redis-sentinel -> redis-server
    -rwxr-xr-x. 1 root root 8092024 3月   6 06:11 redis-server

至此,單機(jī) Redis 安裝完成。

搭建 Redis 集群

進(jìn)入正題。

依據(jù) Redis Cluster 內(nèi)部故障轉(zhuǎn)移實(shí)現(xiàn)原理,Redis 集群至少需要 3 個(gè)主節(jié)點(diǎn),而每個(gè)主節(jié)點(diǎn)至少有 1 從節(jié)點(diǎn),因此搭建一個(gè)集群至少包含 6
個(gè)節(jié)點(diǎn),三主三從,并且分別部署在不同機(jī)器上。

條件有限,測(cè)試環(huán)境下我們只能在一臺(tái)機(jī)器上創(chuàng)建一個(gè)偽集群,通過(guò)不同的 TCP 端口啟動(dòng)多個(gè) Redis 實(shí)例,組成集群。

目前 Redis Cluster 的搭建有兩種方式:

  1. 手動(dòng)方式搭建,即手動(dòng)執(zhí)行 cluster 命令,一步步完成搭建流程。

  2. 自動(dòng)方式搭建,即使用官方提供的集群管理工具快速搭建。

兩種方式原理一樣,自動(dòng)搭建方式只是將手動(dòng)搭建方式中需要執(zhí)行的 Redis
命令封裝到了可執(zhí)行程序。生產(chǎn)環(huán)境下推薦使用第二種方式,簡(jiǎn)單快捷,不易出錯(cuò)。不過(guò)本文實(shí)戰(zhàn)演示兩種方式都會(huì)提及。

手動(dòng)方式搭建

啟動(dòng)節(jié)點(diǎn)

搭建集群的第一步就是要先把參與搭建集群的每個(gè)節(jié)點(diǎn)啟動(dòng)起來(lái)。

由于我們這是在一臺(tái)機(jī)器上模擬多個(gè)節(jié)點(diǎn),可以預(yù)先規(guī)劃下各個(gè)節(jié)點(diǎn)的屬性:

節(jié)點(diǎn)編號(hào)  |  IP 地址  |  TCP 端口  |  節(jié)點(diǎn)類型  |  從節(jié)點(diǎn)  |  啟動(dòng)配置  
---|---|---|---|---|---  
A  |  127.0.0.1  |  7001  |  主  |  D  |  /usr/local/redis-
cluster/7001/redis.conf  
B  |  127.0.0.1  |  7002  |  主  |  E  |  /usr/local/redis-
cluster/7002/redis.conf  
C  |  127.0.0.1  |  7003  |  主  |  F  |  /usr/local/redis-
cluster/7003/redis.conf  
D  |  127.0.0.1  |  8001  |  從  |  /  |  /usr/local/redis-
cluster/8001/redis.conf  
E  |  127.0.0.1  |  8002  |  從  |  /  |  /usr/local/redis-
cluster/8002/redis.conf  
F  |  127.0.0.1  |  8003  |  從  |  /  |  /usr/local/redis-
cluster/8003/redis.conf

根據(jù)上述規(guī)劃,可以先通過(guò)如下命令創(chuàng)建各個(gè)節(jié)點(diǎn)啟動(dòng)配置文件的存放目錄。

    mkdir /usr/local/redis-cluster
    cd redis-cluster
    mkdir -p 7001 7002 7003 8001 8002 8003

順序執(zhí)行如下行命令,進(jìn)入 Redis 源碼包目錄并將默認(rèn)配置文件 redis.conf 分別復(fù)制到六個(gè)節(jié)點(diǎn)配置存放目錄中,作為各自節(jié)點(diǎn)啟動(dòng)配置文件。

    cd /usr/local/redis-5.0.3
    cp redis.conf /usr/local/redis-cluster/7001 
    cp redis.conf /usr/local/redis-cluster/7002
    cp redis.conf /usr/local/redis-cluster/7003 
    cp redis.conf /usr/local/redis-cluster/8001
    cp redis.conf /usr/local/redis-cluster/8002 
    cp redis.conf /usr/local/redis-cluster/8003

接下來(lái)需要分別修改每個(gè)節(jié)點(diǎn)的配置文件。下面貼的是節(jié)點(diǎn) A 的配置文件 /usr/local/redis-cluster/7001/redis.conf 中啟用或修改的一些必要參數(shù)。其他節(jié)點(diǎn) B、C、D、E、F 參照修改,注意把涉及端口的地方修改成各自節(jié)點(diǎn)預(yù)先規(guī)劃的即可。

    bind 192.168.83.128                    # 設(shè)置當(dāng)前節(jié)點(diǎn)主機(jī)地址       
    port 7001                              # 設(shè)置客戶端連接監(jiān)聽(tīng)端口     
    pidfile /var/run/redis_7001.pid        # 設(shè)置 Redis 實(shí)例 pid 文件       
    daemonize yes                          # 以守護(hù)進(jìn)程運(yùn)行 Redis 實(shí)例     
    cluster-enabled yes                    # 啟用集群模式
    cluster-node-timeout 15000             # 設(shè)置當(dāng)前節(jié)點(diǎn)連接超時(shí)毫秒數(shù)
    cluster-config-file nodes-7001.conf    # 設(shè)置當(dāng)前節(jié)點(diǎn)集群配置文件路徑

完成上述工作就可以通過(guò)如下幾組命令啟動(dòng)待搭建集群中的 6 個(gè)節(jié)點(diǎn)了。

    /usr/local/bin/redis-server /usr/local/redis-cluster/7001/redis.conf
    /usr/local/bin/redis-server /usr/local/redis-cluster/7002/redis.conf
    /usr/local/bin/redis-server /usr/local/redis-cluster/7003/redis.conf
    /usr/local/bin/redis-server /usr/local/redis-cluster/8001/redis.conf
    /usr/local/bin/redis-server /usr/local/redis-cluster/8002/redis.conf
    /usr/local/bin/redis-server /usr/local/redis-cluster/8003/redis.conf

最后通過(guò) ps -ef|grep redis 命令確認(rèn)各個(gè)節(jié)點(diǎn)服務(wù)是否已經(jīng)正常運(yùn)行。

    [root@localhost bin]# ps -ef|grep redis
    root       5613      1  0 04:25 ?        00:00:00 /usr/local/bin/redis-server 127.0.0.1:7001 [cluster]
    root       5650      1  0 04:26 ?        00:00:00 /usr/local/bin/redis-server 127.0.0.1:7002 [cluster]
    root       5661      1  0 04:26 ?        00:00:00 /usr/local/bin/redis-server 127.0.0.1:7003 [cluster]
    root       5672      1  0 04:27 ?        00:00:00 /usr/local/bin/redis-server 127.0.0.1:8001 [cluster]
    root       5681      1  0 04:27 ?        00:00:00 /usr/local/bin/redis-server 127.0.0.1:8002 [cluster]
    root       5690      1  0 04:27 ?        00:00:00 /usr/local/bin/redis-server 127.0.0.1:8003 [cluster]
    root       5731   1311  0 04:28 pts/0    00:00:00 grep --color=auto redis

如上輸出可以看出上面規(guī)劃的 6 個(gè)節(jié)點(diǎn)都成功啟動(dòng)。

節(jié)點(diǎn)握手

雖然上面 6
個(gè)節(jié)點(diǎn)都啟用了群集支持,但默認(rèn)情況下它們是不相互信任或者說(shuō)沒(méi)有聯(lián)系的。節(jié)點(diǎn)握手就是在各個(gè)節(jié)點(diǎn)之間創(chuàng)建鏈接(每個(gè)節(jié)點(diǎn)與其他節(jié)點(diǎn)相連),形成一個(gè)完整的網(wǎng)格,即集群。

節(jié)點(diǎn)握手的命令如下:

    cluster meet ip port

但為了創(chuàng)建群集,不需要發(fā)送形成完整網(wǎng)格所需的所有 [ cluster meet ](https://redis.io/commands/cluster-
meet) 命令。只要能發(fā)送足夠的 cluster meet 消息,可以讓每個(gè)節(jié)點(diǎn)都可以通過(guò)一系列已知節(jié)點(diǎn)到達(dá)每個(gè)其他節(jié)點(diǎn),缺失的鏈接將被自動(dòng)創(chuàng)建。

例如,如果我們通過(guò) cluster meet 將節(jié)點(diǎn) A 與節(jié)點(diǎn) B 連接起來(lái),并將 B 與 C 連接起來(lái),則 A 和 C
會(huì)自己找到握手方式并創(chuàng)建鏈接。

我們的創(chuàng)建的 6 個(gè)節(jié)點(diǎn)可以通過(guò) redis-cli 連接到 A 節(jié)點(diǎn)執(zhí)行如下五組命令完成握手,生產(chǎn)環(huán)境需要將 IP 127.0.0.1 替換成外網(wǎng)
IP。

    cluster meet 127.0.0.1 7002
    cluster meet 127.0.0.1 7003
    cluster meet 127.0.0.1 8001
    cluster meet 127.0.0.1 8002
    cluster meet 127.0.0.1 8003

如上述命令正常執(zhí)行輸出結(jié)果如下。

    [root@localhost bin]# /usr/local/bin/redis-cli -p 7001
    127.0.0.1:7001> cluster meet 127.0.0.1 7002
    OK
    127.0.0.1:7001> cluster meet 127.0.0.1 7003
    OK
    127.0.0.1:7001> cluster meet 127.0.0.1 8001
    OK
    127.0.0.1:7001> cluster meet 127.0.0.1 8002
    OK
    127.0.0.1:7001> cluster meet 127.0.0.1 8003
    OK

接下來(lái)可以通過(guò) cluster nodes 命令查看節(jié)點(diǎn)之間
的鏈接狀態(tài)。我隨機(jī)找了兩個(gè)節(jié)點(diǎn) B 和 F 測(cè)試,輸出結(jié)果如下所示。

   [root@localhost /]# /usr/local/bin/redis-cli -p 7002 cluster nodes
    61e8c4ed8d1ff2a765a4dd2c3d300d8121d26e12 127.0.0.1:7001@17001 master - 0 1552220691885 4 connected
    a8a41694f22977fda78863bdfb3fc03dd1fab1bd 127.0.0.1:8002@18002 master - 0 1552220691000 5 connected
    51987c4b5530c81f2845bb9d521daf6d3dce3659 127.0.0.1:8001@18001 master - 0 1552220690878 3 connected
    1b4b3741945d7fed472a1324aaaa6acaa1843ccb 127.0.0.1:7002@17002 myself,master - 0 1552220690000 1 connected
    19147f56e679767bcebb8653262ff7f56ca072a8 127.0.0.1:7003@17003 master - 0 1552220691000 2 connected
    ed6fd72e61b747af3705b210c7164bc68739303e 127.0.0.1:8003@18003 master - 0 1552220690000 0 connected
    [root@localhost /]# /usr/local/bin/redis-cli -p 8002 cluster nodes
    1b4b3741945d7fed472a1324aaaa6acaa1843ccb 127.0.0.1:7002@17002 master - 0 1552220700255 1 connected
    ed6fd72e61b747af3705b210c7164bc68739303e 127.0.0.1:8003@18003 master - 0 1552220703281 0 connected
    19147f56e679767bcebb8653262ff7f56ca072a8 127.0.0.1:7003@17003 master - 0 1552220700000 2 connected
    a8a41694f22977fda78863bdfb3fc03dd1fab1bd 127.0.0.1:8002@18002 myself,master - 0 1552220701000 5 connected
    61e8c4ed8d1ff2a765a4dd2c3d300d8121d26e12 127.0.0.1:7001@17001 master - 0 1552220702275 4 connected
    51987c4b5530c81f2845bb9d521daf6d3dce3659 127.0.0.1:8001@18001 master - 0 1552220701265 3 connected

可以看到,節(jié)點(diǎn) B 和節(jié)點(diǎn) F 都已經(jīng)分別和其他 5 個(gè)節(jié)點(diǎn)建立鏈接。

至此,節(jié)點(diǎn)握手完成。

分配槽位

此時(shí) Redis 集群還并沒(méi)有處于上線狀態(tài),可以在任意一節(jié)點(diǎn)上執(zhí)行 cluster info 命令來(lái)查看目前集群的運(yùn)行狀態(tài)。

    [root@localhost ~]# /usr/local/bin/redis-cli -p 7001 cluster info
    cluster_state:fail
    ......

上面輸出 cluster_state:fail 表示當(dāng)前集群處于下線狀態(tài)。因?yàn)橹挥薪o集群中所有 主節(jié)點(diǎn) 分配好槽位(即哈希槽 slot ,本文第一小節(jié)有提及)集群才能上線。

分配槽位的命令如下:

    cluster addslots slot [slot ...]

根據(jù)預(yù)先規(guī)劃,這一步需要使用 cluster addslots

命令手動(dòng)將 16384 個(gè)哈希槽大致均等分配給 主節(jié)點(diǎn) A、B、C。

    /usr/local/bin/redis-cli -p 7001 cluster addslots {0..5461}
    /usr/local/bin/redis-cli -p 7002 cluster addslots {5462..10922}
    /usr/local/bin/redis-cli -p 7003 cluster addslots {10923..16383}

上面三組命令執(zhí)行完畢,可以再次查看目前集群的一些運(yùn)行參數(shù)。

    [root@localhost ~]# /usr/local/bin/redis-cli -p 7001 cluster info
    cluster_state:ok
    cluster_slots_assigned:16384
    cluster_slots_ok:16384
    cluster_slots_pfail:0
    cluster_slots_fail:0
    cluster_known_nodes:6
    cluster_size:3
    cluster_current_epoch:5
    cluster_my_epoch:4
    cluster_stats_messages_ping_sent:11413
    cluster_stats_messages_pong_sent:10509
    cluster_stats_messages_meet_sent:11
    cluster_stats_messages_sent:21933
    cluster_stats_messages_ping_received:10509
    cluster_stats_messages_pong_received:10535
    cluster_stats_messages_received:21044

如上輸出 cluster_state:ok 證明 Redis 集群成功上線。

主從復(fù)制

Redis 集群成功上線,不過(guò)還沒(méi)有給主節(jié)點(diǎn)指定從節(jié)點(diǎn),此時(shí)如果有一個(gè)節(jié)點(diǎn)故障,那么整個(gè)集群也就掛了,也就無(wú)法實(shí)現(xiàn)高可用。

集群中需要使用 cluster replicate
命令手動(dòng)給從節(jié)點(diǎn)配置主節(jié)點(diǎn)。

集群復(fù)制命令如下:

    cluster replicate node-id

集群中各個(gè)節(jié)點(diǎn)的 node-id 可以用 cluster nodes 命令查看,如下輸出 1b4b3741945d7fed472a1324aaaa6acaa1843ccb 即是主節(jié)點(diǎn) B 的 node-id 。

    [root@localhost /]# /usr/local/bin/redis-cli -p 8002 cluster nodes
    1b4b3741945d7fed472a1324aaaa6acaa1843ccb 127.0.0.1:7002@17002 master - 0 1552220700255 1 connected
    ed6fd72e61b747af3705b210c7164bc68739303e 127.0.0.1:8003@18003 master - 0 1552220703281 0 connected
    19147f56e679767bcebb8653262ff7f56ca072a8 127.0.0.1:7003@17003 master - 0 1552220700000 2 connected
    a8a41694f22977fda78863bdfb3fc03dd1fab1bd 127.0.0.1:8002@18002 myself,master - 0 1552220701000 5 connected
    61e8c4ed8d1ff2a765a4dd2c3d300d8121d26e12 127.0.0.1:7001@17001 master - 0 1552220702275 4 connected
    51987c4b5530c81f2845bb9d521daf6d3dce3659 127.0.0.1:8001@18001 master - 0 1552220701265 3 connected

根據(jù)預(yù)先規(guī)劃,A主D從;B主E從;C主F從。執(zhí)行如下三組命令分別為從節(jié)點(diǎn) D、E、F 指定其主節(jié)點(diǎn),使群集可以自動(dòng)完成主從復(fù)制。

    /usr/local/bin/redis-cli -p 8001 cluster replicate 61e8c4ed8d1ff2a765a4dd2c3d300d8121d26e12
    /usr/local/bin/redis-cli -p 8002 cluster replicate 1b4b3741945d7fed472a1324aaaa6acaa1843ccb
    /usr/local/bin/redis-cli -p 8003 cluster replicate 19147f56e679767bcebb8653262ff7f56ca072a8

命令執(zhí)行成功后,我們便算以手動(dòng)方式成功搭建了一個(gè) Redis 集群。

最后,再來(lái)查看一下集群中的節(jié)點(diǎn)信息。

    [root@localhost ~]# /usr/local/bin/redis-cli -p 8002 cluster nodes
    1b4b3741945d7fed472a1324aaaa6acaa1843ccb 127.0.0.1:7002@17002 master - 0 1552233328337 1 connected 5462-10922
    ed6fd72e61b747af3705b210c7164bc68739303e 127.0.0.1:8003@18003 slave 19147f56e679767bcebb8653262ff7f56ca072a8 0 1552233327000 2 connected
    19147f56e679767bcebb8653262ff7f56ca072a8 127.0.0.1:7003@17003 master - 0 1552233325000 2 connected 10923-16383
    a8a41694f22977fda78863bdfb3fc03dd1fab1bd 127.0.0.1:8002@18002 myself,slave 1b4b3741945d7fed472a1324aaaa6acaa1843ccb 0 1552233327000 5 connected
    61e8c4ed8d1ff2a765a4dd2c3d300d8121d26e12 127.0.0.1:7001@17001 master - 0 1552233327327 4 connected 0-5461
    51987c4b5530c81f2845bb9d521daf6d3dce3659 127.0.0.1:8001@18001 slave 61e8c4ed8d1ff2a765a4dd2c3d300d8121d26e12 0 1552233326320 4 connected

自動(dòng)方式搭建

Redis 3.0 版本之后官方發(fā)布了一個(gè)集群管理工具 redis-trib.rb,集成在 Redis 源碼包的 src 目錄下。其封裝了
Redis 提供的集群命令,使用簡(jiǎn)單、便捷。

不過(guò) redis-trib.rb 是 Redis 作者使用 Ruby 語(yǔ)言開(kāi)發(fā)的,故使用該工具之前還需要先在機(jī)器上安裝 Ruby
環(huán)境。后面作者可能意識(shí)到這個(gè)問(wèn)題,Redis 5.0 版本開(kāi)始便把這個(gè)工具集成到 redis-cli 中,以 --cluster 參數(shù)提供使用,其中
create 命令可以用來(lái)創(chuàng)建集群。

啟動(dòng)節(jié)點(diǎn)

使用集群管理工具搭建集群之前,也是需要先把各個(gè)節(jié)點(diǎn)啟動(dòng)起來(lái)的。節(jié)點(diǎn)的啟動(dòng)方式請(qǐng)參見(jiàn)本文「手動(dòng)方式創(chuàng)建」-「啟動(dòng)節(jié)點(diǎn)」一節(jié),此處不再贅述。

集群管理工具搭建

如果您安裝的 Redis 是 3.x 和 4.x 的版本可以使用 redis-trib.rb 搭建,不過(guò)之前需要安裝 Ruby 環(huán)境。

先使用 yum 安裝 Ruby 環(huán)境以及其他依賴項(xiàng)。

    yum -y install ruby ruby-devel rubygems rpm-build

確認(rèn)安裝版本。

    [root@localhost redis-cluster]# ruby -v
    ruby 2.0.0p648 (2015-12-16) [x86_64-linux]

再使用 redis-trib.rb 腳本搭建集群,具體命令如下所示。

    /usr/local/redis-5.0.3/src/redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:8001 127.0.0.1:8002 127.0.0.1:8003

不過(guò),本文實(shí)驗(yàn)環(huán)境使用的 Redis 版本是 5.0.3,所以我可以直接使用 redis-cli --cluster create
命令搭建,具體命令如下所示。

    /usr/local/bin/redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:8001 127.0.0.1:8002 127.0.0.1:8003 --cluster-replicas 1

主節(jié)點(diǎn)在前,從節(jié)點(diǎn)在后。其中 --cluster-replicas 參數(shù)用來(lái)指定一個(gè)主節(jié)點(diǎn)帶有的從節(jié)點(diǎn)個(gè)數(shù),如上 --cluster- replicas 1 即表示 1 個(gè)主節(jié)點(diǎn)有 1 個(gè)從節(jié)點(diǎn)。

命令執(zhí)行成功會(huì)有類似如下輸出。

    [root@localhost bin]# redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:8001 127.0.0.1:8002 127.0.0.1:8003 --cluster-replicas 1
    >>> Performing hash slots allocation on 6 nodes...
    Master[0] -> Slots 0 - 5460
    Master[1] -> Slots 5461 - 10922
    Master[2] -> Slots 10923 - 16383
    Adding replica 127.0.0.1:8001 to 127.0.0.1:7001
    Adding replica 127.0.0.1:8002 to 127.0.0.1:7002
    Adding replica 127.0.0.1:8003 to 127.0.0.1:7003
    >>> Trying to optimize slaves allocation for anti-affinity
    [WARNING] Some slaves are in the same host as their master
    M: 32f9819fc7d561bfa2b7189182200e86d9901b8a 127.0.0.1:7001
       slots:[0-5460] (5461 slots) master
    M: cca0fbfa374bc175d481e68ee9ed13b65453e967 127.0.0.1:7002
       slots:[5461-10922] (5462 slots) master
    M: 964cfa1c2dcfe36b6d3c63637f0d57ccb568354e 127.0.0.1:7003
       slots:[10923-16383] (5461 slots) master
    S: 1b47b9e6e7a79523579b8d2ddcd5e708583ed317 127.0.0.1:8001
       replicates 32f9819fc7d561bfa2b7189182200e86d9901b8a
    S: aba9330f3e70f26a8af4ced1b672fbcc7bc62d78 127.0.0.1:8002
       replicates cca0fbfa374bc175d481e68ee9ed13b65453e967
    S: 254db0830cd764e075aa793144572d5fa3a398f0 127.0.0.1:8003
       replicates 964cfa1c2dcfe36b6d3c63637f0d57ccb568354e
    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 127.0.0.1:7001)
    M: 32f9819fc7d561bfa2b7189182200e86d9901b8a 127.0.0.1:7001
       slots:[0-5460] (5461 slots) master
       1 additional replica(s)
    S: aba9330f3e70f26a8af4ced1b672fbcc7bc62d78 127.0.0.1:8002
       slots: (0 slots) slave
       replicates cca0fbfa374bc175d481e68ee9ed13b65453e967
    S: 1b47b9e6e7a79523579b8d2ddcd5e708583ed317 127.0.0.1:8001
       slots: (0 slots) slave
       replicates 32f9819fc7d561bfa2b7189182200e86d9901b8a
    S: 254db0830cd764e075aa793144572d5fa3a398f0 127.0.0.1:8003
       slots: (0 slots) slave
       replicates 964cfa1c2dcfe36b6d3c63637f0d57ccb568354e
    M: cca0fbfa374bc175d481e68ee9ed13b65453e967 127.0.0.1:7002
       slots:[5461-10922] (5462 slots) master
       1 additional replica(s)
    M: 964cfa1c2dcfe36b6d3c63637f0d57ccb568354e 127.0.0.1:7003
       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.

OK,搭建完成!一條命令搞定。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容