redis(二)集群部署詳解

? 本文所有描述均為作者親自操作后總結(jié)出來(lái)的,如有疑問(wèn)可直接留言,將及時(shí)回復(fù),如本文理解或描述有誤的地方歡迎指出,將及時(shí)改正

本章主要描述redis集群的部署,若未搭建redis單機(jī)服務(wù)的朋友請(qǐng)移步redis(一)單機(jī)部署與應(yīng)用

參考文檔

redis官方集群指南:https://redis.io/topics/cluster-tutorial
redis官方集群規(guī)范:https://redis.io/topics/cluster-spec
redis中文集群指南:http://redisdoc.com/topic/cluster-tutorial.html
redis中文集群規(guī)范:http://redisdoc.com/topic/cluster-spec.html#cluster-spec

集群簡(jiǎn)介

?? ? redis 集群是一個(gè)可以在多個(gè) redis 節(jié)點(diǎn)之間進(jìn)行數(shù)據(jù)共享的設(shè)施(installation).
? ?? redis 集群有兩點(diǎn),一個(gè)是將數(shù)據(jù)分片存儲(chǔ),另外一個(gè)就是主從復(fù)制。一個(gè) redis 集群包含 16384 個(gè)哈希槽(hash slot), 數(shù)據(jù)庫(kù)中的每個(gè)鍵都屬于這 16384 個(gè)哈希槽的其中一個(gè)。
例如:一個(gè)集群可以有三個(gè)哈希槽, 其中:
? 節(jié)點(diǎn) A 負(fù)責(zé)處理 0 號(hào)至 5500 號(hào)哈希槽。
? 節(jié)點(diǎn) B 負(fù)責(zé)處理 5501 號(hào)至 11000 號(hào)哈希槽。
? 節(jié)點(diǎn) C 負(fù)責(zé)處理 11001 號(hào)至 16384 號(hào)哈希槽。

加入節(jié)點(diǎn)

若要加入新的機(jī)器節(jié)點(diǎn)D并為其指定900個(gè)哈希槽,那么只需要從節(jié)點(diǎn)A/B/C中拉取一定的槽移動(dòng)到D節(jié)點(diǎn)即可,如:A節(jié)點(diǎn)中移出0-300號(hào)哈希槽至D節(jié)點(diǎn),B節(jié)點(diǎn)移出5501-5801號(hào)哈希槽至D節(jié)點(diǎn),C節(jié)點(diǎn)同樣的移出11001-11301號(hào)哈希槽至D節(jié)點(diǎn),這樣就能完成哈希槽的分?jǐn)偣ぷ鳌?/p>

移除節(jié)點(diǎn)

若要移除節(jié)點(diǎn)A機(jī)器,同樣的將哈希槽轉(zhuǎn)移至B/C節(jié)點(diǎn),然后再刪除空白槽的節(jié)點(diǎn)機(jī)器即可。

注:經(jīng)試驗(yàn),改變哈希槽的歸屬不會(huì)造成節(jié)點(diǎn)阻塞,故不影響線上的功能使用,業(yè)務(wù)機(jī)器不會(huì)遇到任何異常。

集群環(huán)境

集群機(jī)器分配

要使redis集群正常工作至少需要3個(gè)master節(jié)點(diǎn),若要實(shí)現(xiàn)集群的高可用,每個(gè)master節(jié)點(diǎn)至少配置一個(gè)slave節(jié)點(diǎn),這里我將使用3個(gè)master和3個(gè)slave節(jié)點(diǎn)進(jìn)行操作,集群規(guī)劃如下:
總共6臺(tái)虛擬機(jī),分別為3臺(tái)master和3臺(tái)slave機(jī)器

服務(wù)器規(guī)劃
單節(jié)點(diǎn)配置

注:按規(guī)劃在6臺(tái)機(jī)器中裝入redis服務(wù),且保證單機(jī)模式能夠正常運(yùn)行,并配置相應(yīng)端口防火墻,建議在配置時(shí)先修改一個(gè)文件, 再互相拷貝至6臺(tái)機(jī)器

