致谢
首先感谢提供机器让我测试的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-Vset 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()