百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Redis系列专题13 -- 分区

mhr18 2024-11-23 19:06 19 浏览 0 评论

分区是分割数据到多个Redis实例的处理过程,因此每个实例只保存key的一个子集。

为啥要分区

分区在Redis中主要有两个目的:

  • 分区利用多台机器的内存构建一个更大数据库。如果不使用分区,数据库大小受限于单个计算机内存。
  • 分区可以在多核和多计算机之间弹性扩展计算能力,并且分区可以在多计算机和网络适配器之间弹性扩展网络带宽。

Redis分区基础

有多种的分区标准。假设我们有4个Redis实例 R0,R1,R2,R3,很多表示用户的键例如 user:1,user:2等等,我们可以找到不同方式选择实例存储指定的键。换句话说有不同的系统映射一个指定的键到一个给定的Redis服务器。

一个最简单的方法是使用范围分区,并且通过映射某一范围的对象到特定的Redis实例。例如,我可以指定ID 0到10000的用户存储到实例R0,而ID 10001到20000的用户存储到实例R2等等。

该方案实际上是可以应用在实践中的,尽管他的缺点是需要一张映射对象范围与实例的表。这张表需要进行维护,并且我们需要为每种类型对象建立一张表,所以范围分区在Redis中常常是不受欢迎的,因为比其他分区方法更低效。

一个范围分区替代方法是哈希分区。此方案适用于任何形式键,无需键格式形如object_name:<id>,就是这么简单:

使用哈希方法(例如crc32哈希方法)将键名转换成数字。例如一个键名是foobar,crc32(foobar)输出结果形如93024922。

我是使用取模操作将该数字转换成0到3的数字,以便映射到四个Redis实例中的一个。93024922对4取余数等于2,这样我知道foobar键应该存储到R2实例中。注意:模操作返回除法运算的余数,大部分编程语言使用%(取余)就可以了。

通过这两个例子,你应该可以想到还有很多其他方法进行分区。一个更先进的哈希分区是一致性哈希,并且是由几个Redis客户端和代理实现的。

分区不同实现方式

分区可以由一个软件栈的不同部分完成。

客户端分区:客户端直接选择正确节点读写指定键。很多Redis客户实现了这种分区方式。

代理辅助分区:是指我们的客户端通过Redis协议把请求发送给代理,而不是直接发送给真正的Redis实例服务器。这个代理会确保我们的请求根据配置分区策略发送到正确的Redis实例上,并返回给客户端。Redis和Memcached的代理都是用Twemproxy (这是twitter开源的一个代理框架)来实现代理服务分区的,国内的codis(豌豆荚开源)

查询路由:是指你可以把一个请求发送给一个随机的实例,这时实例会把该查询转发给正确的节点。通过客户端重定向(客户端的请求不用直接从一个实例转发到另一个实例,而是被重定向到正确的节点),Redis集群实现了一种混合查询路由。

Redis分区缺点

虽然redis分区极大地提高了整个集群的性能,但缺点同样明显:

1.不支持事物(多个不同机器的key)

2.涉及多个key的操作通常是不被支持的,举例来说,当两个set映射到不同的redis实例上时,你就不能对这两个set执行交集操作

3.当使用分区的时候,数据处理会更复杂,对于实例你必须处理多个RDB/AOF文件,为了备份数据,需要从多个实例和主机聚合持久文件。

4.增加或删除容量也比较复杂。redis集群大多数支持在运行时增加、删除节点的透明数据rebalance的能力,但是类似于客户端分区、代理等其他系统则不支持这项特性。我们还需要预分片(分区)技术来帮助实现。

5.分区的最小粒度是键,因此我们不能将关联到一个键的很大的数据集映射到不同的实例。

什么是预分片技术

Sharding,译为分片,有时也用partitioning(分区),这俩是同一个意思,说的是数据分散到Redis多个实例。

那presharding就是预分片的意思,这是Redis 3.0之前的概念。在Redis 3.0官方支持了Redis集群,在那之前,要想实现集群,用的是各种民间方法,如客户端侧的分片、代理等,典型的代表是Twitter的Twemproxy。同时,Redis作者也提出了一种集群方案,即为presharding。他戏称之为乞丐版的集群,正统的当然是之后的3.0集群方案啦。

如何分片,大家可能首先会想到如下的分片方案:Node = Hash(key) MOD N。hash是简单的,但rehash是很困难的,同时涉及到redis运行时key在不同实例间的迁移。

Redis Presharding不需要resharding,主要步骤如下:

0)在项目的开始阶段,在同一服务器上部署多个redis实例;

1)在扩容阶段,新增服务器,部署新的redis实例;

2)将新实例设为要迁移的旧实例的slave;

3)断开客户端;

4)更新配置:新实例的ip;

5)新实例执行slaveof no one,成为master;

6)重启客户端,使客户端使用新实例;

7)关闭旧实例。

以上拆分流程是Redis作者提出的一个平滑迁移的过程,不过该拆分方法还是很依赖Redis本身的复制功能的,如果主库快照数据文件过大,这个复制的过程也会很久,同时会给主库带来压力。所以做这个拆分的过程最好选择为业务访问低峰时段进行。

