高德资深技术专家孙蔚:海量用户应用数据库选型、升级实践

news2024/11/20 19:36:59

高德地图(以下简称“高德”)作为一款用户出行必备、拥有海量用户数据的导航软件,对系统运行稳定性要求极高。

一直以来,高德每时每刻都在生产的一些数据库中的数据已经达到数百 TB,数据量的增长不仅带来存储成本的迅速攀升,同时还带来响应性能的下降,进而影响到客户体验。

为了降低成本,避免用户体验下降,同时也是为了更好支持业务未来的增长,高德做出了数据库升级的决策。去年以来,高德已经成功地完成了多个数据库的升级,这些数据库的升级为高德探索和应用新技术、持续改善用户体验和降低成本奠定了坚实的基础。

图片

高德成立于 2002 年,经过多年的发展,高德已经是一家领先的移动数字地图、导航及实时交通信息服务提供商,面向终端用户提供包括导航、本地生活、打车等多种服务。作为国民出行平台的高德地图,本质上是一个真实世界和用户之间的连接和服务平台,大量数据的生成和交互,也都离不开数据库的支撑。

高德业务很多,先后使用过很多种数据库,包括 MongoDB、MySQL、Lindorm、以及图数据库、时序数据库等,以满足不同业务的需求。而且,这些已经上线的数据库也会随着需求的变化不断被替换。比如,高德中用以保持手机和车载数据同步的云同步功能,最初用的就是文档数据库 MongoDB,但随着用户数量的增长和数据量的增加,性能开始变得不稳定,不时会出现抖动,后来改为了 Lindorm数据库。

如今,随着高德业务继续成长,带来高并发和海量数据存储的挑战,云同步中的 Lindorm 数据库再次面临挑战,尤其是存储成本上升问题很突出。当然,面临挑战的不仅是云同步系统,还有评价等多个系统的数据库都面临同样的压力。

“随着数据的增长,存储在数据库中的数据动辄上百 TB,而且增长很快,如何处理这些数据以降低存储成本和后续扩容及迁移成本,成为了摆在我们面前的重要问题。”高德技术服务平台负责人孙蔚表示。作为后端技术的负责人,孙蔚负责数据库的优化、数据库的选型、数据库迁移方案的制订等,也是本次数据库升级的主要负责人。

而对于财务系统情形又有所不同。财务系统一直用的是 MySQL 数据库,由于不是一个面向 C 端用户的服务,数据量上的压力其实并不大,但财务数据对数据一致性有很高的要求,特别是在部署两地三中心的容灾架构以后,如何确保位于不同地点的 MySQL 数据库之间的数据一致性很让人头疼。

鉴于数据量还处于持续增长之中,未来存储成本的压力、性能上的压力以及数据一致性等压力都将有增无减,为了更好支持公司发展,高德决定对数据库进行统一替换升级。

数据库升级的需求已经明确,接下来的问题就是数据库的选型。孙蔚表示,结合当下面临的挑战以及未来业务的发展,高德在选型过程中会重点考虑数据库以下几个方面的能力:

第一,稳定性。这是高德首先要关注的,高德如今已经成为一个基础设施,程序中依赖的数据库或服务的任何抖动都会对用户体验带来直接影响;

其次,可扩展性。高德的流量波动很大,在面对极端需求(比如国庆、春节的高峰流量)时数据库需要能够快速通过水平扩展实现扩容,确保系统稳定运行;

第三,安全性。数据库本身要足够安全,同时,数据的隔离也要做得非常好;

第四,性能好。数据库的响应要非常快,不管是读还是写。“数据库的处理时间最好在 5 毫秒以内,加上业务不超过 10 毫秒,极端情况也不能超过 20 毫秒。这个要求其实比较高,即使是 OceanBase 为了满足这个要求,也对代理层和接入层都做了针对性优化。”孙蔚介绍;

第五,高可用。出现了问题后要能快速地进行切换,切换时间要足够短,只有足够短才能将业务无感知;

第六,对单元化能力的支持。为了保证用户体验,高德现在采用的就是多地多中心的部署方式,如果数据库支持单元化可以简化应用的开发和运维。

