大环境不好?来看看前同事30K月薪掌握了什么技术!

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 大环境不好?来看看前同事30K月薪掌握了什么技术!

引言

上期我们聊到redis的AKF拆分原则关于沿着X轴扩展的一些问题

[大环境不好]那是因为你没有掌握这项redis技术二!

X轴扩展只是解决了单点故障问题,未解决容量有限问题,本期我们就来探讨一下使用AKF时沿着Y轴、Z轴扩展时遇到的问题。Y轴进行功能点划分数据就比如你们的系统有用户基本信息,邮件、短信等通知信息,商品信息,订单信息,库存信息等等,将这些不同功能点的数据放到不同的redis服务器中;

Z轴进行业务数据再分区在拆分,解决访问压力的问题。

一、Y轴Z轴扩展问题

有个前置知识需要和大家同步一下,我们知道redis是使用内存作为存储空间的,一台服务器的内存空间是有限的,不可能全部分配给redis做存储使用,redis还有持久化的进程和数据需要内存空间和物理空间,再加上服务器上还有其他进程需要处理,那么一台服务器不可能将所有内存都分配给redis使用,所以一般情况下是给redis分配几个G的内存空间使用,这样做使得redis在做持久化等服务进程的时候很轻盈,很快速的就完成了,假如你有一台几百G的服务器给redis实例分配了70、80G内存空间,redis在做持久化的时候很吃力,管理那么大的存储空间就会很慢,不切合redis作者的初衷,redis就是要快。基于轻盈的redis特点,当有大数据量来临的时候怎么存放,就是本期要讨论的重点,一台redis实例肯定是存储不了了,那么就需要把数据进行划分,也就是按照Y轴和Z轴进行划分,将数据分配到不同的redis实例中且每台redis实例中的数据是不一样的,怎么分配就是Y轴和Z轴带来的问题。

二、客户端实现划分逻辑,数据可按业务划分

当数据量不够大,可以进行业务功能进行划分时,我们可以采用一定的逻辑,将不同功能的业务数据存放到不同的redis实例中。

三、客户端实现划分逻辑,数据量特别大已经不能在拆分

前提是已经按照功能点进行业务拆分了,现在某一项数据比如商品数据非常大,拆了后空间都不够,那就只能在拆,就不能用直接逻辑的方法去归类拆分了,这个时代就进入了shrding分片时代,数据根据对应规则被划分到不同的机器上,有三种拆分逻辑,我们一起来看一下。

1、通过取模算法MODULA将数据分治

由我们客户端自己实现算法,将数据划分到不同的redis实例上,算法可以是hash+取模。

这种实现方式也有自己的弊端,hash取模算法的模数值是固定的,一开始就要确定到底是模3、4还是5,还是10,会影响分布式下的扩展性,比如公司业务升级了,数据量也升级了,新加了机器,数据按照之前的模数去取就可能取不到新的数据。

2、通过随机算法RANDOM将数据分治

说到随机,不管后面有几台redis实例,客户端直接随机到后面某台实例,这样一来可能客户端自己都不知道数据去了哪一台redis实例,感觉这种实现就没有实用价值了,其实不然,这种随机也是有使用场景的。比如我们存放一个list数据类型的key,并且key的开头是按照我们的规则设定(比如ooxx),让它随机到2台实例上,这样就将数据分片了并且降低了一台实例的压力,我们客户端使用lpush ooxx...放进去,数据是散列在2台redis,但是我们在客户端连接读取redis使用rpop ooxx..就能够将整个list数据类型取出,而这样一个场景就像是消息队列,ooxx就像是一个topic,这2台redis就像是partition,这种架构的成熟中间件就是kafka。

3、通过一致性哈希算法KETAMA将数据分治

前面我们说过了hash取模算法有弊端不利于扩展,取模数固定,一致性hash算法没有取模,它的算法是结合了数据data和部署的节点node一起计算而分配到不同的redis实例上的。代码实现有千万种写法,关于这个算法不展开叙述,大致理一下思路。

a、规划一个hash环

这个圆环上放着一个个的虚拟点,可以是从0到2的32次方这么多个。

image.png

b、规划节点到hash环位置

不管你目前有几台redis实例,还是后面又有增加实例,我们可以按照某个规则比如取redis实例所在机器的Ip和端口号经过hash运算,映射到某个点上,这个物理节点就可以确定位置,比如node01经过hash计算落到了A点上,机器落的点是物理的其他的点是虚拟的。

c、数据data来临寻找存放位置

