返回顶部
首页 > 资讯 > 数据库 >分片在redis中作用和实现
  • 943
分享到

分片在redis中作用和实现

2024-04-02 19:04:59 943人浏览 独家记忆
摘要

分片(partitioning)就是将你的数据拆分到多个 Redis 实例的过程,这样每个实例将只包含所有键的子集。本文第一部分将向你介绍分片的概念,第二部分将向你展示 Redis 分片的可选方案。分片能做

分片(partitioning)就是将你的数据拆分到多个 Redis 实例的过程,这样每个实例将只包含所有键的子集。本文第一部分将向你介绍分片的概念,第二部分将向你展示 Redis 分片的可选方案。

分片能做什么

Redis 的分片承担着两个主要目标:

1、允许使用很多电脑的内存总和来支持更大的数据库。没有分片,你就被局限于单机能支持的内存容量。

2、允许伸缩计算能力到多核或多服务器,伸缩网络带宽到多服务器或多网络适配器。

分片基础

有很多不同的分片标准(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: 这样的饿形式,就像这样简单:

1、使用一个哈希函数(例如,crc32 哈希函数) 将键名转换为一个数字。例如,如果键是 foobar,crc32(foobar)将会输出类似于 93024922 的东西。

2、对这个数据进行取模运算,以将其转换为一个 0 到 3 之间的数字,这样这个数字就可以映射到我的 4 台 Redis 实例之一。93024922 模 4 等于 2,所以我知道我的键 foobar 应当存储到 R2 实例。注意:取模操作返回除法操作的余数,在许多编程语言总实现为%操作符。

有许多其他的方式可以分片,从这两个例子中你就可以知道了。一种哈希分片的高级形式称为一致性哈希(consistent hashing),被一些 Redis 客户端和代理实现。

分片的不同实现

分片可由软件栈中的不同部分来承担。

1、客户端分片(Client side partitioning)意味着,客户端直接选择正确的节点来写入和读取指定键。许多 Redis 客户端实现了客户端分片。

2、代理协助分片(Proxy assisted partitioning)意味着,我们的客户端发送请求到一个可以理解 Redis 协议的代理上,而不是直接发送请求到 Redis 实例上。代理会根据配置好的分片模式,来保证转发我们的请求到正确的 Redis 实例,并返回响应给客户端。Redis 和 Memcached 的代理 Twemproxy 实现了代理协助的分片。

3、查询路由(Query routing)意味着,你可以发送你的查询到一个随机实例,这个实例会保证转发你的查询到正确的节点。Redis 集群在客户端的帮助下,实现了查询路由的一种混合形式 (请求不是直接从 Redis 实例转发到另一个,而是客户端收到重定向到正确的节点)。

分片的缺点

Redis 的一些特性与分片在一起时玩转的不是很好:

1、涉及多个键的操作通常不支持。例如,你不能对映射在两个不同 Redis 实例上的键执行交集(事实上有办法做到,但不是直接这么干)。

2、涉及多个键的事务不能使用。

3、分片的粒度(granularity)是键,所以不能使用一个很大的键来分片数据集,例如一个很大的有序集合

4、当使用了分片,数据处理变得更复杂,例如,你需要处理多个 RDB/AOF 文件,备份数据时你需要聚合多个实例和主机的持久化文件。

5、添加和删除容量也很复杂。例如,Redis 集群具有运行时动态添加和删除节点的能力来支持透明地再均衡数据,但是其他方式,像客户端分片和代理都不支持这个特性。但是,有一种称为预分片(Presharding)的技术在这一点上能帮上忙。

数据存储还是缓存

尽管无论是将 Redis 作为数据存储还是缓存,Redis 的分片概念上都是一样的,但是作为数据存储时有一个重要的局限。当 Redis 作为数据存储时,一个给定的键总是映射到相同的 Redis 实例。当 Redis 作为缓存时,如果一个节点不可用而使用另一个节点,这并不是一个什么大问题,按照我们的愿望来改变键和实例的映射来改进系统的可用性(就是系统回复我们查询的能力)。

一致性哈希实现常常能够在指定键的首选节点不可用时切换到其他节点。类似的,如果你添加一个新节点,部分数据就会开始被存储到这个新节点上。

这里的主要概念如下:

1、如果 Redis 用作缓存,使用一致性哈希来来实现伸缩扩展(scaling up and down)是很容易的。

2、如果 Redis 用作存储,使用固定的键到节点的映射,所以节点的数量必须固定不能改变。否则,当增删节点时,就需要一个支持再平衡节点间键的系统,当前只有 Redis 集群可以做到这一点,但是 Redis 集群现在还处在 beta 阶段,尚未考虑再生产环境中使用。

预分片

我们已经知道分片存在的一个问题,除非我们使用 Redis 作为缓存,增加和删除节点是一件很棘手的事情,使用固定的键和实例映射要简单得多。

然而,数据存储的需求可能一直在变化。今天我可以接受 10 个 Redis 节点(实例),但是明天我可能就需要 50 个节点。

因为 Redis 只有相当少的内存占用(footprint)而且轻量级(一个空闲的实例只是用 1MB 内存),一个简单的解决办法是一开始就开启很多的实例。即使你一开始只有一台服务器,你也可以在第一天就决定生活在分布式的世界里,使用分片来运行多个 Redis 实例在一台服务器上。

你一开始就可以选择很多数量的实例。例如,32 或者 64 个实例能满足大多数的用户,并且为未来的增长提供足够的空间。

这样,当你的数据存储需要增长,你需要更多的 Redis 服务器,你要做的就是简单地将实例从一台服务器移动到另外一台。当你新添加了第一台服务器,你就需要把一半的 Redis 实例从第一台服务器搬到第二台,如此等等。

使用 Redis 复制,你就可以在很小或者根本不需要停机时间内完成移动数据:

1、在你的新服务器上启动一个空实例。

2、移动数据,配置新实例为源实例的从服务。

3、停止你的客户端。

4、更新被移动实例的服务器 IP 地址配置。

5、向新服务器上的从节点发送 SLAVEOF NO ONE 命令。

6、以新的更新配置启动你的客户端。

7、最后关闭掉旧服务器上不再使用的实例。

Redis 分片的实现

Redis 集群是自动分片和高可用的首选方式。当前还不能完全用于生产环境,但是已经进入了 beta 阶段。

一旦 Redis 集群可用,以及支持 Redis 集群的客户端可用,Redis 集群将会成为 Redis 分片的事实标准。

Redis 集群是查询路由和客户端分片的混合模式。

Twemproxy 是 Twitter 开发的一个支持 Memcached ASCII 和 Redis 协议的代理。它是单线程的,由 C 语言编写,运行非常的快。他是基于 Apache 2.0 许可的开源项目

Twemproxy 支持自动在多个 Redis 实例间分片,如果节点不可用时,还有可选的节点排除支持(这会改变键和实例的映射,所以你应该只在将 Redis 作为缓存是才使用这个特性)。

这并不是单点故障(single point of failure),因为你可以启动多个代理,并且让你的客户端连接到第一个接受连接的代理。

Twemproxy 之外的可选方案,是使用实现了客户端分片的客户端,通过一致性哈希或者别的类似算法。有多个支持一致性哈希的 Redis 客户端,例如 Redis-rb 和 Predis。

以上就是redis分片详解的详细内容,更多请关注编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: 分片在redis中作用和实现

本文链接: https://lsjlt.com/news/37657.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 分片在redis中作用和实现
    分片(partitioning)就是将你的数据拆分到多个 Redis 实例的过程,这样每个实例将只包含所有键的子集。本文第一部分将向你介绍分片的概念,第二部分将向你展示 Redis 分片的可选方案。分片能做...
    99+
    2024-04-02
  • Redis在PHP应用中的Hash分片
    随着Web应用越来越复杂,如何高效地存储和读取数据成为了一个关键的问题。Redis是一个快速的,开源的键值对数据库,经常被用来缓存和存储数据,它支持多种数据类型、数据持久化和复制等功能。在PHP应用中,Redis通常被用作缓存、队列和数据存...
    99+
    2023-05-15
    PHP redis 分片
  • Redis 分片集群的实现
    目录1 搭建分片集群1.1 集群结构1.2 准备实例和配置1.3 启动1.4 创建集群1.5 测试2 散列插槽3 集群伸缩3.1 创建节点并添加到集群3.2 转移插槽4 故障转移4.1.自动故障转移4.2 手动故障转移5...
    99+
    2023-01-30
    Redis分片集群 Redis分片
  • Redis分片集群的实现
    目录1 搭建分片集群1.1 集群结构1.2 准备实例和配置1.3 启动1.4 创建集群1.5 测试2 散列插槽3 集群伸缩3.1 创建节点并添加到集群3.2 转移插槽4 故障转移4....
    99+
    2023-01-30
    Redis 分片集群 Redis 分片
  • 如何在AmazonAurora中实现数据的分片和分区
    在Amazon Aurora中,数据的分片和分区是通过创建和管理数据库表的方式来实现的。以下是在Amazon Aurora中实现数据...
    99+
    2024-04-09
    AmazonAurora
  • Redis数据分片如何实现
    今天小编给大家分享一下Redis数据分片如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Twemproxy的介绍Twi...
    99+
    2023-06-27
  • MongoDB中怎么实现分片操作
    本篇文章为大家展示了MongoDB中怎么实现分片操作,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1.分片简介分片是指将数据拆分,将其分散存在不同机器上的过程.有时...
    99+
    2024-04-02
  • 如何使用Go语言和Redis实现图片分享网站
    如何使用Go语言和Redis实现图片分享网站概述:在本文中,我们将讨论如何使用Go语言和Redis实现一个简单的图片分享网站。我们将学习如何使用Go语言创建一个Web服务器,然后使用Redis存储和检索图片信息。在这个过程中,我们将使用MV...
    99+
    2023-10-27
    Go语言 redis 图片分享
  • 如何操作Redis和zookeeper实现分布式锁
    如何操作Redis和zookeeper实现分布式锁 在分布式场景下,有很多种情况都需要实现最终一致性。在设计远程上下文的领域事件的时候,为了保证最终一致性,在通过领域事件进行通讯的方式中,可以共享存储(领域...
    99+
    2022-06-04
    分布式 操作 Redis
  • 如何在Redis中实现分布式锁
    在Redis中实现分布式锁可以通过以下方式: 使用SETNX命令:在Redis中可以使用SETNX命令(SET if Not e...
    99+
    2024-04-09
    Redis
  • 如何在PostgreSQL中实现数据分片和水平扩展
    在PostgreSQL中实现数据分片和水平扩展通常可以通过以下几种方法来实现: 使用表分区:PostgreSQL支持使用表分区来...
    99+
    2024-04-02
  • 怎么在Java中使用redis实现分布式锁
    本篇文章给大家分享的是有关怎么在Java中使用redis实现分布式锁,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。原理剖析上述三种分布式锁都是通过各自为依据对各个请求进行上锁,...
    99+
    2023-06-15
  • 怎么在SpringBoot中使用Redis实现分布式锁
    这篇文章主要介绍了怎么在SpringBoot中使用Redis实现分布式锁的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么在SpringBoot中使用Redis实现分布式锁文章都会有所收获,下面我们一起来看看吧...
    99+
    2023-07-05
  • 如何在Redis中实现分布式事务
    在Redis中实现分布式事务可以通过使用 Redis 的事务机制 MULTI/EXEC 和 WATCH 命令来实现。以下是实现分布式...
    99+
    2024-04-09
    Redis
  • 如何在Redis中实现分布式限流
    在Redis中实现分布式限流可以通过使用Redis的计数器和过期时间来实现。以下是一种基于计数器和过期时间的简单实现方式: 使用R...
    99+
    2024-04-09
    Redis
  • PHP实现Redis数据库分片的方法
    Redis是一款高性能的NoSQL数据库,而分片是一种常用的数据分布式处理方法,可以提高数据库的性能和扩展性。本文将介绍如何使用PHP实现Redis数据库分片。Redis分片概述Redis分片是将一个大的Redis数据库拆分成多个较小的Re...
    99+
    2023-05-17
    PHP Redis数据库 分片 (Sharding)
  • Redis在分布式系统中的作用及应用
    Redis在分布式系统中的作用及应用引言:随着互联网的发展,分布式系统已经成为构建现代应用的基石。分布式系统可以提供高可用性、容错性和扩展性,但也面临着一些挑战,比如数据一致性、性能瓶颈和负载均衡。为了解决这些问题,Redis作为一种内存键...
    99+
    2023-11-07
    应用 redis 分布式系统
  • 怎么在Redis中实现键值过期操作
    这篇文章将为大家详细讲解有关怎么在Redis中实现键值过期操作,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1.过期设置Redis 中设置过期时间主要通过以...
    99+
    2024-04-02
  • 切片在Golang中有何作用?全面分析
    切片在Golang中有何作用?全面分析 在Golang中,切片(slice)是一种非常重要且常用的数据结构,它可以看作是对数组的一个封装,实现了动态数组的功能。通过切片,我们可以更加灵...
    99+
    2024-03-03
    golang 切片 作用 内存占用
  • redis和zookeeper中怎么实现分布式锁
    redis和zookeeper中怎么实现分布式锁,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。   一、基于redis的分布...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作