以高德的云同步服务为例,云同步主要负责数据的云端存储,多端设备数据同步,用户多点就近接入。高德目前采用的是北京、上海、深圳三地三中心,如果不采用单元化的架构,就可能出现用户跨异地数据中心访问,延迟将不可避免。比如,从深圳的数据中心访问北京的数据中心,仅仅网络通讯一个来回可能就超过 60 毫秒。而采用单元化架构后避免了跨数据中心访问,在一个数据中心就可以完成所有操作。

另外,单元化也可以帮助“扛量”,当某个数据中心出现了故障或者遇到了高峰流量,可以借助其他的单元来临时分担流量,也为故障修复赢得宝贵的时间,这也是一种容灾方式。

“云同步业务上需要保证数据多端准确写入、及时更新,更换设备后数据能快速读取,还需要实现容灾多活。如果没有数据库的支持,就要从应用开发上、从架构设计上去实现,这无疑会加重开发的负担。”孙蔚解释说。

经过调研,最后进入高德视线的主要两类:原生分布式数据库和云原生数据库。后来经过多角度的权衡,结合实际的压测实验,多重评估、高德内部认为 OceanBase 最能满足当下需求,所以,最终选择了 OceanBase。

孙蔚表示:作为一款采用 Shared-Nothing 架构的分布式数据库,OceanBase 天生具有高可扩展性和高可用的特点,而 OceanBase 采用的一些独特技术,使得其在数据一致性、稳定性、性能以及与 MySQL 的兼容上表现优异,尤其是其高压缩的能力更是让人惊讶,数据库迁移后的成本降低非常明显。

根据高德的测算,同样的数据量 OceanBase 所需空间只有 MySQL 的 1/10 左右。结合 OceanBase 的调度等(比如冷热数据的分开处理),使得 OceanBase 的 TCO 成本相比之前的 Lindorm 能减少 10% 和 MySQL 能减少 30% 以上。

孙蔚表示,OceanBase 的几个技术特性尤其让他印象深刻:

第一,向量化引擎。向量化引擎允许一条指令处理多个数据,使得数据库在一些复杂场景效率会更高,外在表现就是更快。这一点对未来高德开发一些与AIGC相关的应用非常有价值。

其次,OceanBase 独特的存储引擎。OceanBase 在行存中又有列存,这种方式给它带来很高的压缩比,而且数据量越大优势也明显。

第三,OceanBase 全链路的缓存机制。OceanBase 提供包括数据缓存(如数据行缓存、微块缓存等)、元数据缓存(如 Partition 位置缓存、Schema 缓存、Clog缓存)等多种缓存,有效提高了 OceanBase 的性能。

最后,OceanBase 的单元化能力。作为分布式原生数据库,OceanBase 架构上的多单元同步链路、OMS 的秒级数据同步能力,保障了多机房数据同步低延迟,支撑了多机房多活的可行性,从而完美地实现了异地多活、各单元异地容灾,机房故障随时切流,用户无损。这样,原来高德需要对数据库专门进行容灾设计,现在借助借助数据库的分布式特性就自动实现了容灾,简化了整个系统的设计,也减轻了运维压力。

如今,高德已经先后完成了云同步、评价系统、财务系统等多个系统的数据库的替换升级,不仅大大节省了存储成本、订阅成本,同时,在动态扩容能力、容灾能力以及最终用户体验上也都有了明显的改善。

回顾已经完成的数据库的升级过程,孙蔚表示,虽然整个过程得到 OceanBase 原厂的大力支持,但还是遇到了一些挑战。最大的挑战就是对分布式数据库和 OceanBase 的了解不够。很多开发人员和运维人员之前没有接触过 OceanBase,要让他们能主动去学习分布式数据库、了解 OceanBase,最后能达成一致参与升级,这是项目组面临的第一个挑战。另一个比较大的挑战是如何保证数据库的平稳迁移,保证迁移过程中不出事故,也不能丢数据。

针对这些挑战高德技术团队做了大量准备工作。孙蔚介绍,他们安排专人来研究 OceanBase,甚至深入到源代码,对数据库进行充分了解,对于数据库的分区 Partition 分区的设计、主索引、二级索引的建立都进行了认真的规划。

其次,充分利用 OceanBase 等数据库提供的各种工具。比如,对 MySQL 数据库利用其 Binlog 日志和 OMS 工具来进行数据同步。有些场景使用了双写,然后通过全量的比对来验证数据是否没有问题。

