58同城如何降低 80%的机器成本 | OceanBase案例

本文作者:58同城架构师刘春雷

一、背景介绍

58同城作为中国互联网生活服务领域的领军者,其平台规模居国内之首,涵盖了包括车辆交易、房产服务、人才招聘、本地生活服务以及金融等多元化的业务场景。

因其业务的广泛性和多样性,我们发现单一的数据库难以满足所有场景的独特需求。例如,金融业务对数据的稳定可靠性有严格标准,而直播业务则对高并发处理能力有极高要求,数据分析业务则更侧重于存储成本优化和AP性能提升。

因此,我们进行了深入的数据库调研,涵盖了OceanBase、TiDB、StarRocks等多种数据库,以期找到能够支撑我们复杂多变业务场景的最佳数据库解决方案

引入OceanBase主要是为了满足TP业务的降本增效需求,以及解决核心业务分库分表的痛点。OceanBase经历过大量金融核心场景的打磨,在核心业务场景选型中占据极大优势。

二、技术选型

在调研时,我们考察了 OceanBase 的一些特性,另我们最看重的特性包括多租户及资源隔离、高压缩率、优秀的查询性能。

多租户

我们有很多业务需要部署大量的数据库实例,通常一个业务会占用一个数据库实例资源,保证业务之间互相不影响。这就可能造成严重的资源碎片化,在某个关键业务或关键客户需求激增时,难以灵活、弹性扩展,性能和可用性难以保证。比如核心业务大数据量级我们仍然采用MySQL分库分表的架构,在业务洪流高峰时,没有很好的弹性扩展手段,只能从应用层去做流量保护来保证业务和数据库的稳定性。

由于数据库资源的碎片化部署,单个实例为了保证一定的性能弹性空间,往往会多划出一部分容量作为短时间内请求增长的预备资源。这种资源预留在整体业务视角来看实际上造成了巨大的资源浪费,大大抬高了我们的资源成本。

而且大量的数据库实例同时带来的还有管理效率的降低, 数据库相关团队难以对成百甚至上千的实例进行精细化管理,出现故障、抖动等事件时恢复时效差,对整体资源水位的把控难以全局掌控,又抬高了我们的管理成本。

OceanBase 的优势在于,其多租户架构可以将多个不同业务的数据库实例集中整合,提升资源利用率,同时基于 Paxos 的多副本机制保证每个资源单元的高可用能力。这样就可以为不同业务提供不同规格的实例,保证资源隔离性的同时降低成本。

1710745147

我们认为OceanBase多租户特性对58同城业务最大的帮助体现在以下三个方面。

·       多租户池化: OceanBase 集群原生支持多租户下的资源隔离和虚拟化,一个集群中可以部署上百个数据库租户,租户间的数据和资源互相隔离,计算资源原地升级规格配置,秒级生效。

·       多维度弹性:基于 OceanBase 的单机分布式一体化式架构,可以实现单机原地升级配置、多机弹性扩展,多机流量均衡多个维度的扩容操作,并且扩容对上层应用透明。对于涉及数据迁移的扩展无需人工值守,可以自动完成迁移及多维度数据校验。

·       统一管理:把多个零散的实例统一部署在 OceanBase 后,运维管理的复杂度会大大降低,DBA 从之前管理数十个分散实例,到目前管理一个 OceanBase 集群,将负载、告警、调优全部统一至集群级别,常规故障能够自动恢复,大幅提升了业务支撑效率和应急响应能力。

高压缩率

因为 OceanBase 的压缩率极高,所以我们也做了一个相对比较详细的调研。

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

通用压缩是在不感知微块内部数据格式的前提下,将整个微块通过通用压缩算法进行压缩,依赖通用压缩算法来检测并消除微块中的数据冗余。目前 OceanBase 支持选择 zlib、snappy、zstd、lz4 等算法进行通用压缩,可以根据表的应用场景,通过 DDL 对指定表的通用压缩算法进行配置和变更。

