项目作者: lingqibaobei

项目描述 :
springboot跟redis-cluster的整合&redis-cluster的配置
高级语言: Shell
项目地址: git://github.com/lingqibaobei/rangers-redis-cluster.git
创建时间: 2018-04-04T09:57:12Z
项目社区:https://github.com/lingqibaobei/rangers-redis-cluster

开源协议:

下载


springboot redis cluster

本示例使用ListOperation演示的结果:

http://localhost:8080/redis/put-left?leftVal=***

http://localhost:8080/redis/put-right?rightVal=***

http://localhost:8080/redis/range?end=10 //查询结果:

  1. [
  2. "can you tel me what's your name ?",
  3. "my name is xiaolang",
  4. "hello world",
  5. "i am a val from right"
  6. ]

项目配置:

1.依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-redis</artifactId>
  4. </dependency>

2.propertis

yml配置

  1. spring:
  2. redis:
  3. cluster:
  4. nodes:
  5. - 127.0.0.1:7031
  6. - 127.0.0.1:7032
  7. - 127.0.0.1:7033
  8. - 127.0.0.1:7034
  9. - 127.0.0.1:7035
  10. - 127.0.0.1:7036

RedisClusterConfigProperties

  1. @Component
  2. @ConfigurationProperties(prefix = "spring.redis.cluster")
  3. public class RedisClusterConfigProperties {
  4. /*
  5. * <li>spring.redis.cluster.nodes[0] = 127.0.0.1:7379 </li>
  6. * <li>spring.redis.cluster.nodes[1] = 127.0.0.1:7380 ...</li>
  7. */
  8. private List<String> nodes;
  9. public List<String> getNodes() {
  10. return nodes;
  11. }
  12. public void setNodes(List<String> nodes) {
  13. this.nodes = nodes;
  14. }
  15. }

3.RedisClusterConfig 的配置

  1. @Configuration
  2. public class RedisClusterConfig {
  3. @Autowired
  4. RedisClusterConfigProperties clusterProperties;
  5. public @Bean RedisConnectionFactory connectionFactory() {
  6. List<String> nodes = clusterProperties.getNodes();
  7. System.out.println("配置的节点信息:" + nodes);
  8. return new JedisConnectionFactory(new RedisClusterConfiguration(nodes));
  9. }
  10. public @Bean RedisTemplate<String, Object> getRedisTemplate(RedisConnectionFactory factory) {
  11. RedisTemplate<String, Object> template = new RedisTemplate<>();
  12. template.setConnectionFactory(factory);
  13. template.setKeySerializer(new StringRedisSerializer());
  14. template.setValueSerializer(new JdkSerializationRedisSerializer());
  15. template.setHashKeySerializer(new StringRedisSerializer());
  16. template.setHashValueSerializer(new JdkSerializationRedisSerializer());
  17. return template;
  18. }
  19. /**
  20. * jedis客户端方式
  21. *
  22. * @return
  23. * @author fuhw/vencano
  24. */
  25. // public @Bean JedisCluster getJedisCluster() {
  26. // Set<HostAndPort> nodes = new HashSet<>();
  27. // for (String node : clusterProperties.getNodes()) {
  28. // String[] parts = StringUtils.split(node, ":");
  29. // Assert.state(parts.length == 2,
  30. // "redis node shoule be defined as 'host:port', not '" + Arrays.toString(parts)
  31. // + "'");
  32. // nodes.add(new HostAndPort(parts[0], Integer.valueOf(parts[1])));
  33. // }
  34. // return new JedisCluster(nodes);
  35. // }
  36. }

redis cluster 配置;