集群節(jié)點(diǎn)描述
主機(jī)名 IP 服務(wù)端口(默認(rèn)為6379) 集群通信端口 主/從
lenovo1 192.168.2.10 6010 16010 Master
lenovo3 192.168.2.30 6030 16030 Master
lenovo4 192.168.2.40 6040 16040 Master
h1 192.168.2.101 6101 16101 Slave
h2 192.168.2.102 6102 16102 Slave
h3 192.168.2.103 6103 16103 Slave
集群配置參數(shù)
配置選項(xiàng) 選項(xiàng)值 描述
daemonize yes 是否作為守護(hù)進(jìn)程運(yùn)行,配置yes則產(chǎn)生pid文件
pidfile /var/run/redis_6030.pid 如開(kāi)啟了daemonize則需指定一個(gè)pid,默認(rèn)為redis_6379.pid
port 6030 監(jiān)聽(tīng)端口默認(rèn)6793
database 1 可用數(shù)據(jù)庫(kù)數(shù),默認(rèn)為16,默認(rèn)數(shù)據(jù)庫(kù)存儲(chǔ)在DB0號(hào)ID庫(kù)中,無(wú)特殊要求建議設(shè)置一個(gè)數(shù)據(jù)庫(kù):database 1
cluster-enabled yes 打開(kāi)reids集群
cluster-config-file nodes-6030.conf 集群配置文件啟動(dòng)自動(dòng)生成不用認(rèn)為干涉
cluster-node-timeout 5000 節(jié)點(diǎn)互聯(lián)超時(shí)時(shí)間,毫秒
appendonly yes 啟用aof持久化方式
配置

以6030端口機(jī)器為例

  1. 復(fù)制redis.conf為對(duì)應(yīng)端口.conf,如6030.conf


    修改各機(jī)器端口為規(guī)劃端口
修改配置-2
修改配置-3
修改配置-4
  1. 防火墻配置

     //#redis  此處比單機(jī)要多集群通信端口的配置
     -A INPUT -p tcp -m state --state NEW -m tcp --dport 6030 -j ACCEPT
     -A INPUT -p tcp -m state --state NEW -m tcp --dport 16030 -j ACCEPT
    
防火墻配置圖
  1. 使用如下命令啟動(dòng)節(jié)點(diǎn)(后續(xù)啟動(dòng)都是如此)

     192.168.2.10
     /home/lenovo/install/redis-3.2.9/bin/redis-server /home/lenovo/install/redis-3.2.9/6010.conf
    
     192.168.2.30
     /home/lenovo/install/redis-3.2.9/bin/redis-server /home/lenovo/install/redis-3.2.9/6030.conf
    
     192.168.2.40
     /home/lenovo/install/redis-3.2.9/bin/redis-server /home/lenovo/install/redis-3.2.9/6040.conf
    
     192.168.2.101
     /home/grid/redis-3.2.9/bin/redis-server /home/grid/redis-3.2.9/6101.conf
    
    192.168.2.102
    /home/grid/redis-3.2.9/bin/redis-server /home/grid/redis-3.2.9/6102.conf
    
    192.168.2.103
    /home/grid/redis-3.2.9/bin/redis-server /home/grid/redis-3.2.9/6103.conf
    
  2. 使用命令查看各個(gè)節(jié)點(diǎn)是否啟動(dòng)成功

     ps -ef | grep redis
    
保證各機(jī)器都成功啟動(dòng)
  1. 查看redis目錄下自動(dòng)生成的nodes-xxx.conf文件


    nodes-xxx.conf自動(dòng)生成文件,必須保證各機(jī)器上該文件的生成
  2. 此時(shí)各個(gè)節(jié)點(diǎn)啟動(dòng)后并未構(gòu)成一個(gè)集群,下面我們將各個(gè)節(jié)點(diǎn)構(gòu)成集群
    ,安裝ruby 和 rubygems(注意需要ruby的版本在1.8.7以上)

    //yum安裝
    yum install ruby rubygems
    