编码压缩的算法比较复杂,OceanBase 根据实际业务场景需求实现了单列数据的字典编码、 RLE 编码、常量编码、数值差值编码、定长字符串差值编码,同时还引入了列间等值编码和列间子串编码,能够分别对数据库中一列数据或几列数据间可能产生的不同类型数据冗余进行压缩。最后还可以再利用 bit-packing 编码、字符串 HEX 编码等,对已经编码过的数据再进行一层编码,进一步去除冗余的信息。

综上, OceanBase 相当于做了三层编码压缩:列内编码、列间编码,以及bit-packing/hex 编码。

下面这两张图就分别是 bit-packing 编码和 hex 编码的示意图。

1710745187

(bit-packing 编码)

1710745195

( HEX 编码)

此外,在编码压缩这一层还使用了自适应压缩技术,根据真实的数据特征自动选择最优的编码算法。因为数据编码的压缩效果不仅与表的 schema 相关,同时还与数据的分布,微块内数据值域等数据本身的特征相关,这也就意味着难以在用户设计表数据模型时指定列编码来实现最好的压缩效果。

为了减轻用户使用负担,也为了实现更好的压缩效果,OceanBase 支持在合并过程中分析数据类型、值域、NDV 等特征,结合合并任务中上一个微块对应列选择的编码算法和压缩率自适应地探测合适的编码,对同一列在不同数据块中支持使用不同的算法来进行编码。

良好的查询性能

因为OceanBase有着极高的数据压缩率,所以我们特别关心 OceanBase 能否同时支持良好的查询性能。

事实上, OceanBase 在设计数据编码格式时也考虑到了对查询性能带来的影响,我们了解到其中几种比较关键的提升查询性能的方法。

1.     行级粒度数据随机访问。

通用压缩中如果要访问一个压缩块中的部分数据,通常需要将整个数据块解压后访问,某些分析型系统的数据编码大多面向扫描场景,而针对点查场景的数据编码较少。因此,OceanBase采用了在访问某一行数据时需要对相邻数据行或数据块内读取行之前所有行进行解码计算的数据编码的格式(如 PFor 等差值编码)。

如果 OceanBase 需要更好地支持事务型负载,就意味着要支持相对更高效的点查,因此 OceanBase 在设计数据编码格式时保证了编码后的数据能够以行为粒度随机访问。也就是在对某一行点查时只需要对这一行相关的元数据进行访问并解码,减小了随机点查时的计算放大。同时,对于编码格式的微块,解码数据所需要的所有元数据都存储在微块内,让数据微块有自解释的能力,也在解码时提供了更好的内存局部性。

2.     计算下推。

由于编码数据中会存储有序字典、 null bitmap 、常量等可以描述数据分布的元数据,在扫描数据时可以利用这些数据对于部分过滤,聚合算子的执行过程进行优化,实现在未解码的数据上直接进行计算。

OceanBase 对分析处理能力进行了大幅优化,一是将聚合与过滤计算下推到存储层执行(在后面落地实践的性能测试部分还会再提到),二是在向量化引擎中利用编码数据的列存特征进行向量化的批量解码等特性。在查询时充分利用了编码元数据和编码数据列存储的局部性,在编码数据上直接进行计算,大幅提高了下推算子的执行效率和向量化引擎中的数据解码效率。

1710745235

存储层的查询优化除了上面提到的行级数据随机访问和计算下推之外,还有 block cache、row cache、缓存解码器等手段。

当然,对于查询性能优化方面,起到更大作用的还是 SQL 层优化,而非存储层优化,不过我们暂时对 SQL 层的优化器和执行器还没有深入调研,这里就偷懒略去不提了。

而我们OceanBase的查询性能进行了测试。例如最基础的 count 聚合测试,通常 DBA 习惯通过 count 看这张表有多少数据,相同的一张表,在 MySQL 里算 count 聚合要执行一千多秒,在 OceanBase 中只需要 0.03 秒。这是因为 OceanBase 的 scalar group by 会下压到存储层进行计算,可以直接利用存储层微块内部已经维护好的聚合信息让查询性能取得数量级的提升,对于我们最常用的聚合函数 count/min/max/sum 都是支持的。

