Redis自版本3以后,开始自身支持集群。
Redis3集群采用数据切片方式,数据取hash值后,散列分布在多个主结点上。
允许多台机器组成集群。
至少需要3个主结点,可以没有从结点;如果指定1个从结点,则至少需要6个结点,既3主3从;如果指定2个从结点,则至少需要9个结点,既3主6从。
无法在创建集群时,指定主、从结点。
如果指定存在从结点,则主从结点至少1比1 的比例,也可1比2、1比3类推;没有测试从结点上限。
集群可以将故障结点自动下线,但不能自动上线。
可以在集群运行时,添加、删除结点。
主结点存活时,从结点不做读写操作。(未测试)
当采用集群模式(./redis-cli -c -p 7000) 时,数据的读写会访问其他主结点;不开启集群模式,可能产生错误,因为数据已经切片,而数据正好需要访问其他结点。
没有管理中心,各结点相互访问。
Jedis 需要2.7版本,2.1版本不支持redis3的集群,其他低版本未测试。
与单结点连接方式不同,需要将所有主从结点配置至JedisCluster连接中。
import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import redis.clients.jedis.HostAndPort; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisCluster; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; import redis.clients.jedis.JedisShardInfo; import redis.clients.jedis.ShardedJedis; import redis.clients.jedis.ShardedJedisPool; import redis.clients.util.Pool; static void t4(){ Set<HostAndPort> nodes = new HashSet<>(); nodes.add(new HostAndPort("172.16.12.55",7000)); nodes.add(new HostAndPort("172.16.12.55",7001)); nodes.add(new HostAndPort("172.16.12.55",7002)); nodes.add(new HostAndPort("172.16.12.56",7100)); nodes.add(new HostAndPort("172.16.12.56",7101)); nodes.add(new HostAndPort("172.16.12.56",7102)); JedisCluster jcluster = new JedisCluster(nodes); System.out.println(jcluster.incr("page_number") ); }
集群搭建:
http://blog.csdn.net/xu470438000/article/details/42971091
http://www.cnblogs.com/tankaixiong/articles/4022646.html
http://redisdoc.com/topic/cluster-spec.html#id6
参考资料:
http://www.cnblogs.com/davidwang456/p/3608737.html
http://www.zhihu.com/question/30026645
jedis官网 https://github.com/xetorthio/jedis
以下是一些测试时的脚步
redis.stop 用于关闭本机所有redis-server,并清理集群时产生的文件。
#!/bin/bash killall -9 redis-server cd /usr/local/redis3_cluster/7000 rm -f `ls | grep -v "redis.conf"` cd /usr/local/redis3_cluster/7001 rm -f `ls | grep -v "redis.conf"` cd /usr/local/redis3_cluster/7002 rm -f `ls | grep -v "redis.conf"` echo 'clear redis_cluster configs,redis server all shutdown.'
redis.start 启动多个redis-server服务
#!/bin/bash #cd /usr/local/redis3_cluster #./redis.stop #echo 'redis server all shutdown.' cd /usr/local/redis3_cluster/7000 redis-server redis.conf cd /usr/local/redis3_cluster/7001 redis-server redis.conf cd /usr/local/redis3_cluster/7002 redis-server redis.conf #cd /usr/local/redis3_cluster/7003 #redis-server redis.conf #cd /usr/local/redis3_cluster/7004 #redis-server redis.conf #cd /usr/local/redis3_cluster/7005 #redis-server redis.conf echo "redis server start..." sleep 3 netstat -ntlp|grep redis-server
redis_cluster.start 启动集群,必顺在启动redis-server服务后执行
#!/bin/bash cd /usr/local/redis3.0.0/src ./redis-trib.rb create --replicas 1 172.16.12.55:7000 172.16.12.56:7100 172.16.12.55:7001 172.16.12.56:7101 172.16.12.55:7002 172.16.12.56:7102 echo "redis cluster restart done."