近年来,云计算已成为主流,企业从自身利益出发,或是不愿意被单一云服务商锁定,或是业务和数据冗余,或是出于成本优化考虑,会尝试将部分或者全部业务从线下机房迁移到云或者从一个云平台迁移到另一个云平台,业务迁移涉及到数据的迁移。正好 JuiceFS 已经对接了各种对象存储的 API ,也实现了数据同步的逻辑,让我们来了解下 JuiceFS 的 sync 命令。

什么是 JuiceFS Sync

JuiceFS 的 sync 子命令是功能完整的数据同步实用工具,可以在所有 JuiceFS 支持的对象存储之间多线程并发同步或迁移数据,既支持在「对象存储」与「JuiceFS」之间迁移数据,也支持在「对象存储」与「对象存储」之间跨云跨区迁移数据。与 rsync 类似,除了对象存储也支持同步本地目录、通过 SSH 访问远程目录、HDFS、WebDAV 等,同时提供全量同步、增量同步、条件模式匹配等高级功能。

基本用法

命令格式

juicefs sync [command options] SRC DST

即把 SRC 同步到 DST,既可以同步目录,也可以同步文件。

其中:

  • SRC 代表数据源地址及路径
  • DST 代表目标地址及路径
  • [command options] 代表可选的同步选项,详情查看命令参考