比如在下面这个执行计划中,可以看到,1 号算子存储层 table scan 吐行的时候吐出来的数据就已经是 T_FUN_COUNT(t1.c1) 了,上层的 0 号算子 group by 就只需要再对存储层吐上来的各个微块的 count 信息求一个 count 的 sum 就好了,可以在计划里看到它确实也是这样做的:

T_FUN_COUNT_SUM(T_FUN_COUNT(t1.c1))。
explain select count(c1) from t1;
 | ========================================
 |ID|OPERATOR       |NAME|EST. ROWS|COST|
 ----------------------------------------
 |0 |SCALAR GROUP BY|    |1        |2   |
 |1 | TABLE SCAN    |t1  |1        |2   |
 ========================================
 
 Outputs & filters:
 -------------------------------------
   0 - output([T_FUN_COUNT_SUM(T_FUN_COUNT(t1.c1))]), filter(nil), rowset=256,
       group(nil), agg_func([T_FUN_COUNT_SUM(T_FUN_COUNT(t1.c1))])
   1 - output([T_FUN_COUNT(t1.c1)]), filter(nil), rowset=256,
       access([t1.c1]), partitions(p0)  

除此以外,我们还测试了一些常用查询,比如查指定日期、指定集群的表大小的 top 10,在 MySQL 里是 0.04 秒,在 OceanBase 是 0.01 秒;查指定日期的表大小的 top 10,MySQL 里是 108 秒,在 OceanBase 是 28 秒。各种 SQL 的查询效率都会显著提升,对于最常用的聚合更有数量级的性能提升。

三、落地实践

目前,我们优先将DBA使用的线上数据统计信息库迁移到了OceanBase,进行运维和使用经验的积累,后续逐步将其他业务迁移到 OceanBase。我们使用OceanBase4.2.1版本,搭建了一套6个节点的集群,机器配置如下表。

配置具体
CPU64核 Intel(R) Xeon(R) Gold 6326 CPU @ 2.90GHz
内存512G
磁盘SSD NVME 3.5T

迁移到OceanBase的库存储了一些其他业务库的统计信息,比如存储 TiDB 业务库的实时慢 SQL、TiDB 业务库天级别慢 SQL、MySQL 业务库中表的基本信息和 SQL 的执行信息、Redis 业务库的链接信息等。

因为有些表的存储量很大,一张单表能达到 1.5TB,如果将大表放在 MySQL 中,查询分析时就会有明显的性能问题,所以我们之前大多数统计信息库都选择放在 TiDB 的不同集群中,比如线上所有 TiDB 集群的实时慢 SQL放到一套 TiDB 集群里, TiDB 天级别的所有的慢 SQL放到另一套 TiDB 集群里。

但是这些 TiDB 集群特别耗资源,原来每个业务的统计信息都对应一个 TiDB 集群,每个 TiDB 集群基本都需要 2 ~3 个 TiDB server,外加 3 个 PD,每台 server 都是 8 核 16G 虚拟机,每台 TiKV 是 40 核 256G 物理机。

租户名业务原集群情况已分配 CPU(核)已分配内存(G)已分配日志盘已使用数据盘
sys系统租户64848GB620MB
t_tidb_realtime_slowTiDB 实时慢 SQLTiDB集群 2 个 TiDB(8核16G300G虚拟机) 3个 PD(8核16G300G虚拟机) 3个TiKV(40核192G3.5T物理机)48144300GB295.75GB
t_tidb_slowTiDB 天级别慢 SQLTiDB集群 3 个 TiDB(8核16G300G虚拟机) 3个 PD(8核16G300G虚拟机) 3个TiKV(40核256G3.5T物理机)72192300GB258.54GB
t_table_statisticsMySQL 表基本信息MySQL集群 表 1.5T,迁移后集群不能下线60192300GB178.26GB
t_redisclientinfoRedis 的连接信息TiDB集群 库:17G 迁移后集群不能下线48192300GB466MB
t_ps_statsMySQL 执行 SQL 信息MySQL集群 3个节点(48核256G物理机) 历史数据废弃,新写到OB 迁移后集群可以下线72192300GB779.05GB

