本文介绍一种通过Jedis和Cluster实现Redis集群(主从)的高可用方案,该方案需要使用Jedis2.8.0(推荐),Redis3.0及以上版本(强制).
Redis项目地址:http://redis.io/
为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,假如有A,B,C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,那么整个集群就会以为缺少5501-11000这个范围的槽而不可用.
然而如果在集群创建的时候我们为每个节点添加一个从节点A1,B1,C1,那么整个集群便有三个master节点和三个slave节点组成,这样在节点B失败后,集群便会选举B1为新的主节点继续服务,整个集群便不会因为槽找不到而不可用了。
下载redis最新的安装包
wget http://download.redis.io/releases/redis-3.0.7.tar.gz
解压
tar xzf redis-3.0.7.tar.gz?
安装支持包tcl
yum install tcl?编译原文件
make
创建集群相关文件(方便管理)
mkdir cluster?
cd cluster
mkdir 6379 6380 6381 6382 6383 6384?
cluster下面每个目录中都创建一个redis.conf文件. 注意修改文件中的端口号:
port 6379
cluster-enabled yes
cluster-config-file nodes_6379.conf
cluster-node-timeout 5000
appendonly yes
把redis-server的可执行文件复制到cluster下面的各个目录, 然后打开6个shell终端,进入各个目录,启动每个实例, 命令如下:?
./redis-server redis.conf
检查6个服务是否都启动了
搭建集群
./redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384
–replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。
此时报错,发现缺少相应的ruby环境,如下安装相应环境:
yum install ruby
yum install rubygems
gem install redis
安装好环境后再次搭建集群
./redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384?
检测集群节点相关信息?
./redis-trib.rb check 127.0.0.1:6379?
?
可以发现系统将前3个服务做了主节点,后3个服务作为了从节点,并且是相对应的。
进入某个节点验证
./redis-cli -c -h 127.0.0.1 -p 6379
?
可以发现程序根据key对16384取模的值为3488,根据hash槽的分布跳转到了对应的节点上。 可见集群环境正常运行
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.8.0</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
//这里只需要配置一个地址就行,其他的地址让jedis自己去找。
jedisClusterNodes.add(new HostAndPort("127.0.0.1", 6379));
JedisCluster jc = new JedisCluster(jedisClusterNodes);
jc.set("11", "22");
String value = jc.get("11");
Redis Cluster集群主从方案(附Jedis Cluster教程)
原文:http://wosyingjun.iteye.com/blog/2289220