设为首页 收藏本站
查看: 1914|回复: 0

[经验分享] Redis 序列之四——Redis的Sharding(分片机制)

[复制链接]

尚未签到

发表于 2016-12-18 08:10:32 | 显示全部楼层 |阅读模式
  Sharding机制:即通常所说的“分片”,允许数据存放在不同的物理机器上,以适应数据量过大的场景,克服单台机器内存或者磁盘空间的限制。而这种“离散式”地存放,对客户端来说是透明的,对客户端来讲,完全看不到这种差别。
  Redis的分片(Sharding或者Partitioning)技术:是指将数据分散到多个Redis实例中的方法,分片之后,每个redis拥有一部分原数据集的子集。在数据量非常大时,这种技术能够将数据量分散到若干主机的redis实例上,进而减轻单台redis实例的压力。分片技术能够以更易扩展的方式使用多台计算机的存储能力(这里主要指内存的存储能力)和计算能力:
  (1)从存储能力的角度,分片技术通过使用多台计算机的内存来承担更大量的数据,如果没有分片技术,那么redis的存储能力将受限于单台主机的内存大小。
  (2) 从计算能力的角度,分片技术通过将计算任务分散到多核或者多台主机中,能够充分利用多核、多台主机的计算能力。
  下面将以举例的方式说明分片技术及其存在的优势:
  示例1:未采用分片技术,有1000万条用户信息数据,以键值对:UsrID:UsrInfo的形式存储在一个redis实例中,此时所有的用户信息都会存储在一个redis实例中,对这1000万条数据的所有插、查、删、该操作压力都会集中在这个redis所在的主机上;此时所要考虑的问题不仅有存储和操作对该主机的压力,还有该主机失效时将导致所有操作都无法进行的问题。如下图1所示:
  
                               
  
  示例2:采用分片技术;有1000万条用户信息数据,以键值对:UsrID:UsrInfo的形式存储于redis中,此时有4台主机,每台主机运行一个Redis实例:主机A (Redis1)、主机B(Redis2)、主机C(Redis3)、主机D(Redis4),分片时算法为:
  redis_index = 用户的ID % 4 + 1;
  例如ID为10000654则可得到到redis_index的值:10000654 % 4 + 1 = 1,即用户10000654的信息将被放到Redis1上,所有对用户1000654的操作也将被分片到Redis1上;假如用户ID以顺序方式出现,这1000万条用户信息将被平均分配到这四台主机的各Redis实例上,如下图2所示:
  
                   
 
  采用分片之后,数据将被分散到4个redis实例中,对数据的操作也被分散到每个redis实例中,此时单台主机的压力将大大减轻。
  预分片技术(pre-sharding)技术:
  Redis目前不支持动态分片操作,扩容和缩容操作都会比较复杂,尤其分片操作部署在客户端时,需要重新配置和启动客户端。在使用过程中缩容用的不多,扩容可以采用预分片策略来缓解此问题。
  在正常运营环境中,一般所存储的数据会逐渐增加,可能今天只要10个redis实例就能应付,但是到了一年以后就需要50个redis实例才能支撑,因此,redis的扩容是经常用到的功能,在redis的分布式部署中,有预分片技术是非常好用的方法之一;
  预分片技术是指在开始时就启动足够多的redis实例(例如32或64个,估计一下够以后扩展用就行了),等到后续需要扩容的时候,只需要将其中一部分的redis实例转移到新增加的机子上即可,在redis实例迁移过程中使用redis的复制功能可以最大限度的降低redis的停工时间甚至可以做到没有停工时间。由于redis实例是轻量级的进程,而且占用内存较少,这里指单纯的空的redis实例,一个空的redis实例大约占用1M的内存;因此,这种方式即不会占用太多系统开销,又便于实现;
  Redis的预分片技术可以按照以下步骤进行实例迁移操作:
  (1)在新机子上启动新的redis实例;
  (2)将新redis实例作为slave将原redis实例作为master,将数据从原redis实例迁移到新redis实例上;
  (3)停止客户端(分片操作在客户端上时)或代理服务器(分片操作在代理上);
  (4)更新客户端或者代理服务器中的配置信息,去掉被迁移的原redis实例的ip和端口等信息,加上新启动redis实例的IP地址和端口;
  (5)向新启动的redis发送SLAVEOF NOONE命令,终止新redis实例对原redis实例的从属关系;
  (6)重启客户端程序或者代理程序,此时它们将会使用新的redis实例;
  (7)关掉被迁移走数据的原redis实例。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-315732-1-1.html 上篇帖子: Redis常用指令 下篇帖子: redis 的mq功能演示
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表