地址格式均为 [NAME://][ACCESS_KEY:SECRET_KEY@]BUCKET[.ENDPOINT][/PREFIX]

其中:

  • NAME 是存储类型,比如 s3oss。详情查看所有支持的存储服务
  • ACCESS_KEYSECRET_KEY 是对象存储的 API 访问密钥
  • BUCKET[.ENDPOINT] 是对象存储的访问地址
  • PREFIX 是可选的,限定要同步的目录名前缀。

以下是一个 Amazon S3 对象存储的地址范例:

s3://ABCDEFG:HIJKLMN@myjfs.s3.us-west-1.amazonaws.com

特别地,SRCDST 如果以 / 结尾将被视为目录,例如:movies/。没有以 / 结尾则会被视为「前缀」,将按照前缀匹配的规则进行匹配,例如,当前目录下有 testtext 两个目录,使用以下命令可以将它们同步到目标路径 ~/mnt/

juicefs sync ./te ~/mnt/te

使用这种方式,sync 命令会以 te 前缀匹配当前路径下所有包含该前缀的目录或文件,即 testtext。而目标路径 ~/mnt/te 中的 te 也是前缀,它会替换所有同步过来的目录和文件的前缀,在此示例中是将 te 替换为 te,即保持前缀不变。如果调整目标路径的前缀,例如将目标前缀改为 ab

juicefs sync ./te ~/mnt/ab

目标路径中同步来的 test 目录名会变成 absttext 会变成 abxt

资源清单

这里假设有以下存储资源:

  1. 对象存储 A

    • Bucket 名:aaa
    • Endpoint:https://aaa.s3.us-west-1.amazonaws.com
  2. 对象存储 B

    • Bucket 名:bbb
    • Endpoint:https://bbb.oss-cn-hangzhou.aliyuncs.com
  3. JuiceFS 文件系统

    • 元数据存储:redis://10.10.0.8:6379/1
    • 对象存储:https://ccc-125000.cos.ap-beijing.myqcloud.com

所有存储的访问密钥均为:

  • ACCESS_KEYABCDEFG
  • SECRET_KEYHIJKLMN

对象存储与 JuiceFS 之间同步

将 对象存储 A 的 movies 目录同步到 JuiceFS 文件系统:

# 挂载 JuiceFS
sudo juicefs mount -d redis://10.10.0.8:6379/1 /mnt/jfs
# 执行同步
juicefs sync s3://ABCDEFG:HIJKLMN@aaa.s3.us-west-1.amazonaws.com/movies/ /mnt/jfs/movies/

将 JuiceFS 文件系统的 images 目录同步到 对象存储 A:

# 挂载 JuiceFS
sudo juicefs mount -d redis://10.10.0.8:6379/1 /mnt/jfs
# 执行同步
juicefs sync /mnt/jfs/images/ s3://ABCDEFG:HIJKLMN@aaa.s3.us-west-1.amazonaws.com/images/

对象存储与对象存储之间同步

将对象存储 A的全部数据同步到对象存储 B:

juicefs sync s3://ABCDEFG:HIJKLMN@aaa.s3.us-west-1.amazonaws.com oss://ABCDEFG:HIJKLMN@bbb.oss-cn-hangzhou.aliyuncs.com

高级用法

增量同步与全量同步

sync 命令默认以增量同步方式工作,即先对比源路径与目标路径之间的差异,然后仅同步有差异的部分。可以使用 --update-u 选项更新文件的 mtime

如需全量同步,即不论目标路径上是否存在相同的文件都重新同步,可以使用 --force-update-f。例如,将对象存储 A 的 movies 目录全量同步到 JuiceFS 文件系统:

# 挂载 JuiceFS
sudo juicefs mount -d redis://10.10.0.8:6379/1 /mnt/jfs
# 执行全量同步
juicefs sync --force-update s3://ABCDEFG:HIJKLMN@aaa.s3.us-west-1.amazonaws.com/movies/ /mnt/jfs/movies/

模式匹配

sync 命令的模式匹配功能跟 rsync 类似,可以通过规则排除或包含某类文件,并通过多个规则的组合实现任意集合的同步,规则如下:

  • / 结尾的模式会仅匹配目录,否则会匹配文件、链接或设备;
  • 包含 *?[ 字符时会以通配符模式匹配,否则按照常规字符串匹配;
  • * 匹配任意非空路径组件,在 / 处停止匹配;
  • ? 匹配除 / 外的任意字符;
  • [ 匹配一组字符集合,例如 [a-z][[:alpha:]]
  • 在通配符模式中,反斜杠可以用来转义通配符,但在没有通配符的情况下,会按字面意思匹配;
  • 始终以模式作为前缀递归匹配。

排除文件/目录

使用 --exclude 选项设置要排除的目录或文件。例如,将 JuiceFS 文件系统完整同步到对象存储 A,但不同步隐藏的文件和文件夹:

在 Linux 系统中所有以 . 开始的名称均被视为隐藏文件

# 挂载 JuiceFS
sudo juicefs mount -d redis://10.10.0.8:6379/1 /mnt/jfs
# 完整同步,排除隐藏文件和目录
juicefs sync --exclude '.*' /mnt/jfs/ s3://ABCDEFG:HIJKLMN@aaa.s3.us-west-1.amazonaws.com/

可以重复该选项匹配更多规则,例如,排除所有隐藏文件、pic/ 目录 和 4.png 文件:

juicefs sync --exclude '.*' --exclude 'pic/' --exclude '4.png' /mnt/jfs/ s3://ABCDEFG:HIJKLMN@aaa.s3.us-west-1.amazonaws.com

包含文件/目录

使用 --include 选项设置要包含(不被排除)的目录或文件,例如,只同步 pic/4.png 两个文件,其他文件都排除:

juicefs sync --include 'pic/' --include '4.png' --exclude '*' /mnt/jfs/ s3://ABCDEFG:HIJKLMN@aaa.s3.us-west-1.amazonaws.com

在使用包含/排除规则时,位置在前的选项优先级更高。--include 应该排在前面,如果先设置 --exclude '*' 排除了所有文件,那么后面的 --include 'pic/' --include '4.png' 包含规则就不会生效。

多线程和带宽限制

JuiceFS sync 默认启用 10 个线程执行同步任务,可以根据需要设置 --thread 选项调大或减少线程数。

另外,如果需要限制同步任务占用的带宽,可以设置 --bwlimit 选项,单位 Mbps,默认值为 0 即不限制。

目录结构与文件权限

默认情况下,sync 命令只同步文件对象以及包含文件对象的目录,空目录不会被同步。如需同步空目录,可以使用 --dirs 选项。

另外,在 local、sftp、hdfs 等文件系统之间同步时,如需保持文件权限,可以使用 --perms 选项。

拷贝符号链接

JuiceFS sync本地目录之间同步时,支持通过设置 --links 选项开启遇到符号链时同步其自身而不是其指向的对象的功能。同步后的符号链接指向的路径为源符号链接中存储的原始路径,无论该路径在同步前后是否可达都不会被转换。

另外需要注意的几个细节

  1. 符号链接自身的 mtime 不会被拷贝;
  2. --check-new--perms 选项的行为在遇到符号链接时会被忽略。

多机并发同步

本质上在两个对象存储之间同步数据就是从一端拉取数据再推送到另一端,如下图所示,同步的效率取决于客户端与云之间的带宽。

在同步大量数据时,单机带宽往往会被占满出现瓶颈,针对这种情况,JuiceFS Sync 提供多机并发同步支持,如下图。

Manager 作为主控执行 sync 命令,通过 --worker 参数定义多个 Worker 主机,JuiceFS 会根据 Worker 的总数量,动态拆分同步的工作量并分发给各个主机同时执行。即把原本在一台主机上处理的同步任务量拆分成多份,分发到多台主机上同时处理,单位时间内能处理的数据量更大,总带宽也成倍增加。

在配置多机并发同步任务时,需要提前配置好 Manager 主机到 Worker 主机的 SSH 免密登陆,确保客户端和任务能够成功分发到 Worker。

Manager 会将 JuiceFS 客户端程序分发到 Worker 主机,为了避免客户端的兼容性问题,请确保 Manager 和 Worker 使用相同类型和架构的操作系统。

例如,将对象存储 A 同步到对象存储 B,采用多主机并行同步:

juicefs sync --worker bob@192.168.1.20,tom@192.168.8.10 s3://ABCDEFG:HIJKLMN@aaa.s3.us-west-1.amazonaws.com oss://ABCDEFG:HIJKLMN@bbb.oss-cn-hangzhou.aliyuncs.com

当前主机与两个 Worker 主机 bob@192.168.1.20tom@192.168.8.10 将共同分担两个对象存储之间的数据同步任务。

如果 Worker 主机的 SSH 服务不是默认的 22 号端口,请在 Manager 主机通过 .ssh/config 配置文件设置 Worker 主机的 SSH 服务端口号。

场景应用

数据异地容灾备份

异地容灾备份针对的是文件本身,因此应将 JuiceFS 中存储的文件同步到其他的对象存储,例如,将 JuiceFS 文件系统中的文件同步到对象存储 A:

# 挂载 JuiceFS
sudo juicefs mount -d redis://10.10.0.8:6379/1 /mnt/jfs
# 执行同步
sudo juicefs sync /mnt/jfs/ s3://ABCDEFG:HIJKLMN@aaa.s3.us-west-1.amazonaws.com/

同步以后,在对象存储 A中可以直接看到所有的文件。

建立 JuiceFS 数据副本

与面向文件本身的容灾备份不同,建立 JuiceFS 数据副本的目的是为 JuiceFS 的数据存储建立一个内容和结构完全相同的镜像,当使用中的对象存储发生了故障,可以通过修改配置切换到数据副本继续工作。需要注意这里仅复制了 JuiceFS 文件系统的数据,并没有复制元数据,元数据引擎的数据备份依然需要。

这需要直接操作 JucieFS 底层的对象存储,将它与目标对象存储之间进行同步。例如,要把对象存储 B 作为 JuiceFS 文件系统的数据副本:

juicefs sync cos://ABCDEFG:HIJKLMN@ccc-125000.cos.ap-beijing.myqcloud.com oss://ABCDEFG:HIJKLMN@bbb.oss-cn-hangzhou.aliyuncs.com

同步以后,在对象存储 B 中看到的与 JuiceFS 使用的对象存储中的内容和结构完全一样。

如有帮助的话欢迎关注我们项目 Juicedata/JuiceFS 哟! (0ᴗ0✿)

巧用 JuiceFS Sync 命令跨云迁移和同步数据的更多相关文章

  1. redis跨实例迁移 & redis上云

    1)redis跨实例迁移--源实例db11迁移至目标实例db30 root@fe2e836e4470:/data# redis-cli -a pwd1 -n 11 keys \* |while rea ...

  2. 使用 Velero 跨云平台迁移集群资源到 TKE

    概述 Velero 是一个非常强大的开源工具,可以安全地备份和还原,执行灾难恢复以及迁移Kubernetes群集资源和持久卷,可以在 TKE 平台上使用 Velero 备份.还原和迁移集群资源,关于如 ...

  3. 从阿里云迁移分布式redis实例到华为云解决方案(详细)

    如果要换多数是经济因素啦- 一. 准备工作 先在华为云上买一台redis数据库,配置一定要注意多数要保持一致,至于4.0还是5.0倒问题不大亲测兼容 可用区要找现有ECS云主机中的相同的机器.记下:这 ...

  4. Clusternet:一款开源的跨云多集群云原生管控利器!

    作者 徐迪,Clusternet 项目发起人,腾讯云容器技术专家. 摘要 Clusternet (Cluster Internet)是一个兼具多集群管理和跨集群应用编排的开源云原生管控平台,解决了跨云 ...

  5. 跨云应用部署第一步:使用IPSEC VPN连接AWS中国版和Windows Azure中国版

    随着公有云的普及,越来越多的客户将关键应用迁移到云端.但是事实证明,没有哪家云服务提供商可以提供100%的SLA,无论是例行维护还是意外中断服务,对于客户的关键应用而言,都会受到不同程度的影响.此外, ...

  6. redis 迁移工具 redis-port 从阿里云迁移到aws

    对于 redis 的 迁移我在网上看到了很多方法,有使用redis-dump 的,有使用 aof导入方式,有rdb文件迁移方式,和redis-port. 由于我是将  redis  从阿里云迁移到AW ...

  7. 利用Snapshot快速跨Region迁移服务器

    当你需要对现有的网站进行跨区域迁移,或者是部署DR Site的时候,又不希望重新部署应用,有什么好办法呢?其实你可以利用Azure的磁盘snapshot进行磁盘级的复制,这样可以减少很多部署应用的时间 ...

  8. 虚拟化学习笔记-KVM虚拟化跨机迁移原理

    参考:https://zhuanlan.zhihu.com/p/27055555 在线迁移过程划分为三个阶段:准备阶段.迁移阶段和切换阶段.迁移环境为虚拟化底层KVM+Qemu.虚拟化管理Libvir ...

  9. 跨云厂商部署 k3s 集群

    原文链接:https://fuckcloudnative.io/posts/deploy-k3s-cross-public-cloud/ 最近一两年各大云服务商都出了各种福利活动,很多小伙伴薅了一波又 ...

随机推荐

  1. Serialzers 序列化组件

    Serialzers 序列化组件 前言 当做前后端分离的项目时,JSON是一个轻量级的数据交互格式.所有我们给前端数据的时候都要转成json格式,那就需要对我们从数据库拿到数据进行序列化 Django ...

  2. springcloud学习01-用intellij idea搭建Eureka服务

    0.配置intellij idea工具:https://www.cnblogs.com/wang-liang-blogs/p/12060702.html 1.使用maven构建工具构建主工程项目. 1 ...

  3. R数据分析:纵向分类结局的分析-马尔可夫多态模型的理解与实操

    今天要给大家分享的统计方法是马尔可夫多态模型,思路来源是下面这篇文章: Ward DD, Wallace LMK, Rockwood K Cumulative health deficits, APO ...

  4. linklist template

    #include <iostream.h> typedef int ElemType; typedef struct LNode { ElemType data; struct LNode ...

  5. 什么是B树(B-树)?

    写在开头:B-树,就是B树.因B树的英文名称为B-tree ,B-树因此而来,有人会误以为B-树是一种树,而B树又是另外一种树.实际上,B-tree就是指的B树. 而且B-树不可以读成B减树... 一 ...

  6. 为什么要使用 rabbitmq?

    (1)在分布式系统下具备异步,削峰,负载均衡等一系列高级功能; (2)拥有持久化的机制,进程消息,队列中的信息也可以保存下来. (3)实现消费者和生产者之间的解耦. (4)对于高并发场景下,利用消息队 ...

  7. springBoot集成Elasticsearch抛出Factory method 'restHighLevelClient' threw exception; nested exception is java.lang.NoSuchFieldError: IGNORE_DEPRECATIONS

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'restHighLeve ...

  8. 如何在网上找java包

    如图所示 在java api后面输入你要找包的名称就可以了

  9. 为什么 Java 中的 String 是不可变的(Immutable)?

    Java 中的 String 不可变是因为 Java 的设计者认为字符串使用非常频繁,将字 符串设置为不可变可以允许多个客户端之间共享相同的字符串.

  10. 电源PCB布板的10个基本法则

    电容模型 电容并联高频特性 电感模型 电感特性 镜象面概念 高频交流电流环路 过孔 (VIA) 的例子 PCB板层分割 降压式(BUCK)电源:功率部分电流和电压波形 降压式电源排版差的例子 电路等效 ...