Redis3官方文档(18)
——分片
分片(partitioning)就是将你的数据拆分到多个Redis实例的过程,这样每个实例将只包含所有键的子集。本文第一部分将向你介绍分片的概念,第二部分将向你展示Redis分片的可选方案。
分片为何有用(Why useful)
Redis的分片承担着两个主要目标:
- 允许使用很多电脑的内存总和来支持更大的数据库。没有分片,你就被局限于单机能支持的内存容量。
- 允许伸缩计算能力到多核或多服务器,伸缩网络带宽到多服务器或多网络适配器。
分片基础(Basics)
有很多不同的分片标准(criteria)。假想我们有4个Redis实例R0,R1,R2,R3,还有很多表示用户的键,像user:1,user:2,…等等,我们能找到不同的方式来选择一个指定的键存储在哪个实例中。换句话说,有许多不同的办法来映射一个键到一个指定的Redis服务器。
最简单的执行分片的方式之一是范围分片(range partitioning),通过映射对象的范围到指定的Redis实例来完成分片。例如,我可以假设用户从ID 0到ID 10000进入实例R0,用户从ID 10001到ID 20000进入实例R1,等等。
这套办法行得通,并且事实上在实践中被采用,然而,这有一个缺点,就是需要一个映射范围到实例的表格。这张表需要管理,不同类型的对象都需要一个表,所以范围分片在Redis中常常并不可取,因为这要比替他分片可选方案低效得多。
一种范围分片的替代方案是哈希分片(hash partitioning)。这种模式适用于任何键,不需要键像object_name:<id>这样的饿形式,就像这样简单:
- 使用一个哈希函数(例如,crc32哈希函数)将键名转换为一个数字。例如,如果键是foobar,crc32(foobar)将会输出类似于93024922的东西。
- 对这个数据进行取模运算,以将其转换为一个0到3之间的数字,这样这个数字就可以映射到我的4台Redis实例之一。93024922模4等于2,所以我知道我的键foobar应当存储到R2实例。注意:取模操作返回除法操作的余数,在许多编程语言总实现为%操作符。
有许多其他的方式可以分片,从这两个例子中你就可以知道了。一种哈希分片的高级形式称为一致性哈希(consistent hashing),被一些Redis客户端和代理实现。
分片的不同实现(Different implementations)
分片可由软件栈中的不同部分来承担。
- 客户端分片(Client side partitioning)意味着,客户端直接选择正确的节点来写入和读取指定键。许多Redis客户端实现了客户端分片。
- 代理协助分片(Proxy assisted partitioning)意味着,我们的客户端发送请求到一个可以理解Redis协议的代理上,而不是直接发送请求到Redis实例上。代理会根据配置好的分片模式,来保证转发我们的请求到正确的Redis实例,并返回响应给客户端。Redis和Memcached的代理Twemproxy实现了代理协助的分片。
- 查询路由(Query routing)意味着,你可以发送你的查询到一个随机实例,这个实例会保证转发你的查询到正确的节点。Redis集群在客户端的帮助下,实现了查询路由的一种混合形式(请求不是直接从Redis实例转发到另一个,而是客户端收到重定向到正确的节点)。
分片的缺点(Disadvantages)
Redis的一些特性与分片在一起时玩转的不是很好:
- 涉及多个键的操作通常不支持。例如,你不能对映射在两个不同Redis实例上的键执行交集(事实上有办法做到,但不是直接这么干)。
- 涉及多个键的事务不能使用。
- 分片的粒度(granularity)是键,所以不能使用一个很大的键来分片数据集,例如一个很大的有序集合。
- 当使用了分片,数据处理变得更复杂,例如,你需要处理多个RDB/AOF文件,备份数据时你需要聚合多个实例和主机的持久化文件。
- 添加和删除容量也很复杂。例如,Redis集群具有运行时动态添加和删除节点的能力来支持透明地再均衡数据,但是其他方式,像客户端分片和代理都不支持这个特性。但是,有一种称为预分片(Presharding)的技术在这一点上能帮上忙。
数据存储还是缓存(Store or cache)
尽管无论是将Redis作为数据存储还是缓存,Redis的分片概念上都是一样的,但是作为数据存储时有一个重要的局限。当Redis作为数据存储时,一个给定的键总是映射到相同的Redis实例。当Redis作为缓存时,如果一个节点不可用而使用另一个节点,这并不是一个什么大问题,按照我们的愿望来改变键和实例的映射来改进系统的可用性(就是系统回复我们查询的能力)。
一致性哈希实现常常能够在指定键的首选节点不可用时切换到其他节点。类似的,如果你添加一个新节点,部分数据就会开始被存储到这个新节点上。
这里的主要概念如下:
- 如果Redis用作缓存,使用一致性哈希来来实现伸缩扩展(scaling up and down)是很容易的。
- 如果Redis用作存储,使用固定的键到节点的映射,所以节点的数量必须固定不能改变。否则,当增删节点时,就需要一个支持再平衡节点间键的系统,当前只有Redis集群可以做到这一点,Redis集群已经完全可用,从2015年4月1日起就可以在生产环境中使用。
预分片(Presharding)
我们已经知道分片存在的一个问题,除非我们使用Redis作为缓存,增加和删除节点是一件很棘手的事情,使用固定的键和实例映射要简单得多。
然而,数据存储的需求可能一直在变化。今天我可以接受10个Redis节点(实例),但是明天我可能就需要50个节点。
因为Redis只有相当少的内存占用(footprint)而且轻量级(一个空闲的实例只是用1MB内存),一个简单的解决办法是一开始就开启很多的实例。即使你一开始只有一台服务器,你也可以在第一天就决定生活在分布式的世界里,使用分片来运行多个Redis实例在一台服务器上。
你一开始就可以选择很多数量的实例。例如,32或者64个实例能满足大多数的用户,并且为未来的增长提供足够的空间。
这样,当你的数据存储需要增长,你需要更多的Redis服务器,你要做的就是简单地将实例从一台服务器移动到另外一台。当你新添加了第一台服务器,你就需要把一半的Redis实例从第一台服务器搬到第二台,如此等等。
使用Redis复制,你就可以在很小或者根本不需要停机时间内完成移动数据:
- 在你的新服务器上启动一个空实例。
- 移动数据,配置新实例为源实例的从服务。
- 停止你的客户端。
- 更新被移动实例的服务器IP地址配置。
- 向新服务器上的从节点发送SLAVEOF NO ONE命令。
- 以新的更新配置启动你的客户端。
- 最后关闭掉旧服务器上不再使用的实例。
Redis分片的实现(Implementations)
到目前为止,我们从理论上讨论了Redis分片,但是实践情况如何呢?你应该使用什么系统呢?
Redis集群(Redis Cluster)
Redis集群是自动分片和高可用的首选方式。Redis集群已经完全可用,从2015年4月1日起就可以在生产环境中使用。你可以从集群教程(请持续关注本公众账号后续文章,译者注)中获取更多Redis集群的相关信息。
一旦Redis集群可用,以及支持Redis集群的客户端可用,Redis集群将会成为Redis分片的事实标准。
Redis集群是查询路由和客户端分片的混合模式。
Twemproxy
Twemproxy是Twitter开发的一个支持Memcached ASCII和Redis协议的代理。它是单线程的,由C语言编写,运行非常的快。他是基于Apache 2.0许可的开源项目。
Twemproxy支持自动在多个Redis实例间分片,如果节点不可用时,还有可选的节点排除支持(这会改变键和实例的映射,所以你应该只在将Redis作为缓存是才使用这个特性)。
这并不是单点故障(single point of failure),因为你可以启动多个代理,并且让你的客户端连接到第一个接受连接的代理。
从根本上说,Twemproxy是介于客户端和Redis实例之间的中间层,这就可以在最下的额外复杂性下可靠地处理我们的分片。
你可以阅读更多关于Twemproxy的信息(作者的这篇博客文章http://antirez.com/news/44 ,译者注)。
支持一致性哈希的客户端
Twemproxy之外的可选方案,是使用实现了客户端分片的客户端,通过一致性哈希或者别的类似算法。有多个支持一致性哈希的Redis客户端,例如Redis-rb和Predis。
请查看完整的Redis客户端列表,看看是不是有支持你的编程语言的,并实现了一致性哈希的成熟客户端。
===============================================================================
大家好,我是阮威。华中科技大学,计算机软件专业硕士。毕业后加入腾讯,先后在腾讯电子商务部和无线游戏产品部工作,现供职于欢聚时代基础产品部。IT男,至今。欢迎大家收听我的公众账号。
分享到:
相关推荐
8. **集群支持**:Redis Cluster是其官方提供的分布式解决方案,可以自动分片和故障转移,实现水平扩展。 在压缩包文件`redis-3.0.1`中,可能包含的是Redis 3.0.1版本的源代码、编译脚本、配置文件以及相关的文档。...
6. **集群**:Redis Cluster是官方提供的分布式解决方案,它可以自动将数据分片到多个节点,实现水平扩展。 7. **Lua脚本**:Redis支持使用Lua编写脚本,可以在服务器端执行复杂的数据操作,提高了性能。 8. **...
Redis 集群通过分片来处理大规模数据。每个节点负责一部分哈希槽(hash slots),数据会被分布到这些哈希槽中。这种设计使得 Redis 能够支持大规模部署,并提供高可用性和可扩展性。 ### 16. Redis 集群方案可能面临...
7. **集群**:Redis Cluster提供了一种水平扩展的方式,通过分片(sharding)将数据分布到多个节点上,提升处理能力。 8. **内存管理**:Redis是内存数据库,需要注意内存使用策略,如设置最大内存限制、使用LRU...
7. **Sentinel监控与Cluster集群**:Redis Sentinel用于监控和自动故障转移,Redis Cluster则提供数据分片和高可用性的分布式解决方案。 对于新手来说,了解这些基本概念后,可以着手进行Springboot整合Redis的学习...
- Cluster(集群):数据分片,提供水平扩展能力。 4. **分布式锁**: 使用 SETNX 或 SET 命令加过期时间实现,确保同一时刻只有一个客户端持有锁。 5. **Redis 作为异步队列**: 通常使用 LPush/RPop 或 BRPop...
- 使用一致性哈希来管理数据分片。 - 提供强一致性和最终一致性两种模型。 - 具备自动故障恢复功能。 ##### 1.1.3 memcachedb - **简介**:memcachedb是一种高性能的嵌入式Key-Value存储引擎,它结合了memcached...
- **高级查询**:MongoDB 提供了丰富的查询语言,支持复杂的查询操作,包括聚合管道、索引、分片等高级功能,这大大增强了其作为数据处理平台的能力。 #### 高级接口、数据处理、数据存储与资源管理 - **高级接口*...
此外,了解Sharding分片、Replica Sets副本集、GridFS文件存储、聚合框架等高级特性也是必不可少的。MongoDB在处理非结构化数据和半结构化数据方面表现出色,常见应用包括日志分析、内容管理、物联网数据存储等。 ...
下载Redis后,你可以按照官方文档或博客中的配置指南进行安装和设置,了解其基本操作和使用方法。 2. MongoDB:MongoDB是一款基于分布式文件存储的文档型数据库,支持JSON格式的数据存储,适合处理半结构化和结构化...
7. **Mycat常用分片规则**:阐述了Mycat支持的各种分片策略,如哈希分片、范围分片、模运算分片等,以及如何根据业务需求选择合适的分片规则。 【关联技术】:课程还提到了非关系型数据库(NoSQL),如key-value型...
6. **配置与部署**: Sharding-Proxy的部署涉及配置文件的设置,如数据源配置、分片规则定义、网络配置等,解压后的bin目录通常包含启动脚本,用户可以根据官方文档进行配置和启动。 7. **扩展性**: ShardingSphere...
- **分布式任务调度**:熟悉分布式任务调度系统的架构设计与关键技术点,如定时任务触发、任务分片执行等。 - **微服务架构**:理解微服务架构的核心理念与设计原则,包括服务拆分策略、服务治理机制、API网关的作用...
《基于Node.js的分片路由器——深入理解"sharding-router"》 在现代Web应用程序开发中,随着数据量的增长和用户需求的复杂性增加,单个数据库往往难以满足高并发、大数据量的处理需求。因此,数据库分片技术...
6. **分片和集群支持**:Jedis支持Redis的分片和集群模式,能够在多个Redis实例之间分散负载。 7. **复制**:Jedis提供了主从复制的配置和操作,便于数据备份和故障恢复。 8. **Pipeline和Transaction**:这两个...
- **高可用性**:通过副本集(replica sets)和分片(sharding)机制实现。 - **易扩展性**:水平扩展简单,可以通过增加节点来扩展系统的处理能力。 - **丰富的查询语言**:支持类似于SQL的查询语法,便于开发人员使用...
Redis 不支持自动分片,需要依赖应用程序来实现一致性哈希。 2. **Memcached**:本身不具备数据冗余机制,通过成熟的哈希算法或环状算法来解决单点故障问题。 3. **MongoDB**:支持多种高可用架构,如主从模式...
此外,MongoDB还支持分片集群和复制集,以确保数据的可用性和可靠性。 在实际应用中,这些数据库工具能够提高开发效率,简化数据库管理,并帮助我们应对不同场景下的数据需求。例如,MySQL适合处理结构化数据,如...
- **部署**:MongoDB的部署包括单机、复制集、分片集群等多种模式,适应不同规模的场景。 - **数据类型**:MongoDB同样有多种数据类型,如整数、浮点数、字符串、数组、对象等,且支持复杂查询和聚合操作。 - **...
OrientDB设计时考虑了性能和可扩展性,它支持分布式模式,可以轻松地在多个节点之间进行数据分片和复制,从而实现水平扩展,满足大数据量和高并发场景的需求。 **5. 查询语言** OrientDB支持SQL和自己的图查询语言...