<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          一次搞定:分布式緩存 Redis 集群搭建!

          共 14801字,需瀏覽 30分鐘

           ·

          2020-12-01 17:45

          點(diǎn)擊上方藍(lán)色“小哈學(xué)Java”,選擇“設(shè)為星標(biāo)

          回復(fù)“資源”獲取獨(dú)家整理的學(xué)習(xí)資料!

          來(lái)源:cnblogs.com/esofar/p/10486621.html

          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ì)永久保持。

          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 待安裝目錄。

          Copycd?/usr/local

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

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

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

          Copycd?redis-5.0.3
          make?&&?make?install

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

          Copyyum?-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 安裝成功。

          Copy......
          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=命令安裝到指定路徑。

          Copy[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)配置
          A127.0.0.17001D/usr/local/redis-cluster/7001/redis.conf
          B127.0.0.17002E/usr/local/redis-cluster/7002/redis.conf
          C127.0.0.17003F/usr/local/redis-cluster/7003/redis.conf
          D127.0.0.18001//usr/local/redis-cluster/8001/redis.conf
          E127.0.0.18002//usr/local/redis-cluster/8002/redis.conf
          F127.0.0.18003//usr/local/redis-cluster/8003/redis.conf

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

          Copymkdir?/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)配置文件。

          Copycd?/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ī)劃的即可。

          Copybind?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)了。

          Copy/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)行。

          Copy[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)握手的命令如下:

          Copycluster?meet?ip?port

          但為了創(chuàng)建群集,不需要發(fā)送形成完整網(wǎng)格所需的所有 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。

          Copycluster?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é)果如下。

          Copy[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é)果如下所示。

          Copy[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)。

          Copy[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é)有提及)集群才能上線。

          分配槽位的命令如下:

          Copycluster?addslots?slot?[slot?...]

          根據(jù)預(yù)先規(guī)劃,這一步需要使用 cluster addslots 命令手動(dòng)將 16384 個(gè)哈希槽大致均等分配給主節(jié)點(diǎn) A、B、C。

          Copy/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ù)。

          Copy[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ù)制命令如下:

          Copycluster?replicate?node-id

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

          Copy[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ù)制。

          Copy/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)信息。

          Copy[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)。

          Copyyum?-y?install?ruby?ruby-devel?rubygems?rpm-build

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

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

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

          Copy/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命令搭建,具體命令如下所示。

          Copy/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ì)有類似如下輸出。

          Copy[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,搭建完成!一條命令搞定。


          題外話: 目前小哈正在個(gè)人博客(新搭建的網(wǎng)站,域名就是犬小哈的拼音)?www.quanxiaoha.com?上更新《Go語(yǔ)言教程》,畢竟Go自帶天然的并發(fā)優(yōu)勢(shì),后端的同學(xué)還是要學(xué)一下的,這個(gè)教程系列小哈會(huì)一直更新下去,目前已經(jīng)更新到 Go語(yǔ)言的基礎(chǔ)語(yǔ)法了,歡迎小伙伴們?cè)L問(wèn)哦~

          END


          有熱門(mén)推薦?

          1.?Oracle 慌了!華為終于對(duì) JDK 下手了!

          2.?我給Apache頂級(jí)項(xiàng)目提了個(gè)Bug

          3.?8 款好用超贊的 Google Chrome 插件,一直用,一直爽

          4.?"服務(wù)不可用"怎么排查?講了100遍還是記不住?

          最近面試BAT,整理一份面試資料Java面試BATJ通關(guān)手冊(cè),覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫(kù)、數(shù)據(jù)結(jié)構(gòu)等等。

          獲取方式:點(diǎn)“在看”,關(guān)注公眾號(hào)并回復(fù)?Java?領(lǐng)取,更多內(nèi)容陸續(xù)奉上。

          文章有幫助的話,在看,轉(zhuǎn)發(fā)吧。

          謝謝支持喲 (*^__^*)

          瀏覽 58
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  99久久精 | 国产骚逼被操 | 亚洲黄色视频网站在线观看视频 | 婷婷色图| 午夜黄色毛片 |