使用场景:

  1. redis是个内存数据库,数据都存在内存中,既然存在内存中,那么大小肯定受服务器内存大小的限制。
  2. 比如一个64G内存的服务器,一个redis撑死也就能存储64G的数据量,而对于大型网站架构,数据量
  3. 岂止是64G,有的网站甚至存储了上T的数据量,遇见这种情况,怎么办?
  4. redis 3.0版本之前,通常是获取keyhashcode,然后取模(mod),但是这种做法的缺点是
  5. 无法很好的支持动态伸缩要求,一但有节点的增加或者删除操作,都会导致key无法在redis上命中。
  6. redis 3.0版本之后开始支持集群(cluster),采用的是哈希槽(hash slot)。
  7. CRC16(K)%16384算法(memecached采用的一致性hash算法)决定key对应的slot槽,他可以把多个
  8. redis实例整合在一起,形成一个集群。比如100G的数据量,一台服务器存储不下,那我可以将它分散
  9. 到多台机器上,每个客户端都连接一个redis服务实例,这是一个无中心结构,每个节点 都保存数据
  10. 和整个集群的状态。每个节点也都知道其他节点所负责的槽。
  11. 取值的流程:传入的key -> CRC16(K)%16384 决定进入哪个slot槽,slot槽属于哪个node节点,
  12. 若果不在当前node上,当前node知道改slot对应的nodeRedirect过去;

可以选择docker 安装配置
可以手动安装配置cluster

redis.conf修改的配置项:

  1. 1)绑定端口,port 7031
  2. 2)指定数据存放路径,dir /usr/local/redis-cluster/7031
  3. 3)启动集群模式,cluster-enabled yes
  4. 4)后台启动,daemonize yes
  5. 5)指定集群节点配置文件,cluster-config-file nodes-7031.conf
  6. 6)指定集群节点超时时间,cluster-node-timeout 5000
  7. 7)指定持久化方式,appendonly yes
  8. 8)绑定IPbind 127.0.0.1

集群结构:

  1. | 文件夹 | 端口 | 节点类型 | 分片信息 |
  2. | ---------------------| -----------------------------------------------------|
  3. | 7031 | 7031 | master | |
  4. | 7032 | 7032 | master | |
  5. | 7033 | 7033 | master | |
  6. | 7034 | 7034 | slave | |
  7. | 7035 | 7035 | slave | |
  8. | 7036 | 7036 | slave | |
  9. | 7037 | 7037 | master动态添加/移除 | |

目录结构:

  1. -- /usr/local/redis-cluster
  2. -- 7031
  3. -- 7032
  4. -- 7033
  5. -- 7034
  6. -- 7035
  7. -- 7036
  8. -- redis-3.2.11
  9. -- .new-node.sh
  10. -- .start-cluster.sh
  11. -- .shutdown-cluster.sh
  12. -- redis.conf.demo
  13. -- REMAME.md

1.去官网下载redis,或包管理器:yum/gem/brew等等

2.进入终端: /usr/local/redis-cluster (创建redis-cluster目录)

3.解压 redis包到 /usr/local/redis-cluster/redis-3.2.11

4.sudo cp /redis-3.2.11 中的redis.conf -> redis.conf.demo (修改上述提到的配置项作为配置模版)

5.创建目录和配置

sudo mkdir -p /usr/local/redis-cluster/7037 && cp ./redis.conf.demo /usr/local/redis-cluster/7037/redis.conf && sed -i ‘’ ‘s/7030/7037/g’ /usr/local/redis-cluster/7037/redis.conf

(7030-》redis.conf.demo中修改的端口;7037-》指定node名,port端口名)

依次执行上述命令(也可自行创建脚本处理): 得到 7031,7032,7033,7034,7035,7036文件夹,每个文件夹对应有redis.conf配置

6.启动配置的node

