Skip to main content

跨区数据复制

JuiceFS 支持跨云跨区的数据复制,可以用异步数据复制的方式,将数据同步到另一个区域或者其它云服务的对象存储。

为叙述方便,我们下面将创建文件系统时指定的对象存储区域称作「主要区域」。启用数据复制需要为文件系统再指定一个「目标区域」,可以与主要区域是同一个云服务商,也可以不同。

适用场景

该功能适用于以下场景:

  • 跨地域数据共享:如果文件系统需要在两个地域访问,可以用数据复制功能将对象存储桶实时、异步地拷贝到另一个区域。如此一来,跨区挂载 JuiceFS 也能享受到更好的对象存储性能。需要注意的是,如果区域之间网络延迟过大,那么目标区域的元数据访问性能可能不佳,此时还需要考虑部署「镜像文件系统」来进一步提升元数据性能;
  • 镜像文件系统的数据复制:通常来说,如果部署了镜像文件系统,并且镜像区域也使用当地的对象存储桶,则应当在镜像文件系统启用数据复制功能,而不是在源文件系统开启数据复制,这点在下方「工作原理」详细介绍;
  • 对象存储服务灾备:如果主要区域的对象存储服务发生故障,可以手动切换到目标区域的对象存储(修改 --bucket 选项,并重新挂载客户端),就能在短时间内恢复服务;
  • 平滑迁移对象存储服务:如果需要变更某个文件系统底层的对象存储服务,可以使用该功能实现同时写入两个桶,从而实现平滑迁移。

目前而言,数据复制功能仅支持「一对一」复制关系,无法进行「一对多」复制。如果确实需要将数据同步到多个区域,考虑使用 juicefs sync 进行数据搬运,或者用镜像功能来实现一对多的复制关系。

工作原理

以主要区域写入,目标区域读取为例,数据复制的工作方式如下图所示:

replication

在图中所示的两个区域,各地的客户端都会访问同一个元数据服务,可读可写。具体而言:

  • 对于文件写入,会优先写到当前区域的对象存储,成功后则认为数据写入完成,再异步复制到远端的对象存储。
  • 读数据时,也会优先从当前区域的对象存储,如果不存在(还未同步完成),则会从远端区域的对象存储读取,此时性能会受影响。推荐根据使用场景来进行缓存调优

对于镜像文件系统场景,数据复制的原理有所区别(如下图所示):镜像区域的客户端,会通过订阅元数据变更的方式,在后台任务进行数据异步复制。作为对比,非镜像场景下的数据复制,则是主要区域的客户端发起写入时,就异步写入目标区域的对象存储桶。基于这个区别,如果镜像区域参与数据同步的客户端数量不足、导致同步不及时,也可以增加挂载点数量来加速同步。

mirror-replication

考虑到一定是先有「源」文件系统,才能创建镜像,因此在镜像场景如果要开启数据复制,应当在镜像文件系统的设置启用数据复制功能,而不是在源文件系统开启数据复制,因为:

  • 如果通过在源文件系统开启数据复制功能,那么为了同步所有的数据变更,所有的挂载点都必须调整挂载参数,增加 --access-key2--secret-key2 参数,对于已经投产的大规模集群,批量调整参数和重新挂载的操作成本很大;
  • 一个文件系统可能会在多个区域部署镜像,形成「一对多」的数据复制关系。考虑到 JuiceFS 数据复制功能只允许「一对一」,因此无法通过在源文件系统开启数据复制功能,来实现一对多的数据复制。从这个角度来讲,也必须在镜像一侧使用数据复制,才能实现「一对多」的复制关系。

启用数据复制

打开 JuiceFS 控制台,在文件系统的「设置」页面可以启用数据复制,选择一个目标云服务和区域,保存设置之后,所有客户端都需要重新认证、重新挂载,数据复制才会全局生效。之所以强调所有客户端都需要重新挂载,是因为数据复制是在客户端实时异步触发的,每一次写入都会将数据修改同步到目标桶。因此如果存在某些参与写入的客户端并未追加双桶配置,那么它们的写入就不会进行实时同步。

具体而言,需要执行的命令示范如下(请根据你的具体环境调整):

# 调整认证参数,增加第二桶的配置
juicefs auth myjfs --access-key=xxx --secret-key=xxx --access-key2=xxx --secret-key2=xxx

# 平滑重新挂载、让数据复制生效
juicefs mount myjfs /jfs

对于 CSI 驱动,原理也是一样的,需要在「文件系统认证信息」追加相关参数,配置会在新的 Mount Pod 中生效。

数据一致性

因为两个区都是使用同一个元数据服务,因此在元数据方面有强一致性保证。只是目标区域客户端的元数据延迟更大,因此性能有所降低,可以引入「镜像文件系统」来提高元数据访问性能。

而至于对象存储桶的数据一致性,首先 JuiceFS 在对象存储中的数据块都是不可变对象,一旦创建不会进行修改。为文件系统启用数据复制功能以后(客户端以「双桶」模式挂载),创建好的对象,会经由异步数据复制功能拷贝到目标区域。再配合元数据一致性,在主要区域读不到的数据块,会退而访问主要区域(也就是 --bucket2),因此保证跨区访问的数据一致性。

除了实时的增量同步外,客户端还会定期(每周一次)执行全量、双向的数据同步,主要桶和目标桶之间会保持最终一致性。

计费方式

跨区数据复制功能向所有用户免费提供。启用之后不产生额外的元数据,因此对 JuiceFS 产生的费用没有影响,你只需要关注在对象存储服务提供商产生的费用。需要注意,镜像文件系统功能是收费的,不应与数据复制功能混淆。