分区是将数据拆分为多个Redis实例的过程,因此每个实例将仅包含键的一个子集。 本文档的第一部分将向您介绍分区的概念,第二部分将向您展示Redis分区的替代方法。

为什么分区是有用的

对Redis进行分区有两个主要目标:它使用许多计算机的内存总和来允许更大的数据库。 如果不进行分区,则只能使用一台计算机可以支持的内存量。

它允许将计算能力扩展到多核和多台计算机,并将网络带宽扩展到多台计算机和网络适配器。

分区基础

有不同的分区规范。 想象一下,我们有四个Redis实例R0,R1,R2,R3,以及代表用户的许多key,例如user:1,user:2等...,我们可以找到不同的方法来选择在哪个实例中存储给定的key 。 换句话说,存在将给定key映射到给定Redis服务器的不同系统。

执行分区的最简单方法之一是范围分区,它是通过将对象范围映射到特定Redis实例中来实现的。 例如,我可以说从ID 0到ID 10000的用户将进入实例R0,而从ID 10001到ID 20000的用户将进入实例R1,依此类推。

该系统可以工作并且可以在实践中实际使用,但是,它的缺点是需要一个将范围映射到实例的表。 需要管理该表,并且每种对象都需要一个表,因此Redis中的范围分区通常是不理想的,因为它比其他替代分区方法效率低得多。

范围分区的替代方法是哈希分区。 此方案适用于任何key,而无需采用object_name:形式的密钥,并且非常简单:获取key name并使用哈希函数(例如crc32哈希函数)将其转换为数字。 例如,如果键是foobar,则crc32(foobar)将输出类似93024922的信息。

对这个数字使用取模运算,以将其转换为0到3之间的数字,以便可以将该数字映射到我的四个Redis实例之一。 93024922模4等于2,所以我知道我的密钥foobar应该存储到R2实例中。 注意:模运算返回除法运算的余数,并以%运算符在许多编程语言中实现。

还有许多其他方法可以执行分区,但是通过这两个示例,您应该可以理解。 哈希分区的一种高级形式称为一致性哈希,由一些Redis客户端和代理实现。

分区的不同实现

分区可能是软件堆栈中不同部分的责任。客户端分区意味着客户端直接选择要在其中写入或读取给定key的正确节点。 许多Redis客户端实现客户端分区。

代理辅助分区意味着我们的客户将请求发送到能够使用Redis协议的代理,而不是直接将请求发送到正确的Redis实例。 代理将确保根据配置的分区模式将请求转发到正确的Redis实例,并将回复发送回客户端。 Redis和Memcached代理Twemproxy实现了代理辅助分区。

查询路由意味着您可以将查询发送到随机实例,该实例将确保将查询转发到正确的节点。 Redis Cluster在客户端的帮助下实现了混合形式的查询路由(请求不会直接从Redis实例转发到另一个实例,而是会将客户端重定向到正确的节点)。

分区的缺点

Redis的某些功能在分区中不能很好地发挥作用:通常不支持涉及多个键的操作。 例如,如果两个集合存储在映射到不同Redis实例的键中,则无法执行它们的相交(实际上,有很多方法可以执行此操作,但不能直接执行)。

不能使用涉及多个key的Redis事务。

分区粒度是关键,因此无法使用单个大键(如非常大的排序集)对数据集进行分片。

使用分区时,数据处理会更加复杂,例如,您必须处理多个RDB / AOF文件,并且要备份数据,则需要从多个实例和主机聚合持久性文件。

添加和删除容量可能很复杂。 例如,Redis Cluster支持大多数透明的数据重新平衡,并能够在运行时添加和删除节点,但是其他系统(例如客户端分区和代理)不支持此功能。 但是,在这方面,一种称为预分片的技术会有所帮助。

数据存储还是缓存?

尽管无论将Redis用作数据存储还是用作缓存,Redis中的分区在概念上都是相同的,但是将其用作数据存储时存在很大的限制。 当Redis用作数据存储时,给定的key必须始终映射到相同的Redis实例。 当Redis用作缓存时,如果给定节点不可用,则使用不同的节点不是什么大问题,因为我们希望提高系统的可用性(即, 系统来回复我们的查询)。

如果给定key的首选节点不可用,则一致性哈希实现通常可以切换到其他节点。 同样,如果添加新节点,则部分新key将开始存储在新节点上。

