BOSS 直聘:日增10亿数据的历史库,如何通过OceanBase节省70%存储成本?

图片

BOSS 直聘是在全球范围内首创互联网“直聘”模式的在线招聘产品,目前已经成为了中国最大的招聘平台。本文谈到的 BOSS 直聘的业务场景主要是通过数据库对招聘过程中的聊天记录信息进行存储,数据量极大,且每天都有 5 亿到 10 亿的增量数据。和招聘相关聊天记录往往呈现流水型特征,写入一段时间后即不会再次访问或更新,写多读少。

面对快速增长的在线数据,尤其是访问频率很低甚至为 0 的历史聊天记录,其占用的在线业务库的存储空间达到 PB 级别,造成了大量硬件资源浪费,堆高了企业的 IT 成本。同时,随着数据量的增加,在线数据库体积臃肿、查询效率逐步降低,给后续数据变更、扩展造成阻碍。

为了解决这些问题,我们需要对历史聊天记录进行冷热数据分离。热数据所在的在线库是多个 MySQL 集群,采用分库分表的方式,每月定期清理过期数据,滚动写入历史归档库。

图片

团队进行这次数据库选型的主要目的就是对超大容量的归档库进行选型,参加选型的几个数据库为:MySQL、ClickHouse、OceanBase、某开源分布式数据库(以下简称为 DB-U),主要从存储成本、高可用这两个方面对归档库进行评估。

(一)存储成本

我们的归档库需要保留三到五年的历史聊天数据,必须解决大容量存储的成本问题。首先我们对 MySQL、ClickHouse、OceanBase、DB-U(某开源分布式数据库) 分别创建一张相同的用于存储用户历史消息的表,表结构如下:

图片

然后分别写入 1 亿行相同的单副本数据,并对其磁盘的使用情况进行对比:

数据库

磁盘使用量

MySQL

130GB

DB-U(某开源分布式数据库)

60GB

ClickHouse

30GB

OceanBase

22GB

可以清楚地看到,基于列存进行存储的 ClickHouse 和拥有超高压缩率的 OceanBase 这两款数据库的存储成本明显低于 MySQL 和 DB-U,所以我们分别对 ClickHouse 和 OceanBase 的存储引擎进行了调研。

📝 ClickHouse 存储引擎调研

ClickHouse 存储成本低的原因显而易见,就是因为它的存储引擎是基于列存的。相比行存存储引擎,ClickHouse 同一列中的数据属于同一类型,压缩效果显著。列存往往有着高达十倍甚至更高的压缩比,节省了大量的存储空间,降低了存储成本。

图片

不过历史归档库一般都是写多读少的场景,像 ClickHouse 这种纯列存的存储引擎在这里并不能发挥出查询性能好的优势,相反列存引擎写入性能差的劣势还被放大了。

📝 OceanBase 存储引擎调研

1. 存储引擎架构

OceanBase 的存储引擎基于 LSM-Tree 架构,将数据分为基线数据(放在 SSTable 中)和增量数据(放在 MemTable/SSTable 中)两部分,其中基线数据是只读的,一旦生成就不再被修改;增量数据支持读写。

图片

数据库 DML 操作插入、更新、删除等首先写入内存里的 MemTable,所以在写入性能上就相当于内存数据库的写入性能,正好适合我们历史归档库写多读少的场景。等到 MemTable 达到一定大小时转储到磁盘成为增量的 SSTable(上图中红色箭头部分),转储到磁盘上的过程是批量的顺序写,相比 B+ 树离散的随机写,会大大提高写盘的性能。

当增量的 SSTable 达到一定规模的时候,会触发增量数据和基线数据的合并,把增量数据和基线数据做一次整合,基线数据在合并完成之后就不会发生变化了,直到下一次合并。同时每天凌晨的业务低峰期,系统也会自动进行每日合并。

但是 LSM-Tree 的架构也存在一个问题,就是读放大(上图中绿色箭头部分)。在进行查询时,需要分别对 SSTable 和 MemTable 进行查询,并将查询结果进行一次归并,然后再将归并后的查询结果返回 SQL 层。OceanBase 为了减小读放大带来的影响,在内存实现了多级的缓存,例如 Block Cache 和 Row cache,来避免对基线数据频繁的进行随机读。

2. 数据压缩技术

在这样的存储架构下, OceanBase 的数据压缩集中发生在 compaction 过程中 SSTable 的写入时,数据的在线更新与压缩得到了解耦。

