巧用 JuiceFS Sync 命令跨云迁移和同步数据

近年来,云计算已成为主流,企业从自身利益出发,或是不愿意被单一云服务商锁定,或是业务和数据冗余,或是出于成本优化考虑,会尝试将部分或者全部业务从线下机房迁移到云或者从一个云平台迁移到另一个云平台,业务迁移涉及到数据的迁移。正好 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
  2. Bucket 名:aaa
  3. Endpoint: https://aaa.s3.us-west-1.amazonaws.com
  4. 对象存储 B
  5. Bucket 名:bbb
  6. Endpoint: https://bbb.oss-cn-hangzhou.aliyuncs.com
  7. JuiceFS 文件系统
  8. 元数据存储: redis://10.10.0.8:6379/1
  9. 对象存储: 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 命令跨云迁移和同步数据

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

巧用 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✿)

Original: https://www.cnblogs.com/JuiceData/p/16145379.html
Author: JuiceFS
Title: 巧用 JuiceFS Sync 命令跨云迁移和同步数据

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/612834/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • python_列表

    列表创建 列表类似数组,但是以一对方括号 []作为符号,同时支持-1到-n的下标访问。列表中包含的是元素值的引用 并且,列表中的元素可以不是同一类型的 列表的创建: listNew…

    Linux 2023年6月7日
    0143
  • sublime 3同步编辑线上代码

    1.打开编辑器输入框(Ctrl+Shift+P),并执行 2.回车后输入sftp 3.回车,安装,等待 4.右键项目 5.修改配置信息,保存 Original: https://w…

    Linux 2023年6月7日
    083
  • php发送邮件 (phpmailer)

    1.首先下载phpMailer文件官方文件https://sourceforge.net/projects/phpmailer/; 还有class.smtp.php. 2.去配置一…

    Linux 2023年6月14日
    079
  • 磁盘空间满,如何处理?

    作为运维人员,磁盘空间报警是最寻常遇到的情况,那么遇到空间如何处理呢?这里介绍一下处理办法及处理思路。 操作系统:centos系统 、Ubuntu 1 定位目录 收到空间报警信息,…

    Linux 2023年6月6日
    0103
  • ssh远程连接服务(二)三台虚拟机之间的免密登录

    创建三台虚拟机主机名分别为node01、node02、node03 在node01虚拟机上生成密钥对 然后将生成的公钥分别复制到node02、node03的虚拟机上(前提三台虚拟机…

    Linux 2023年6月7日
    095
  • Nmap 操作手册-完整版

    Nmap – 基础篇 下载Nmap.rpm包 方式一: $ curl -OL https://nmap.org/dist/nmap-7.92-1.x86_64.rpm …

    Linux 2023年6月13日
    096
  • 深入理解linux内核-内存寻址

    逻辑地址:由一个段和偏移量组成的地址线性地址(虚拟地址):物理地址:CPU的物理地址线相对应的地址32或36位 多处理器系统中每个CPU对应一个GDT 局部线程存储:用于线程内部的…

    Linux 2023年6月6日
    078
  • Redis的slot迁移

    1) 在目标节点B 上执行,从节点A 导入slot 到节点B : CLUSTER SETSLOT8 IMPORTING src– A-node-id 对于迁移的slot…

    Linux 2023年5月28日
    069
  • java 连接 redis

    Jedis 导入对应的依赖 redis.clients jedis 4.2.3 com.alibaba fastjson 1.2.79 连接数据库 记得在本地打开 redis //…

    Linux 2023年6月7日
    089
  • 详解 Serverless 架构的 6 大应用场景

    Serverless 架构将成为未来云计算领域重要的技术架构,将会被更多的业务所采纳。进一步深究,Serverless 架构在什么场景下有优秀的表现,在什么场景下可能表现得并不是很…

    Linux 2023年6月8日
    088
  • 没那么简单的单例模式

    作者:小牛呼噜噜 | https://xiaoniuhululu.com计算机内功、JAVA底层、面试相关资料等更多精彩文章在公众号「小牛呼噜噜 」 什么是单例 单例的应用场景 单…

    Linux 2023年6月6日
    0108
  • shell练习:svndiff & change_ip

    在shell中写代码,有些命令比较常用,所以整合到一起来实现一些小功能,笔记一下: 第一个脚本是用来对比SVN中的不同版本的不同,借助了svn自身的命令行工具和vimdiff工具:…

    Linux 2023年5月28日
    091
  • aspx.designer.cs没有自动生成代码(没有自动注册)

    遇到这个问题的最大可能是:aspx页面存在bug。 比如说我的主页是从项目里的别的页面复制过来的,但是少复制了一些引用,页面就存在bug,导致aspx.designer.cs没有自…

    Linux 2023年6月7日
    082
  • Redis分布式锁实战

    背景 目前开发过程中,按照公司规范,需要依赖框架中的缓存组件。不得不说,做组件的大牛对CRUD操作的封装,连接池、缓存路由、缓存安全性的管控都处理的无可挑剔。但是有一个小问题,该组…

    Linux 2023年5月28日
    092
  • Guava中这些Map的骚操作,让我的代码量减少了50%

    Guava是google公司开发的一款Java类库扩展工具包,内含了丰富的API,涵盖了集合、缓存、并发、I/O等多个方面。使用这些API一方面可以简化我们代码,使代码更为优雅,另…

    Linux 2023年6月7日
    0112
  • Redis分布式锁的使用与实现原理

    模拟一个电商里面下单减库存的场景。1.首先在redis里加入商品库存数量。 2.新建一个Spring Boot项目,在pom里面引入相关的依赖。 <dependency&gt…

    Linux 2023年5月28日
    0108
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球