ruby所有依賴(lài)文件在這里,有需要離線安裝的朋友可參考,我以將ruby依賴(lài)包上傳至redis集群ruby依賴(lài)包密碼:f0fj

   //離線安裝步驟,yum安裝方式的朋友直接跳過(guò)
   [grid@h3 ~]$ mkdir ruby
   [grid@h3 ~]$ cd ruby/
   [grid@h3 ruby]$ rz //選中所有依賴(lài)包后上傳
   [root@h3 ruby]# rpm -iv *.rpm//使用root用戶(hù)安裝
   軟件包準(zhǔn)備中...
   ruby-libs-2.0.0.648-29.el7.x86_64
   libyaml-0.1.4-11.el7_0.x86_64
   ruby-irb-2.0.0.648-29.el7.noarch
   ruby-2.0.0.648-29.el7.x86_64
   rubygem-bigdecimal-1.2.0-29.el7.x86_64
   rubygem-io-console-0.4.2-29.el7.x86_64
   rubygem-json-1.7.7-29.el7.x86_64
   rubygem-rdoc-4.0.0-29.el7.noarch
   rubygems-2.0.14.1-29.el7.noarch
   rubygem-psych-2.0.0-29.el7.x86_64

安裝完成后查看ruby版本

   [root@h3 ruby]# ruby –v  
   ruby 2.0.0p648 (2015-12-16) [x86_64-linux]
  1. 執(zhí)行redis集群創(chuàng)建命令(在一個(gè)節(jié)點(diǎn)執(zhí)行即可),將redis-trib.rb腳本文件復(fù)制到bin下并更換名稱(chēng)為redis-trib

    [root@lenovo1 /]# cd /home/lenovo/install/redis-3.2.9/src
    [root@lenovo1 src]# cp redis-trib.rb ../bin/redis-trib
    [root@lenovo1 src]# cd ../bin/
    

使用redis-trib腳本程序的create命令創(chuàng)建集群,且復(fù)制節(jié)點(diǎn)為1,集群機(jī)器為這6臺(tái)機(jī)器

   [root@lenovo1 bin]# redis-trib create --replicas 1 192.168.2.10:6010 
   192.168.2.30:6030 192.168.2.40:6040 192.168.2.101:6101 
   192.168.2.102:6102 192.168.2.103:6103

