首页 > 其他分享 >Discord 存储迁移之路

Discord 存储迁移之路

时间:2023-10-21 23:31:55浏览次数:28  
标签:存储 读取 Discord 数据库 ScyllaDB 请求 迁移 节点 Cassandra

从 MongoDB 到 Cassandra

开始选择新的存储(Cassandra)进行数据迁移,他们认为 Cassndra 是当时(2015 年底)唯一能满足他们要求的数据库(后面也打脸了)。他们对数据库的要求如下:

  1. 线性可扩展性——不需要手动进行数据的分片
  2. 自动故障转移——尽可能的进行自我修复
  3. 维护成本低——设置好后就能工作,以后数据量增加后只需要增加节点即可。
  4. 已经被证明有效——他们喜欢采用新技术,但又不是太新
  5. 可预测的性能——当 API 的响应时间的 P95 超过 80ms 时就会告警,他们也不希望在 Redis 或者在 Memcache 中缓存数据
  6. 不是 Blob 存储——如果必须不断地反序列化 Blob 并附加到它们,那么每秒写入数千条消息的效果并不好。
  7. 开源——掌控自己的命运,不想依赖第三方公司

理想很丰满现实很骨感,随着业务场景和消息规模的增长,2022 年初 Cassandra 有 177 个节点,拥有数万亿条消息 ,Cassandra 也出现了严重的性能问题。

在 Cassandra 中,读取比写入更昂贵。 写入会附加到提交日志并写入称为内存表的内存结构,最终刷新到磁盘。 然而,读取需要查询 memtable 和可能的多个 SSTable(磁盘文件),这是一个更昂贵的操作。 用户与服务器交互时的大量并发读取可以使分区成为热点,称之为“热分区”。 当数据集的大小与这些访问模式相结合时,导致 Cassandra 的集群陷入困境。

当遇到热分区时,它经常会影响整个数据库集群的延迟。 一个通道和存储桶对接收了大量流量,并且随着节点越来越努力地服务流量并且越来越落后,节点中的延迟将会增加。由于该节点无法跟上,对该节点的其他查询受到影响。 由于我们以仲裁一致性级别执行读取和写入,因此对服务热分区的节点的所有查询都会遭受延迟增加,从而导致更广泛的最终用户影响。

集群维护任务也经常造成麻烦。 他们很容易在压缩方面落后,Cassandra 会压缩磁盘上的 SSTable 以提高读取性能。 不仅的读取成本更高,而且当节点试图压缩时,还会看到级联延迟。

由于 Cassandra 是 Java 开发的,他们还花费了大量时间调整 JVM 的垃圾收集器和堆设置,因为 GC 暂停会导致显着的延迟峰值。

从 Cassandra 到 ScyllaDB

他们选取的方案是 ScyllaDB,这是一个用 C++ 编写的与 Cassandra 兼容的数据库。 它承诺提供更好的性能、更快的修复、通过每核分片架构实现更强的工作负载隔离,以及无垃圾收集器,听起来相当吸引人。它采用 C++编译而不是 Java 所以没有垃圾收集器的 GC 暂停问题。

ScyllaDB 也并不是完全没有问题,当以与表排序相反的顺序扫描数据库时,有反向查询性能不足的问题,现在 ScyllaDB 已经优先解决了这个问题。ScyllaDB 同样也存在“热分区”的问题,当前还是需要业务通过其他方式去解决。

热分区问题

Discord 采用的方案是:在 ScyllaDB 和业务服务之间加了一个中介服务(Rust 语言编写),它不包含任何业务逻辑,主要功能就是合并请求。

合并请求

如果多个用户同时请求数据库的同一行,那么只会查询数据库一次。 第一个发出请求的用户会导致该服务中启动工作任务, 后续请求将检查该任务是否存在并订阅它, 该工作任务将查询数据库并将该行返回给所有订阅者。

img

收敛请求

同时根据一致性 hash 将同类查询请求,比如同一个频道的请求,进一步收敛到中介服务,这个请求合并的效果更好。

img

迁移效果