当data数据来临时,也通过一个hash计算得到一个位子,这个点是虚拟的,在经过在环上比较比它大的物理节点是哪个,比如这里算出来就在node01和node02间,比这个位置大的最近的物理节点是Node02,就找到了node02这个节点,并且将数据放到node02上。

d、物理节点增加

假如这个时候增加了一台机器node03,算出来的位置恰巧就在node01和node02之间,刚刚我们存放的那个数据是在node02,这个时候会带来什么问题?之前客户端压过来的请求经过计算是在node01到node02之间,和node02到node01之间,都能够最终在2或1上取到数据,现在03节点进来,不会影响到03节点到02节点间的数据访问,但会影响01到03节点间的数据访问,请求压过来在03节点上找不到数据,可能会带来缓存穿透,压到数据库给数据库造成压力,但是增加了03节点,对于后面新增的数据有一部分会分配到03节点,势必是为02节点降低了压力,并且这种增加方式不会像取模算法那样让所有数据重新分配,不会造成数据的全局洗牌。

关于增加一个节点03带来的问题,我们可以采取折中方案,取离得计算节点最近的2个节点,增加系统复杂度,就是假设在03上取不到,就再去02节点取一次,最近的这2个节点都找不到的时候,才去数据库mysql中查询,返回且回写到最近的节点。当然可能又有伙伴会说假设又增加一个节点04刚好落在了03和02之间,那取最近的2个节点不就取不到了吗?那把流程再设计的复杂点,取3次取4次,不用这么做,这个点的取舍在于我们怎么去设计了,要是真取3、4次,那多次tcp的消耗就够多了,所以这里就需要根据实际场景去计算和推算。另外刚刚说道增加了03节点,之前放在02节点的部分数据就不能够访问,数据是不是就一直在那放着占用存储空间,这个时候我们就可以使用过期淘汰策略来清除一些非热点数据,因而redis更是倾向于作为缓存使用而不是作为数据库使用。

e、数据倾斜

刚刚我们谈到2个redis实例,经过计算落在了2个点上,也有可能所有数据经过hash计算最后就只存放在了node02节点上,node01节点没有存放到任意1笔数据,这样就会造成数据倾斜。为了解决数据倾斜的问题,我们可以再增加一个操作,刚刚我们假设是使用ip地址,这时我们在ip地址后面拼接10个数,假如就是ip1,ip2,ip3...参与hash运算,就会产生10个点分布在hash还上,2个redis实例就是20个点,不管你有多少数据,总会计算到2台节点上,不会造成数据倾斜。

总结

本期我们讨论了AKF拆分沿着YZ轴带来的一些问题,也给出了再客户端解决数据分片的问题,数据如何拆分同样也可以由第三方模块或者代理来实现数据分片,我们下期接着聊,欢迎持续关注!


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
Oracle Java 关系型数据库
程序员做开发工作必须要考证么?
众所周知,随着信息技术的迅速发展,程序员已经成为现代社会中不可或缺的一部分。与此同时,关于程序员需要考证的话题也越来越受到关注,以及现在互联网行业内卷严重,催生了程序员继续学习的渠道。随着行业寒冬的影响,互联网行业的程序员竞争越来越激烈,也让程序员再次审视了考证提高自身竞争力的设想。那么本文就来简单探讨一下程序员是否需要考证,以及衡量程序员能力的方式是什么?
208 2
程序员做开发工作必须要考证么?
|
3月前
|
设计模式 算法 安全
2023下半年软件设计师 关于我用了半个月过了软件设计师这件事
这篇文章分享了作者在仅用半个月的业余时间备考并通过2023下半年软件设计师考试的经历,包括备考策略、所用资料和个人建议,同时提供了相关备考资料的获取方式。
|
3月前
信不信?工作这么多年,还有很多网工不知道光模块光衰的正常范围?
信不信?工作这么多年,还有很多网工不知道光模块光衰的正常范围?
343 2
|
SQL 缓存 Java
终于来新同事了,没想到竟是我噩梦的开始
终于来新同事了,没想到竟是我噩梦的开始
63 0
|
运维 监控 数据可视化
当开发同事辞职,接手到垃圾代码怎么办?
当开发同事辞职,接手到垃圾代码怎么办?
|
人工智能 IDE 算法
【周末闲谈】新的编程方式,程序员的未来何在?
【周末闲谈】新的编程方式,程序员的未来何在?
123 0
|
缓存 JavaScript 小程序
接手前同事代码,特别烂,各种BUG,看麻了。。。
接手前同事代码,特别烂,各种BUG,看麻了。。。
|
数据可视化 算法
从新人到技术主管,他只用了2年
加入阿里云MVP,与行业大咖切磋
1153 0