天天看點

NoSQL之Redis(四)--- RedisCluster概念以及搭建          RedisCluster概念          RedisCluster安裝

之前已經在博文中介紹了redis以及redis的簡單實用,但是在實際的項目中用單機版redis還是很少的基本上都是實用redis叢集。

NoSQL之Redis(四)--- RedisCluster概念以及搭建          RedisCluster概念          RedisCluster安裝

         (1)所有的redis節點彼此互聯(ping-pong機制),内部使用二進制協定優化傳輸速度和帶寬.

         (2)節點的fail是通過叢集中超過半數的節點檢測失效時才生效.

         (3)用戶端與redis節點直連,不需要中間proxy層.用戶端不需要連接配接叢集所有節點,連接配接叢集中任何一個可用節點即可

         (4) redis cluster  是redis的叢集實作,内置資料自動分片機制,叢集内部将所有的key映射到16384個slot中,叢集中的每個redis instance負責其中的一部分的slot的讀寫。叢集用戶端連接配接叢集中任一redis instance即可發送指令,當redis instance收到自己不負責的slot的請求時,會将負責請求key所在slot的redis instance位址傳回給用戶端,用戶端收到後自動将原請求重新發往這個位址,對外部透明。一個key到底屬于哪個slot由crc16(key) % 16384 決定。

         例如下圖

NoSQL之Redis(四)--- RedisCluster概念以及搭建          RedisCluster概念          RedisCluster安裝

         key:a

         計算a的hash值,例如值為100,100這個slot在server1上,是以a應該放到server1.

         key:hello

         hash值:10032,此slot在server3上。hell可以應該存在server3.

NoSQL之Redis(四)--- RedisCluster概念以及搭建          RedisCluster概念          RedisCluster安裝

         (1)領着投票過程是叢集中所有master參與,如果半數以上master節點與master節點通信超過(cluster-node-timeout),認為目前master節點挂掉.

         (2):什麼時候整個叢集不可用(cluster_state:fail)? 

             a:如果叢集任意master挂掉,且目前master沒有slave.叢集進入fail狀态,也可以了解成叢集的slot映射[0-16383]不完成時進入fail狀态. ps : redis-3.0.0.rc1加入cluster-require-full-coverage參數,預設關閉,打開叢集相容部分失敗.

             b:如果叢集超過半數以上master挂掉,無論是否有slave叢集進入fail狀态.

           ps:當叢集不可用時,所有對叢集的操作做都不可用,收到((error) clusterdown the cluster is down)錯誤

         版本說明

         本教程使用redis3.0版本。3.0版本主要增加了redis叢集功能。同時由于筆者實用的是一台虛拟機是以隻是僞叢集模式,但是和真叢集的安裝方法本質上還是類似的。

         安裝的前提條件:

         需要安裝gcc:yum install gcc-c++

         下載下傳redis的源碼包,把源碼包上傳到linux伺服器

         解壓源碼包

NoSQL之Redis(四)--- RedisCluster概念以及搭建          RedisCluster概念          RedisCluster安裝

tar -zxvf redis-3.0.0.tar.gz  

make  

make install  

make installprefix=/usr/local/redis-cluster/redis01  

         ps:prefix必須大寫表示redis的安裝路徑,執行上面幾步之後單機版的redis已經安裝成功。

         搭建叢集需要使用到官方提供的ruby腳本,需要安裝ruby的環境。       

         安裝ruby

NoSQL之Redis(四)--- RedisCluster概念以及搭建          RedisCluster概念          RedisCluster安裝

yum install ruby  

yum install rubygems  

         redis叢集管理工具redis-trib.rb輸入如下依次指令可以找到

NoSQL之Redis(四)--- RedisCluster概念以及搭建          RedisCluster概念          RedisCluster安裝

cd redis-3.0.0/src  

ll*.rb  

         腳本需要的ruby包:

         上傳到linux,并安裝ruby包

         geminstall redis-3.0.0.gem

NoSQL之Redis(四)--- RedisCluster概念以及搭建          RedisCluster概念          RedisCluster安裝

         第一步:建立6另外5個redis執行個體,在/usr/local/redis-cluster/檔案夾下,複制redis01即可,分别命名為redis02~redis06。

         注意:需要分别删除每個redis安裝目錄裡面的dum.rdb檔案。

         第二步:修改redis配置檔案

         1将port分别改成7001~7006

         2打開cluster-enable前面的注釋

         3把建立叢集的ruby腳本複制到redis-cluster目錄下。

         4啟動6個redis執行個體

         5建立叢集

 ./redis-trib.rb create --replicas 1 192.168.21.225:7001192.168.21.225:7002 192.168.21.225:7003 192.168.21.225:7004 192.168.21.225:7005192.168.21.225:7006

         ps:建立了三個節點主節點,三個從節點。其中—replicas1 表示每個主節點下面有1個從節點,從節點可以是任意多個。

視窗輸出結果入下:

>>> creating cluster

connecting to node 192.168.21.225:7001: ok

connecting to node 192.168.21.225:7002: ok

connecting to node 192.168.21.225:7003: ok

connecting to node 192.168.21.225:7004: ok

connecting to node 192.168.21.225:7005: ok

connecting to node 192.168.21.225:7006: ok

>>> performing hash slotsallocation on 6 nodes...

using 3 masters:

192.168.21.225:7001

192.168.21.225:7002

192.168.21.225:7003

adding replica 192.168.21.225:7004 to 192.168.21.225:7001

adding replica 192.168.21.225:7005 to 192.168.21.225:7002

adding replica 192.168.21.225:7006 to 192.168.21.225:7003

m: 5a8523db7e12ca600dc82901ced06741b3010076192.168.21.225:7001

  slots:0-5460 (5461 slots) master

m: bf6f0929044db485dea9b565bb51e0c917d20a53192.168.21.225:7002

  slots:5461-10922 (5462 slots) master

m: c5e334dc4a53f655cb98fa3c3bdef8a808a693ca192.168.21.225:7003

  slots:10923-16383 (5461 slots) master

s: 2a61b87b49e5b1c84092918fa2467dd70fec115f192.168.21.225:7004

  replicates 5a8523db7e12ca600dc82901ced06741b3010076

s: 14848b8c813766387cfd77229bd2d1ffd6ac8d65192.168.21.225:7005

  replicates bf6f0929044db485dea9b565bb51e0c917d20a53

s: 3192cbe437fe67bbde9062f59d5a77dabcd0d632192.168.21.225:7006

  replicates c5e334dc4a53f655cb98fa3c3bdef8a808a693ca

can i set the above configuration? (type'yes' to accept): yes

>>> nodes configuration updated

>>> assign a different configepoch to each node

>>> sending cluster meet messagesto join the cluster

waiting for the cluster to join.....

>>> performing cluster check(using node 192.168.21.225:7001)

m: 2a61b87b49e5b1c84092918fa2467dd70fec115f192.168.21.225:7004

  slots: (0 slots) master

m: 14848b8c813766387cfd77229bd2d1ffd6ac8d65192.168.21.225:7005

m: 3192cbe437fe67bbde9062f59d5a77dabcd0d632192.168.21.225:7006

[ok] all nodes agree about slotsconfiguration.

>>> check for open slots...

>>> check slots coverage...

[ok] all 16384 slots covered.

         依次輸入如下指令

cd/usr/local/redis-cluster/

redis01/bin/redis-cli-h 192.168.21.225 -p 7002 –c

         ps:-c表示連接配接叢集

NoSQL之Redis(四)--- RedisCluster概念以及搭建          RedisCluster概念          RedisCluster安裝