Redis3.0 及其之后的版本提供了 redis-cluster 集群支持,用于在多个redis节点间共享数据,以提高服务的可用性。

构建 redis-cluster 集群可以通过 redis-trib.rb 工具来完成。redis-trib.rb 是redis官方提供的一个集群管理工具,集成在redis安装包的 src 目录下。redis-trib.rb 封装了redis提供的集群命令,使用简单、便捷。

因为 redis-trib.rb 是由ruby语言编写的,所以使用该工具需要ruby语言环境的支持。

$ ruby -v
ruby 2.3.1p112 (2016-04-26) [x86_64-linux-gnu]

redis-cluster集群

1、配置

要启用redis-cluster集群,需要先修改redis配置文件集群配置部分的内容

redis.conf

################################ REDIS CLUSTER  ###############################
# 启用redis-cluster集群
cluster-enabled yes# 集群节点配置文件
# 该文件无需手工修改,由redis自动维护(创建和更新)
# 需要注意,单机运行多实例时,确保该文件没有被其他实例覆盖(不允许重名)
cluster-config-file nodes-6377.conf# 节点超时时长(毫秒)
cluster-node-timeout 15000

为了方便进行演示,这里分别以端口 637763786379 各启用一个实例来代表不同的redis服务器

2、创建集群

创建集群使用 redis-tribcreate 命令完成,create 命令的格式为:

 create host1:port1 ... hostN:portN

默认情况下,ruby 是无法识别redis的,直接执行 redis-trib.rb create IP:PORT 将会报错

$ ./redis-trib.rb create 192.168.206.128:6377 192.168.206.128:6378 192.168.206.128:6379
/usr/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- redis (LoadError)from /usr/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'from ./redis-trib.rb:25:in `<main>'

所以需要先为ruby安装redis第三方接口,执行命令 gem install redis 即可

$ sudo gem install redis
[sudo] password for zhangcs:
Fetching: redis-4.0.1.gem (100%)
Successfully installed redis-4.0.1
Parsing documentation for redis-4.0.1
Installing ri documentation for redis-4.0.1
Done installing documentation for redis after 1 seconds
1 gem installed

此时再使用 create 就可以将637763786379 这3台服务器构建成一个集群了

有一点需要注意的是,redis-cluster集群至少需要3个可用节点。

3、查看集群

使用 info 命令指定集群上任一节点的地址便可以查看集群状态

主从复制模型

刚才说到,redis-cluster至少需要保证3个节点可用。那么为了避免节点宕机导致服务不可用,我们就需要添加主从配置,为集群中的节点增加从节点;使其在主节点宕机时,能够将从节点提升为主节点代替原来的主节点进行工作。

在非集群的单节点环境中,配置主从关系的方法大致有 2 种:

1、修改从服务器配置文件 redis.confslaveof <masterip> <masterport> 选项;

2、在从服务器上使用slaveof 命令直接指定主服务器。

然而在redis-cluster集群环境中,启用了cluster配置的情况下slaveof 是不可用的。

假定有 6381 服务器配置 slaveof 指定主服务器 6377 ,同时该服务器启用了redis-cluster配置

################################# REPLICATION #################################
slaveof 192.168.206.128 6377################################ REDIS CLUSTER  ###############################
cluster-enabled yes
cluster-config-file nodes-6381.conf
cluster-node-timeout 15000

那么此时 6381 端口的服务器将无法成功启动

$ ./redis-server /usr/local/redis/6381/redis.conf
*** FATAL CONFIG FILE ERROR ***
Reading the configuration file, at line 283
>>> 'slaveof 192.168.206.128 6377'
slaveof directive not allowed in cluster mode

显然我们无法使用原有的主从配置方法对集群进行配置。此时我们需要借助于 redis-trib.rb 工具来进行从节点的添加操作,先将节点加入集群中,然后再声明节点为原有节点的从节点。

1、启用服务后先将该节点加入集群,直接使用redis-trib.rb的 add-node 命令即可实现:

redis-trib add-node new_host:new_port existing_host:existing_port

此时通过 redis-trib info 能够查看到该节点已经成功加入了集群中,并且该节点并没有分配哈希槽

2、声明该节点为集群中某一节点的从节点,需要使用客户端进入该节点(此处即为新增的从节点 6381)进行设置,使用 cluster replicate 命令指定所属主节点ID。

主节点ID可以使用客户端连接到集群后通过命令 cluster nodes 查看 :

使用客户端连接新增的从节点 6381 ,指定主节点 6377 在集群中的ID ,声明为 6377 节点的从节点

$ ./redis-cli -h 192.168.206.128 -c -p 6381
192.168.206.128:6381> cluster replicate e10dde558fb46fe8ae6fe66e54ef56032fbcce0f
OK

至此就完成了集群中一个节点的主从配置,查看 6377 节点能够看到其包含一个从节点:

查询出 6377 端口服务对应的PID,然后通过 kill 将服务关闭,使该节点在集群上不可用;此时查看集群信息,能够发现从节点 6381 自动提升为主节点,顶替了不可用的 6377 节点。

重新启动已宕机的服务后,该节点将会被当做从节点添加到管理原先的哈希槽分配范围的节点上。这里也就是添加到了 6381 节点上,6381 节点管理的哈希槽就是原先由 6377 节点所管理的

客户端连接 redis-cluster

客户端在连接 redis 服务器时带上参数 -c 即为连接到cluster集群

$ redis-cli -h 192.168.206.128 -c -p 6377
192.168.206.128:6377> set name zhangcs
-> Redirected to slot [5798] located at 192.168.206.128:6378
OK
192.168.206.128:6378>

可以看到,在 6377 端口的服务器上存储一个string类型的键值对 name = zhangsan 的时,操作被重定向到了 6378 端口的服务器上,而 name = zhangsan 这个键值对最终也被存储在了 6378 端口的服务器里。

同理,在获取数据时,也会重定向到对应数据实际存储的服务器上,然后在该服务器上进行操作。

$ ./redis-cli -h 192.168.206.128 -c -p 6377
192.168.206.128:6378> get name
"zhangcs"
192.168.206.128:6378>
单独连接集群上的节点

需要注意的是,节点在加入集群后,如果不声明参数 -c 连接集群而是单独连接集群上的节点,那么在操作时如果需要重定向到其他的服务器,是无法成功重定向然后完成操作的。

例如键值对 name = zhangsan 存储在 6378 端口的服务器上,此时如果我们单独连接到 6377 端口的服务器上进行操作,那么该操作是无法成功的。

$ redis-cli -h 127.0.0.1 -p 6377
127.0.0.1:6377> get name
(error) MOVED 5798 127.0.0.1:6378
127.0.0.1:6377> set name lisi
(error) MOVED 5798 127.0.0.1:6378
127.0.0.1:6377>

而如果无需重定向,则能成功完成操作。

$ redis-cli -h 127.0.0.1 -p 6378
127.0.0.1:6378> get name
"zhangsan"
127.0.0.1:6378>

Spring集成 redis-cluster

1、连接池配置

@Bean
public JedisPoolConfig jedisPoolConfig() {JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();jedisPoolConfig.setMaxTotal(100);jedisPoolConfig.setMaxIdle(10);jedisPoolConfig.setMaxWaitMillis(1500);return jedisPoolConfig;
}

2、JedisCluster对象配置

@Bean
public JedisCluster jedisCluster() {Set<HostAndPort> nodes = new HashSet<HostAndPort>();nodes.add(new HostAndPort("192.168.206.128", 6377));nodes.add(new HostAndPort("192.168.206.128", 6378));nodes.add(new HostAndPort("192.168.206.128", 6379));nodes.add(new HostAndPort("192.168.206.128", 6381));JedisCluster jedisCluster = new JedisCluster(nodes, jedisPoolConfig());return jedisCluster;
}

3、JedisCluster对象的使用

@Autowired
private JedisCluster jedisCluster;@Test
public void testCluster() {Assert.assertNotNull(jedisCluster);String result = jedisCluster.set("name", "zhangsan");Assert.assertNotNull(result);Assert.assertEquals("OK", result);String name = jedisCluster.get("name");Assert.assertNotNull(name);Assert.assertEquals("zhangsan", name);
}
spring-cache集成
@Configuration
@ComponentScan(basePackages = {"org.pro.service"})
// 启用缓存
@EnableCaching
public class RootConfig {/*** jedis连接池配置* */@Beanpublic JedisPoolConfig jedisPoolConfig() {JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();jedisPoolConfig.setMaxTotal(1000);jedisPoolConfig.setMaxIdle(10);jedisPoolConfig.setMaxWaitMillis(1500);return jedisPoolConfig;}/*** redis-cluster配置* */@Beanpublic RedisClusterConfiguration redisClusterConfiguration() {RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration();Set<RedisNode> nodes = new HashSet<>();nodes.add( new RedisNode("127.0.0.1", 6377));nodes.add( new RedisNode("127.0.0.1", 6378));nodes.add( new RedisNode("127.0.0.1", 6379));redisClusterConfiguration.setClusterNodes(nodes);redisClusterConfiguration.setMaxRedirects(4);return redisClusterConfiguration;}/*** jedis连接工厂* */@Beanpublic JedisConnectionFactory jedisConnectionFactory() {JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(redisClusterConfiguration(), jedisPoolConfig());jedisConnectionFactory.setTimeout(15000);return jedisConnectionFactory;}/*** redis模板* */@Beanpublic RedisTemplate redisTemplate() {RedisTemplate redisTemplate = new RedisTemplate();redisTemplate.setConnectionFactory(jedisConnectionFactory());StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();redisTemplate.setKeySerializer(stringRedisSerializer);redisTemplate.setValueSerializer(stringRedisSerializer);redisTemplate.setHashKeySerializer(stringRedisSerializer);redisTemplate.setHashValueSerializer(stringRedisSerializer);return redisTemplate;}/*** redis缓存管理器* */@Beanpublic RedisCacheManager redisCacheManager() {RedisCacheManager redisCacheManager = new RedisCacheManager(redisTemplate());return redisCacheManager;}}