第三,认真规划,递进式切流。数据库的迁移从单客户开始,然后扩展到 10 个、再到 20、到 100 个,逐步增加,确认没有问题再开始一定比例的灰度测试,最后才全部切换。

“在整个迁移过程中,一定要有回退的手段。一旦有问题,能够随时退回,这样才能保证不出问题。这一点非常重要。”孙蔚说。

显然,面对高德的海量用户带来的高并发和大数据量,这种谨慎是非常必要,因为一个哪怕很小的故障,也可能海量用户放大成一场灾难。为了避免事故,在系统运维时,高德非常强调可靠性,强调减少不确定性。比如,高德经常会做断网演练,对于应急扩容等意外也都提前做好了规划。

孙蔚表示,理论上高德是不允许进行紧急扩容的。“如果出现临时紧急扩容,说明你的设计和运维出现了很大问题。这意味着很大的不确定性,风险极高,一定要尽量避免。如果要扩容也应该是在规划之中的扩容,是有计划的,最好是自动的,这样才能降低不确定性。当然,这就要求要提高可观测性,提高运维能力。”他说。

谈及下一步的工作。孙蔚表示,随着数据库升级的完成,他们也将工作重点转向数据库的优化和一些新技术能力的挖掘。比如,当下很热的 HTAP 和 Serverless 数据库都已经进入高德的考察范围,而 OceanBase 也已经具备了这些能力。孙蔚说,高德有丰富的应用场景,无论是 OceanBase 的 HTAP 还是 Serverless 能力相信未来都会有用武之地。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于Office阻止访问嵌入对象的解决办法

问题 Word文档中想要下载嵌入的文件时被Office阻止了,无法下载。 解决办法 打开文件——选项——信任中心,在宏设置中启用所有宏,关于Macro、Acitve X插件等项目设置上,建议暂时全部设置为允许,看下相关对象的访问…

try-catch-finally执行以及他们在有return的情况下,基本数据类型、对象以及有异步赋值情况异同分析

这两天面试,遇到好几个人,都是那种我感觉我肚子里的墨水都吐出来完了,难不倒人家,于是问了下家里那位老狗,从最开始就念叨着你问他try-catch在有return的情况下怎么执行的,执行结果是啥,我前面没理,后面确实有点遭不住了,来看看吧,肚子里添点墨水,别把脸丢大了~ 做…

分布式搜索引擎ES

文章目录 初识elasticsearch了解ES倒排索引正向索引倒排索引正向和倒排 es的一些概念文档和字段索引和映射mysql与elasticsearch 安装ES部署kibana安装IK分词器扩展词词典停用词词典 索引库操作mapping映射属性索引库的CRUD创建索引库和映射查询索引库修改索引库删除索引库 文档…

MySQL 常见面试题总结:索引 InnoDB索引 MyISAM索引

1.关系型数据库(MySQL)和非关系型数据库(nosql)区别 存储方式:关系型以表的形式 非关系型以键值对形式 应用场景:关系型一致性要求较高,非关系型并发性要求较高 2. Mysql如何实现的索引机制? MySQL中索…

WAF入侵防御系统标准检查表

软件开发全文档获取:进主页

『Linux升级路』基础开发工具——vim篇

🔥博客主页:小王又困了 📚系列专栏:Linux 🌟人之为学,不日近则日退 ❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、vim的基本概念 📒1.1命令模式 📒1.2插入模式 &…

ENVI IDL:如何监测代码运行时间(计时器函数实现)?

01 预想 我预想的是在循环中加入一个函数,可以监测相邻两次循环的运行时间,正常操作如此: pro unknowfor ix 0, 5 do beginstart_timekeeping systime(1)wait, randomu(systime(1), 1) ; 此处systime(1)仅仅作为seed种子end_timekeeping…

C# DirectoryInfo类的用法

在C#中,DirectoryInfo类是System.IO命名空间中的一个类,用于操作文件夹(目录)。通过DirectoryInfo类,我们可以方便地创建、删除、移动和枚举文件夹。本文将详细介绍DirectoryInfo类的常用方法和属性,并提供…

拥抱中国发展新机遇,原知因制药再次亮相2023进博会

