redisCluster:python
在3.0版本之後支持,無中心,在某種狀況下會形成數據丟失,其也是經過算法將數據分片保存至某個redis服務器,即再也不經過客戶端計算key保存的redis服務器,redis服務器須要提早設置好本身所負責的槽位,好比redis A負責處理0-5000的哈希槽位數據,redis B負責處理5001-10000的hash槽位數據,redis C負責處理10001-16384的hash槽位數據,redis cluster須要特定的客戶端,要求客戶端必須支持集羣協議,可是目前尚未比較好的客戶端。git
這種將哈希槽分佈到不一樣節點的作法使得用戶能夠很容易地向集羣中添加或者刪除節點。好比說:redis
若是用戶將新節點 D 添加到集羣中,那麼集羣只須要將節點 A 、B 、 C 中的某些槽移動到節點 D 就能夠了。算法
與此相似,若是用戶要從集羣中移除節點 A ,那麼集羣只須要將節點 A 中的全部哈希槽移動到節點 B 和節點 C ,而後再移除空白(不包含任何哈希槽)的節點 A 就能夠了。ruby
由於將一個哈希槽從一個節點移動到另外一個節點不會形成節點阻塞,因此不管是添加新節點仍是移除已存在節點,又或者改變某個節點包含的哈希槽數量,都不會形成集羣下線。服務器
rediscluster須要專門的客戶端,好比python當中引入的redis模塊也不能使用了,目前官方的客戶端也不是不少,須要本身開發。架構
(1)全部的redis節點彼此互聯(PING-PONG機制),內部使用二進制協議優化傳輸速度和帶寬.app
(2)節點的fail是經過集羣中超過半數的節點檢測失效時才生效.ide
(3)客戶端與redis節點直連,不須要中間proxy層.客戶端不須要鏈接集羣全部節點,鏈接集羣中任何一個可用節點便可
(4)redis-cluster把全部的物理節點映射到[0-16383]slot上,cluster 負責維護node<->slot<->value
Redis 集羣中內置了 16384 個哈希槽,當須要在 Redis 集羣中放置一個 key-value 時,redis 先對 key 使用 crc16 算法算出一個結果,而後把結果對 16384 求餘數,這樣每一個 key 都會對應一個編號在 0-16383 之間的哈希槽,redis 會根據節點數量大體均等的將哈希槽映射到不一樣的節點
(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 Thecluster is down)錯誤
(要讓集羣正常工做至少須要3個主節點,在這裏咱們要建立6個redis節點,其中三個爲主節點,三個爲從節點,對應的redis節點的ip和端口對應關係以下)
10.0.3.56:6001
10.0.3.56:6002
10.0.3.56:6003
10.0.3.56:6004
10.0.3.56:6005
10.0.3.56:6006
同上所示,下載官網3.0版本以後,支持集羣模式
http://download.redis.io/releases/
# cd /opt
# wgethttp://download.redis.io/releases/redis-3.0.5.tar.gz
# tar xvf redis-3.0.5.tar.gz
# ln -sv /opt/redis-3.0.5/usr/local/redis
# cd /usr/local/redis/
# make && make install
mkdir /application &&cd /application/
[root@gxmzd-card-mxkmp application]# ll
total 10876
drwxrwxr-x. 7 root root 4096 May 16 22:59 redis-3.0.5
-rw-r--r--. 1 root root 63488 May 16 23:51 redis-3.0.5.gem
-rw-r--r--. 1 root root 1366160 May 16 22:50 redis-3.0.5.tar.gz
drwxr-xr-x. 23 1035 1035 4096 Mar 30 2016 ruby-2.1.9
-rw-r--r--. 1 root root 9395648 May 16 22:50 ruby-2.1.9.tar.xz
drwxr-xr-x. 7 1249840000 4096 May 31 2011 rubygems-1.8.5
-rw-r--r--. 1 root root 249170 May 16 22:50 rubygems-1.8.5.tgz
ln -sv /application/redis-3.0.5 /usr/local/redis
cd /usr/local/redis
make && make install
echo $?
#檢查編譯是否報錯
mkdir redis_cluster && cd redis_cluster
mkdir redis{6001..6006}
主要針對以下幾項:其它默認便可
bind 0.0.0.0
port 6001
daemonize yes (默認是no,直接運行./redis-server是前臺啓動,在關閉運行的窗口後redis也將關閉,爲了關閉窗口後不關閉redis,須要使用後臺啓動,因此調整爲no)
pidfile /var/run/redis_6001.pid
logfile "/usr/local/redis/redis_cluster/redis6001/redis6001.log" #節點啓動日誌
dir /usr/local/redis/redis_cluster/redis6001/ #保存路徑
maxmemory 512M #限制redis 最大使用內存
appendonly yes #是否開啓AOF
appendfilename "appendonly_6001.aof" #保存路徑,和RDB在一塊兒
appendfsync everysec #每秒執行一次fsync,即將內存更改的數據寫入磁盤
cluster-enabled yes #必須打開cluster功能,不然集羣建立不成功
cluster-config-filenodes-6001.conf#每一個主機一個配置文件,有集羣建立和管理,集羣內的各主機不能重名節點實例啓動配置
#複製redis6001配置文件爲模板,經過sed批量生成reids 配置文件
cp /usr/local/redis/redis_cluster/redis6001/redis.conf /application
sed "s#6001#6002#g"/application/redis.conf >>/usr/local/redis/redis_cluster/redis6002/redis.conf
sed "s#6001#6003#g"/application/redis.conf >>/usr/local/redis/redis_cluster/redis6003/redis.conf
sed "s#6001#6004#g"/application/redis.conf >>/usr/local/redis/redis_cluster/redis6004/redis.conf
sed "s#6001#6005#g"/application/redis.conf >>/usr/local/redis/redis_cluster/redis6005/redis.conf
sed "s#6001#6006#g"/application/redis.conf >>/usr/local/redis/redis_cluster/redis6006/redis.conf
啓動redis多節點服務
/usr/local/redis/src/redis-server /usr/local/redis/redis_cluster/redis6001/redis.conf
/usr/local/redis/src/redis-server /usr/local/redis/redis_cluster/redis6002/redis.conf
/usr/local/redis/src/redis-server /usr/local/redis/redis_cluster/redis6003/redis.conf
/usr/local/redis/src/redis-server /usr/local/redis/redis_cluster/redis6004/redis.conf
/usr/local/redis/src/redis-server /usr/local/redis/redis_cluster/redis6005/redis.conf
/usr/local/redis/src/redis-server /usr/local/redis/redis_cluster/redis6006/redis.conf
#查看進程啓動狀況
[root@gxmzd-card-mxkmp ~]# ps -ef|grep redis
root 46835 1 023:24 ? 00:00:00 /usr/local/redis/src/redis-server0.0.0.0:6001 [cluster]
root 46870 1 023:26 ? 00:00:01 /usr/local/redis/src/redis-server0.0.0.0:6002 [cluster]
root 46875 1 023:26 ? 00:00:01 /usr/local/redis/src/redis-server0.0.0.0:6003 [cluster]
root 46879 1 023:26 ? 00:00:00/usr/local/redis/src/redis-server 0.0.0.0:6004 [cluster]
root 46884 1 023:26 ? 00:00:00/usr/local/redis/src/redis-server 0.0.0.0:6005 [cluster]
root 46888 1 023:26 ? 00:00:00/usr/local/redis/src/redis-server 0.0.0.0:6006 [cluster]
root 47244 43369 0 23:37 pts/2 00:00:00 grep redis
redis-cli -h 10.0.3.56 -p6001
redis-cli -h 10.0.3.56 -p6002
redis-cli -h 10.0.3.56 -p6003
redis-cli -h 10.0.3.56 -p6004
redis-cli -h 10.0.3.56 -p6006
redis-cli -h 10.0.3.56 -p6005
10.0.3.56:6005>
#出現此界面表示啓動成功,節點正常!
執行上面的命令的時候會報錯,由於是執行的ruby的腳本,須要ruby的環境
錯誤內容:./redis-trib.rb:24:in`require': no such file to load -- rubygems (LoadError)
from./redis-trib.rb:24
(強烈建議此方法)
yum -y install rubyrubygems
安裝完成後,執行gem軟件安裝
cd /application
gem install redis-3.0.5.gem
安裝ruby
tar xf ruby-2.1.9.tar.xz
cd ruby-2.1.9
./configure
make && make install
安裝rubygems
tar -xf rubygems-1.8.5.tgz
cd rubygems-1.8.5
ruby setup.rb
需安裝redis-3.0.5.gem軟件包,本地上傳該軟件包後,執行以下操做:
下載:https://rubygems.org/gems/redis/versions/3.0.5
cd /application
gem install redis-3.0.5.gem
單機部署redis cluster集羣
輸入 yes並按下回車確認以後, 集羣就會將配置應用到各個節點, 並鏈接起(join)各個節點 ——也便是, 讓各個節點開始互相通信. (通常按如上步驟操做後便可正常安裝)
1)複製ruby的管理腳本
cp /usr/local/redis/src/redis-trib.rb /usr/local/bin/redis-trib
2)執行集羣建立命令
redis-trib create --replicas 1 10.0.3.56:6001 10.0.3.56:6002 10.0.3.56:600310.0.3.56:6004 10.0.3.56:6005 10.0.3.56:6006
#命令在這裏用於建立一個新的集羣, 選項--replicas1 表示咱們但願爲集羣中的每一個主節點建立一個從節點。
問題記錄:
注意:若是建立集羣以前建立過請清空以前的文件,不然出現以下報錯:
[ERR] Node XXXXXX is not empty.Either the node already knows other nodes (check with CLUSTER NODES) orcontains some key in database 0
解決方法是刪除生成的配置文件nodes.conf,若是不行則說明如今建立的結點包括了舊集羣的結點信息,須要刪除redis的持久化文件後再重啓redis,好比:appendonly.aof、dump.rdb 文件(若是擔憂丟失,可執行mv 移動到別的文件夾)
使用客戶端進行連接測試
本地登陸測試 必須加參數「-c」才能進入到集羣環境。
redis-cli -c -p 6005
遠程客戶端登陸
redis-cli -h 10.0.3.56 -p 6001
redis-cli + IP + 端口
執行INFO名稱查看各節點狀態
10.0.3.56:6005> INFO
# Server
redis_version:3.0.5
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:fe615b439d6069da
redis_mode:cluster
……
如何關閉redis節點
經過命令redis01/redis-cli -p 7001 shutdown進行關閉,這樣在關閉以前,數據纔可以進行保存。
不能直接kill。