将运行 177 个 Cassandra 节点减少到仅运行 72 个 ScyllaDB 节点。 每个 ScyllaDB 节点拥有 9TB 磁盘空间,高于每个 Cassandra 节点平均 4TB 的存储空间。1774-729=60T,这么看的话他们的存储空间也节省了一些。在 Cassandra 上获取历史消息的 p99 为 40-125 毫秒,而 ScyllaDB 的延迟为 15 毫秒,消息插入性能从 Cassandra 上的 5-70 毫秒 p99 到 ScyllaDB 上稳定的 5 毫秒 p99。

标签:存储,读取,Discord,数据库,ScyllaDB,请求,迁移,节点,Cassandra
From: https://blog.51cto.com/JavaEdge/7970141

相关文章

  • 存储管理
    一、概述1.1地址映射(地址重定位)  内存中每个存储单元都有一个编号,这个编号称为内存地址(物理地址、绝对地址)。内存地址的集合称为内存空间(物理地址空间)。  用户编程所用的地址称为逻辑地址(程序地址、虚地址),由逻辑地址组成的空间称为逻辑地址空间。  地址映射:把用户程序......
  • 前端大量复杂数据存储探索
    引入最近有需求做一个在B端的长期数据储存方案,主要是需要将大量数据结构化储存,避免每一次启动都去服务端重复拉取数据第一个想到的前端持久化数据存储方案理所当然想到localstorage,但是它有一个最大5M的空间限制,这大小远远不够,因此我们将视线转移到前端数据库,半年前我接的有看到......
  • INFINI Labs 产品更新 | Easysearch 优化字段压缩提升写入速度,Console 优化数据迁移和
    INFINILabs产品又更新啦~。本次更新概要如下:Easysearch增强source_reuse压缩功能,并大幅提升写入速度;Console优化了数据迁移和校验功能,新增了通用的数据列表和下拉等标准组件,化繁为简,实现可复用。以下是本次更新的详细说明。INFINIEasysearchv1.6.1INFINIEasysearch是......
  • 在客户端存储登录令牌 token 步骤
    原理:  是服务器创建的对象(一般存储当前登录用户的编号);加密为定长字符串;发送给客户端;客户端存储起来;等待下一次请求时,提交自己的身份令牌;服务器读取该令牌,解密从而获取其中的用户信息一-类似于银行卡客户端在登录成功后保存令牌:  uni.setStorageSync(userToken'......
  • mysql常用报表处理及数据迁移写法SQL
    熟悉一些常用的sql写法便于工作中快速导出数据,本文不涉及到业务,所以对表库做了名字的修改,仅提供一些用法的说明。以下直接举例子并讲解1单表批量数据迁移场景:日志迁移具体实例:将test_log2日志表2的数据全部迁移到test_log1日志表1sql:......
  • Oracle集群升级迁移—主机网络设置及交换机侧bond vlan划分
    目录Oracle集群升级迁移—主机网络设置及交换机bondvlan划分网络规划操作系统层面的IP设置bond类型介绍设置bond1和bond0交换机侧的设置(省略)Oracle集群升级迁移—主机网络设置及交换机bondvlan划分网络规划按照工程师要求,配置了5个IP供集群使用。1个IP为ScanIP、2个IP为VIP......
  • Mysql三大存储引擎
    1、MyISAM(对事务支持不好,容易产生死锁)在5.5版本以前是数据库的默认存储引擎。MyISAM不支持事务和外键,适用于对事务完整性没有要求或者以select、insert为主的应用 2、InnoDB(对事务支持好)InnoDB提供了具有提交、回滚和崩溃恢复能力的事务安全。对比MyISAM写的......
  • 操作系统之段页式存储组织
    1、例题展示2、例题解决......
  • docker单机版Minio迁移方案
    docker单机版Minio迁移方案起因一开始并没有想到会在轻量应用服务器上部署好几个服务,因为这个轻量服务器是用来做测试用的,但是由于缺少运维的原因,正式使用的也是这台服务器上的minio,结果因为其他的服务导致服务器老是卡死,所以需要在新的服务器上重新起一个单机的minio前置条件......
  • 操作系统之分区存储组织+页式存储组织
    1、分区存储例题展示2、分区存储例题问题解决由相关知识可知,在已知该题采用可变分区进行内存分配存储管理的情况下,我们共有四种算法可以选择:1、首次适应算法--空闲分区以地址递增的次序进行连接,即从上至下按照原来次序排列,然后将作业4放入其中即可故可知,作业4应被放入到首位......