OceanBase 支持不感知数据特征的通用压缩 ( compression ) 和感知数据特征并按列进行压缩的数据编码 ( encoding )。这两种压缩方式是正交的,也就是说,可以对一个数据块先进行编码,然后再进行通用压缩,来实现更高的压缩率。

批量落盘的特性使其采用更激进的压缩策略。OceanBase 是行列混存的微块存储格式( PAX ),充分利用了同一列数据的局部性和类型特征,在微块内部对一组行以列存的方式存储,并针对数据特征按列进行编码。变长的数据块和连续批量压缩的数据也可以让 OceanBase 通过同一个 SSTable 中已经完成压缩的数据块的先验知识,对下一个数据块的压缩进行指导,在数据块中压缩尽量多的数据行,并选择更优的编码算法。

图片

与部分在 schema 上指定数据编码的数据库实现不同, OceanBase 选择了用户不感知的数据自适应编码,在给用户带来更小负担的同时降低了存储成本。从历史归档库角度而言,也不需要针对数据做出过多压缩与编码相关的配置调整。 

(二)高可用和稳定性

除了存储成本以外,我们还对归档库选型中的候选者 ClickHouse 和 OceanBase 的高可用能力和稳定性进行了对比。

📝 ClickHouse

我们将 ClickHouse 拟作历史库选型对其进行了充分测试:通过 Replication(复制)来实现集群中不同服务器之间自动同步数据的功能,以此确保数据的高可用性和容错性;使用 ZooKeeper 来协调复制过程,跟踪所有副本的状态,并确保它们保持一致。Replication 和 ZooKeeper 保证了在不同的物理设备上有多个数据副本,减少了数据丢失的风险。

图片

不过在使用 ClickHouse 的过程中,我们发现它的高可用方案在大数据量的场景下会存在一些问题。主要由于原生的 Replication 方案有太多的信息存在 ZooKeeper 上,而为了保证服务,一般会有一个或几个副本,但 ZooKeeper 不支持线性扩展,受单机服务能力限制,,当归档库集群的数据量持续增长时,整个服务很快会不可用。

实际上在 ClickHouse 使用时,大家往往都把 ZooKeeper 当成了多种服务的结合,而不仅仅把它当作一个 Coordinate service。例如常见做法中,还会把它当作 Log Service,很多行为日志等数字的信息也会存在 ZooKeeper 上;还会作为表的 catalog service,像表的一些 schema 信息也会在 ZooKeeper 上做校验,这就会导致 ZooKeeper 上接入的数量与数据总量会成线性关系。按照我们归档库的数据增长速度做预估,ClickHouse 搭配 ZooKeeper 无法支撑三到五年全量归档数据需求。

除此以外,ClickHouse 的复制功能高度依赖于 ZooKeeper。但 ZooKeeper 是一个外部的协调服务,本身 的配置和维护增加了额外的复杂性,而且如果 ZooKeeper 自身出现问题,可能会影响到 ClickHouse 的复制过程。同时,这种高可用方案还增加了问题排查的链路长度和定位问题的难度,恢复过程也变得比较复杂,需要手动进行干预。我们在使用 ClickHouse 的过程中,很容易出现丢数据的情况。

📝 OceanBase

OceanBase 是原生的分布式数据库,原生就可以保证多个数据副本之间的一致性,它们利用了基于 Paxos 分布式一致性协议保证了在任一时刻只有当多数派副本达成一致时,才能推选一个 Leader,保证主副本的唯一性来对外提供数据服务。也就是说,OceanBase 通过多副本和 Paxos 协议来保证数据库的高可用。

图片

相比 MySQL 和 ClickHouse 的高可用方案方案,OceanBase 的高可用方案降低了我们的运维难度和业务变更难度。而且 OceanBase 的多地多副本架构和 Paxos 一致性协议,还能够支持数据副本分别存储在同城和异地,实现异地容灾。

图片

因为 OceanBase 具备分布式特性,所以数据存储原生就具备了动态扩容的能力。当归档库的数据量持续增长时,只需要我们的 DBA 执行几条命令,就可以对机器的硬件或者整个集群的节点数进行扩容。在集群增加新节点之后,数据会自动在新、老节点之间完成负载均衡的过程,可以做到业务无感知的平滑扩容,保证业务扩容时不停机。同时还节省了业务量猛增后的数据库扩容和迁移成本,极大降低了数据库容量不足造成的各种风险。

对 OceanBase 进行扩容时,无论是增加单机的容量,还是增加 zone 内的节点数,亦或是为了保证更高的可用性而增加新的 zone,都可以直接通过白屏化的 OCP 工具来完成。下面就是我们把一个单副本的集群扩展成三 zone 三副本时的一张 OCP 截图:

