redis3.0.3集群搭建


redis3.0版本之后支持Cluster,具體介紹redis集群我就不多說,了解請看redis中文簡介

首先,直接訪問redis.io官網,下載redis.tar.gz,現在版本3.0.3,我下面已經在虛擬機啟動了兩個linux來部署redis。

1. 下載和解包

   cd /usr/local/

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

   tar -zxvf redis-3.0.3.tar.gz

   mv redis-3.0.3  redis

2. 編譯安裝

   cd redis

   make && make install

   有些人在這里可能會碰到一個錯誤導致編譯不過(如下)

make[1]: Entering directory `/redis/src'
CC adlist.o
In file included from adlist.c:34:
zmalloc.h:50:31: error: jemalloc/jemalloc.h: No such file or directory
zmalloc.h:55:2: error: #error "Newer version of jemalloc required"
make[1]: *** [adlist.o] Error 1
make[1]: Leaving directory `/redis/src'
make: *** [all] Error 2

   原因是沒有安裝jemalloc內存分配器,可以安裝jemalloc 或 直接 輸入make MALLOC=libc  && make install

3. 創建redis節點

     我們將在兩台Server上創建六個節點,每台3個,3主3從。

   1)Server1 

     cd /usr/local/

     mkdir redis_cluster   //創建集群目錄

     mkdir 7000 7001 7002   //分別代表三個節點    其對應端口 7000 7001 7002

     創建7000節點為例,

     cd ./7000

     cp /usr/local/redis/redis.conf   ./    //拷貝到當前7000目錄

     vi redis.conf    //編輯配置  主要修改一下幾個參數

daemonize    yes                          //redis后台運行
pidfile  /var/run/redis_7000.pid        //pidfile文件對應7000
port  7000                                  //端口7000
cluster-enabled  yes                    //開啟集群   把注釋#去掉
cluster-config-file  nodes.conf      //集群的配置  配置文件首次啟動自動生成
cluster-node-timeout   5000       //請求超時  設置5秒夠了
appendonly   on                  //aof日志開啟   有需要就開啟,它會每次寫操作都記錄一條日志  (全持久化)
#save 900 1
#save 300 10
//注釋掉這幾個,這是寫磁盤的配置,我只是做緩存,不需要寫磁盤 (半持久化)
#save 60 10000 //開啟的話,在啟動節點后,會生成相應的dump.rdb

    配置好了,就相應地把這個修改后的配置文件拷貝到 7001  7002目錄,注意要修改監聽端口port 7001 7002.

    接下來,啟動服務,進入節點目錄

    依次執行  redis-server   redis.conf

    可以看到生成了appendonly.aof  nodes.conf

    ps -ef | grep redis 查看是否啟動成功

       root 885 0.8 0.2 129452 2620 ? Ssl 20:10 0:21 redis-server *:7000 [cluster]
       root 887 0.8 0.2 129452 2616 ? Ssl 20:10 0:21 redis-server *:7001 [cluster]
       root 893 0.8 0.2 128356 2612 ? Ssl 20:10 0:21 redis-server *:7002 [cluster]

    netstat -tnlp | grep redis 可以看到redis監聽端口

       tcp 0 0 0.0.0.0:7000 0.0.0.0:* LISTEN 885/redis-server *
       tcp 0 0 0.0.0.0:7001 0.0.0.0:* LISTEN 887/redis-server *
       tcp 0 0 0.0.0.0:7002 0.0.0.0:* LISTEN 893/redis-server *
       tcp 0 0 0.0.0.0:17000 0.0.0.0:* LISTEN 885/redis-server *
       tcp 0 0 0.0.0.0:17001 0.0.0.0:* LISTEN 887/redis-server *
       tcp 0 0 0.0.0.0:17002 0.0.0.0:* LISTEN 893/redis-server *

    我們除了看到 配置文件中設置的端口700*    還有700*+10000  (1700*), 前者是客戶端訪問的, 后者是集群內部節點之間訪問的.

    注意,在多台Server間搭建集群,如果開了防火牆的,需要設置iptables開放上面所有端口.

 

   2) Server2

    步驟和Server1一樣, 設置端口  7003  7004  7005

  

 4. 創建集群

   前面已經准備好了搭建集群的redis節點,接下來我們要把這些節點都串連起來搭建集群。官方提供了一個工具:redis-trib.rb  (/usr/local/redis/src/redis-trib.rb) 看后綴就知道這鳥東西不能直接執行,它是用ruby寫的一個程序,所以我們還得安裝ruby.

   yum -y install ruby ruby-devel rubygems rpm-build    //網上不明覺厲,都是這么安裝的,就跟着這樣玩吧

   再用 gem 這個命令來安裝 redis接口     gem貌似是ruby的一個工具包  反正沒錯就是了。

   gem install redis     //等一會兒就好了

   當然,方便操作,兩台Server都要安裝。

   

   上面的步驟完事了,接下來運行一下redis-trib.rb

    /usr/local/redis/src/redis-trib.rb 

Usage: redis-trib <command> <options> <arguments ...>

  reshard         host:port
                  --to <arg>
                  --yes
                  --slots <arg>
                  --from <arg>
  check           host:port
  call            host:port command arg arg .. arg
  set-timeout     host:port milliseconds
  add-node        new_host:new_port existing_host:existing_port
                  --master-id <arg>
                  --slave
  del-node        host:port node_id
  fix             host:port
  import          host:port
                  --from <arg>
  help            (show this help)
  create          host1:port1 ... hostN:portN
                  --replicas <arg>

For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.

    看到這,應該明白了吧, 就是靠上面這些操作 完成redis集群搭建的.

     確認所有的節點都啟動,接下來使用參數create 創建     (在Server1中來創建)

    /usr/local/redis/src/redis-trib.rb  create  --replicas  1   127.0.0.1:7000  127.0.0.1:7001  192.168.1.199:7003  192.168.1.199:7004  192.168.1.199:7005  127.0.0.1:7002

    解釋下, --replicas  1  表示 自動為每一個master節點分配一個slave節點    上面有6個節點,程序會按照一定規則生成 3個master(主)3個slave(從)

    前面已經提醒過的 防火牆一定要開放監聽的端口,否則會創建失敗。

    運行中,提示Can I set the above configuration? (type 'yes' to accept): yes    //輸入yes

    接下來 提示   Waiting for the cluster to join..........  安裝的時候在這里就一直等等等,沒反應,傻傻等半天,看這句提示上面一句,Sending Cluster Meet Message to join the Cluster.

    這下明白了,我剛開始在一台Server上去配,也是不需要等的,這里還需要跑到Server2上做一些這樣的操作。

    在Server2, redis-cli -c -p 700*  分別進入redis各節點的客戶端命令窗口, 依次輸入 cluster meet 192.168.1.197 7000…… 

    回到Server1,已經創建完畢了。

    查看一下 /usr/local/redis/src/redis-trib.rb check 127.0.0.1:7000

    到這里集群已經初步搭建好了。

 

5. 測試

   1)get 和 set數據

    redis-cli -c -p 7000

    進入命令窗口,直接 set  hello   howareyou

    直接根據hash匹配切換到相應的slot的節點上。

    還是要說明一下,redis集群有16383個slot組成,通過分片分布到多個節點上,讀寫都發生在master節點。

  2)假設測試

    哥果斷先把Server2服務Down掉,(Server2有1個Master, 2個Slave) ,  跑回Server1, 查看一下 發生了什么事,Server1的3個節點全部都是Master,其他幾個Server2的不見了

    測試一下,依然沒有問題,集群依然能繼續工作。

    原因:  redis集群  通過選舉方式進行容錯,保證一台Server掛了還能跑,這個選舉是全部集群超過半數以上的Master發現其他Master掛了后,會將其他對應的Slave節點升級成Master.

    疑問: 要是掛的是Server1怎么辦?    哥試了,cluster is down!!    沒辦法,超過半數掛了那救不了了,整個集群就無法工作了。 要是有三台Server,每台兩Master,切記對應的主從節點

             不要放在一台Server,別問我為什么自己用腦子想想看,互相交叉配置主從,掛哪台也沒事,你要說同時兩台crash了,呵呵噠......

   3)關於一致性

    我還沒有這么大膽拿redis來做數據庫持久化哥網站數據,只是拿來做cache,官網說的很清楚,Redis Cluster is not able to guarantee strong consistency.  

   4)項目中實踐

    項目是java的,選了 Jedis 這個開發包,哥先去跑跑看,就寫到這里啦。有什么重大發現再續寫喔。

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM