Redis集群的一点一滴

本文并非介绍如何搭建一个集群,也不是介绍集群如何使用,重点是分享一些大家在使用集群过程中经常遇到的,经常提出来的问题:

问题一 Exception: Could not get resource from pool

   使用jedis客户端,无论缓存是以集群模式还是单点模式部署,凡是遇到这种问题,归结于无法从连接池中获取到连接,那么哪些原因导致获取链接失败呢?

   1.1 跨机房访问,注意网络是否可以访问,有无防火墙;

   1.2 本机访问,若redis以单机模式部署,注意是否启用密码认证;

   1.3 redis.conf配置bind是否绑定本地ip地址(建议绑定本地真实ip地址);

   1.4 若前置已部署代理,检查代理服务是否正常运行;

   1.5 最后必须保证redis服务正常运行,另外配置的ip与port都是正确的;

问题二 JedisRedirectionException: Too many cluster directions

   问题分析有两种异常造成:
   2.1 JedisMovedDataException:节点迁移后重新renew本地slot与redis节点的映射Map
   2.2 JedisAskDataException:数据正在迁移,发生asking问题, 获取asking的      Jedis,此过程最多循环redirections次。
   这种异常说明重定向redirections次,仍然没有找到可以处理的节点来完成本次redis操作。原因主要包括但不限于以下几点:
     1. 压测遇到的超时比较多,默认超时时间是2000ms
       1.1 网络原因:比如是否存在跨机房、网络闪断等。
       1.2 存在慢查询的操作,因为redis是单线程,如果有慢查询的话,会阻塞后续操作。
       1.3 value值过大(如二进制流),可能性非常小
       1.4 aof文件正在重写,rdb文件或 aof文件正在fork进程
    2. 节点之间槽位发生变化,会发生JedisMovedDataException
    3. 节点之间发生数据迁移,会发生JedisAskDataException

问题三 ASK转向与MOVED转向区别及场景介绍

   MOVED转向通常发生在集群稳定状态下:若向node-1节点发送key1请求,经过CRC算法计算出key1的slot值,若slot值属于node-1节点的处理范围则直接处理,若不属于node-1节点的处理范围则返回moved异常和能够处理该slot的节点信息(格式:-MOVED SLOT IP:PORT),注:集群中每个节点都记录其他节点的信息。客户端的实现会根据返回的-MOVED转向来将请求再次转发到正确的节点处理。若集群slot不断地发生迁移,那么客户端会不断地根据服务端返回的-MOVED转向重新转发。

   ASK转向通常发生在集群slot迁移过程中:若集群正在发生slot迁移,slot迁移实质上是迁移slot中每一个key的过程,若key1经过计算slot值后路由到node-1发现slot正在发生迁移,而且该key位置已经迁移到node-2,同时这次迁移过程并没有结束(即仍然有key存在于node-1中),那么返回给客户端ASK转向。客户端根据ASK转向将key1转发到node-2中,注意这次转发是基于请求的临时转发,下次请求key2依然根据CRC算法计算slot值若位于node-1将继续转发请求到node-1。若迁移过程结束,所有的key请求经过计算slot值永久的路由到实际的目标节点。

问题四 集群通信方式以及选举过程介绍

   集群节点通过gossip协议进行互相关注(ping),若集群发现某个节点长期没有收到(+pong)响应,那么会每秒一次进行跟踪疑似下线的节点。选举是通过raft算法进行选举,选举过程不予介绍。重点介绍集群在选举过程中可能存在的问题:若master节点跟随的slave节点比较多的话,那么选举的过程耗时略微长一点。那么在这个过程中,所有被路由到这个节点处理的请求均抛出异常。

5. 集群不支持的功能大汇总

   5.1 事务,不管是数据库还是缓存跨节点的事务很棘手

   5.2 Pipeline,队列命令涉及到命令的分发和结果聚合

   5.3 密码认证,多节点认证比较难以协调

   5.4 mget/mset,多命令操作涉及到命令分发与聚合

   5.5 涉及到multi-key的操作或者跨节点的操作均不支持

6. 停机数据备份或迁移简单方案介绍

   不少网友问到数据迁移,如跨级房迁移,或者select 1迁移至select 0,这样的场景最简便的方案是备份物理文件拷贝过去,注意若将select 1迁移到select 0,只需要将aof文件中的select 1改成select 0,redis服务启动默认优先通过aof来恢复数据的。

7. 是否有必要开启rdb或者aof备份

   开启rdb,aof的好处就是备份,主从复制,最新的redis已经支持diskless的发送复制流(即无需将复制的信息写入磁盘而是直接发送给slave节点,见redis.conf参数repl-diskless-sync),当然这个功能现在使用的也很少,风险比较大。那么开启rdb,aof的缺点,fork进程,作者使用高压测试,发现后台fork进程复制的速度是比较慢的,起码肉眼能看到。

。。。待完善。。。

时间: 2024-11-08 20:15:26

Redis集群的一点一滴的相关文章

这可能是最全的 Redis 集群方案介绍了

由于Redis出众的性能,其在众多的移动互联网企业中得到广泛的应用.Redis在3.0版本前只支持单实例模式,虽然现在的服务器内存可以达到100GB.200GB的规模,但是单实例模式限制了Redis没法满足业务的需求(例如新浪微博就曾经用Redis存储了超过1TB的数据).Redis的开发者Antirez早在博客上就提出在Redis 3.0版本中加入集群的功能,但3.0版本等到2015年才发布正式版.各大企业在3.0版本还没发布前为了解决Redis的存储瓶颈,纷纷推出了各自的Redis集群方案.

Redis集群技术及Codis实践

Redis集群技术及Codis实践 前言 本文主要讨论Redis集群相关技术及新发展,关于Redis运维等内容,以后另开主题讨论. 本文重点推荐Codis--豌豆荚开源的Redis分布式中间件(该项目于4个月前在GitHub开源,目前star已超过2100).其和Twemproxy相比,有诸多激动人心的新特性,并支持从Twemproxy无缝迁移至Codis. 好吧我们正式开始. 1. Redis常见集群技术 长期以来,Redis本身仅支持单实例,内存一般最多10~20GB.这无法支撑大型线上业务

一步一个脚印:解密唯品会中Redis集群架构演进与功能定制

在2016杭州云栖大会的"开源数据库之Redis专场"上,来自唯品会的高级数据工程师申政带来了题为<Redis在唯品会的应用实践>的精彩分享.分享中,他主要介绍Redis集群架构演进.Redis使用经验以及唯品会对Redis二次开发实践积累三部分,干货满满,精彩不容错过. 以下内容根据演讲PPT及现场分享整理. Redis集群架构演进 目前在唯品会内对Redis的使用属于重量级别,目前在唯品会内大概有8000个Redis实例.1000台物理机.500个应用. 上图是唯品会对

redis集群相关资料

Cluster简介         Redis 3.0引入的cluster.cluster是具有有自动数据分片.容错.针对读取速度有了显著的提升.改进了AOF重写等的redis分布式实现.     Redis 集群是一个分布式(distributed).容错(fault-tolerant)的 Redis 实现, 集群可以使用的功能是普通单机 Redis 所能使用的功能的一个子集(subset).     Redis 集群中不存在中心(central)节点或者代理(proxy)节点, 集群的其中一

Redis集群环境安装指南

环境 RHLinux-6.4-64-EN, 红帽6.4 64位,英文正式发布版.   Redis3.0.0 redis2.x版本还不支持集群,3.0版本将会支持,现在3.0版本还在开发中,现在是beta-3版本(截止2014-5-8),但功能是可用的. 下载Redis3.0.0 beta-3版本,点击这里下载. Redis3的安装可以参照之前的单机安装指南操作. 创建Redis集群实例 创建集群节点的文件夹,先创建cluster-test文件夹,再以端口为名称创建子文件夹.这里我们要创建6个Re

《Redis官方教程》Redis集群规范

原文链接(on 20 Jul)  作者:antirez  译者:carlvine   Redis集群规范 欢迎来到Redis集群规范.在这里你可以找到有关Redis的算法和设计的基本原理.这篇文章是一项正在进行的工作,因为它是不断地与Redis的实际实现同步.   主要属性和设计原理 Redis的集群目标   Redis集群是一个分布式的实现,具有以下目标,按设计的重要性排序: 高性能,并且多达1000个节点的线性可扩展性.没有代理,使用异步复制,并且在进行赋值时没有合并操作. 可接受程度的写安

基于Redis Sentinel的Redis集群(主从Sharding)高可用方案(转)

本文主要介绍一种通过Jedis&Sentinel实现Redis集群高可用方案,该方案需要使用Jedis2.2.2及以上版本(强制),Redis2.8及以上版本(可选,Sentinel最早出现在Redis2.4中,Redis2.8中Sentinel更加稳定),Redis集群是以分片(Sharding)加主从的方式搭建,满足可扩展性的要求: Redis Sentinel介绍 Redis Sentinel是Redis官方提供的集群管理工具,主要有三大功能: 监控,能持续监控Redis的主从实例是否正常

commons-pool2实现redis集群,报JedisDataException异常

问题描述 commons-pool2实现redis集群,报JedisDataException异常 配置文件如下: <bean id="genericObjectPoolConfig" class="org.apache.commons.pool2.impl.GenericObjectPoolConfig"> <property name="maxTotal" value="${redis.maxActive}&quo

《Redis官方文档》Redis集群教程

原文链接 译文链接 译者: tiffany 这篇教程是Redis集群的简要介绍,而非讲解分布式系统的复杂概念.它主要从一个使用者的角度介绍如何搭建.测试和使用Redis集群,至于Redis集群的详细设计将在"Redis集群规范"中进行描述. 本教程以redis使用者的角度,用简单易懂的方式介绍Redis集群的可用性和一致性. 注意: 本教程要求redis3.0或以上的版本. 如果你打算部署redis集群,你可以读一些关于集群的详细设计,当然,这不是必须的.由这篇教程入门,先大概使用一下