近年来,云计算已成为支流,企业从本身利益登程,或是不违心被繁多云服务商锁定,或是业务和数据冗余,或是出于老本优化思考,会尝试将局部或者全副业务从线下机房迁徙到云或者从一个云平台迁徙到另一个云平台,业务迁徙波及到数据的迁徙。正好 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
是存储类型,比方s3
、oss
。详情查看所有反对的存储服务ACCESS_KEY
和SECRET_KEY
是对象存储的 API 拜访密钥BUCKET[.ENDPOINT]
是对象存储的拜访地址PREFIX
是可选的,限定要同步的目录名前缀。
以下是一个 Amazon S3 对象存储的地址范例:
s3://ABCDEFG:HIJKLMN@myjfs.s3.us-west-1.amazonaws.com
特地地,SRC
和 DST
如果以 /
结尾将被视为目录,例如:movies/
。没有以 /
结尾则会被视为「前缀」,将依照前缀匹配的规定进行匹配,例如,当前目录下有 test
和 text
两个目录,应用以下命令能够将它们同步到指标门路 ~/mnt/
:
juicefs sync ./te ~/mnt/te
应用这种形式,sync
命令会以 te
前缀匹配以后门路下所有蕴含该前缀的目录或文件,即 test
和 text
。而指标门路 ~/mnt/te
中的 te
也是前缀,它会替换所有同步过去的目录和文件的前缀,在此示例中是将 te
替换为 te
,即放弃前缀不变。如果调整指标门路的前缀,例如将指标前缀改为 ab
:
juicefs sync ./te ~/mnt/ab
指标门路中同步来的 test
目录名会变成 abst
,text
会变成 abxt
。
资源清单
这里假如有以下存储资源:
-
对象存储 A <span id=”bucketA” />
- Bucket 名:aaa
- Endpoint:
https://aaa.s3.us-west-1.amazonaws.com
-
对象存储 B <span id=”bucketB” />
- Bucket 名:bbb
- Endpoint:
https://bbb.oss-cn-hangzhou.aliyuncs.com
-
JuiceFS 文件系统 <span id=”bucketC” />
- 元数据存储:
redis://10.10.0.8:6379/1
- 对象存储:
https://ccc-125000.cos.ap-beijing.myqcloud.com
- 元数据存储:
所有存储的 拜访密钥 均为:
- ACCESS_KEY:
ABCDEFG
- SECRET_KEY:
HIJKLMN
对象存储与 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
选项开启遇到符号链时同步其本身而不是其指向的对象的性能。同步后的符号链接指向的门路为源符号链接中存储的原始门路,无论该门路在同步前后是否可达都不会被转换。
另外须要留神的几个细节
- 符号链接本身的
mtime
不会被拷贝; --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.20
和 tom@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✿)