Redis-使用redis-trib构建集群相关推荐

  1. Redis面试题及分布式集群

    Redis面试题及分布式集群 Reference: http://blog.csdn.net/yajlv/article/details/73467865 1. 使用Redis有哪些好处? (1) 速 ...

  2. Redis三主三从集群搭建

    一.引子 主从复制以及哨兵,他们可以提高读的并发,但是单个master容量有限,数据达到一定程度会有瓶颈,这个时候可以通过水平扩展为多master-slave集群(看原理图). 所以一起来学习redi ...

  3. Redis三主三从集群搭建(三台机器)

    介绍 redis三种模式 一.主从模式 Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况.为了分担读压力,Redis支持主从复制,Redis的主从结构可以采用一主多从或者级联结构. ...

  4. redis 3.0.7 cluster 集群部署

    一.环境描述 DB:redis 3.0.7 最新稳定版 OS:centos 6.6_x64 二.安装步骤 1.基本软件包安装 [root@mysql-121 ~]# yum -y install ru ...

  5. 【云原生 | Docker 高级篇】03、搭建 Redis 3主3从集群

    目录 3主3从redis集群配置 一.新建6个docker容器redis实例 二.进入容器redis-node-1并为6台机器构建集群关系 三.链接进入6381作为切入点,查看节点状态 四.​​​​​ ...

  6. NoSQL(3) 之Redis主从复制、哨兵和集群介绍及详细搭建步骤

    文章目录 一.主从复制 1.1 主从复制的概念 1.2 主从复制的作用 1.3 主从复制的流程 1.4 部署Redis 主从复制步骤 1)首先要搭建redis,在之前的博客写过, 具体可参考:NoSQ ...

  7. Redis Cluster高可用(HA)集群环境搭建详细步骤

    1.为什么要有集群 由于Redis主从复制架构每个数据库都要保存整个集群中的所有数据,容易形成木桶效应,所以Redis3.0之后的版本添加特性就是集群(Cluster) 2.Redis集群架构说明 架 ...

  8. Redis系列教程(五):Redis哨兵、复制、集群的设计原理,以及区别

    前一篇文章高并发架构系列:Redis为什么是单线程.及高并发快的3大原因详解谈了Redis高并发快的3个原因,本篇主要谈Redis的高可用,两篇合起来就可以把redis的高并发和高可用搞清楚了. 谈到 ...

  9. Redis系列教程(二):详解Redis的存储类型、集群架构、以及应用场景

    高并发架构系列 高并发架构系列:数据库主从同步的3种一致性方案实现,及优劣比较 高并发架构系列:Spring Cloud的核心成员.以及架构实现详细介绍 高并发架构系列:服务注册与发现的实现原理.及实 ...

  10. Redis进阶-高可用:集群

     前言 前面几篇文章中,已经介绍了Redis的几种高可用技术:持久化.主从复制和哨兵,但这些方案仍有不足,其中最主要的问题是存储能力受单机限制,以及无法实现写操作的负载均衡. Redis集群解决了上述 ...

最新文章

  1. leetcode-24 两两交换链表中的节点
  2. 大华web对接文档_分分钟了解Web接口测试
  3. socket连接时间太长受什么原因影响?_真全粮多功能酿酒设备-酿酒发酵前期为什么要通风处理?...
  4. 《程序员代码面试指南》第二章 链表问题 搜索二叉树转换为双向链表
  5. 文献记录(part97)--MethodicallyUnifiedProcedures for a ConditionalApproachToOD,Clustering,Classification
  6. vue $refs的基本用法
  7. 自己的 「 代码制造 check list 」
  8. 【Prims】--【telerik】DataGridView 控件
  9. [Error]Python虚拟环境报错 OSError: setuptools pip wheel failed with error code 2
  10. springmvc以html作为视图_SpringMVC如何自定义视图
  11. RE-Base64编码分析
  12. wow.js插件,让滚动动画更简单,让生活更美好
  13. 全国总决赛前八名成绩
  14. php如何继续提升技术?一个php技术栈后端猿的知识储备仓库
  15. 题目 - 北京地铁 描述 北京地铁涨价了,现在的地铁票价计算方法如下: 6公里内 3元 (包括6公里) 6-12 公里 4元 (不包括6公里,包括12公里) 12-32 公里 每10公里加1元
  16. echarts图表大小根据div大小的改变而改变的问题
  17. spring学习之将类交给spring管理,bean的注入,scope,集合注入,自动装配,生命周期,迟加载
  18. 基于微信小程序的健身房私教预约管理系统+后台管理系统(SSM+mysql)-JAVA.VUE【毕业设计、论文、源码、开题报告】
  19. Node解析二进制文件
  20. 线性代数的本质,附手打公式

热门文章

  1. Linux文字游戏制作软件,小精灵美化app
  2. 《跟任何人都聊得来》读书笔记
  3. C语言 一元二次方程求解
  4. SPSS到底怎么入门?这些干货你收藏了么?
  5. 谓语动词时态 - 一般过去时、一般现在时、现在进行时
  6. 浅谈如何根治慢性扁桃体炎-个人经验总结
  7. uni-app 设备之(加速计,罗盘,陀螺仪)
  8. 将TIF图像格式转化为PNG或者JPG格式
  9. 【转】影响光纤传输距离的因数和传输衰减损耗的原因
  10. 如何导入支付宝的SDK及其模拟使用