vivo 手机云服务建设之路-平台产品系列04

一 、手机设背景
几乎每家手机厂商都为用户提供了信息存储的云服云服务能力。通过一个账号 ,平列用户可以将手机系统中的台产各种常用的信息备份到云端 ,以便后续在合适的品系时间点查看或恢复自身的数据 。然而由于用户量级巨大 ,手机设服务在设计系统的云服时候需要考虑的因素特别多 ,比如如何保证服务的平列稳定性 ,如何保证大文件的模板下载台产传输效率,以及如何保证用户文件的品系数据持久性等等。
除此之外 ,手机设随着越来越多的云服终端用户开始使用vivo云服务,存储和计算的平列成本也与日俱增。可能有部分人了解 ,台产某些手机厂商的品系云服务产品年度亏损数亿级别,而主要成本之处来自用户私人文件的存储成本。
另外 ,在安全方面,云服务在这块需要承担的云计算使命更是重中之重 。某些厂商的云服务曾经出现过用户数据泄露,居然可以通过搜索引擎直接查询到用户的私人文件,这种事件一旦出现 ,对企业品牌的打击和影响可以说是非常巨大 。
如上所述 ,云服务在建设过程中可以说是困难重重,那么vivo云服务在建设过程中,又是如何兼顾产品功能、服务器租用资源成本 、服务稳定性、数据安全等等诸多因素而进行设计的 ?且听后文细细分解。
二、产品能力与设计
2.1 功能介绍2.1.1 多设备数据同步能力

当今智能设备发展迅速 ,各个手机厂商相继推出了PAD 、智能手表等设备。因此不同设备之间的数据互通诉求也随之而来,一个帐号实现数据互通 。
拿vivo为例 ,vivo帐号可以同时在vivo手机、vivo PAD 、PC上登录 ,用户可以在手机 、亿华云PAD 、PC上同时对联系人、日历等内容进行编辑,一端编辑 ,多端可见 。
这种多设备数据同步互通就是云服务的一项核心功能。当前云服务支持同步的数据项 :联系人 、日历、便签、书签 、黑名单、蓝牙、WLAN ,香港云服务器后续会支持更多的数据项。
2.1.2 整机数据打包备份、恢复能力

手机行业功能更新迭代很快 ,新的亮点功能会吸引用户购买新机。但是新机购买回来后,各种数据的设置、新增对用户来说是个繁琐 、头疼的事情 。
为了方便用户将旧手机的数据迁移到新手机上来 ,免费模板手机厂商提供了一些数据迁移工具。如我司的互传 ,新老手机放在一起通过蓝牙可以方便的将数据导入新手机上。但是互传必须要求2个手机在一起 ,如果用户旧手机不在身边呢?
此场景下 ,云服务提供的整机打包功能很好的解决了此痛点。用户在使用旧手机期间 ,可以打开云服务的整机备份开关 ,云服务会自动将用户手机数据打成数据包备份至云端。
在用户购买新手机换机时 ,可以通过云服务快速选择老手机的打包数据进行恢复,方便快捷。
2.1.3 云盘能力

云盘是一种专业的互联网存储工具,是互联网云技术的产物,它通过互联网为企业和个人提供信息的储存 ,读取,下载等服务。具有安全稳定 、海量存储的特点 。
在vivo云服务中,除了诸如联系人、短信等数据类型内容的备份恢复能力之外,文件类型的云端存储能力 ,即云盘的能力同样重要。
用户可以将自己本地重要的图片、视频 、文档等重要文件备份到云端,以便后续可以在云端后者在其他设备上可以访问到该文件 ,同时借助于云盘的能力 ,用户也可以方便快捷的释放整理本地空间 。
除此之外 ,云盘还提供了丰富的文件周边功能,例如压缩文件的在线解压 ,视频的在线播放 ,以及文档在线协作等等 。
2.2 能力建设2.2.1 多设备数据一致性同步方案设计
云服务数据同步的方案采用的是类似于Git版本管理的概念,主要涉及2个行为 :
推数据 :将本地设备增量数据推送至云端。拉数据:将云端增量数据拉取至本地。主要需要了解的有以下2点 :
增量数据识别;数据冲突处理。(1)增量数据识别
云服务采用的是基于数据版本的识别方案 :云端每条数据都有自身的版本号,版本号逐步递增。
主要同步流程如下图:

如图可见,增量数据同步过程并不复杂,整个流程总结如下:
客户端获取云端当前最大的数据版本sv;若客户端本地数据最大版本lv < sv ,则证明云端数据有更新 ,客户端需要拉取云端增量数据;若lv = sv ,则客户端判断本地是否存在增量更新数据,若有则将本地增量数据推送到云端。(2)数据冲突处理
数据冲突出现在多设备同时使用的过程中 ,同时对同一条数据进行操作,造成数据冲突的情况 。
因此同步数据流程需要考虑数据冲突的场景。
常见的冲突解决方案有2种 :a、自动为用户解决冲突。b、用户手动自行解决冲突。
自动为用户解决冲突一般有以下方案:
以最新的数据修改时间为准,以修改时间最迟的设备的数据为准。(多设备时钟无法统一问题 ,后面上报的数据可能并不是用户实际上最后修改的)2条数据都保留。(会给用户造成数据重复的错觉,影响体验)用户手动自行解决冲突:
参照git的冲突处理方式,冲突数据展示给用户 ,由用户自行选择内容的存留,最后将最终数据推送到云端。
由于云服务对接了很多不同模块的数据:联系人、日程、浏览器书签,不同数据的特性不一样 ,每种数据的冲突处理的规则也不一样。因此云服务采用了将冲突数据返回给业务模块 ,供业务模块自行解决的策略 ,于业务方采用上述哪种解决方式 ,由业务方自行决策 。
2.2.2 整机数据打包备份、恢复设计
云服务采用的是将本地不同模块的数据打包成文件 ,上传至云盘的方案 。

通过树形结构 ,将整个包、不同模块、不同模块的数据文件进行关联,恢复数据时,通过父包parentId即可获取到所有的数据文件的metaId,进行恢复即可。
此方案的优点:方便快速扩展备份手机其他模块的数据,服务器基本上不需要进行改造 。
当然此方案也存在劣势:设备不同模块的数据格式对服务器属于黑盒,服务器难以针对模块的数据做实时的解析和展示。
2.2.3 云盘方案设计
相对于数据项目的同步备份,云盘模块主要聚焦的是文件类型的云端存取。
和普通业务模型相比,云盘业务的显著特点是逻辑复杂 ,需要考虑的细节很多:例如空间占用 、数据安全 、大文件传输效率等等,因此整个的系统设计更加复杂 。
(1) 、对象存储简介

《对象存储》是由云存储供应商提供的一套基于对象的海量存储服务 ,一般可以为用户可以提供海量、安全 、高可靠 、低成本的数据存储能力。
在vivo云服务的存储逻辑中 ,用户的图片 、视频、音频等文件目前均存储在对象存储服务中。
由于早期vivo内部并无自建的对象存储能力 ,故一开始这部分数据均存放在公有云,随着近两年vivo自建对象存储能力的完善,目前公有云数据已完全迁移到了自建存储。
(2) 、云盘系统架构

