存储量扩大千倍,Discord 是若何利用Rust语言和ScyllaDB数据库来改良架构的?:比分查询

做者 | Bo Ingram

译者 | 平川

筹谋 | Tina

本文最后发布于 Discord 官方博客比分查询。

2017 年,我们写了一篇关于我们若何存储数十亿条动静的博文,分享了我们起头时若何利用 MongoDB,但又将数据迁徙到 Cassandra 的过程,因为我们正在寻找一个扩展性和容错性比力高而维护成底细对较低的数据库比分查询。我们确信本身会开展,并且我们确实做到了!

我们想要一个能跟着我们的开展而演进的数据库,但又不希望它的维护需求会跟着我们的存储需求而增长比分查询。遗憾的是,我们发现事实并不是如斯——我们的 Cassandra 集群呈现了严峻的性能问题,光是维护就需要破费良多的精神,更不消说改良了。

近 6 年过去了,我们已经改动了良多,我们存储动静的体例也发作了变革比分查询。‍

Cassandra 的费事

我们把信息存储在一个名为 cassandra-messages 的数据库中比分查询。望文生义,它运行 Cassandra 来存储动静。2017 年,我们运行了 12 个 Cassandra 节点,存储了数十亿条动静。

2022 岁首年月,节点数到达 177 个,而动静有数万亿条比分查询。令人懊恼的是,那是一个高强度的系统——我们的随叫随到团队经常接到反应数据库问题的德律风,延迟不成预测,因为成本过高,我们不能不削减维护操做。

是什么招致了那些问题?起首,让我们来看一条动静比分查询。

CREATETABLEmessages (

channel_id bigint,

bucketint,

message_id bigint,

author_id bigint,

contenttext,

PRIMARY KEY((channel_id, bucket), message_id)

) WITHCLUSTERINGORDERBY(message_id DESC);

上面的 CQL 语句是我们最小的动静形式版本比分查询。我们利用的每个 ID 都是用雪花算法生成的,定时间挨次排序。我们按照动静的发送通道以及桶(一个静态时间窗口)停止动静分区。那种分区意味着,在 Cassandra 中,特定通道和桶的所有动静将存储在一路,并在 3 个节点(取决于设置的复造因子)上复造。

那种分区有潜在的性能缺陷:只要一小群人利用的办事器发送的动静往往比有数十万人利用的办事器少几个数量级比分查询。

在 Cassandra 中,读的开销比写大比分查询。写操做会被逃加到提交日记,并写入内存中一个名为 memtable 的构造,最初再刷写到磁盘。然而,读操做需要查询 memtable,还可能要查询多个 SSTable(磁盘上的文件),其成本更高。当用户与办事器交互时,大量的并发读取会使一个分区成为热点,我们能够称其为“热分区”。那些拜候形式在碰到我们的数据集规模时,招致我们的集群陷入了窘境。

当我们碰到热分区时,它经常会影响整个数据库集群的延迟比分查询。一个通道 - 桶对领受了大量的流量,节点为之供给办事会越来越费劲,延迟会越来越大,越落越远。

该节点上的其他查询也会遭到影响,因为它的速度跟不上比分查询。因为我们的读写操做都是仲裁一致性级此外,所以在为热分区供给办事的节点上,所有查询的延迟城市增加,进而对最末用户产生更普遍的影响。

集群维护使命也经常引起费事比分查询。我们很容易在压缩上落后,为了获得更高的读性能,Cassandra 会压缩磁盘上的 SSTable。如许一来,不只读取的开销增大,并且当节点试图压缩时,还会产生级联延迟。

‍我们经常施行一种我们称之为“八卦舞”的操做比分查询。我们让一个节点退出轮换,让它在停行领受流量的情况下停止压缩,然后让它从头参加轮换,从 Cassandra 获取表示切换线索,然后再反复,曲到待压缩项为空。我们还花了大量时间对 JVM 的垃圾搜集器和堆设置停止调优,因为 GC 暂停会招致显著的延迟尖峰。

