redis3.0版本以後支持Cluster,具體介紹redis集羣我就很少說,瞭解請看redis中文簡介。html
首先,直接訪問redis.io官網,下載redis.tar.gz,如今版本3.0.3,我下面已經在虛擬機啓動了兩個linux來部署redis。java
1. 下載和解包node
cd /usr/local/linux
wget http://download.redis.io/releases/redis-3.0.3.tar.gzredis
tar -zxvf redis-3.0.3.tar.gz數據庫
mv redis-3.0.3 redis緩存
2. 編譯安裝ruby
cd redisbash
make && make installapp
有些人在這裏可能會碰到一個錯誤致使編譯不過(以下)
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 這個開發包,哥先去跑跑看,就寫到這裏啦。有什麼重大發現再續寫喔。