for((i=1;i<=6;i++)); do /usr/local/redis-cluster/redis-3.2.11/src/redis-server /usr/local/redis-cluster/703$i/redis.conf; done

  1. -bash-3.2$ ps -ef | grep redis.server
  2. 0 7866 1 0 4:58下午 ?? 0:03.57 /usr/local/redis-cluster/redis-3.2.11/src/redis-server 127.0.0.1:7031 [cluster]
  3. 0 7868 1 0 4:58下午 ?? 0:03.55 /usr/local/redis-cluster/redis-3.2.11/src/redis-server 127.0.0.1:7032 [cluster]
  4. 0 7870 1 0 4:58下午 ?? 0:03.55 /usr/local/redis-cluster/redis-3.2.11/src/redis-server 127.0.0.1:7033 [cluster]
  5. 0 7872 1 0 4:58下午 ?? 0:03.53 /usr/local/redis-cluster/redis-3.2.11/src/redis-server 127.0.0.1:7034 [cluster]
  6. 0 7874 1 0 4:58下午 ?? 0:03.53 /usr/local/redis-cluster/redis-3.2.11/src/redis-server 127.0.0.1:7035 [cluster]
  7. 0 7876 1 0 4:58下午 ?? 0:03.52 /usr/local/redis-cluster/redis-3.2.11/src/redis-server 127.0.0.1:7036 [cluster]
  8. 501 7926 7779 0 5:45下午 ttys000 0:00.00 grep redis.server
  9. -bash-3.2$

7.创建集群

cd ./redis-3.2.11/src

执行创建:
./redis-trib.rb create —replicas 1 127.0.0.1:7031 127.0.0.1:7032 127.0.0.1:7033 127.0.0.1:7034 127.0.0.1:7035 127.0.0.1:7036

交互选择即可

8.连接测试

cd ./redis-3.2.11/src

./redis-cli -c -p 7031 (-c指定是集群连接,否则的话,会在set,get的时候报错MOVED..)

  1. -bash-3.2$ redis-cli -c -p 7031
  2. 127.0.0.1:7031> get A
  3. -> Redirected to slot [6373] located at 127.0.0.1:7032
  4. "xiaolang"
  5. 127.0.0.1:7032> get B
  6. "xiaohei"
  7. 127.0.0.1:7032> get C
  8. -> Redirected to slot [14503] located at 127.0.0.1:7033
  9. "huoqiang"
  10. 127.0.0.1:7033>

set/get 可能会去不同的node(不同的slot)
查看节点信息:

  1. 127.0.0.1:7033> cluster nodes
  2. 6ddcd6c1970114ae881f0c0a3bdb00c56aa96b9d 127.0.0.1:7035 slave 5e1594337d8b4afdc2898588f16b4d5e2cff8936 0 1522835309965 5 connected
  3. 8722e5a2bae76b9ef85f6b73497965fead4e106a 127.0.0.1:7033 myself,master - 0 0 3 connected 11712-16383
  4. a4c7c35dbf156599c1bd133e95ff3ff7d24505c0 127.0.0.1:7036 slave 8722e5a2bae76b9ef85f6b73497965fead4e106a 0 1522835310970 3 connected
  5. 9b166a42f352fbe24732a53ce2a00ae013f2fcad 127.0.0.1:7034 slave 600b343193e410a21bbf7cc3a7fed3984db083c8 0 1522835309462 8 connected
  6. 5e1594337d8b4afdc2898588f16b4d5e2cff8936 127.0.0.1:7032 master - 0 1522835311476 2 connected 6250-10922
  7. 600b343193e410a21bbf7cc3a7fed3984db083c8 127.0.0.1:7031 master - 0 1522835310468 8 connected 0-6249 10923-11711
  8. 127.0.0.1:7033> cluster info
  9. cluster_state:ok
  10. cluster_slots_assigned:16384
  11. cluster_slots_ok:16384
  12. cluster_slots_pfail:0
  13. cluster_slots_fail:0
  14. cluster_known_nodes:6
  15. cluster_size:3
  16. cluster_current_epoch:8
  17. cluster_my_epoch:3
  18. cluster_stats_messages_sent:13135
  19. cluster_stats_messages_received:13132
  20. 127.0.0.1:7033>

redis集群的add-node,reshard,del-node等待补充