重点说明:

1.presharding前后,集群中的redis实例总数是不变的。正因为如此,避免了resharding,不存在key值从一个区转移到另一个分片区。

2.集群的思想是用多台(可能性能相对差的)机器,得到高效的处理能力。随着业务的发展,单机上可能存储、CPU、内存不够用了,此时就需要增加机器,并进行实例的迁移,此时单机的实例数变少,单机的压力减小。因此,假设有N台机器,每台M个实例,随着业务的发展,N会逐渐增大,M逐渐减小,但N*M是保持不变的。

3.限制。该方案受限于初始设定的实例数,如果N*M个redis实例还满足不了需求,再增加机器就会出现resharding。作者建议初始单机部署32,64,128个redis实例,当然最终还是应该根据自己的业务实际情况和对未来的预估,或者直接升级redis版本。

相关推荐

【推荐】一个开源免费、AI 驱动的智能数据管理系统,支持多数据库

如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!.前言在当今数据驱动的时代,高效、智能地管理数据已成为企业和个人不可或缺的能力。为了满足这一需求,我们推出了这款开...

Pure Storage推出统一数据管理云平台及新闪存阵列

PureStorage公司今日推出企业数据云(EnterpriseDataCloud),称其为组织在混合环境中存储、管理和使用数据方式的全面架构升级。该公司表示,EDC使组织能够在本地、云端和混...

对Java学习的10条建议(对java课程的建议)

不少Java的初学者一开始都是信心满满准备迎接挑战,但是经过一段时间的学习之后,多少都会碰到各种挫败,以下北风网就总结一些对于初学者非常有用的建议,希望能够给他们解决现实中的问题。Java编程的准备:...

SQLShift 重大更新:Oracle→PostgreSQL 存储过程转换功能上线!

官网:https://sqlshift.cn/6月,SQLShift迎来重大版本更新!作为国内首个支持Oracle->OceanBase存储过程智能转换的工具,SQLShift在过去一...

JDK21有没有什么稳定、简单又强势的特性?

佳未阿里云开发者2025年03月05日08:30浙江阿里妹导读这篇文章主要介绍了Java虚拟线程的发展及其在AJDK中的实现和优化。阅前声明:本文介绍的内容基于AJDK21.0.5[1]以及以上...

「松勤软件测试」网站总出现404 bug?总结8个原因,不信解决不了

在进行网站测试的时候,有没有碰到过网站崩溃,打不开,出现404错误等各种现象,如果你碰到了,那么恭喜你,你的网站出问题了,是什么原因导致网站出问题呢,根据松勤软件测试的总结如下:01数据库中的表空间不...

Java面试题及答案最全总结(2025版)

大家好,我是Java面试陪考员最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Spring、MySQL、JVM、Redis、Linux、Sprin...

数据库日常运维工作内容(数据库日常运维 工作内容)

#数据库日常运维工作包括哪些内容?#数据库日常运维工作是一个涵盖多个层面的综合性任务,以下是详细的分类和内容说明:一、数据库运维核心工作监控与告警性能监控:实时监控CPU、内存、I/O、连接数、锁等待...

分布式之系统底层原理(上)(底层分布式技术)

作者:allanpan,腾讯IEG高级后台工程师导言分布式事务是分布式系统必不可少的组成部分,基本上只要实现一个分布式系统就逃不开对分布式事务的支持。本文从分布式事务这个概念切入,尝试对分布式事务...

oracle 死锁了怎么办?kill 进程 直接上干货

1、查看死锁是否存在selectusername,lockwait,status,machine,programfromv$sessionwheresidin(selectsession...

SpringBoot 各种分页查询方式详解(全网最全)

一、分页查询基础概念与原理1.1什么是分页查询分页查询是指将大量数据分割成多个小块(页)进行展示的技术,它是现代Web应用中必不可少的功能。想象一下你去图书馆找书,如果所有书都堆在一张桌子上,你很难...

《战场兄弟》全事件攻略 一般事件合同事件红装及隐藏职业攻略

《战场兄弟》全事件攻略,一般事件合同事件红装及隐藏职业攻略。《战场兄弟》事件奖励,事件条件。《战场兄弟》是OverhypeStudios制作发行的一款由xcom和桌游为灵感来源,以中世纪、低魔奇幻为...

LoadRunner(loadrunner录制不到脚本)

一、核心组件与工作流程LoadRunner性能测试工具-并发测试-正版软件下载-使用教程-价格-官方代理商的架构围绕三大核心组件构建,形成完整测试闭环:VirtualUserGenerator(...

Redis数据类型介绍(redis 数据类型)

介绍Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sortedset:有序集合)。1、字符串类型概述1.1、数据类型Redis支持...

RMAN备份监控及优化总结(rman备份原理)

今天主要介绍一下如何对RMAN备份监控及优化,这里就不讲rman备份的一些原理了,仅供参考。一、监控RMAN备份1、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...

取消回复欢迎 发表评论: