NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

华为云 AOM 基于 cassandra 的亿级数据监控实践系列

  • 2020-04-01
  • 本文字数:2948 字

    阅读完需:约 10 分钟

华为云AOM基于cassandra的亿级数据监控实践系列

2016 下半年加入 CloudBU 大家庭,开始搞华为云 AOM(应用运维管理)和 APM(应用性能管理),截止今天,AOM/APM 上线已成功上线稳定运行整整一年时间,当前在华为云上使用 AOM 的 VM 总数已达 m 台,每天处理的指标数据规模亿级,日志数据 TB 级。最近想把近一年内踩过的坑与大家共享下,希望能对开发者们有所帮助。


AOM 每天处理着亿级条数据,这么多数据是怎么存储的呢?


说到数据存储就会想到关系型数据库,比如 mysql,oracle,sybase。关系型数据库有自己的优势,数据强一致性,支持事务,通用,技术成熟。但是对于大批量数据的存储和查询就稍显吃力,毕竟 AOM 每秒的写入数据至少都是上万条,甚至是十几万条,随着系统规模增长,数据库的扩容也成为新的瓶颈。


AOM 的数据存储系统使用的是非关系型数据库-----cassandra,相比关系型数据库,cassandra 拥有高并发,大数据下读写能力强,支持分布式,易扩展等优点,当前也有最致命的缺点,不支持事务,不过对于事务我们可以通过 zk/etcd 等其他组件协助完成。


对于关系型数据库相比非关系型数据库为什么会有这么大的差异,这个就得从两者的架构上来讲了,下面小编以 mysql 和 cassandra 进行对比分析。


不管是 mysql 还是 cassandra,最终数据的存储都要落盘,我们先来看下磁盘的写入原理:



磁盘的基本组件可分为以下几部分:磁头,盘片,盘面,磁道,柱面,扇区等。


盘片被划分成一系列同心环,圆心是盘片中心,每个同心环叫做一个磁道,所有半径相同的磁道组成一个柱面。磁道被沿半径线划分成一个个小的段,每个段叫做一个扇区,每个扇区是磁盘的最小存储单元。当需要从磁盘读取数据时,系统会将数据逻辑地址传给磁盘,磁盘的控制电路按照寻址逻辑将逻辑地址翻译成物理地址,即确定要读的数据在哪个磁道,哪个扇区。为了读取这个扇区的数据,需要将磁头放到这个扇区上方,为了实现这一点,磁头需要移动对准相应磁道,这个过程叫做寻道,所耗费时间叫做寻道时间,然后磁盘 旋转将目标扇区旋转到磁头下,这个过程耗费的时间叫做旋转时间。


即一次访盘请求(读/写)完成过程由三个动作组成:


1.寻道(时间):磁头移动定位到指定磁道


2.旋转延迟(时间):等待指定扇区从磁头下旋转经过


3.数据传输(时间):数据在磁盘与内存之间的实际传输


大家应该有过类似的经历,进行数据拷贝时,文件个数越少,单个文件越大,拷贝的速率越快,反之文件个数多,单个文件小,拷贝的速率越慢,这其中的原因就是因为在拷贝小文件时,系统的耗时基本都耗费在寻址上了。Cassandra 相比 mysql 有更高的写入能力,就是因为 cassandra 采用了更高效的写入机制,该机制大大缩短了磁盘的寻址时间(准确来讲应该是寻址次数)。


我们先来看下 Mysql(InnoDB)的索引原理, InnoDB 的索引采用 B+树,其数据结构如下所示:



所有的数据都存储在叶子节点,叶子节点之间都有指针,这是为了做范围遍历。B+树的优势在于快速索引,B+树的层高基本都在 2~3 层,也就意味着一次数据查找只需要 2~3 次 IO 操作。而且每次的单条数据都非常稳定,耗时和查找次数都差不多。B+树最大的性能问题是会产生大量的随机 IO,随着数据的插入,叶子节点会慢慢分裂,逻辑上连续的节点物理上确不连续,甚至相隔甚远,顺序遍历的时候,会产生大量的随机 IO 操作。这正如大家熟知的 ArrayList 和 LinkedList,ArrayList 在内存中是一块连续的内存,访问的时候顺序访问,LinkedList 是多个内存块通过指针串联起来的,访问的时候必须先通过指针获取下一个内存块的地址,然后再通过地址访问,因此 ArrayList 的访问远远高于 LinkedList。B+树的叶子节点就类似一个 LinkedList,随着叶子节点的分裂,在做顺序检索时,跨叶子节点的访问往往需要先找到下一个叶子节点的地址(磁盘寻址),然后才能访问到具体的叶子节点。


B+树的顺序检索会产生大量的随机 IO,B+树的写入同样会产生类似的问题,比如上图 B+树中的 9 和 86,它们所属的叶子节点在磁盘上相隔甚远,数据插入时就会产生两次随机写入。当大批量数据写入时,随机 IO 操作的次数也就更多。


如下是一张随机读写和顺序读写的性能比对图:



从上图可以直观的感受到随机读写与顺序读写的差异,这两者完全不在一个量级。用过 kafka 和 HDFS 的开发者就会发现 kafka 和 HDFS 的磁盘 IO 使用率非常高,有时甚至接近磁盘的最大写入速率,这个就是因为 kafka 和 HDFS 是基于文件的顺序写入(当然还有其他技术)。从以上分析来看,磁盘的随机读取/写入是影响 mysql 顺序检索和批量写入的最大因素,那我们有没有办法减少这种随机写入呢,此时 LSM-Tree(Log-Structured Merge-Tree)呼之欲出。


2006 年,google 发表了 BigTable 的论文。BigTable 的数据结构就采用了LSM,目前 LSM 被很多数据库作为存储结构,比如 HBase,Cassandra,LevelDB。LSM 抛弃了大多数数据库使用的传统文件组织方法,通过减少更新/写入操作带来的随机操作次数来提高数据的写入能力。


LSM Tree 的核心思路其实非常简单,就是假定内存足够大,因此不需要每次有数据更新就必须将数据写入到磁盘中,而可以先将最新的数据驻留在磁盘中,等到积累到一定数目之后,再使用归并排序的方式将内存内的数据合并追加到磁盘队尾(因为所有待排序的树都是有序的,可以通过合并排序的方式快速合并到一起)。


LSM 的核心思路可以分为两部分:


①数据先写入内存


②将内存中的数据排序后追加到磁盘队尾



LSM 由两个或两个以上的存储结构组成。最简单的 LSM 由两部分组成,一部分常驻内存,称为 C0;另一部分存储在硬盘上,称为 C1。


数据写入时,先记录到本地的操作日志文件(HLog 或 CommitLog),为将来做数据恢复使用。然后将数据写入到 C0 中,由于 C0 使用的是内存,因此插入性能远远高于磁盘写入。当 C0 的节点数目超过一定阈值时,会将 C0 中的数据进行一次排序,然后追加到 C1 树中。


多部件的 LSM 就是包含多个存储结构:



随着数据规模增加,C0 中的数据超过阈值后就会往磁盘中写入一个新的 file,这样磁盘中的树(file)会越来越多。当较小的 Ci-1 个数超过一定阈值的时候,会进行 Ci-1 和 Ci 的合并。合并是为了减少整个 C 树的个数,加快搜索速度。


数据查询的时候,会按照树的生成时间按照从新到旧的顺序逐个遍历每个 C 树,即 C0,C1,C2….Ck。为什么要按照时间顺序从最近往之前遍历呢,这就是 LSM 的另一个巧妙点(更新/删除)。


LSM 的更新和删除操作都是往 C0 上新增一条记录,通过新记录+标记的方式完成,因此在遍历的时候必须按照时间顺序进行遍历,这样就可以保证数据更新和删除的正确性,同时保证了数据的顺序写入。当前 LSM 在进行 C 树合并时,会对删除和更新记录进行合并。


我们来看下 HBase 的整个架构图:



