Redis-cluster叢集傻瓜配置+Python操作叢集小demo
致謝
首先感謝提供機器讓我測試的Sequin_YF、Paranoid同學,沒有你們,沒有本文。
以及友好的redis.cn的各種中文教程,本文主要來自redis cluster教程
正文
Redis-cluster簡介
Redis作為大火的K-V NoSQL自然不用細說。
Redis的叢集方案可以參照這個Redis叢集怎麼做 問題的回答
而關於本篇中的叢集我引用了redis cluster教程的敘述
Redis 叢集是一個提供在多個Redis間節點間共享資料的程式集。
Redis叢集並不支援處理多個keys的命令,因為這需要在不同的節點間移動資料,從而達不到像Redis那樣的效能,在高負載的情況下可能會導致不可預料的錯誤.
Redis 叢集通過分割槽來提供一定程度的可用性,在實際環境中當某個節點宕機或者不可達的情況下繼續處理命令. Redis 叢集的優勢:
自動分割資料到不同的節點上。
整個叢集的部分節點失敗或者不可達的情況下能夠繼續處理命令。
傻瓜配置
主要需要Redis (version > 3,我用的3.2.8)、 Ruby、 Rubygems,其他的便是一些簡單重複的操作了。正所謂懶惰即美德,我把這些操作寫成了一個指令碼,我自己不是很會shell,sed,awk,grep這些,所以寫的很粗糙很醜陋,不過能用是第一步的嘛!優化可以慢慢來~
指令碼流程便是執行指令碼–>下載Redis. Ruby Rubygems 。。安裝.–>修改配置檔案–>設定節點目錄–>啟動節點
注意點
分散式叢集嘛,自然一臺機器不行,指令碼預設master機器採用埠7000,7001,7002,slave採用7003,7004,7005.可以提前使用netstat -apn | grep 埠號
在執行指令碼成功後,用ps -ef | grep "redis"
檢視下
如圖即為成功
目前的版本還需要一些操作才能讓叢集正式跑起來。
在一臺機器上輸入
redis-trib.rb create --replicas 1 192.168.30.132:7009 192.168.30.132:7010 192.168.30.132:7011 192.168.30.120:7000 192.168.30.120:7001 192.168.30.120:7002
建立3master–3slave的叢集(似乎master和slave是自動分配的),上面的引數1
就是1對1啦
建立成功如下
然後就可以用redis-cli
輸入
redis-cli -h 192.168.30.132 -c -p 7009
連線資料庫 寫入一條K-V
set test ok
檢視
get test
其他機器也可以檢視到相同的結果,成功啦~
傻瓜指令碼地址
傻瓜指令碼地址–>github 當然,這裡可能(一定)還有很多問題,希望大家多多提出意見哈。
Python操縱叢集demo
Redis 叢集現階段的一個問題是客戶端實現很少。
以下是一些我知道的實現:
redis-rb-cluster 是我(@antirez)編寫的 Ruby 實現, 用於作為其他實現的參考。 該實現是對 redis-rb 的一個簡單包裝, 高效地實現了與叢集進行通訊所需的最少語義(semantic).
redis-py-cluster 看上去是 redis-rb-cluster 的一個 Python 版本, 這個專案有一段時間沒有更新了(最後一次提交是在六個月之前), 不過可以將這個專案用作學習叢集的起點。
流行的 Predis 曾經對早期的 Redis 叢集有過一定的支援, 但我不確定它對叢集的支援是否完整, 也不清楚它是否和最新版本的 Redis 叢集相容 (因為新版的 Redis 叢集將槽的數量從 4k 改為 16k 了).
使用最多的時java客戶端, Jedis 最近添加了對叢集的支援, 詳細請檢視專案README中Jedis Cluster部分.
StackExchange.Redis 提供對 C# 的支援(並且包括大部分 .NET 下面的語言,比如: VB, F#等等)
thunk-redis 提供對 Node.js 和 io.js的支援。
Redis unstable 分支中的 redis-cli 程式實現了非常基本的叢集支援, 可以使用命令 redis-cli -c 來啟動。
我們使用的便是redis-py-cluster github連結 直接pip下載就好
pip install redis-py-cluster
配合上面的傻瓜配置,我們就有了第一個demo
first demo
雖然我的github上也有,不過既然這麼短還是貼出來。
#!/usr/bin/env python
# coding=utf-8
# Jack Kang
from rediscluster import StrictRedisCluster
import sys
def redis_cluster():
redis_nodes = [{'host':'192.168.30.132','port':7009},
{'host':'192.168.30.132','port':7010},
{'host':'192.168.30.132','port':7011},
{'host':'192.168.30.120','port':7000},
{'host':'192.168.30.120','port':7001},
{'host':'192.168.30.120','port':7002}
]
try:
redisconn = StrictRedisCluster(startup_nodes = redis_nodes)
except Exception,e:
print "connect error"
sys.exit(1)
redisconn.set('name','kk')
print "name is", redisconn.get('name')
redis_cluster()