本文是在虛擬機centos7系統上安裝redis3.2.5集群
redis集群在啟動的時候就自動在多個節點間分好片。同時提供了分片之間的可用性:當一部分redis節點故障或網絡中斷,集群也能繼續工作。但是,當大面積的節點故障或網絡中斷(比如大部分的主節點都不可用了),集群就不能使用。所以,從實用性的角度,Redis集群提供以下功能: ● 自動把數據切分到多個redis節點中 ● 當一部分節點掛了或不可達,集群依然能繼續工作
Redis集群不是使用一致性哈希,而是使用哈希槽。整個redis集群有16384個哈希槽,決定一個key應該分配到那個槽的算法是:計算該key的CRC16結果再模16834。集群中的每個節點負責一部分哈希槽,比如集群中有3個節點,則: ● 節點A存儲的哈希槽范圍是:0 – 5500 ● 節點B存儲的哈希槽范圍是:5501 – 11000 ● 節點C存儲的哈希槽范圍是:11001 – 16384這樣的分布方式方便節點的添加和刪除。比如,需要新增一個節點D,只需要把A、B、C中的部分哈希槽數據移到D節點。同樣,如果希望在集群中刪除A節點,只需要把A節點的哈希槽的數據移到B和C節點,當A節點的數據全部被移走後,A節點就可以完全從集群中刪除。因為把哈希槽從一個節點移到另一個節點是不需要停機的,所以,增加或刪除節點,或更改節點上的哈希槽,也是不需要停機的。如果多個key都屬於一個哈希槽,集群支持通過一個命令(或事務, 或lua腳本)同時操作這些key。通過“哈希標簽”的概念,用戶可以讓多個key分配到同一個哈希槽。哈希標簽在集群詳細文檔中有描述,這裡做個簡單介紹:如果key含有大括號”{}”,則只有大括號中的字符串會參與哈希,比如”this{foo}”和”another{foo}”這2個key會分配到同一個哈希槽,所以可以在一個命令中同時操作他們。
為了保證在部分節點故障或網絡不通時集群依然能正常工作,集群使用了主從模型,每個哈希槽有一(主節點)到N個副本(N-1個從節點)。在我們剛才的集群例子中,有A,B,C三個節點,如果B節點故障集群就不能正常工作了,因為B節點中的哈希槽數據沒法操作。但是,如果我們給每一個節點都增加一個從節點,就變成了:A,B,C三個節點是主節點,A1, B1, C1 分別是他們的從節點,當B節點宕機時,我們的集群也能正常運作。B1節點是B節點的副本,如果B節點故障,集群會提升B1為主節點,從而讓集群繼續正常工作。但是,如果B和B1同時故障,集群就不能繼續工作了。Redis集群的一致性保證Redis集群不能保證強一致性。一些已經向客戶端確認寫成功的操作,會在某些不確定的情況下丟失。產生寫操作丟失的第一個原因,是因為主從節點之間使用了異步的方式來同步數據。一個寫操作是這樣一個流程:1)客戶端向主節點B發起寫的操作2)主節點B回應客戶端寫操作成功3)主節點B向它的從節點B1,B2,B3同步該寫操作從上面的流程可以看出來,主節點B並沒有等從節點B1,B2,B3寫完之後再回復客戶端這次操作的結果。所以,如果主節點B在通知客戶端寫操作成功之後,但同步給從節點之前,主節點B故障了,其中一個沒有收到該寫操作的從節點會晉升成主節點,該寫操作就這樣永遠丟失了。就像傳統的數據庫,在不涉及到分布式的情況下,它每秒寫回磁盤。為了提高一致性,可以在寫盤完成之後再回復客戶端,但這樣就要損失性能。這種方式就等於Redis集群使用同步復制的方式。基本上,在性能和一致性之間,需要一個權衡。
第一步: 下載redis3.2.5 source文件
我把下載的軟件放在/usr/soft下[root@localhost /soft] wget http://download.redis.io/releases/redis-3.2.5.tar.gz結果如下圖:
[root@localhost /soft] tar xvf redis-3.2.5.tar.gz[root@localhost /soft] cd redis-3.2.5[root@localhost /redis-3.2.5] make && make install這時候可能會報錯,原因是需要gcc gcc安裝[root@localhost /soft] yum install gcc成功之後,回到redis-3.2.5/src目錄,運行make命令[root@localhost /redis-3.2.5] make && make install不出意外是成功了。
第二步:檢測make命令執行的結果的正確性
輸出提示會強烈建議我們運行make test命令,目的是檢查make命令的結果有無錯誤(也可以不運行make tet命令,從而可以進行越過這個繼續redis集群搭建了)
[root@localhost /redis-3.2.5] make test這時可能會報錯,如下圖
原因是:缺少tcl
第三步:安裝tcl8.6.6
安裝tcl:[root@localhost /soft] wget http://prdownloads.sourceforge.net/tcl/tcl8.6.6-src.tar.gz[root@localhost /soft]tar xvf tcl8.6.6-src.tar.gz[root@localhost /tcl8.6.6] cd tcl8.6.6/unix/[root@localhost /unix]./configure make && make install等待一會,查看打出的信息,沒有錯誤就ok。現在回到redis-3.2.5/src目錄[root@localhost soft]# cd redis-3.2.5/src[root@localhost /src]# make test稍等,去喝一杯再回來
ok。到此,redis編譯都ok了
第四步:創建集群配置文件
[root@localhost soft]# mkdir redis_cluster[root@localhost soft]# cd redis_cluster[root@localhost redis_cluster]# mkdir conf在此目錄下,創建redis_7000.conf到redis_7005.conf六個配置文件現創建redis_7000.conf,其余5個cp就可以了,再把內容中的端口號改為對應的700*[root@localhost conf]#touch redis_7000.conf[root@localhost conf]#vim redis_7000.conf把daemonize yes pidfile /var/run/redis_7000.pid port 7000 cluster-enabled yes cluster-config-file nodes_7000.conf cluster-node-timeout 5000 appendonly yes 粘貼到文件中Esc :wq, 保存退出
[root@localhost conf]# cp redis_7000.conf redis_7001.conf[root@localhost conf]# cp redis_7000.conf redis_7002.conf[root@localhost conf]# cp redis_7000.conf redis_7003.conf[root@localhost conf]# cp redis_7000.conf redis_7004.conf[root@localhost conf]# cp redis_7000.conf redis_7005.conf記得把cp後的文件內容的端口相應的修改字段說明:daemonize yes //redis後台運行pidfile /var/run/redis_7000.pid //pidfile文件對應port 7000 //端口cluster-enabled yes //開啟集群 把注釋#去掉cluster-config-file nodes_7000.conf //集群的配置 配置文件首次啟動自動生成cluster-node-timeout 5000 //請求超時 設置5秒夠了appendonly yes //aof日志開啟 有需要就開啟,它會每次寫操作都記錄一條日志使用tree命令可以清楚的查看目錄的結構:[root@localhost redis_cluster]#yum install tree[root@localhost redis_cluster]# tree -I conf配置好的6個文件如下圖
啟動這6個redis實例
查看啟動後的redis進程
查看redis6個進程的監聽端口
第五步:搭建集群
現在我們已經有了六個正在運行中的 Redis 實例, 接下來我們需要使用這些實例來創建集群, 並為每個節點編寫配置文件。通過使用 Redis 集群命令行工具 redis-trib , 編寫節點配置文件的工作可以非常容易地完成: redis-trib 位於 Redis 源碼的 src 文件夾中, 它是一個 Ruby 程序, 這個程序通過向實例發送特殊命令來完成創建新集群, 檢查集群, 或者對集群進行重新分片(reshared)等工作。所以我們需要安裝ruby的東西[root@localhost redis_cluster]# yum install ruby
[root@localhost redis_cluster]# yum install rubygems
[root@localhost redis_cluster]# gem install redis
[root@localhost src]# ./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 \> 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005這個命令在這裡用於創建一個新的集群, 選項–replicas 1 表示我們希望為集群中的每個主節點創建一個從節點。之後跟著的其他參數則是這個集群實例的地址列表,3個master3個slave redis-trib 會打印出一份預想中的配置給你看, 如果你覺得沒問題的話, 就可以輸入 yes , redis-trib 就會將這份配置應用到集群當中,讓各個節點開始互相通訊,最後可以得到如下信息:
輸入"yes",回車
左邊的“M:”表示該節點是master節點,相應的“S:”表示該節點為slave節點
Redis 分支中的 redis-cli 程序實現了非常基本的集群支持, 可以使用命令 redis-cli -c 來啟動。
在7000上set yy yao,集群自動存到7001上。在7000上set yy2 go2,集群自動存到7001上。在7000上get yy2,集群自動到7001上取值。
http://www.bkjia.com/Linuxjc/1191993.html TechArticle