改良架构

动静集群并非我们独一的 Cassandra 数据库比分查询。我们还有其他几个集群,每个集群都展示出类似的缺陷(虽然可能没有那么严峻)。

在上文提到的那篇文章中,ScyllaDB 引起了我们的兴趣,那是一个用 C++ 编写的数据库,兼容 Cassandra比分查询。它许诺供给更好的性能、更快的修复、更强的工做负载隔离(通过其按核分片架构),并且无垃圾收受接管,听起来相当吸惹人。

虽然 ScyllaDB 也纷歧定没问题,但它没有垃圾搜集器,因为它是用 C++ 而不是 Java 编写的比分查询。持久以来,我们的团队在 Cassandra 的垃圾搜集器上碰到过许多问题,从 GC 暂停影响延迟,到持续超长时间的 GC 暂停,以至运维人员必需手动重启问题节点才气将其恢复到安康形态。那些问题招致了大量的随叫随到工做,也是我们动静集群中许多不变性问题的根源。

在对 ScyllaDB 停止试验并在测试中察看改良效果之后,我们决定迁徙所有的数据库比分查询。固然那个决定自己能够零丁写成一篇博文,但简单来说,截行 2020 年,除一个数据库之外,我们已经将其他所有的数据库都迁徙到了 ScyllaDB 上。

最初剩下的阿谁是我们的伴侣,cassandra-messages比分查询。

为什么我们还没有迁徙它呢?起首,那是一个很大的集群,有数万亿条动静和近 200 个节点,任何迁徙工做城市很复杂比分查询。此外,我们对新数据库停止了性能调优,希望它们可以到达更佳形态。我们还希望可以积累更多在消费情况利用 ScyllaDB 的经历,领会它的陷阱。

我们还针对我们的用例改良了 ScyllaDB 的性能比分查询。我们在测试中发现,反向查询的性能不敷以满足我们的需求。在以与表排序相反的挨次扫描数据库时,例如按升序扫描动静时,将施行反向查询。ScyllaDB 团队优先改良并实现了高性能的反向查询,为我们的迁徙方案消弭了最初的数据库障碍。

我们并没有指望在系统上加一个新数据库就能让一切奇异地变比如分查询。热分区在 ScyllaDB 中仍然存在。因而,我们还希望投资改良数据库上游系统,为数据库增加一道屏障,进一步提拔数据库的性能。

用数据办事供给数据

关于 Cassandra,我们碰到了热分区的费事比分查询。到特定分区的高流量会招致无限并发,进而招致级联延迟,后续查询的延迟会继续增加。若是能够控造热分区的并发流量,我们就能够庇护数据库不被压垮。

为了完成那项使命,我们编写了所谓的数据办事——介于 API 单体和数据库集群之间的中介办事比分查询。在编写数据办事时,我们选择了一种在 Discord 中应用越来越多的语言:Rust。我们在之前的几个项目顶用过它,它没有孤负我们的期望。它为我们供给了媲美 C/C++ 的速度,并且没有牺牲平安性。

无惧并发是 Rust 引认为豪的次要优势之一——该语言使编写平安并发代码变得更容易比分查询。它供给的库也十分契合我们的预期。Tokio 生态系统是构建异步 I/O 系统的坚实根底,而且该语言供给了 Cassandra 和 ScyllaDB 的驱动法式。

此外,我们还发现,Rust 编译器供给的帮忙、明晰的错误动静、语言构造及其对平安性的重视,让编码变得很有乐趣比分查询。我们十分喜好的一点是,Rust 法式一旦通过编译,凡是就能够运行。不外,最重要的是,我们能够说我们用 Rust 停止了重写(模因声誉十分重要)。

那就是 Rust 的强大之处:它使编写平安并发代码变得更简单比分查询。

存储量扩大千倍strong/p
p比分查询/strong,Discord 是若何利用Rust语言和ScyllaDB数据库来改良架构的?:比分查询