如上图所示,云盘涉及到的周边模块众多 ,但是最核心的还是元数据模块、空间管理模块、文件处理这三个模块,概述如下:
元数据模块:主要用来描述文件的属性 ,例如文件的名称 ,文件的大小,媒体文件的长宽高等等。更抽象的,元数据模块保存了除了文件实体内容之外的所有信息。
但是,为了系统后续的可扩展性 ,我们针对元数据模块还进行了“动静”分离 。
具体如下:
不同的业务所关注的元数据信息不尽相同,比如除了一些名称大小这些公共属性外,云相册业务还会关注诸如文件拍摄时间,exif中的特定字段等等 ,而这些字段在别的业务中却不会使用 。
所以我们继续将静态的不会变化的公共信息继续进行了一层沉降 ,即上图中的公用元数据层。这一层存放了文件的大小、状态、文件摘要值 ,存储在对象存储的路劲等核心内容 。
空间模块:和大部分手机厂商一样 ,云服务默认会允许每个用户免费使用的5G空间 ,如果存储总量级超出了5G,那么用户则需要购买VIP以提升空间容量。
那么关于用户空间信息的管理,我们有一个统一的空间模块进行收纳管控 。
文件处理模块 :此模块主要提供用户文件数据的上下行能力。比如文件的断点上传下载能力 ,媒体文件的缩略图处理能力,压缩包文件的在线解压能力等等 ,都由该服务承载。
下面,我们主要来了解下最核心的文件上传流程,如下图所示 。

在实际的业务处理中,文件上传的整个流程其实远远不止上述时序图这么简单,比如文件缩略图的处理 ,比如用户身份的校验 ,或者是风险文件的识别,加密的处理等等 。
三 、稳定性建设
3.1 分库分表方案设计由于云服务业务使用用户量级巨大,所以在关系型数据库的设计上,也要考虑后续频繁扩容的场景。
关于云服务的分库分表实践 ,这里不再展开描述,感兴趣的可以参考这篇文章 :你分库分表的姿势对么 ?——详谈水平分库分表
3.2 云盘文件大文件稳定性传输和普通的业务数据交互相比 ,文件的上下行动作就显得特别"笨重",因为每次处理都要传输大量的文件报文。
那试想 ,如果用户在上传一个上G的文件,突然遇到了弱网环境而中断了链接 ,那下次恢复链接之后 ,还需要从头开始上传,这样无非会对整体文件的传输体验带来非常大的影响。
3.2.1 文件分片技术
在客户端进行文件上传时,我们会约定一个分片大小阈值 。我们会将文件切割成一组组大小不超过阈值的文件片段,然后对每个片段进行传输。
这样如果端上遇到了弱网环境 ,那么我们也只要对失败的分片进行重传即可,大大提升了整体文件传输的性能。

3.2.2 断点下载
同样,客户端进行文件下载时 ,如果下载一半网络断开了,那么下次又需要对整个文件进行重新下载 。
所以 ,vivo云盘在对文件下载时 ,也使用了断点下载能力,主要基于HTTP的Range头信息,对需要的文件资源进行定位截取。
因为前文描述了文件在上传的时候通过分片技术将文件进行了拆分 ,那么在断点下载的时候,可以通过Range中的范围计算得到具体涉及的存储路劲 ,无需进行多余的IO操作 。
四、资源成本
当前云服务用户数据规模颇大 ,诸如元数据类存储在数据库中的数据总条数已经超过了5000亿、而文件类总占用空间也超过了百PB。
如此海量数据的存储,每年耗费的磁盘成本和数据库成本都是一笔不小的数目 ,因此云服务在节省成本上也做了不少动作 。
4.1 对象存储降本随着在网用户的量级越来越大,用户每天需要备份的文件数量也呈日趋增大,那么如何从技术层级进行降本呢 ?
我们这边主要进行了以下几个方面的探索和挖掘。
4.1.1 存储分级
在vivo对象存储自建完成之前,云盘也是将数据存放在公有云的对象存储上。
存储分级技术主要是将不同的数据采取不同的存储方式分别存储在不同性能的存储设备上 。
一般来说,公有云将对象存储的存储分成三种类型(部分公有云会有四层或更多),即标准存储,低频存储 ,归档存储。
以下为某公有云的存储分级报价情况 :

在标准存储和低频存储的选择方面,我们假设:S为当前存储总量 ,G为每月取回总大小,那么经过数据计算,我们可以推导出 :
两者成本一致的临界条件为:G/S = (P1-P2)/R2