这里的主要概念如下:如果将Redis用作缓存,则使用一致hash就可以进行向上和向下缩放。

如果将Redis用作存储,则使用固定的“键到节点”映射,因此节点数必须固定并且不能变化。 否则,需要一个能够在添加或删除节点时在节点之间重新平衡key的系统,并且目前只有Redis Cluster能够做到这一点-Redis Cluster于2015年4月1日全面可用并投入生产。

预分片

我们了解到分区的问题在于,除非我们将Redis用作缓存,否则添加和删除节点可能很棘手,并且使用固定的键实例映射要简单得多。

但是,数据存储需求可能会随时间变化。 今天,我可以使用10个Redis节点(实例),但是明天我可能需要50个节点。

由于Redis的占地面积非常小且重量轻(备用实例使用1 MB的内存),因此解决此问题的简单方法是从头开始使用许多实例。 即使仅从一台服务器启动,也可以决定从一开始就生活在分布式环境中,并使用分区在单个服务器上运行多个Redis实例。

您可以从一开始就将实例数量选择为很大。 例如,对于大多数用户而言,32或64个实例可以解决问题,并将为增长提供足够的空间。

这样,随着数据存储需求的增加以及您需要更多的Redis服务器,您要做的就是将实例从一台服务器移到另一台服务器。 一旦添加了第一台其他服务器,您将需要将一半Redis实例从第一台服务器移动到第二台服务器,依此类推。

使用Redis复制,您将可以为用户减少停机时间或减少停机时间:在新服务器中启动空实例。

移动将这些新实例配置为源实例的从属的数据。

停止您的客户。

使用新的服务器IP地址更新移动实例的配置。

将SLAVEOF NO ONE命令发送到新服务器中的从属服务器。

使用新的更新配置重新启动客户端。

最后,关闭旧服务器中不再使用的实例。

Redis分区的实现

到目前为止,我们已经在理论上介绍了Redis分区,但是实践呢? 您应该使用什么系统?

Redis集群

Redis Cluster是获得自动分片和高可用性的首选方法。 自2015年4月1日起,该版本将普遍可用并投入生产。您可以在Cluster教程中获得有关Redis Cluster的更多信息。

一旦Redis Cluster可用,并且如果兼容Redis Cluster的客户端可用于您的语言,则Redis Cluster将成为Redis分区的事实上的标准。

Redis Cluster是查询路由和客户端分区之间的混合体。

Twemproxy

Twemproxy是Twitter上针对Memcached ASCII和Redis协议开发的代理。 它是单线程的,它是用C语言编写的,并且速度非常快。 它是根据Apache 2.0许可条款发行的开源软件。

Twemproxy支持在多个Redis实例之间进行自动分区,并在节点不可用的情况下提供可选的节点弹出功能(这将更改keys-instances映射,因此仅在将Redis用作缓存时才应使用此功能)。

这不是单点故障,因为您可以启动多个代理并指示您的客户端连接到第一个接受连接的客户端。

基本上,Twemproxy是客户端和Redis实例之间的中间层,它将以最小的额外复杂性可靠地为我们处理分区。

您可以在此antirez博客文章中了解有关Twemproxy的更多信息。

支持一致哈希的客户端

Twemproxy的替代方法是使用通过一致性哈希或其他类似算法实现客户端分区的客户端。 有多个Redis客户端支持一致的哈希,尤其是Redis-rb和Predis。

请检查Redis客户端的完整列表,以检查是否存在具有针对您的语言的一致哈希实现的成熟客户端。