HBase 是基于 HDFS 之上采用 LSM 结构做的数据存储。HBase 的主要部件可以分为如下几类:


storeFile:小文件,不可编辑。即写入到磁盘中的C树。Hlog:LSM中用于记录写入记录的操作日志,为了将来做数据恢复使用,毕竟C0中的数据是在内存中存储,当HBase宕机后,内存中的数据就会丢失,此时需要从Hlog中恢复。Memstore:即C0树。
复制代码


至此,LSM 和 B+树的对比也就讲完了,下一篇文章会继续讲解 AOM 是如何使用 Casandra 的一些特性。


本文转载自 华为云产品与解决方案 公众号。


原文链接:https://mp.weixin.qq.com/s/_LqMT4jAant-gk2eVVXaGg


2020-04-01 21:18979

评论

发布
暂无评论
发现更多内容

技术实战:初创项目前端框架选型

FinFish

前端开发 前端框架 技术选型 移动开发

租便宜的云服务器能干啥?有什么好处?怎么选择?

行云管家

云计算 服务器 云服务器

报名即将结束!11 大云原生领域开源技术干货一场拿下

阿里巴巴云原生

阿里云 开源 容器 微服务 云原生

Function源码解析与实践

京东科技开发者

编程语言 Function 编程‘’ 后端、

教育机构客户管理系统功能方案详解!

优秀

CRM系统 客户关系管理系统

元宇宙赛道逐渐清晰,虚实世界如何“破壁”?

旺链科技

区块链 产业区块链 元宇宙

Go1.20 新版覆盖率方案解读

大卡尔

Go 测试覆盖率 11月月更

上新啦KIT

HMS Core

HMS Core

谈谈我工作中的23个设计模式

阿里巴巴云原生

阿里云 云原生 技术文章

W3C发布小程序技术标准白皮书

Onegun

小程序 微信小程序

应用 Serverless 化,让业务开发心无旁骛

Serverless Devs

ShareSDK Android端权限说明

MobTech袤博科技

移动跨平台技术方案选型建议

Onegun

移动端 跨端开发 跨端框架

行业分析| 实时音视频的多种用法

anyRTC开发者

音视频 实时音视频 实时通信 语音通话 视频通话

火山引擎VeDI推出这款产品 助力企业实现以“人”为中心的数据洞察

字节跳动数据平台

大数据 数据分析 火山引擎

小程序插件和小程序组件,有区别?

FinFish

小程序 移动开发 跨端开发 小程序插件 小程序组件

MobPush for HarmonyOS

MobTech袤博科技

Java最常见的230道面试题,临阵磨枪,不快也光!涨薪指日可待

钟奕礼

Java 程序员 java面试 java编程

跨境电商ERP也爆单,分布式新型数据库迎战

OceanBase 数据库

数据库 oceanbase

大数据培训前景怎么样?

小谷哥

大数据培训程序员都去做什么了

小谷哥

前端哪个培训学习比较好?

小谷哥

java程序员京东T3岗面试回顾:多线程+数据库+中间件+JVM+spring

钟奕礼

Java 程序员 java面试 java编程

国密浏览器是什么?有哪些?有什么特点?

行云管家

国密 国密浏览器

什么?Coolbpf 不仅可以远程编译,还可以发现网络抖动! | 龙蜥技术

OpenAnolis小助手

Linux 开源 ebpf coolbpf 龙蜥峰会

预告|2022 星策 Summit 首批嘉宾确认,大会火热报名中!

星策开源社区

机器学习 开源 数字化 管理层 企业转型

前端培训中应该怎么学习web前端

小谷哥

工信部领导莅临2022南京软博会诚迈科技展区参观指导

科技热闻

移动跨端框架发展史及优劣对比

FinFish

前端框架 跨端框架 移动端跨端 跨端发展

web前端培训学习后还有做前端开发的吗

小谷哥

SQL面试 100 问

FunTester

华为云AOM基于cassandra的亿级数据监控实践系列_文化 & 方法_华为云产品与解决方案_InfoQ精选文章