让我们想象一下,在一个大型办事器上,有一条 @所有人的重要通知布告:用户将翻开应用法式并阅读动静,向数据库发送大量流量比分查询。以前,那可能会招致热分区,而且可能需要随叫随到工程师帮忙恢复系统。通过数据办事,我们可以显著降低数据库的流量峰值。

魔法的第 2 部门在数据办事的上游比分查询。为了实现更有效的合并,我们实现了一致的基于哈希的数据办事路由。我们为每个数据办事恳求供给一个路由键。关于动静,那是一个通道 ID。如许一来,对统一通道的所有恳求城市发送到办事的统一实例。那种路由体例帮忙我们进一步削减了数据库的负载。

存储量扩大千倍strong/p
p比分查询/strong,Discord 是若何利用Rust语言和ScyllaDB数据库来改良架构的?:比分查询

那些改良对我们帮忙很大,但其实不能处理所有问题比分查询。我们仍然会在 Cassandra 集群上看到热分区和延迟增加,只是不那么频繁了。那为我们博得了一些时间,让我们能够筹办更优的 ScyllaDB 集群并施行迁徙。‍

一次规模十分大的迁徙

我们的迁徙需求十分简单:我们需要在不断机的情况下迁徙数万亿条动静,并且需要快速完成,因为固然 Cassandra 的情况有所改善,但我们仍是经常处于灭火形态比分查询。

第一步很简单:利用超等磁盘存储拓扑筹办一个新的 ScyllaDB 集群比分查询。借助当地 SSD 来进步速度,并操纵 RAID 将数据镜像到耐久盘。如许,我们既从附加的当地磁盘那里获得了速度,又从耐久盘那里获得了耐久性。集群启动后,我们就能够起头向此中迁徙数据了。

我们第一版的迁徙方案旨在快速获取价值比分查询。我们起头利用崭新的 ScyllaDB 集群来处置新数据,然后找一个切换时间迁徙汗青数据。那带来了更多的复杂性,但每个大型项目城市有额外的复杂性,不是吗?

关于新数据,我们起头施行双重写入,即同时写入 Cassandra 和 ScyllaDB比分查询。与此同时,我们还起头筹办 ScyllaDB 的 Spark 迁徙器。那需要大量的调整,设置完成之后,我们估量了完成时间:3 个月。

关于那个期限,我们其实不满意比分查询。我们希望能够更快地获取价值。因而,我们团队组织了一场思维风暴,看看若何加快速度,曲到我们记起来,我们已经编写了一个快速的高性能数据库库,我们能够对它停止扩展。我们选择参与了一些模因驱开工程,并用 Rust 重写了数据迁徙器。

有一全国午,为了施行大规模数据迁徙,我们扩展了数据办事库比分查询。它从数据库中读取令牌范畴,通过 SQLite 在当地停止查抄,然后将它们送入 ScyllaDB。我们毗连到颠末改良的新迁徙器,并从头估量了工期:9 天!若是可以那么快的迁徙数据,我们就能够抛开我们基于时间的复杂办法,一次性地切换所有内容。

我们启动它并让它连结运行,以每秒 320 万条动静的速度迁徙比分查询。几天后,我们看到迁徙已达 100%。不外我们意识到,它被卡在了 99.9999%(是实的)。我们的迁徙器在读取数据的最初几个令牌范畴时超时了,因为它们包罗了庞大的墓碑范畴,并且从未压实。在我们把阿谁令牌范畴压实几秒钟后,迁徙就完成了!

通过向两个数据库发送一小部门读数恳求并比力成果,我们完成了主动数据验证,一切看起来都很比如分查询。在全消费流量的情况下,集群仍然运行优良,而 Cassandra 却碰到了越来越频繁的延迟问题。我们的团队聚在现场,按下开关,让 ScyllaDB 成为主数据库,并分享了庆贺蛋糕!

数月之后……

2022 年 5 月比分查询,我们切换了动静数据库,但自那以后它的运行情况若何呢?

