操作与实践
更新时间:2023-09-06
挂载
BOS FS挂载bucket到本地目录执行命令:
bosfs mybucket my_local_directory -o endpoint=http://bj.bcebos.com -o ak=xxxxxxxxxxxxxxxx -o sk=xxxxxxxxxxxxxxxxx -o logfile=xx/xx.log
执行之后后台会启动一个名为bosfs的daemon进程,如果挂载成功,可以用df
命令看挂载点。此外可以查看/etc/fstab,来了解具体使用到的挂载选项。
同时bosfs支持挂载子目录,使用方式将bucket名变成bucket/subdir即可实现挂载子目录,即可实现将子目录作为挂载点的根目录。
说明: 默认只有root用户有权限执行
fusermount
,如果需要特定用户执行fusermount
,则要通过命令usermod -a -G fuse YourAccount
把这个用户加入到安装fuse后获得的用户组中。
卸载
- 使用
umount
命令可以直接卸载。 - 对于非root用户且没有卸载权限的,如果加入到了fuse用户组中,可以使用
fusermount -u my_local_directory
进行卸载。 - 还可以通过杀掉后台的bosfs进程来卸载,不过一般不建议这么使用,会造成未FLUSH文件的损坏。
操作示例
以同步两个Bucket的数据为例,讲解BOS FS的使用。
假设有bucket-a和bucket-b两个bucket,且这两个bucket可能位于不同的Region(比如北京,广州)。业务上需要将bucket-a的数据备份到bucket-b,且只同步有变更的文件,以减小开销。可以按照如下步骤实现:
- 找到一台可用的Centos镜像的虚机(没有则可以购买一台)并开通EIP服务;
- 安装bosfs;
- 使用bosfs挂载命令将bucket-a和bucket-b挂载到本地的bucket-a,bucket-b两个目录上;
- 使用命令
rsync -av --partial-dir=/tmp bucket-a bucket-b
开始同步这两个bucket的数据。 - 可以考虑将
rsync
命令加入crontab,用来定期执行。
注意事项:
- 同步一个文件的时候,会在/tmp目录或者指定的cache目录占用这个文件大小的空间,同步完这个文件的时候将释放。因此需要保证本地有足够的磁盘空间。
- 使用rsync命令时加上
--partial-dir=/tmp
选项, 把临时文件放到tmp目录下, 避免临时文件在挂载点内产生不必要的数据传输。- 如果使用一个rsync进程同步速度可能会比较慢,如果使用另外一台机器同步速度也会受单机网卡的影响。所以如果同步的bucket本身目录结构可以进行切分,则可以考虑多个rsync进程并行,或者多部署几套虚机并行同步不同的子目录。
- 如果同时在多个mount点上对同一个文件进行操作,BOS无法保证一个可预期的结果,可能会造成文件截断、写入丢失,或刚写入的无法在另一个挂载点上读出等问题,所以需要避免。
- 本示例因为两个Bucket位于不同Region,所以需要开通EIP。只要两个Bucket及BCC有任意一个跨区域则需要开通EIP服务,只有三者均处于同一Region才不需开通EIP。
实践
-
关于bosfs性能与注意事项:
- bosfs基于fuse开发和进行挂载, 由于其框架接口的语义限制, 对挂载点内的本地文件的操作可能需要与BOS对象存储服务进行多次网络交互, 因此bosfs挂载点的实例与BOS endpoint之间的网络环境会影响bosfs的性能.
- bosfs提供了大量参数, 可根据自身使用的场景进行参数调优, 可参考文档
- bosfs操作并非原子的, 尤其是如使用多个bosfs进程挂载同一个BOS bubket, 多个挂载点中对该bucket的并发操作可能出现未定义的行为.
- 若bosfs无法满足业务需求时, 建议使用boscmd, 非线上敏感业务可以使用bosfs,若要求可靠性、稳定性, 以及可控性, 建议使用API接入.
-
docker/kubernetes环境下使用bosfs:
- 在k8s环境中, 可使用静态PV/PVC的方式通过bosfs挂载来访问BOS.
- 建议将业务pod和bosfs pod分开管理, 可使用保活探针机制, 当bosfs异常后重新拉起.
- 当单个业务pod中使用大量bosfs挂载点或者k8s中拉起多个业务pod时, 如果多个bosfs容器部署在同一node, 可能会占用大量内存和网络带宽, 建议根据实际情况进行调整.
- 百度智能云容器引擎CCE 已集成了容器中通过bosfs挂载的方式访问BOS的组件, 可参考文档.