如何面对PB级别数据的架构变迁?
面对PB级别数据存储,我们一路走来也踩过很多坑,这里就直接进入主题了,给大家分享一下监控宝系统架构变迁的两个比较重要的点。
一、Redis的扩展
我们面临的第一个的问题是redis的扩展,redis进程无法使用多核,我们当时的redis进程并发1.5W,单 core CPU占用率95%,偶发会达到100%,监控宝的任务调度会出现延迟现象。我们想到的方案如下:
方案1:改程序逻辑,基于任务ID的一致性hash支持redis多实例。 但是研发很忙(好吧,好像从来没有闲过)。此方案只能放弃。
方案2:redis cluster. 当时看到官方的架构图,我就直接将此方案放弃了。我们有大量的写操作,如果每个点都同步写操作,理论上瓶颈无法解决,不太适合我们的使用场景,而且大家的生产环境用这个的好像也不多。
redis cluster 的逻辑图如下:
方案3:codis, Twemproxy.
最终我们选择了codis。借此机会感谢一下豌豆荚的刘奇同学,当时遇到了一些问题,请教了刘奇同学,总是能很快的得到解答,非常赞。目前codis 在线上稳定运行一年多,从未出现任何问题。QPS 已经达到15万次每秒。
其架构图如下,整个架构每一层都支持扩展,并且无单点。
Codis有很多优点,让我们选择它的理由如下:
1、平滑迁移。Codis 提供了迁移工具,比较容易操作。我们生产环境已经验证,从redis迁到codis 对业务影响为0,不过redis有些命令是不支持的,迁移之前还是要仔细读下codis的文档,看是否适合自己的生产环境。
2、扩展容易。Codis将数据默认分了1024个slot, 看到这个当时就很开心, 以后基本不用担心数据量的问题了。理论上是可以扩展到1024个redis实例,扩展的时候,先把新的redis实例加入到集群中,再将部分slot迁移 至新的实例中就可以了,包括后面将要提到的Mycat 2.0 也会采用这种设计。
3、友好的管理页面,扩展的操作直接就可以通过管理页面做了。下面是迁移管理的图:
而上面这几点Twemproxy是不具备的。唯一的缺点就是稍稍复杂一些,入门的时候稍需要多花些时间。但相比其优点这些都微不足道了。
我们面临的第二个问题是PB级别的数据存储。
现实场景:以我们的网站监控为例简单的介绍下数据的情况。我们在全球分布有200+个监测点,这些监测点按用户设置的频率访问指定的网站页面,监测数据传到我们的数据中心。这个服务目前有30多万用户在使用,平均数据日增量在1T以上。
这部分数据类似于日志数据,使用Mysql来存这些数据并不是什么高大上的做法,如果大家使用过ELK的话,会推荐我们使用elasticsearch来存储这些日志数据。
好吧,的确是这样,我们的新产品:透视宝、压测宝、数据宝是有用到elasticsearch,也用到了hadoop、spark、suro、kafka,druid等大数据相关的框架应用。或者直接使用文件来存储也是可以的。
但老系统的问题还是要解决的。使用Mysql做大量数据存储很容易就想到分库分表,提到分库分表自然就会想到Mysql的中间件。
大家在网站可以查到一些常用的分库分表的中间件,包括大家比较熟悉的Atlas、Mycat(cobar)、TDDL、HEISENBERG、OCEANUS、VITESS、ONEPORXY、DRDS等,先不谈这些中间件之间的区别,他们共有一个特性,只能在一个维度上对数据进行拆分或者说只能对数据进行一次拆分。
切分数据库分为垂直切分和水平切分,先介绍一个我们使用到的比较简单的垂直切分场景:
垂直切分
几个数据库在同一个Mysql实例中,但因数据库A 的IO相对较高,希望将其单独拉到另外一台服务器上。又不想让研发改动代码。
以前一直以为Mycat只能做水平切分,其实也可以垂直切分的,很实用,配置也很简单,因各种原因希望将原来一个Mysql实例中的多个库分布到多个实例中,直接使用Mycat就可以做到,对应用程序来看还是同一个实例,在拆分过程可以通过主从同步实现平滑迁移。
水平切分
接下来介绍水平切分,水平切分是指将某个表按照某个字段按某种规则来分散到多个表之中,每个表中包含一部分数据。
常用的根据主键或非主键的分片规则:
一致性hash算法有效解决了分布式数据的扩容问题。这个大家可以查下具体的算法实现。
以上是常用的几种方式,也有一些分片方式是根据上面5种变化得来,比如对日期字段hash再分片的。
单独使用一种分片规则是很难支撑大量数据的存储,哪怕使用一致性hash在生产环境中也是很麻烦的事情,光是数据迁移就是一件让运维头疼的事了,这时候我们需同时采用垂直分片和水平分片,甚至多次水平分片,下面聊一下我们在实际生产中如何使用这些分片规则的。
以我们API监控为例, 看下应用场景。
现在我们手机里安装的是各种APP,其架构中必然存在大量的API,我们的用户不但要监控单个API请求,还要监控连续请求构成的事务,监控宝API监控的正确性是以断言来判断的。每个监测点都会对用户的API做出请求,请求数据及断言的结果都将被存储到数据中心。
我们借助于cobar, 对数据做了两次分片。分片逻辑图如下:
首先我们是通过cobar 采用枚举法按监测点ID对DB这层进行了数据分片,这样做的话物理上同一个监测点的数据在一起,业务上也是好理解的。
其次,在程序逻辑中按天对表进行了分片。每天都会有脚本将一月之内的表都创建好。
从上图中大家可以看到,这里扩展上是存在问题的!
这时候如何解决问题呢,我们来分析一下数据,单个数据库中是按日期来分表的,而大于3个月的历史数据较少有人查询,用户也可以接受历史数据查询时间稍长一些,于是我们选用了TokuDB来压缩历史数据,基本上1T的数据压缩之后在100G左右。
1:10的压缩例,即使这样,理论上最多也只能存储4P左右的数据(数据放在UCLOUD上,云主机支持的最大硬盘为2T)。
我们在网站监控的数据分库中解决了这个问题,逻辑图如下,我们从4个维度对数据进行了分片。
1、按日期为第一维度对数据库分片,必须按日期做第一次分片,并且分片时间点可以在配置文件中自定义。
2、按监测点ID为第二维度对数据库分片
3、按实际分片数量对任务ID动态取模为第三维度对数据库分片。
4、对任务ID 100取模为第四维度对数据表分片。
创建后的数据库类名似于db-201501-monitor01-01、 db-201501-monitor01-02 …… 每个库是有100张表。这样可以的好处:
1、冷热数据自然分离。
2、可以根据日期无限次分片。
3、在同一个时间段里实际分片数可以自定义。
注意:理论上可以无限次分片。每次分片服务器的数量是可控的,并且下次分片的时间也变的可预期。可以在最大程度是节约成本。
4、数据无需迁移
细心的同学会发现这样对数据分片造成一个小问题,我们对任务ID做了两次取模。会造成部分实例中的某些表中数据是空的,不过并不影响应用。
并不都通过mycat分片,有些是程序支持的,特别是第一次分片,我们需要能在指定的时间点分片。 总记录量我们没有统计,我们知道目前每秒的写入为2万QPS。
我们的业务中并没有用到一致性hash,主要是评估迁移量的时候,觉得数据量太大,不太适合我们的应用场景。
我们使用的是UCLOUD的云盘,他们的IOPS可以支持到 随机写1600QPS,据我了解,他们的底层是通过8块硬盘作raid10.
作用是为了保障高可用性,当某个redis实例节点出现故障可以实现master-slave的角色切换,我们当时用到的版本中切换是需要手动触发的。他们也提供了一个脚本来实现。
对于跨机房容灾的问题,我们是借助于云平台来做的,目前的知名云平台都有多个机房,并且之间都是光纤打通的。PING值在10ms以内,基本可以当内网使用。另外,我们从年前开始启用了多云布署的方案,多云布署,聊起来有点长了。
这个问题在问题4中已经回答了。我使用的版本还不会自动切换和踢出集群。但当时刘奇说过要在后面的版本实现,因为我们有自己做调用他们提供的切换脚本了,就没在关注后面的版本。大家关心的话,可以看下codis 的官方文档。
codis本身是通过redis的一个版本二次开发的,本质上这个主从关系就是通过redis的主从功能实现的。
这个问题还是接上图吧。
这个是操作界面上的可以手动操作。另外还有一个脚本可以实现。
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
在当今数据驱动的时代,数据分析能力备受青睐,数据分析能力频繁出现在岗位需求的描述中,不分岗位的任职要求中,会特意标出“熟 ...
2025-04-03在当今数字化时代,数据分析师的重要性与日俱增。但许多人在踏上这条职业道路时,往往充满疑惑: 如何成为一名数据分析师?成为 ...
2025-04-02最近我发现一个绝招,用DeepSeek AI处理Excel数据简直太爽了!处理速度嘎嘎快! 平常一整天的表格处理工作,现在只要三步就能搞 ...
2025-04-01你是否被统计学复杂的理论和晦涩的公式劝退过?别担心,“山有木兮:统计学极简入门(Python)” 将为你一一化解这些难题。课程 ...
2025-03-31在电商、零售、甚至内容付费业务中,你真的了解你的客户吗? 有些客户下了一两次单就消失了,有些人每个月都回购,有些人曾经是 ...
2025-03-31在数字化浪潮中,数据驱动决策已成为企业发展的核心竞争力,数据分析人才的需求持续飙升。世界经济论坛发布的《未来就业报告》, ...
2025-03-28你有没有遇到过这样的情况?流量进来了,转化率却不高,辛辛苦苦拉来的用户,最后大部分都悄无声息地离开了,这时候漏斗分析就非 ...
2025-03-27TensorFlow Datasets(TFDS)是一个用于下载、管理和预处理机器学习数据集的库。它提供了易于使用的API,允许用户从现有集合中 ...
2025-03-26"不谋全局者,不足谋一域。"在数据驱动的商业时代,战略级数据分析能力已成为职场核心竞争力。《CDA二级教材:商业策略数据分析 ...
2025-03-26当你在某宝刷到【猜你喜欢】时,当抖音精准推来你的梦中情猫时,当美团外卖弹窗刚好是你想吃的火锅店…… 恭喜你,你正在被用户 ...
2025-03-26当面试官问起随机森林时,他到底在考察什么? ""请解释随机森林的原理""——这是数据分析岗位面试中的经典问题。但你可能不知道 ...
2025-03-25在数字化浪潮席卷的当下,数据俨然成为企业的命脉,贯穿于业务运作的各个环节。从线上到线下,从平台的交易数据,到门店的运营 ...
2025-03-25在互联网和移动应用领域,DAU(日活跃用户数)是一个耳熟能详的指标。无论是产品经理、运营,还是数据分析师,DAU都是衡量产品 ...
2025-03-24ABtest做的好,产品优化效果差不了!可见ABtest在评估优化策略的效果方面地位还是很高的,那么如何在业务中应用ABtest? 结合企业 ...
2025-03-21在企业数据分析中,指标体系是至关重要的工具。不仅帮助企业统一数据标准、提升数据质量,还能为业务决策提供有力支持。本文将围 ...
2025-03-20解锁数据分析师高薪密码,CDA 脱产就业班助你逆袭! 在数字化浪潮中,数据驱动决策已成为企业发展的核心竞争力,数据分析人才的 ...
2025-03-19在 MySQL 数据库中,查询一张表但是不包含某个字段可以通过以下两种方法实现:使用 SELECT 子句以明确指定想要的字段,或者使 ...
2025-03-17在当今数字化时代,数据成为企业发展的关键驱动力,而用户画像作为数据分析的重要成果,改变了企业理解用户、开展业务的方式。无 ...
2025-03-172025年是智能体(AI Agent)的元年,大模型和智能体的发展比较迅猛。感觉年初的deepseek刚火没多久,这几天Manus又成为媒体头条 ...
2025-03-14以下的文章内容来源于柯家媛老师的专栏,如果您想阅读专栏《小白必备的数据思维课》,点击下方链接 https://edu.cda.cn/goods/sh ...
2025-03-13