但此時(shí)卻報(bào)了如下異常

    /usr/share/rubygems/rubygems/core_ext/kernel_require.rb:55:in 
    `require': cannot load such file -- redis (LoadError)    
    from /usr/share/rubygems/rubygems/core_ext/kernel_require.rb:55:in `require'
     from /home/lenovo/install/redis-3.2.9/bin/redis-trib:25:in `<main>

糾結(jié)了會(huì)發(fā)現(xiàn)我們似乎漏了些什么東西,ruby裝完了是干嘛的呢?
解決方案:安裝redis與ruby交互的接口

    //在線安裝
    [root@lenovo1 bin]# gem install redis
    Fetching: redis-3.3.3.gem (100%)
    Successfully installed redis-3.3.3
    Parsing documentation for redis-3.3.3
    Installing ri documentation for redis-3.3.3
    1 gem installed

注:若需要離線安裝的同學(xué),我以將redis接口文件存放在ruby同級(jí)目錄下,直接在該目錄下執(zhí)行如下命令即可進(jìn)行安裝

    //離線安裝-在線安裝的直接跳過(guò)
    [root@h1 ruby]# gem install redis-3.3.3.gem
    Successfully installed redis-3.3.3
    Parsing documentation for redis-3.3.3
    Installing ri documentation for redis-3.3.3
    1 gem installed
  1. 重新啟動(dòng)redis服務(wù)(使用步驟3方式指定conf啟動(dòng),否則不會(huì)生成nodes-xxx.conf文件),然后再執(zhí)行創(chuàng)建集群的命令,查看結(jié)果
    卻出現(xiàn)如下錯(cuò)誤

     >>> Creating cluster
     [ERR] Sorry, can't connect to node 192.168.2.30:6030
    

    沃ri啊,相信你是崩潰的,誰(shuí)讓我們都是搞事情的呢,出了事情就得去解決

修改此處所有節(jié)點(diǎn)機(jī)器的ip值

再將所有防火墻打開(kāi),保證集群通信端口能互通,再次創(chuàng)建集群


再次執(zhí)行創(chuàng)建集群的命令

若此時(shí)不是你規(guī)劃的設(shè)置,請(qǐng)調(diào)整創(chuàng)建命令的機(jī)器順序,默認(rèn)前3個(gè)為主節(jié)點(diǎn)


創(chuàng)建集群成功

若啟動(dòng)出現(xiàn)如下錯(cuò)誤,請(qǐng)將上一次創(chuàng)建集群失敗的cluster-config-file文件刪除,然后重新啟動(dòng)各節(jié)點(diǎn)
對(duì)應(yīng)上句錯(cuò)誤
  1. 集群?jiǎn)?dòng)幾點(diǎn)保證
    正確配置了配置文件,安裝了ruby環(huán)境和ruby與redis的接口,保證啟動(dòng)后生成了nodes-xxx.conf文件
    若在創(chuàng)建集群中出現(xiàn)如下錯(cuò)誤:

    [ERR] Node 192.168.2.30:6030 is not empty. Either the node 
    already knows other nodes (check with CLUSTER NODES) or 
    contains some key in database 0.
    

則需要將上次啟動(dòng)生成的數(shù)據(jù)庫(kù)文件及節(jié)點(diǎn)配置刪除,或者修改6030.conf中的database數(shù)量

  1. 集群簡(jiǎn)單測(cè)試
    使用redis-cli命令進(jìn)入集群環(huán)境
    若使用如下命令進(jìn)入集群這時(shí)會(huì)出現(xiàn)如下錯(cuò)誤

     ./redis-cli –c –p 6030
     Could not connect to Redis at 127.0.0.1:6030: Connection refused
    

主要原因是配置了6030.conf中的bind,但若不配置bind又將出現(xiàn)找不到節(jié)點(diǎn)錯(cuò)誤,故下面加上-h參數(shù)

    [root@lenovo3 bin]# ./redis-cli -c -h 192.168.2.30 -p 6030
    -c是以集群方式登錄; 
    -h后跟主機(jī)號(hào) ;
    -p后跟端口號(hào)。
    若綁定了127.0.0.1則可以省略-h參數(shù)。不加-c則客戶(hù)端不自動(dòng)切換。
  1. 查看集群綁定的節(jié)點(diǎn)信息

        [root@lenovo1 bin]# ./redis-cli -c -h 192.168.2.10 -p 6010 cluster nodes
    
集群節(jié)點(diǎn)綁定詳情
  1. 集群使用


    在30節(jié)點(diǎn)設(shè)置一個(gè)值

    然后模擬30節(jié)點(diǎn)宕機(jī)后,然后再次查看所有節(jié)點(diǎn)信息


    30節(jié)點(diǎn)宕機(jī)

    繼續(xù)在其他節(jié)點(diǎn)獲取30宕機(jī)前的edu的值
    30宕機(jī)后其自動(dòng)重定向至該從節(jié)點(diǎn)102

    再次關(guān)停102從節(jié)點(diǎn),會(huì)發(fā)現(xiàn)該集群任何一個(gè)節(jié)點(diǎn)都將不提供服務(wù)


    該集群停止服務(wù)

    接下來(lái)嘗試重新啟動(dòng)102從節(jié)點(diǎn),看看能否繼續(xù)提供服務(wù)
    繼續(xù)提供服務(wù)且未丟失數(shù)據(jù)
  2. 總結(jié)
    由以上實(shí)驗(yàn)可以得出,當(dāng)redis集群(3臺(tái))中的任何一臺(tái)master機(jī)器停止服務(wù)后,若存在slave節(jié)點(diǎn),則slave節(jié)點(diǎn)會(huì)直接頂替宕機(jī)的master并繼續(xù)提供服務(wù),若slave再次宕機(jī),則整個(gè)集群停止提供服務(wù),重啟該slave后其服務(wù)繼續(xù)執(zhí)行,且未損失任何數(shù)據(jù),說(shuō)明redis將該緩存持久化在數(shù)據(jù)庫(kù)中

redis集群部署配置就講到這里,另外關(guān)于redis更高級(jí)的配置這里不做說(shuō)明,大家可以自己花時(shí)間進(jìn)行學(xué)習(xí)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,619評(píng)論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,155評(píng)論 3 425
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 177,635評(píng)論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,539評(píng)論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,255評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,646評(píng)論 1 326
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,655評(píng)論 3 444
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,838評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,399評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,146評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,338評(píng)論 1 372
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,893評(píng)論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,565評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,983評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,257評(píng)論 1 292
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,059評(píng)論 3 397
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,296評(píng)論 2 376

推薦閱讀更多精彩內(nèi)容