它是一个恬静、乖巧的数据库(那么说不妨,因为那周我不消随叫随到)比分查询。我们周末不消长时间救火了,也不消为了连结一般运行时间而同时处置多个集群节点。那个数据库更高效——我们的 Cassandra 节点有 177 个,而 ScyllaDB 节点只要 72 个。每个 ScyllaDB 节点有 9TB 的磁盘空间,而每个 Cassandra 节点的均匀磁盘空间为 4TB。

我们的尾部延迟也得到了大幅改善比分查询。例如,从 Cassandra 获取汗青动静的 p99 延迟在 40-125 毫秒之间,在 ScyllaDB 上只要 15 毫秒;向 Cassandra 插入动静的 p99 延迟在 5-70 毫秒之间,而 ScyllaDB 为不变的 5 毫秒。得益于前面提到的性能改良,我们还解锁了新的产物用例。如今,我们抵消息数据库很有自信心。

2022 岁尾,全世界的人都在收看世界杯比分查询。我们很快就发现,监控图上显示了总进球数。那十分酷,因为那不只让我们能够在系统中看到实在世界的事务,还让我们团队在会议期间旁观足球角逐有了合理的理由。我们不是“在会议期间旁观足球角逐”,而是“在主动监控系统的性能”。

存储量扩大千倍strong/p
p比分查询/strong,Discord 是若何利用Rust语言和ScyllaDB数据库来改良架构的?:比分查询

现实上,我们能够通过动静发送图来讲述世界杯决赛的故事比分查询。那场角逐十分出色。梅西试图完成职业生活生计的最初一项成就,率领阿根廷队夺得冠军,但才调横溢的姆巴佩和法国队试图阻挠他的前进之路。

图中的 9 个尖峰代表角逐中的 9 个事务:

1. 梅西罚进点球,阿根廷 1-0 领先比分查询。

2. 阿根廷再次得分,2-0 领先比分查询。

3. 中场歇息比分查询。用户议论角逐,有一个持续 15 分钟的平稳期。

4. 那里的大尖峰是因为姆巴佩为法国队进球比分查询,90 秒后又进球扳平了比分!

5. 常规时间的角逐完毕了,那场重要的角逐将进入加时赛比分查询。

6. 加时赛的前半段什么也没发作,但到了中场歇息时,用户们在聊天比分查询。

7. 梅西再次进球比分查询,阿根廷获得领先!

8. 姆巴佩还击扳平比分查询!

9. 加时赛完毕了比分查询,要踢点球了!

10. 在点球大战中比分查询,兴奋感和压力不竭增加,曲到法国队罚丢,而阿根廷队射中!阿根廷赢了!

存储量扩大千倍strong/p
p比分查询/strong,Discord 是若何利用Rust语言和ScyllaDB数据库来改良架构的?:比分查询

每秒合并动静数

全世界的人们都在旁观那场难以想象的角逐,但与此同时,Discord 和动静数据库却毫无压力比分查询。我们在信息发送和处置方面做得很好。我们基于 Rust 的数据办事和 ScyllaDB 可以接受那些流量,并为用户供给一个交换的平台。

原文链接:

我在GitHub 暗盘买“水军”:一万颗star只要4000多元比分查询,人人都能“一夜爆火”

微办事先行者 James Lewis:别纠结单体仍是微办事比分查询,面向办事 SOA 架构才是正解

微软Office正式融入GPT-4;文心一言正式发布比分查询,百度股价次日涨超16%;TikTok回应美国要求字节跳动出卖持股|Q资讯

Docker正在裁减开源组织比分查询,CTO硬刚开发者,网友:想赚钱能够,但沟通体例烂透了

发布于 2023-06-07 11:30:22
分享
海报
30
上一篇:在线比分网:网优在线:长尾词扩展内容若何产生办法 下一篇:比分查询:ChatGPT甩出“王炸”!行业的iPhone时刻来了?
目录

    推荐阅读

    忘记密码?

    图形验证码