Enterprise Cloud Disk Implementation and Technical Details
The article details vivo’s enterprise cloud disk, describing its personal, team, and backup spaces, user authentication via asymmetric encryption and SSO, metadata storage in MySQL with object storage for files, and the implementation of file operations—including permission management, partner access, and both small‑file and multipart large‑file upload workflows.
作者:来自 vivo 互联网存储团队- Cheng Zhi
本文将介绍企业云盘的基本功能以及服务端实现。 一、背景 vivo 企业云盘是一个企业级文件数据管理服务,解决办公数据的存储、共享、审计等文件管理需求;同时便于团队成员快速共享、管理文件,帮助集中管理企业数字资产,提升办公效率,实现内部数据资源的共享以及与外部客户之间的文件安全交换。 二、功能介绍 目前 vivo 企业云盘有 3 个空间:个人空间,团队空间和备份空间。 2.1 个人空间 个人空间用于存储用户个人的文件数据,其他用户不可见;容量默认为 100GB。个人空间支持文件的分享、下载、移动、重命名、星标、机房下载和删除操作,如下图所示: 2.2 团队空间 团队空间用于多人协作,团队中可容纳多名成员,每个成员都可以向团队空间中上传文件并与其他人共享这些文件,也可以下载其他人上传到该团队空间的文件;团队空间没有容量限制。 用户可以在如下位置创建团队空间: 团队空间的创建者默认为该空间的管理员,管理员可以在左边菜单栏中的团队空间下看到“团队设置”和“成员管理”,在“团队设置”页可以修改该团队空间的名称和团队描述信息: 在“成员管理”页可以添加成员并修改已有成员的权限: 彩蛋提醒 我们为大家准备了抽奖福利,请继续阅读下去。 2.3 合作伙伴 团队空间中除了内部员工还可以加入外部合作伙伴,管理员可在如下页面申请合作伙伴账号: 点击“新增”后在弹出的“申请外部用户账号”页填写合作伙伴相关信息即可提交直接上级领导审批,审批通过后会在该团队空间中生成一个合作伙伴账号,账号及初始密码会以邮件形式发送到合作伙伴邮箱,合作伙伴登录后即可上传文件或下载分享给他的文件。 出于数据安全的考虑,合作伙伴无法看到团队空间中内部员工上传的文件,只能看到自己上传的文件以及分享给他的文件。 管理员可以在”成员管理“页禁用合作伙伴账号: 2.4 备份空间 备份空间用于备份用户本地电脑上的文件。目前企业云盘网页端只能查看已有的备份策略,新建备份策略需要在企业云盘客户端进行;用户可以在企业云盘网页端右上角的“客户端下载”下载企业云盘客户端: 在客户端的“备份同步”页点击“新增备份”,然后在弹出的对话框中选择想要备份的本地文件夹即可创建备份记录: 企业云盘客户端将按用户设置的频率将指定文件夹下的文件上传到对象存储以实现文件备份;对于实时备份,企业云盘客户端会每 3 分钟扫描一次本地文件夹,并与远程的文件进行对比,将新增的文件上传到对象存储。 三、功能实现 企业云盘的存储分为元数据和对象存储两部分,元数据存储使用的是 MySQL,保存的是用户,群组以及文件等实体的元数据,文件的实际数据是以对象的形式保存在对象存储中。企业云盘架构如下: 下面介绍一下各个功能是如何实现的: 3.1 用户认证鉴权 企业云盘在用户的身份验证中使用了非对称加密,前端持有一个公钥,后端持有一个私钥,用户登录时,前端首先获取浏览器指纹 webFinger,同时生成一个随机数种子 seed,然后用公钥计算出一个特征字符串 RSA(webFinger+seed),然后将此字符串放入请求 header 中的 finger 字段,传递给服务端;另外企业云盘接入了 uuc 单点登录系统,uuc 登录成功后会在请求的 cookie 字段中放置 uuc-token 和 uuc-uuid,这两个值也会传给后端。 服务端收到登录请求后,先使用 cookie 中的 uuc-token 以及 uuc-uuid 调用 uuc 接口查询得到用户 uid, 然后尝试从 user 表中查询用户信息,如果查询不到那么说明用户是第一次登录企业云盘,那么服务端会从 uuc 获取用户信息并存储在 user 表中;然后服务端利用私钥解密登录请求中的特征字符串,得到 webFinger,再根据 webFinger + 当前时间 + uid 进行 AES 加密得到一个字符串 clouddisk-token,并将 clouddisk-token 放置在 cookie 中,返回给客户端。在发送后续请求时,客户端需要将 clouddisk-token 保持在 cookie 中。 在后续请求中,客户端以同样的方式生成 finger,并且在请求中携带 clouddisk-token;服务端接收到请求后,将 clouddisk-token 进行AES解密,获取 uid + 时间 + webFinger,同时服务端根据自身持有的私钥,对 header 中的 finger 解密,获取此 finger 对应的 webFinger,与解密 token 得到的 webFinger 对比,如果相等,则验证通过。以上过程如下图所示: 团队空间的数据保存在 groups 表中,该表会记录团队名称、创建人等信息;用户与团队空间的归属关系保存在 group_usrs 表中,该表会记录每个团队空间有哪些用户,以及这些用户在团队空间中的权限。 在个人空间中用户对文件有最高权限,可以任意操作;当用户操作的文件属于某个团队空间时前端会在请求中携带 group_id,服务端会根据 group_id 查询 group_usrs 表,从而获取该用户在该团队空间中的权限,进而判断用户是否有权限执行相应操作。 3.2 文件上传 用户可以通过点击页面的上传按钮然后选择本地文件或拖拽文件/文件夹到企业云盘页面的方式上传文件,除此之外开启备份策略时也会调用上传接口;用户发起上传后,前端会判断文件大小,如果在 10MB 以内则直接上传,否则,对于备份的文件将文件按 10MB 大小分片进行分片上传,其他文件按 5MB 进行分片上传。 所有文件的元数据都保存在 files 表中,该表会记录文件名、文件路径、文件所在空间、文件数据在对象存储中的 key、文件所属用户等信息;所有文件夹的元数据都保存在 folder 表中,该表会记录文件夹的名称、路径、文件夹所在空间、文件夹所属用户等信息。 3.2.1 小文件上传 小文件上传的逻辑如下: 查数据库获取用户及其所在空间的空间信息; 空间用量校验; 查找文件夹,如果文件夹不存在则新建文件夹; 查找文件,构造新 files 记录:如果文件不存在,则使用原始文件名;如果文件已存在,则在文件名后面拼接序号以区别于原文件; 上传文件数据到对象存储; 生成随机字符串作为 file_mark,将第 4 步中的 files 记录插入 files 表。 3.2.2 大文件上传 大文件指采用分片方式上传的文件,文件分片的信息保存在 multi 表中,multi 表会记录分片对应的文件、上传者、分片总数、当前分片编号、upload id 等信息。 大文件分片上传分 3 个步骤: start 阶段 查数据库获取用户及所在空间信息,认证鉴权; 判断文件是否已经存在; 查找文件夹,如果文件夹不存在则新建文件夹; 查找文件,构造新 files 记录:如果文件不存在,则使用原始文件名;如果文件已存在,则在文件名后面拼接序号以区别于原文件; 从对象存储获取用于分片上传的 upload id; 生成随机字符串作为 file_mark,将第 4 步中的 files 记录插入 files 表; 将分片记录插入 multi 表; 将 upload id 返回给客户端,用于后续关联分片;将 file_mark 返回给客户端,用于后续关联文件。 upload 阶段 查数据库获取用户及所在空间信息,认证鉴权; 通过 file_mark 获取文件信息; 通过 upload id 获取文件的分片信息; 为当前分片生成 multi 表记录; 将当前分片数据上传到对象存储; 将第 4 步中的 multi 记录插入 files 表。 complete 阶段 查数据库获取用户及所在空间信息,认证鉴权; 通过 file_mark 获取文件信息; 通过 upload id 获取文件的分片信息; 通知对象存储进行分片合并操作; 删除该文件所有分片记录; 更新目录用量及文件状态。 3.2.3 元数据与对象的对应 以下是使用对象存储 SDK 从对象存储获取对象的示例代码: params := &s3.GetObjectInput{ Bucket: aws.String(
Signed-in readers can open the original source through BestHub's protected redirect.
This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactand we will review it promptly.
vivo Internet Technology
Sharing practical vivo Internet technology insights and salon events, plus the latest industry news and hot conferences.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.