11月5日至10日,第六届进博会在国家会展中心(上海)成功举办。作为世界上首个以进口为主题的国家级博览会,进博会成为构建新发展格局的窗口、高水平开放的载体,持续为世界经济注入正能量。 原知因制药再次亮相进博会&am…

开放领域问答机器人1

开放领域问答机器人是一种智能机器人,它不受限制,可以回答任何问题。这种机器人主要通过自然语言处理技术来理解用户的问题,并从大量的数据中获取相关信息,以提供准确的答案。它的应用领域广泛,包括客户服务、教育、医…

网易云音乐未登录接口返回301

网易云音乐 NodeJS 版 API (neteasecloudmusicapi.js.org) 上面是网易云音乐的官方API接口文档 当我调用接口发送请求的时候部分接口数据是需要登录之后进行获取的,但是当我发送请求的时候原生js项目中的跨端问题是比较难解决的。 遇到的问题:跨端请求…

嵌入式Linux系统中内存分配详解

Linux中内存管理 内存管理的主要工作就是对物理内存进行组织,然后对物理内存的分配和回收。但是Linux引入了虚拟地址的概念。 虚拟地址的作用 如果用户进程直接操作物理地址会有以下的坏处: 1、 用户进程可以直接操作内核对应的内存,破坏…

拓世法宝AI智能直播一体机,快速搭建品牌矩阵,开启扩张新里程

时光荏苒,数字时代悄然而至,短视频已成为品牌传播的新宠。在这个潮流中,短视频以一种无法阻挡的势头成为了品牌传播的新趋势。如何巧妙地利用短视频进行品牌传播,实现零成本的品牌升级,构建强大的品牌矩阵,…

Linux编辑器---vim的使用

Vim是一个高度可配置的文本编辑器,它是操作Linux的一款利器,旨在高效地创建和更改任何类型的文本。这款编辑器起源于"vi",并在此基础上发展出了众多新的特性。Vim被普遍推崇为类Vi编辑器中最好的一个,事实上真正的劲敌来…

【每日OJ—— 206. 反转链表(链表)】

每日OJ—— 206. 反转链表(链表) 1.题目:206. 反转链表(链表)2.方法讲解:2.1解法:2.1.1.图文解析2.1.2.代码实现2.1.3.提交通过展示 1.题目:206. 反转链表(链表&#xff…

WPS的JS宏基础(二)——其他

数据的输入和输出 InputBox(‘请输入内容’) //输入框 alert(‘a’) //简单消息框 MsgBox(‘b’) //进阶消息框 Debug.Print(‘c’) //立即窗口 Console.log(‘d’) //立即窗口 编写规则与注释 1.严格遵循大小写规范 2.每条语句之间用分号分隔 3.复合语句块(块中…

uni.getLocation() 微信小程序 线上获取失败

开发版,体验版,用此方法都可以正确获取定位,但是在小程序的线上,总是获取失败 参考:uni-app微信小程序uni.getLocation获取位置;authorize scope.userLocation需要在app.json中声明permission;小程序用户拒绝授权后重新授权-CSDN博客 uniapp 中的 uni.…

[sd_scripts]之fine_tune

https://github.com/kohya-ss/sd-scripts/blob/main/docs/fine_tune_README_ja.mdhttps://github.com/kohya-ss/sd-scripts/blob/main/docs/fine_tune_README_ja.md fine-tune微调是指使用图像和文本对来训练模型,不包括lora、textual inversion和hypernetwork。 …

JavaFX03(首页搭建)学生管理业务逻辑老师管理登录注册

数据库脚本 --创建学生管理系统 create database db_school; --使用当前数据库 use db_school; --创建学生表 create table tb_stu(sid int primary key identity(1,1),sname varchar(50),spwd varchar(50),ssex varchar(10),sage int,shobby varchar(100),saddress varchar(1…

STM32H743XX/STM32H563XX芯片烧录一次后,再次上电无法烧录

近期在使用STM32H563ZIT6这款芯片在开发板上使用正常,烧录到自己打的板子就遇到了芯片烧录一次后,再次上电无法烧录的问题。 遇到问题需要从以下5点进行分析。 首先看下开发板的原理图 1.BOOT0需要拉高。 2.NRST脚在开发板上是悬空的。这里我建议大家…