有奖捉虫:行业应用 & 管理与支持文档专题 HOT

功能说明

GooseFS-Lite 工具支持将对象存储(Cloud Object Storage,COS)存储桶挂载到本地,像使用本地文件系统一样直接操作腾讯云对象存储中的对象,相比于 COSFS 工具,GooseFS-Lite 可提供更高的大文件读写速度,不受本地磁盘的性能限制。GooseFS-Lite 支持 POSIX 文件系统的主要功能,例如文件顺序/随机读,顺序写、目录操作等功能。

局限性

GooseFS-Lite 仅适合挂载后对文件进行简单的管理,不支持本地文件系统的一些功能用法。请注意以下不适用的场景:
不支持对文件进行随机写和 truncate 操作。
多个客户端挂载同一个 COS 存储桶时,依赖用户自行协调多个客户端的行为。例如避免多个客户端写同一个文件等。
文件/文件夹的 rename 操作非原子操作。
不支持读取和 rename 当前挂载点正在写入的文件。
元数据操作。例如 list directory,性能较差,因为需要远程访问 COS 服务器。
不支持 soft/hard link。
追加写性能较差,涉及服务端数据拷贝和下载被追加文件。
不适合 rsync,如果有数据同步需求,直接 cp 即可。
注意:
外网挂载和非低频存储的追加写操作,会产生下载流量费用。

使用环境

JDK 11。
Linux 系统:libfuse 2.9.3及以上。

使用方法

步骤1:安装依赖

CentOS/TLinux 系列
yum install -y fuse-devel java-11-openjdk-devel fuse
Ubuntu/Debian 系列
apt install -y libfuse-dev openjdk-11-jdk fuse
如果不希望修改默认 Java 环境,可以参考此文档 手动安装KonaJDK(强烈建议)。

步骤2:下载 GooseFS-Lite 安装包

目前最新版本为1.0.4,请按照以下步骤安装使用。
1. 获取 GooseFS-Lite 安装包。执行时可以将版本号替换为公开的版本号,如1.0.4,命令如下:
curl -LO https://downloads.tencentgoosefs.cn/goosefs-lite/goosefs-lite-1.0.4.tar.gz
2. 获取 GooseFS-Lite 的 Md5 文件。执行时可以将版本号替换为公开的版本号,如1.0.4,命令如下:
curl -LO https://downloads.tencentgoosefs.cn/goosefs-lite/goosefs-lite-1.0.4-md5.txt
3. 验证文件的完整性。执行时可以将版本号替换为公开的版本号,如1.0.4,命令如下:
md5sum --check goosefs-lite-1.0.4-md5.txt
执行以上三步后,当看到如下图所示,则表示文件完整性验证通过。
?

步骤3:解压 GooseFS-Lite 安装包

执行时可以将版本号替换为公开的版本号,如1.0.4,命令如下:
tar -xvf goosefs-lite-1.0.4.tar.gz

步骤4:初始化

goosefs-lite 软链接(In)到 /usr/bin/goosefs-lite,方便后续可以直接使用 goosefs-lite 命令,而不需要进入到 goosefs-lite 目录。使用 sudo 或者 root 用户执行如下命令。
sudo bash bin/init.sh
执行结果如下图所示:
?
?
备注:部分较老的操作系统(如CentOS6),可能出现 jemalloc 库编译失败的问题。对于64GB内存以内的机器,可以通过在 bin/goosefs-lite 的第二行加入export GOOSEFS_DISABLE_CALLOC=true 跳过此错误。对于64GB 内存以上的机器,建议升级 gcc 版本,重新编译。

步骤5:配置密钥文件

进入 goosefs-lite-${version} 目录下,修改配置文件 conf/core-site.xml (配置参数可以参考 Hadoop工具);执行时可以将版本号替换为公开的版本号,如1.0.4,示例如下:
?
?
?
将 fs.cosn.userinfo.secretKey 配置为腾讯云密钥 Key。
将 fs.cosn.userinfo.secretId 配置为腾讯云密钥 ID。
将 fs.cosn.bucket.region 配置为存储桶地域。
注意:
建议用户尽量避免在配置中使用永久密钥,采取配置子账号密钥或者临时密钥的方式有助于提升业务安全性。为子账号授权时建议按需授权子账号可执行的操作和资源,避免发生预期外的数据泄露。
如果您一定要使用永久密钥,建议对永久密钥的权限范围进行限制,可通过限制永久密钥的可执行操作、资源范围和条件(访问 IP 等),提升使用安全性。
示例:
<configuration>
<!--账户的 API 密钥信息。可登录 [访问管理控制台](https://console.cloud.tencent.com/capi) 查看云 API 密钥。-->
<!--建议使用子账号密钥或者临时密钥的方式完成配置,提升配置安全性。为子账号授权时建议按需授权子账号可执行的操作和资源-->
<property>
<name>fs.cosn.impl</name>
<value>org.apache.hadoop.fs.CosFileSystem</value>
</property>
<property>
<name>fs.cosn.userinfo.secretId</name>
<value>******</value>
</property>
<property>
<name>fs.cosn.userinfo.secretKey</name>
<value>****</value>
</property>
<property>
<name>fs.cosn.bucket.region</name>
<value>ap-guangzhou</value>
</property>
<property>
<name>fs.cosn.read.ahead.queue.size</name>
<value>6</value>
</property>
<property>
<name>fs.cosn.upload_thread_pool</name>
<value>32</value>
</property>
<property>
<name>fs.cosn.tmp.dir</name>
<value>/data/goosefs-lite-tmp/</value>
</property>
<property>
<name>fs.cosn.posix_extension.enabled</name>
<value>false</value>
</property>
<property>
<name>fs.cosn.posix_extension.tmp.dir.quota</name>
<value>10737418240</value>
</property>
<property>
<name>fs.cosn.filestatus.list.recursive.enabled</name>
<value>true</value>
</property>
?
</configuration>
如果您挂载的是 元数据加速 存储桶,则需要您先对元数据加速存储桶进行如下配置:
1. 性能配置 > HDFS 权限配置 > HDFS 用户配置,添加超级用户,例如 root。
2. 性能配置 > HDFS 权限配置 > HDFS 权限配置,添加访问 COS 存储桶的 VPC 和 IP 地址信息。
3. 在本机执行如下命令,添加 hadoop 用户和 supergroup 组。
useradd hadoop
groupadd supergroup
4. 修改配置信息:
<configuration>
<!--账户的 API 密钥信息。可登录 [访问管理控制台](https://console.cloud.tencent.com/capi) 查看云 API 密钥。-->
<!--建议使用子账号密钥或者临时密钥的方式完成配置,提升配置安全性。为子账号授权时建议按需授权子账号可执行的操作和资源-->
<property>
<name>fs.cosn.impl</name>
<value>org.apache.hadoop.fs.CosFileSystem</value>
</property>
<property>
<name>fs.cosn.userinfo.secretId</name>
<value>AKIDnQxxxxx</value>
</property>
<property>
<name>fs.cosn.userinfo.secretKey</name>
<value>YYYY</value>
</property>
<property>
<name>fs.cosn.bucket.region</name>
<value>ap-guangzhou</value>
</property>
<property>
<name>fs.cosn.trsf.fs.ofs.bucket.region</name>
<value>ap-guangzhou</value>
</property>
<property>
<name>fs.cosn.trsf.fs.ofs.plugin.info.log</name>
<value>true</value>
</property>
<property>
<name>fs.cosn.trsf.fs.ofs.user.appid</name>
<value>1250000000</value>
</property>
<property>
<name>fs.cosn.trsf.fs.ofs.tmp.cache.dir</name>
<value>/data/tmp/ofs</value>
</property>
</configuration>

步骤6:运行工具

执行如下命令,将密钥文件中配置的存储桶挂载到指定目录:
./bin/goosefs-lite mount <MountPoint> cosn://<BucketName>/
其中:
<MountPoint> 为本地挂载目录(例如 /mnt/goosefs-lite-mnt-dir)。
<BucketName> 为存储桶名称(例如 examplebucket-1250000000)。
示例:
mkdir -p /mnt/goosefs-lite-mnt
./bin/goosefs-lite mount /mnt/goosefs-lite-mnt/ cosn://examplebucket-1250000000/
查看本地挂载点和对应的 COS 存储桶,输出信息依次为进程 ID、本地挂载点和 COS 路径:
$ ./bin/goosefs-lite stat
pid mount_point cos_path
13815 /mnt/goosefs-lite-mnt/ cosn://examplebucket-1250000000/
如果您需要在命令行中,同时指定多个挂载参数,可以使用逗号分隔多个参数,例如,下面的命令设置挂载点只读,且允许除其他用户访问挂载点:
./bin/goosefs-lite mount -o"ro,allow_other" mnt/ cosn://examplebucket-1250000000/
其中:
-oallow_other:如果要允许其他用户访问挂载文件夹,可以在运行 GooseFS-Lite 的时候指定该参数。
-oro:将挂载点设置为只读,不允许写入和删除操作。
说明:
单个参数可通过 -o 指定,例如 -oro;多个参数可通过逗号分割,例如 -o"ro,allow_other"

步骤7:卸载存储桶

卸载存储桶示例:
$./bin/goosefs-lite umount /mnt/goosefs-lite-mnt
Unmount fuse at /mnt/goosefs-lite-mnt/ (PID: 17206).
?
# 异常情况卸载
# 1. 通过下面命令找到对应挂载点的PID
ps aux | grep lite | grep /mount_point
# 2. 将进程kill -9
# 3. umount -l /mount_point
# 备注:第3步需要root权限
?

步骤8:参数调优

GooseFS-Lite 包含两个配置文件,分别为 conf/core-site.xml 及 conf/goosefs-lite.properties。 您可以通过修改 conf/core-site.xml 调优上传下载带宽。常用参数如下,更多参数可参见 Hadoop-COS 文档。
属性键
说明
默认值
必填项
fs.cosn.useHttps
配置是否使用 HTTPS 作为与 COS 后端的传输协议。
true
fs.cosn.upload.part.size
分块上传的每个 part size 的大小。由于 COS 的分块上传最多只能支持10000块,因此需要预估最大可能使用到的单文件大小。 例如,part size 为8MB时,最大能够支持78GB的单文件上传。 part size 最大可以支持到2GB,即单文件最大可支持19TB。
8388608(8MB)
fs.cosn.upload_thread_pool
文件流式上传到 COS 时,并发上传的线程数目。
10
fs.cosn.read.ahead.block.size
预读块的大小。
1048576(1MB)
fs.cosn.read.ahead.queue.size
预读队列的长度。
8
fs.cosn.trsf.fs.ofs.tmp.cache.dir
元数据加速存储桶的临时文件目录。
fs.cosn.trsf.fs.ofs.user.appid
元数据加速存储桶的 Appid。
fs.cosn.trsf.fs.ofs.bucket.region
元数据加速存储桶所在的地域,如 ap-shanghai,ap-beijing。
您可以通过修改 conf/goosefs-lite.properties 对 GooseFS-Lite 的行为进行调整。常用参数如下:
属性
说明
默认值
必填项
goosefs.fuse.list.entries.cache.enabled
是否开启客户端 List 缓存
true
goosefs.fuse.list.entries.cache.max.size
客户端 List 最大缓存的条目数,单位:条
100000
goosefs.fuse.list.entries.cache.max.expiration.time
客户端 List 缓存的有效时间,单位:ms
15000
goosefs.fuse.async.release.max.wait.time
open 和 rename 操作的文件正在被写入时,等待写入操作完成的时间,单位:ms
5000
goosefs.fuse.umount.timeout
卸载文件系统时,等待未完成操作的时间,单位:ms
120000
当您的读取和写入并发度较大,您可以通过如下方式,调整 GooseFS-Lite 最大 JVM 运行内存,避免 FullGC 和 OutOfMemoryError。JVM 默认值为 -Xms2G -Xmx2G -XX:MaxDirectMemorySize=1G -XX:+UseG1GC -XX:G1HeapRegionSize=32m,调整方式如下:
export JAVA_OPTS=" -Xms2G -Xmx4G -XX:MaxDirectMemorySize=1G -XX:+UseG1GC -XX:G1HeapRegionSize=32m"
./bin/goosefs-lite mount /mnt/goosefs-lite-mnt/ cosn://examplebucket-1250000000/
# 查看进程
ps -ef|grep goosefs-lite|grep -v grep

常见问题

缺少 libfuse 库文件,如何处理?

?
img
?
?
需要安装 libfuse,请参照以下方式进行操作:
方式一
1. 执行如下命令,安装 fuse-devel。
如果是 CentOS 或者 TencentOS 系统,执行如下命令:
yum install fuse-devel
如果是 Ubuntu 系统,执行如下命令:
apt install libfuse-dev
2. 安装完成后,执行如下命令,查看安装是否成功。
find / -name libfuse.so*
方式二 更新旧版本 libfuse.so.2.9.2,安装步骤如下:
说明:
CentOS 7默认安装的是 libfuse.so.2.9.2。
1. 下载 libfuse 源码,并编译生成 libfuse.so.2.9.7。
tar -zxvf fuse-2.9.7.tar.gz
cd fuse-2.9.7/ && ./configure && make && make install
echo -e '\\n/usr/local/lib' >> /etc/ld.so.conf
ldconfig
2. 编译及生成 libfuse.so.2.9.7 后,可按照以下步骤进行替换:
2.1 执行以下命令,查找旧版本 libfuse.so.2.9.2 库链接。
find / -name libfuse.so*
2.2 执行以下命令,将 libfuse.so.2.9.7拷贝至旧版本库 libfuse.so.2.9.2 所在位置。
cp /usr/local/lib/libfuse.so.2.9.7 /usr/lib64/
2.3 执行以下命令, 删除旧版本 libfuse.so 库的所有链接。
rm -f /usr/lib64/libfuse.so
rm -f /usr/lib64/libfuse.so.2
2.4 执行以下命令,建立与被删除旧版本链接类似的 libfuse.so.2.9.7 库链接。
ln -s /usr/lib64/libfuse.so.2.9.7 /usr/lib64/libfuse.so
ln -s /usr/lib64/libfuse.so.2.9.7 /usr/lib64/libfuse.so.2

?

如何配置开机挂载?

1. 编辑文件 /usr/lib/systemd/system/goosefs-lite.service,追加如下内容,您可以将 examplebucket-1250000000 换为您的存储桶:注意,以下JAVA_OPTS中-Xms和-Xmx配置的内存值不能超过所在节点的物理内存上限的50%。如节点物理内存16GB,那么建议最多配置-Xms8G -Xmx8G。
[Unit]
Description=The Tencent Cloud GooseFS Lite for COS
Requires=network-online.target
After=network-online.target
?
[Service]
Type=forking
User=root
Environment="JAVA_OPTS=-Xms2G -Xmx4G -XX:MaxDirectMemorySize=1G -XX:+UseG1GC -XX:G1HeapRegionSize=32m"
ExecStart=/usr/local/goosefs-lite-1.0.4/bin/goosefs-lite mount /mnt/goosefs-mnt cosn://examplebucket-1250000000/
ExecStop=/usr/local/goosefs-lite-1.0.4/bin/goosefs-lite umount /mnt/goosfs-mnt
Restart=always RestartSec=5
?
[Install]
WantedBy=multi-user.target
2. 执行如下命令,执行挂载命令和查看后台 Daemon 进程状态:
# 让 goosefs-lite 的 systemd 配置生效
systemctl daemon-reload
# 启动后台 Fuse 进程
systemctl start goosefs-lite
# 查看后台 Daemon 进程状态
systemctl status goosefs-lite
# 查看挂载点列表
/usr/local/goosefs-lite-1.0.0/bin/goosefs-lite stat
# 如果是修改systemd配置,则在修改后reload并restart。
设置为开机启动时尝试挂载:
systemctl enable goosefs-lite
3. 卸载挂载点,重启机器,并查看 Fuse 进程状态:
# 执行卸载,注意:请勿在数据写入的时卸载,否则会导致数据不完整
systemctl stop goosefs-lite
# 重启操作系统,请谨慎操作,不要影响业务
reboot -h now
# 查看后台 Daemon 进程状态
systemctl status goosefs-lite
# 查看挂载点列表
/usr/local/goosefs-lite-1.0.0/bin/goosefs-lite stat

?

GooseFS-Lite 每天在某个时间段里 CPU 使用率较高,且向 COS 发出大量 Head、List 请求,产生大量请求次数费用,该怎么处理?

这通常是由于您机器上存在定时扫盘任务导致的,Linux 系统上常见的扫盘程序是 updatedb,您可以将 GooseFS-Lite 挂载点目录,添加到 updatedb 的配置文件 /etc/updatedb.conf 文件的 PRUNEPATHS 配置项中,避免该程序的扫盘行为。此外,您可以使用 Linux 工具 auditd,查找访问 GooseFS-Lite 挂载点的程序。
操作步骤如下:
1. 安装 auditd
Ubuntu:
apt-get install auditd -y
CentOS:
yum install audit audit-libs
2. 启动 auditd 服务
systemctl start auditd
systemctl enable auditd
3. 监控挂载目录
说明:
-w 指定 GooseFS-Lite 挂载目录,-k 为输出在 audit 日志中的 key。
auditctl -w /usr/local/service/mnt/ -k goosefs_lite_mnt
4. 根据日志确定访问程序
audit 的日志目录: /var/log/audit,查询命令如下:
ausearch -i|grep 'goosefs_lite_mnt'
5. 停止 auditd 服务
如果您需要停止 auditd 服务,可以使用如下命令:
/sbin/service auditd stop
注意:
如果访问挂载点的程序一直在运行,新启动的 auditd,并不会监控到该程序的访问行为;程序中关于挂载目录的多次调用,只会记录第一次。

?

GooseFS-Lite 安装时报“cannot allocate memory”错误,如何处理?

?
?
?
该报错主要是因为 GooseFS-Lite 运行过程时分配内存异常报错,一般为申请内存小于实际可用内存。
您可以进入 ./bin/goosefs-lite 文件中修改 JAVA_OPT 参数配置为合理内存数值,至少需要保证申请的内存数量小于实例可用内存数量。
?

如何查看日志?

问题的排查需要依赖日志,以下是相关日志所在位置。
对于 goosefs-lite 1.0.3版本及以上,默认日志目录在/data/goosefs/logs/fuse下。
例如:您挂载 goosefs-lite 的用户为 root,挂载点路径为/data1/data2,那么日志路径为:/data/goosefs/logs/fuse/root/data1/data2
对于 goosefs-lite 1.0.0-1.0.2版本,默认日志目录在/data/goosefs/logs下。
?
另一种查看挂载点日志路径的方式,首先重新挂载,然后 ps aux | grep ${MOUNT_POINT},从输出中可以看到 Error_File 或者 goosefs.logs.dir,这个路径的父目录则是该挂载点的全部日志所在位置。
?
系统日志:如果是 centos 或者 tlinux 系统,则是 /var/log/message*,如果是 ubuntu,则是 /var/log/syslog
?
如果是需要开启 debug 日志,进入 conf/log4j.properties,注释最下面一行内容,重新挂载即可。
注意:
开启 debug 日志会影响性能,正常情况无需开启。
?

挂载失败报错“Name or service not known”,如何处理?

?
?
?
通常是因为无法解析域名,可以通过 ping 对应的域名尝试,如上图所示报错,命令如下:
ping VM-36-104-centos
如果同样返回失败。
可以通过修改 /etc/hosts 的方式,配置对应的 ip。一般可以配127.0.0.1
操作方法如下:
1. /etc/hosts文件中添加一行。这里的“VM-36-104-centos”替换成您的主机名。
127.0.0.1 VM-36-104-centos
2. 之后重新 ping 测试,确认可以正常解析后,重新挂载即可。
?

默认环境 JDK 不是 KonaJDK11,怎么使用 GooseFS-lite?

1. 下载 KonaJDK11 的包,并解压。
2. 复制 konajdk 中 java 二进制程序的绝对路径。例如,解压的 jdk 在 /root/konajdk11下。
# 确定java版本
/root/konajdk11/bin/java -v
# 修改当前shell的JAVA环境变量,不影响其他shell和进程
export JAVA=/root/konajdk11/bin/java
# 挂载
goosefs-lite mount /mnt cosn://bucket-appid
3. 使用 ps aux | grep goosefs-lite,可以看到进程开头是 /root/konajdk11/bin/java,说明已经使用了我们指定的 java 版本,操作完成。
?

挂载点本来是正常的,使用过程中突然无法正常使用了,如何处理?

假设当前的问题挂载点是 /tmp/mount_point
1. 首先ps aux | grep /tmp/mount_point查看当前是否有进程正在使用这个挂载点,包括 goosefs-lite。如果有,使用 kill 命令杀掉对应的进程。
2. 使用 ls 尝试访问挂载点,如果返回为空,说明挂载点已经卸载成功。接着重新挂载即可。
ls /mount_point
3. 如果抛出 transport is not connected 之类的错误。则需要执行 umount -l /mount_point 强制卸载。(此命令执行需要 root 权限)
通常这类情况是进程被 kill -9 或系统 oom-killer 导致。可以在系统日志或者 goosefs-lite 日志中找到。
4. 观察挂载点日志目录(/data/goosefs/logs/fuse/$USER/$MOUNT_POINT)下是否有 hs_error 开头的日志(文件中描述程序退出前的堆栈及原因)。
?

抛异常:Unsupported or unrecognized SSL message,如何处理?

当前环境不支持关闭 https 模式,需要修改配置。解决方式为,在core-site.xml 配置文件中,加入如下内容:
<property> <name>fs.con.useHttps</name> <value>false</value> </property>

?

GooseFS-Lite 怎么使用内网域名访问 COS?

core-site.xml配置文件中,将 fs.cosn.bucket.region 属性删除,并添加 fs.cosn.bucket.endpoint_suffix
想了解更多参数,可以阅读下面文档:
?

挂载的时候或者使用过程中出现403 Forbidden,如何处理?

通常日志中 ERROR 类型日志会描述缺少什么权限,按需补充即可。
注意:对于 head bucket 权限,需要设置到桶级别而不能仅仅路径级别,例如,cosn://bucket-appid/path这种是不生效的,必须是cosn://bukcet-appid。此权限不会暴露桶内有哪些对象。
?

报错 “fuse: failed to open /dev/fuse Operation not permitted”,如何处理?

1. 检查是否拥有 root 权限。
2. 如果是容器中,检查容器启动时是否带有 --privileged ,如果没有,加上。
3. 检查 fuse 内核模块是否安装:lsmod | grep fuse ,看下是否有返回结果,如果没有说明 fuse 内核模块缺失。
?

文件写入失败,报错“ part num: 10001, the parameter partNumber is not valid.”,如何处理?

这种情况说明分块上传的块数超出限制了,cos 最大只支持1万个part上传。所以 goosefs-lite 默认最大支持8MB*10000(约78GB)的大文件。如果需要支持更大的文件,需要调参,参数是 fs.cosn.upload.part.size。例如,fs.cosn.upload.part.size修改为16777216(即16MB),则可以支持16MB*10000的大文件。
?
?


http://www.vxiaotou.com