如今我们统一把上表的所有集群统一迁移到一套 OceanBase 集群上,不同业务的统计数据按照租户进行拆分。这样不仅利用 OceanBase 的高压缩比节省了存储空间(大约节省50%),还能把节点数量也从20+个缩减到6个,机器成本缩减了5倍。

此外,如果考虑到后续在 HTAP 场景中上线OceanBase,替换现有的 TiKV 和 TiFlash 两套存储引擎,成本将节省更多。 

回到上线流程,我们使用OMS将一张 21 亿行的表从 MySQL 迁移到 OceanBase ,迁移前的 MySQL 磁盘信息如下表。

分类磁盘占用量
逻辑数据大小856.19G
逻辑索引大小591.45G
碎片大小0.01G
实际文件大小1.5T

由于OMS可以选择迁移模式,我们没有选择高速迁移,而是选择平稳迁移模式耗费 11 小时完成迁移,大约每秒迁移五万多行数据。迁移后 OMS 会进行索引创建,我们选择单线程创建4个索引,耗费7个小时。官方建议选择多线程方式,可以更加快速地并行创建索引。

迁移完成后,会达到磁盘占用量的顶峰 259GB,全量合并后,数据约 157GB 。也就是说,MySQL单副本1.5TB大表迁移到OceanBase后是双副本 155GB,从单副本来看的话,应该只有 80G 左右。整体的压缩率让我们很震惊,1.5T 变成 80G,压缩率达到95%。

分类OceanBase实际磁盘占用量
迁移前2.88G
迁移后(高峰)269.57G
迁移后(10小时后,全量合并)164.32G
真实OceanBase迁移数据大小161.44G(双副本),单副本80G
对比MySQL1.5T单副本数据压缩率MySQL 1.5T->OceanBase 80G(压缩率95%)

下图是迁移前后的存储成本和查询性能对比。

分类迁移前 MySQL迁移后 OceanBase比值: MySQL / OceanBase
磁盘占用量1.5TB81.64G (单副本)18.37
查询耗时 表总条数:select count(*)1013.75s0.03s33791
查询耗时 计算指定日期、指定集群的表大小top100.04s0.01s4
查询耗时 计算指定日期的表大小top10108.88s28.75s3.78

四、未来:使用OceanBase替换MySQL、TiDB、StarRocks

从关注OceanBase到迁移上线,我们用了6个月时间,应用OceanBase后,最大的收获包括如下三方面。

首先,OceanBase 的多租户能力,支持我们把多个 MySQL 和 TiDB 的实例整合到一套 OceanBase 集群中,进行统一管理,租户间资源隔离,还可按需弹性扩展,在简化运维的同时有效提高资源利用率。

1710745335

其次,基于 OceanBase 的高级压缩技术,在保证性能的同时,数据存储空间相比原先能够节省三到五倍左右,一些场景甚至可以节省将近二十倍。同等硬件投入的前提下,可以让我们存储更多数据。

1710745343

此外,在数据迁移方面,因为 OceanBase 兼容 MySQL 协议与语法,所以我们可以利用 OMS 做到平滑迁移,大幅降低了业务迁移和改造成本。OMS 通过全量迁移、增量迁移、反向迁移,保障数据迁过程中的强一致,还提供了数据同步到 Kafka 等消息队列中的能力。

1710745355

综合考虑 OceanBase 高压缩率带来的存储成本下降、各种内核实现优化带来的查询性能提升,以及超级好用的数据迁移工具 OMS,我们计划将后续大量 MySQL 的上百 GB 甚至上 T 级别的大表迁移至 OceanBase 。

除了 MySQL 场景以外,我们还尝试将资源占用极高的 TiDB 也逐步替换成 OceanBase,以节省机器资源和存储资源。测试表明,OceanBase 查询性能也超越 TiDB 3~4 倍,完全满足我们的业务需求。

此外,我们将对 OceanBase 的 AP 能力进行深入调研和测试,使用 OceanBase 替换 StarRocks,实现一套引擎同时处理 OLTP 业务和 OLAP 请求,降低运维复杂度和运维成本。

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

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

相关文章

Keil MDK map文件学习笔记

Keil MDK map文件学习笔记 map文件组成1.Section Cross References段交叉引用2.Removing Unused input sections from the image移除无用的段3.Image Symbol Table镜像符号表局部符号表全局符号表 4.Memory Map of the image镜像存储器映射ROM区执行域RAM区执行域 5. Image com…

DLRover:蚂蚁集团开源的AI训练革命

在当前的深度学习领域,大规模训练作业面临着一系列挑战。首先,硬件故障或软件错误导致的停机时间会严重影响训练效率和进度。其次,传统的检查点机制在大规模训练中效率低下,耗时长且容易降低训练的有效时间。资源管理的复杂性也给…

关于新配置的adb,设备管理器找不到此设备问题

上面页面中一开始没有找到此android设备, 可能是因为我重新配置的adb和设备驱动, 只把adb配置了环境变量,驱动没有更新到电脑中, 点击添加驱动, 选择路径,我安装时都放在了SDK下面,可以尝试…

卷爆短剧出海:五大关键,由AIGC重构

短剧高温下,谈谈AIGC的助攻路线。 短剧,一个席卷全球的高温赛道。 以往只是踏着霸总题材,如今,内容循着精品化、IP化的自然发展风向,给内容、制作、平台等产业全链都带来新机,也让短剧消费走向文化深处&am…

【C语言回顾】动态内存管理

前言1. 动态内存管理初步概述2. malloc3. calloc4. realloc5. free6. 常见的动态内存错误7. 柔性数组8. 程序内存区域划分结语 #include<GUIQU.h> int main { 上期回顾: 【C语言回顾】联合和枚举 个人主页&#xff1a;C_GUIQU 专栏&#xff1a;【C语言学习】 return 一键…

win32-鼠标消息、键盘消息、计时器消息、菜单资源

承接前文&#xff1a; win32窗口编程windows 开发基础win32-注册窗口类、创建窗口win32-显示窗口、消息循环、消息队列 本文目录 键盘消息键盘消息的分类WM_CHAR 字符消息 鼠标消息鼠标消息附带信息 定时器消息 WM_TIMER创建销毁定时器 菜单资源资源相关菜单资源使用命令消息的…

远动通讯屏具体干啥作用

远动通讯屏具体干啥作用 远动通讯屏主要用于电力系统中的各类发电厂、变电站、光伏电站、开闭所、配电房等&#xff0c;具有实时传输数据和远程控制功能。它的主要作用包括&#xff1a; 数据采集&#xff1a;远动通讯屏能够采集各种模拟量、开关量和数字量等信息&#xff0c…

python查找内容在文件中的第几行(利用了滑动窗口)

def find_multiline_content(file_path, multiline_content):with open(file_path, r) as file:# 文件内容file_lines file.readlines()# 待检测内容multiline_lines multiline_content.strip().split(\n)# 待检测内容总行数num_multiline_lines len(multiline_lines)matchi…

【CALayer-CALayer的transform属性 Objective-C语言】

一、接下来,我们来说的是这个,transform的属性 1.layer的transform属性, 把最后一份代码command + C、command + V、一份儿,改个名字, Name:04-CALayer的transform属性, 我们把这个代码稍微修改一下, 我们先添加了一个layer,到控制器的view上, 然后呢,这两句话不…

Tina-Linux -- 5. 网络通信(有线网络,无线网络,SSH链接)

有线网络 bash 指令 ifconfig eth0 192.168.2.222 netmask 255.255.255.0 up route add default gw 192.168.2.1开机自启 修改网络设置文件 /etc/init.d/S40network #!/bin/sh # # Start the network.... ## Debian ifupdown needs the /run/network lock directory mkdir …

Vue3实现简单的瀑布流效果,可抽离成组件直接使用

先来看下效果图&#xff1a; 瀑布流中的内容可进行自定义&#xff0c;这里的示例图是通过不同背景颜色的展示进行区分&#xff0c;每个瀑布流中添加了自定义图片和文字描述。 实现方式&#xff1a; 1.建立子组件&#xff08;可单独抽离&#xff09;写出瀑布流的样式 文件名为…

C++-逻辑语句

if语句 基本格式&#xff1a; 只有判断结果为true&#xff0c;才会执行后续{}内的代码 if (要执行的判断&#xff0c;结果需是bool型) {判断结果true&#xff0c;才会执行的代码; }if (条件判断) { 如果判断结果为true&#xff0c;会执行的代码; }else{如果判断结果为false…

【工具】AFL+Unicorn|二进制程序模糊测试工具 AFL 和 Unicorn 的前世今生、安装以及 Python 使用实例

文章目录 【工具】AFLUnicorn&#xff5c;二进制程序模糊测试基础工具&#xff08;AFLUnicorn&#xff09;写在最前1. 系统环境2. 软件版本3. 背景知识3.1 AFL vs AFLplusplus3.2 QEMU vs Unicorn3.3 Unicorn vs UnicornAFL 4. 工具安装4.1 Ubuntu184.2 Ubuntu 20~224.3 收尾 5…

分布式事务——9种解决方案的原理与分类

目录 一、概要1. 分布式事务的概念2. 分布式事务解决方案分类 二、常见的分布式事务解决方案1. 基础的 2PC&#xff08;二阶段提交&#xff09;1.1 核心思想1.2 简介1.3 主要特点1.3.1 优点1.3.2 缺点 2. 基础的 3PC&#xff08;三阶段提交&#xff09;2.1 核心思想2.2 简介2.3…

【系统架构师】-案例篇(十五)SOA、微服务与数据库

1、可复用构件应具备哪些属性 可用性&#xff1a;构件必须易于理解和使用。 质量&#xff1a;构件及其变形必须能正确工作。 适应性&#xff1a;构件应该易于通过参数化等方式在不同语境中进行配置。 可移植性&#xff1a;构件应能在不同的硬件运行平台和软件环境中工作。 可变…

# 全面解剖 消息中间件 RocketMQ-(2)

全面解剖 消息中间件 RocketMQ-&#xff08;2&#xff09; 一、RocketMQ – RocketMQ 各角色介绍 1、RocketMQ 各角色介绍 Producer : 消息的发送者; 举例:发信者。Consumer : 消息接收者; 举例:收信者。Broker : 暂存和传输消息; 举例:邮局。NameServer : 管理 Broker; 举例…

全网最全爬取-b站爬取弹幕+评论之js逆向与xml降本增效

&#x1f31f; ❤️ 作者&#xff1a;yueji0j1anke 首发于公号&#xff1a;剑客古月的安全屋 字数&#xff1a;801 阅读时间: 10min 声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及…

K-means聚类模型

目录 1.定义 2.K-means聚类模型的优点 3.K-means聚类模型的缺点 4.K-means聚类模型的应用场景 5.对K-means聚类模型未来的展望 6.小结 1.定义 什么是 K-means 聚类模型&#xff1f;K-means 聚类模型是一种无监督学习算法&#xff0c;用于将数据划分为不同的组或簇&#…

概念+bug

模型 迭代模型和增量模型 增量模型是将一个大的需求变成小的功能&#xff0c;然后将每个功能逐个开发几乎完整再上线。 迭代模型会上线一个基础版本&#xff0c;但是基础版本所有的功能都有但是非常简陋&#xff0c;之后再迭代优化上线。 一般都是两个一起用&#xff0c;不…

微服务Day7学习

文章目录 数据聚合聚合分类 自动补全DSL实现Bucket聚合DSL实现Metrics聚合RestAPI实现聚合多条件聚合对接前端接口拼音分词器自定义分词器自动补全查询实现酒店搜索框自动补全 数据同步数据同步思路分析利用mq实现mysql与elasticsearch数据同步 集群介绍搭建ES集群 数据聚合 聚…