图片

相较于黑屏执行命令的方式,我们的 DBA 同学反馈使用 OCP 来进行 OceanBase 的部署和运维会更加方便,推荐大家使用。

综上所述:相比 MySQL 和 ClickHouse,在一致性方面,OceanBase 原生就有着强一致的存储保证,而不是去用最终一致性的妥协换取其他方面的能力,而且也不需要通过配置各种复杂的周边组件来对一致性进行保证。在高可用方面,OceanBase 的多副本容灾技术面向单个集群,事务日志持久化并在多个副本之间同步日志数据,基于 Paxos 协议保证日志数据在多数派副本持久化成功,整体上对用户提供了少数派故障时 RPO = 0,RTO < 8s 的高可用能力。在整个测试过程中,OceanBase 的表现相比 MySQL、 ClickHouse和DB-U,也要更加稳定。

综合考量各种数据库的存储成本、高可用能力、运维难度等方面之后,我们最终选择了 OceanBase 作为我们的历史归档库。

图片

我们目前的在线库是主从结构的 MySQL,用于存储热数据,一般是最近一个月内的用户聊天记录;历史库是几个由 OCP 接管的 OceanBase 集群。每个月我们都会通过一个自研的 DTS 工具从 MySQL 在线库定期归档过期数据到通过 OceanBase 搭建的历史库,整体架构如下图:

图片

我们现在已经用 OCP 接管了 8 个 OceanBase 归档业务集群,超过 20 个租户。在线库 MySQL 分表超过万张,仍然在源源不断地通过 App 按照用户的 ID hash 向 MySQL 写入数据,过期的历史数据现在会直接新导入到归档库 OceanBase 中。

图片

我们曾经用过的一个旧 ClickHouse 归档库集群目前仍然提供部分历史数据的读取功能,不过由于考虑到 ClickHouse 的稳定性和数据安全问题,该归档集群会逐步被 OceanBase 替换掉。

图片

首先,OceanBase 通过数据库内核的高压缩的能力,帮助我们轻松完成冷数据归档,并且节省了超过 70%  的存储资源。

图片

其次,OceanBase 是原生的分布式系统,有着良好的扩展性。而且还可以对用户提供少数派故障时 RPO = 0,RTO < 8s 的高可用能力,让数据库在使用过程中更加稳定。

最后,OceanBase 自带一个智能化的白屏 OCP 平台工具,降低了我们 DBA 同学的部署和运维的门槛。OCP 对集群、租户、主机、软件包这些资源对象进行一个全生命周期管理,包括管理,安装、运维、性能监控、配置、升级这些功能。并且除了默认的监控告警之外,现在 OCP 还支持自定义告警,比如我们可以定制磁盘、内存达到怎样一个水位线的时候就会进行报警,满足了定制化的告警需求。除此以外,OCP 还支持备份恢复和在运维过程中可以支持进行一些自动化的诊断功能。

图片

图片

(一)在线库分布式能力支持

我们的在线库目前依然使用的是 MySQL,在 MySQL 中进行分库分表明显比在分布式数据库中使用单表的业务复杂度要高很多,而且数据一致性难以保证,当多个数据表或数据库之间的数据关联较为复杂时,维护数据的一致性难度也会增加很多。

图片

除了一致性问题以外,在线库的运维难度也很高,需要对多个数据库或数据表进行管理和维护,增加了系统的故障排查和维护的难度。而且在分库分表的场景下,历史问题数据追溯问题是一个普遍存在的问题,由于数据被分散存储在多个数据库或数据表中,导致历史数据的追溯变得困难。

现在依然有很多上层业务都依赖在线库 MySQL,这些上层业务很多都是根据 MySQL 分库分表进行的设计和实现,所以在线库从 MySQL 替换成 OceanBase 还需要花一些时间。

但引入 OceanBase 数据库后,完善了 DB 侧对原生分布式库表的支持能力,对于大存储量、改造分库分表逻辑难度比较大的业务提供了更便捷的可行方案。

图片

(二)使用 ODC 与 Binlog Server 等工具

我们了解到白屏化的 ODC 工具从 4.2.2 版本开始,就已经提供了从 MySQL 到 OceanBase 和从 OceanBase 到 OceanBase 的灵活数据归档能力,支持了多种维度的自动化任务配置。考虑到 OceanBase 的高压缩率及 ODC 的数据归档功能,用 OceanBase 做历史库方案就变得非常简单。

BOSS 直聘目前内部使用的 RDS 平台可以直接调用自研的 DTS 工具进行数据归档,所以业务同学目前会继续保持原有的 DTS 归档方法,当出现 DTS 解决不了的归档问题时,会利用 ODC 对 DTS 缺失的能力进行补位。后续, 我们会继续研究 ODC 的其他功能完善 DB 侧的支持能力。

另外,由于在线业务的逐步接入,下游数据仓库等业务也提出了基于 Binlog 订阅等需求,OceanBase 4.2.1 版本提供了 Binlog Service,对于分库分表类业务的下游接入可以直接通过该服务来提供,降低了下游需要逐个 MySQL 集群订阅 Binlog 的复杂度。

(三) 最佳实践探索

新数据库的引入对于 DBA 的考验也有所增加,在保证数据库稳定的前提下,也要充分对硬件、服务配置等维度进行合理的选型和持续优化,以便更好地挖掘OceanBase潜力。我们将持续与OceanBase团队一起实践和探讨,找到 OceanBase 最有效率和最具成本效益的使用方式,为业务的快速和稳定发展提供强有力的支撑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/351608.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux入门攻坚——14、实战软件安装-搭建Python3.8环境-2

上一篇解决了openssl和pip问题&#xff0c;这一篇来解决sqlite问题 创建app时出现错误&#xff0c;模块_sqlite3找不到&#xff0c;查询sqlite相关的包&#xff1a; 在python2.6的lib-dynload路径下&#xff0c;有_sqlite3.so&#xff0c;这个应该就是Python需要的sqlite模块&a…

Redis 实际项目中的整合,记录各种用法

Redis缓存餐厅数据 我们来看主要的流程 很简单,就是在数据库和接口之间加了一层缓冲,在redis之前其实还可以加其他的缓存 例如 nginx的缓存 接下来,就是结合我的业务,来做缓存 我这里的业务逻辑是,按了分类的按钮,分别以不同的 分类为一组缓存数据 所以,这里的缓存粒度是分类…

一个人永远无法赚到认知以外的钱

做交付、做产品&#xff0c;从来都不是一件容易的事情。在营销和服务的过程中&#xff0c;我充分见证了人生百态。 前一段时间&#xff0c;小灰创建了一个自媒体陪伴群&#xff0c;群里邀请了各个领域的自媒体大佬&#xff0c;每周都会在群里进行分享&#xff0c;大家的学习气氛…

推荐家庭关系三姑六婆计算器微信小程序源码

亲戚关系计算器微信小程序源码是一款为避免遇到亲戚却不知道该怎么称呼时遇到的尴尬情况而开发的&#xff0c;由于社会节奏的快速发展&#xff0c;现在的关系不像以前一样经常联系和维护&#xff0c;导致了有些自己家的一些亲戚也疏远了很多。 演示地 址 &#xff1a; runrunco…

httprunnerV4.X的基本使用详解

目录 1、httprunner概述 1.1、httprunner的优点 2、httprunner的安装 3、基本命令的使用 3.1、生成脚手架 3.2、将har文件转换为测试用例文件 3.3、执行测试用例 3.4、为项目创建虚拟环境&#xff0c;然后安装httprunner库 3.4、执行测试用例生成测试报告 4、httprun…

北斗卫星为野外科考人员提供安全保障

北斗卫星为野外科考人员提供安全保障 自第二次青藏高原综合科学考察研究启动以来&#xff0c;青海不断提升科考服务保障能力&#xff0c;推动科考全程信息化&#xff0c;有效促进科考成果转化。 为保障科考人员的人身安全&#xff0c;青海省青藏科学考察服务中心开发了基于北…

【Docker】附录一:常见问题总结

作者主页&#xff1a; 正函数的个人主页 文章收录专栏&#xff1a; Docker 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01; 常见问题总结 一、镜像相关 如何批量清理临时镜像文件&#xff1f; 答&#xff1a;可以使用 docker image prune 命令。 如何查看镜像支持…

9.异步爬虫

异步爬虫可以理解为非只单线程爬虫 我们下面做个例子&#xff0c;之前我们通过单线程爬取过梨视频 https://blog.csdn.net/potato123232/article/details/135672504 在保存视频的时候会慢一些&#xff0c;为了提升效率&#xff0c;我们使用异步爬虫爬取 目录 1 线程池 2 …

使用vs2022将.net8的应用程序发布为一个单独文件

在使用.NetCore3.1时&#xff0c;可以通过设置以下工程配置文本来将项目发布为一个单独的应用程序文件&#xff1a; <Project Sdk"Microsoft.NET.Sdk.WindowsDesktop"><PropertyGroup><TargetFramework>netcoreapp3.1</TargetFramework><…

Jmeter性能测试: 基于JDK 21 安装 Jmeter 5.6.3

目录 一、实验 1.环境 2.JDK下载 3.Jmeter下载 4.Windows安装JDK 21 5.Windows安装Jmeter 5.6.3 6.Linux安装JDK 21 7.Linux安装Jmeter 5.6.3 二、问题 1. Linux 的profile、bashrc、bash_profile文件有哪些区别 一、实验 1.环境 &#xff08;1&#xff09;主机 表…

C语言之指针的地址和指向的内容总结(八十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

计算机网络:体系结构知识点汇总

文章目录 一、计算机网络概述1.1概念及功能1.2组成和分类1.3性能指标 二、体系结构与参考模型2.1分层结构、协议、接口、服务2.2OSI参考模型2.3TCP/IP参考模型 一、计算机网络概述 1.1概念及功能 计算机网络就是通过各个节点&#xff0c;这个节点包括终端的电脑&#xff0c;手…

opencv#32 可分离滤波

滤波的可分离性 就是将一个线性滤波变成多个线性滤波&#xff0c;这里面具体所指的是变成x方向的线性滤波和y方向的线性滤波。无论先做x方向的滤波还是y方向滤波&#xff0c;两者的叠加结果是一致的&#xff0c;这个性质取决于滤波操作是并行的&#xff0c;也就是每一个图像在滤…

研发日记,Matlab/Simulink避坑指南(六)——字节分割Bug

文章目录 前言 背景介绍 问题描述 分析排查 解决方案 总结归纳 前言 见《研发日记&#xff0c;Matlab/Simulink避坑指南&#xff08;一&#xff09;——Data Store Memory模块执行时序Bug》 见《研发日记&#xff0c;Matlab/Simulink避坑指南(二)——非对称数据溢出Bug》…

文旅项目包括什么?

文旅项目是指与文化和旅游相结合的项目&#xff0c;旨在通过提供丰富的文化体验和旅游服务来吸引游客&#xff0c;促进地方经济发展。 文旅项目通常包括多个方面&#xff0c;以下是对每块内容的详细介绍&#xff1a; 文化旅游景区&#xff1a;这类项目以展示人类文化和历史遗产…

单片机学习笔记---独立按键控制LED显示二进制

这节我们来实现独立按键的第三个功能&#xff0c;独立按键控制LED显示二进制 新创建一个工程文件&#xff0c;然后上来我们就要把基本框架写好&#xff0c;这是基本的习惯 老规矩&#xff0c;然后把Delay 1ms的代码复制过来 复制过来后改造一下&#xff1a; 把1ms删掉&#x…

近20k stars,GSYVideoPlayer一款优秀的视频播放器

近20k stars&#xff0c;GSYVideoPlayer一款优秀的视频播放器 引言 在现代社会中&#xff0c;视频已经成为人们获取信息和娱乐的重要形式。为了提供更好的观看体验&#xff0c;开发一款优秀的视频播放器变得至关重要。而GSYVideoPlayer作为一款功能强大、稳定可靠的视频播放器…

03 SB实战 -微头条之首页门户模块(跳转某页面自动展示所有信息+根据hid查询文章全文并用乐观锁修改阅读量)

1.1 自动展示所有信息 需求描述: 进入新闻首页portal/findAllType, 自动返回所有栏目名称和id 接口描述 url地址&#xff1a;portal/findAllTypes 请求方式&#xff1a;get 请求参数&#xff1a;无 响应数据&#xff1a; 成功 {"code":"200","mes…

最新多功能PHP图床源码 /兰空图床Lsky Pro开源版v2.1/ 单纯的图床程序源码

源码介绍&#xff1a; Lsky Pro 是一个用于在线上传、管理图片的图床程序&#xff0c;中文名&#xff1a;兰空图床&#xff0c;你可以将它作为自己的云上相册&#xff0c;亦可以当作你的写作贴图库。 该程序的最初版本诞生于2017年10月&#xff0c;由ThinkPHP 5框架精心打造而…

20240127使用ffmpeg合并音轨和视频通道为mp4

20240127使用ffmpeg合并音轨和视频通道为mp4 2024/1/27 11:11 百度&#xff1a;ffmpeg 合并 音频和视频 mp4 ffmpeg -i 视频文件名.mp4 -i 音频文件名.mp3 -c:v copy -c:a aac -strict experimental 输出文件名.mp4ffmpeg -i "videoplayback (1).mp4" -i videoplay…