多个项目共用同一个redis_分区:如何在多个Redis实例之间拆分数据相关推荐

  1. MT8788/MT6771/MT8766硬件相同怎样实现单双卡共用同一个image

    [DESCRIPTION] FAQ20105有介绍手机硬件不同实现单双卡共用一个image的方案.如果手机硬件完全相同,无法区分硬件版本,怎样实现单双卡共用同一个image? 如果需要MTK相关的技术 ...

  2. SAP WM 共用同一个仓库号的2个存储地点之间转库

    SAP WM 共用同一个仓库号的2个存储地点之间转库 工厂代码NMDC下2个存储地点0001和0002,对应的Warehouse Number都是NM1. 本文展示的是如果在存储地点0001和0002 ...

  3. 区块链80%项目靠同一个故事拿钱,但标准链说最坏的时机就是好的开始

    区块链80%项目靠同一个故事拿钱,但标准链说最坏的时机就是好的开始 2008年,一位名为中本聪大神在一个密码学邮件列表中上传了一份名为"比特币:一个P2P电子货币系统"的白皮书,比 ...

  4. vue 如何实现多个路由共用同一个页面组件

    多个页面共用同一个组件 当多个路由公用同一个组件时,切换路由不会重新触发该组件页面的钩子函数. 为了重新触发钩子函数.获取最新数据.有两种方式: 方法1:假如父组件下的两个子组件A ,B需要公用同一个 ...

  5. 腾讯开放平台创建应用的坑,安卓和iOS端如何共用同一个Appid?

    很多人遇到一种情况,就是自己的应用使用QQ登录的时候,在不同客户端,返回的openid竟然不一样,导致统一个用户在不同客户端创建了不同的账号. 这时候有两种解决方法: 第一种:需要发邮件给腾讯开放平台 ...

  6. 使用Redis分区将数据分割到多个Redis实例

    分区是将所有的数据分割到多个Redis实例的过程,所以每个Redis实例存放的是所有键值的子集. Redis分区主要有两个目标: 1)允许使用多台计算机的内存来存放更大的数据.如果不做分区的话,单台计 ...

  7. 锁分区提升并发,以及锁等待实例

    码字介绍 http://msdn.microsoft.com/en-us/library/ms187504(v=SQL.100).aspx 锁分区技术对提高并发有一定帮助,但对对象操作又有了新的定义, ...

  8. mysql分区功能详细介绍,以及实例

    转载:http://blog.csdn.net/yongchao940/article/details/55266603 一,什么是数据库分区 前段时间写过一篇关于mysql分表的的文章,下面来说一下 ...

  9. 一个项目的经验教训:关于打乱和拆分数据

    最近因为某事要准备一点材料,刚好前段时间给导师做项目的时候遇到一个大坑,浪费了很多时间,所以就着这个问题顺便做点总结. 传统的机器学习,即在深度学习流行之前的问题的一般处理流程通常是"预处理 ...

最新文章

  1. 计算机网络技术与计算机应用技术,计算机网络技术和计算机应用技术.pdf
  2. 定时任务框架APScheduler学习详解
  3. 泛泰A880S升级官方4.4.2 binx教程
  4. 又一任务被Transformer攻陷!NVIDIA开源HORST,用Transformer解决早期动作识别和动作预期任务...
  5. 安卓dts音频解码_家庭影院三维音效技术应用之DTS:X摆位
  6. bzoj 1677: [Usaco2005 Jan]Sumsets 求和(DP)
  7. 阿里云服务器的安全组怎么创建和修改?
  8. unity3d api 中文文档_官方文档
  9. 制作u盘winpe启动盘_微PE工具箱 (WePE),绿色纯净的WinPE启动盘/U盘重装系统工具...
  10. python 实现图片转视频
  11. 磁盘如何除写保护(常规解决方案)
  12. html5理财计算,理财产品的收益怎么算(个人理财收益计算器)
  13. android 经纬度的格式,的Android如何转换经纬度成度格式
  14. ip关联是什么意思,亚马逊如何防止ip关联(ip关联过多是什么意思)
  15. 【Visual C++】游戏开发笔记四十三 浅墨DirectX教程十一 为三维世界添彩:纹理映射技术(二)
  16. android 相机启动失败怎么回事,Android相机启动crash错误排查
  17. 硬干货:深入剖析 MySQL 索引和 SQL 调优实战
  18. Python中文转数字
  19. 10.1 快乐,自费送几本豆瓣9.0高分书籍
  20. java定义接口区分飞机和汽车_JAVA菜鸟入门篇 - 抽象类、接口 (十九)

热门文章

  1. Caffe 学习系列
  2. (转) Linux(Centos7)yum安装最新mysql
  3. float、定位、inline-block、兼容性需注意的特性总结
  4. [转]JSON and Microsoft Technologies(翻译)
  5. php 抽象类 静态 单体设计模式
  6. shellcode编写技巧
  7. springboot2源码2-SpringApplication运行
  8. Django APIView源码解析
  9. AWS向中国有限预览客户推出多级别AWS支持服务
  10. Python链接Sql server