FastCFS – 可以跑数据库的高性能通用分布式文件系统
简介
FastCFS 是一款强一致性、高性能、高可用、支持百亿级海量文件的通用分布式文件系统,可以作为MySQL、PostgreSQL、Oracle等数据库,k8s、KVM、FTP、SMB和NFS等系统的后端存储。
FastCFS 主要特点
保证数据强一致前提下实现了高性能:性能完胜Ceph;
完全兼容POSIX文件接口,支持文件锁,64G内存即可支持百亿级海量文件;
高可用:不存在单点,自动failover;
简洁高效的架构和原生实现,不依赖第三方组件,内置运维工具,易用性较好;
随机写性能强悍:FCFS基于trunk顺序分配空间,将客户端的随机写转换为顺序写。
FastCFS 典型应用场景
数据库:支持常规的独享数据和高阶的共享数据两种存储方式,支持数据库云化;
文件存储:如文档、图片、视频等等,FastCFS比对象存储更容易与通用软件集成;
超融合存储:数据库和文件存储共用一个存储集群,显著提升存储资源利用率;
高性能计算:高可靠和高性能的FastCFS,支持RDMA,天然适合高性能计算场景;
视频监控:FastCFS采用顺序写盘方式,使用SATA硬盘也可保证多路视频流畅写入。
集群系统环境
操作系统: ubuntu24.04
关闭防火墙: systemctl stop ufw
服务器架构: arm64
集群服务器信息
组件: 服务器ip: 个数:
FastDir 10.211.55.3、10.211.55.4、10.211.55.5 3
FastStore 10.211.55.3、10.211.55.4、10.211.55.5 3
FastAuth 10.211.55.3、10.211.55.4、10.211.55.5 3
Fast-fuse客户端 10.211.55.6、10.211.55.5 1
服务器别名
10.211.55.3 <--> ubuntu
10.211.55.4 <--> ubuntu1
10.211.55.5 <--> ubuntu2
10.211.55.6 <--> ubuntu3
集群端口准备
fdir
默认集群端口 11011
默认服务端口 11012
fvote
默认集群端口 41011
默认服务端口 41012
fauth
默认集群端口 31011
默认服务端口 31012
fstore
默认集群端口 21014
默认副本端口 21015
默认服务端口 21016
安装系统依赖
apt-get update
apt-get install libaio-dev -y
apt-get install libaio1t64 -y
apt-get install openssh-server
安装异步io系统库(本集群为arm64架构需要手动安装)
curl -O http://ftp.de.debian.org/debian/pool/main/liba/libaio/libaio1_0.3.113-4_arm64.deb
dpkg -i libaio1_0.3.113-4_arm64.deb
以下操作均在root用户下操作
集群服务器生成ssh密钥:
ssh-keygen -t rsa -b 2048
配置免密登录:
集群服务器ssh配置允许root用户ssh登录 --> ubuntu(10.211.55.3)配置举例:
vim /etc/ssh/sshd_config
PermitRootLogin yes
服务器配置hosts --> ubuntu(10.211.55.3)配置举例:
vim /etc/hosts
10.211.55.4 ubuntu1
10.211.55.5 ubuntu2
10.211.55.6 ubuntu3
拷贝密钥到集群各服务器 --> ubuntu(10.211.55.3)配置举例:
ssh-copy-id ubuntu1
ssh-copy-id ubuntu2
ssh-copy-id ubuntu3
安装服务:
集群脚本安装:
git clone https://gitee.com/fastdfs100/FastCFS.git; cd FastCFS/
./fastcfs.sh install
手动(单独)安装:
- 配置系统gpg
apt-get install curl gpg
curl http://www.fastken.com/aptrepo/packages.fastos.pub | gpg --dearmor > fastos-archive-keyring.gpg
install -D -o root -g root -m 644 fastos-archive-keyring.gpg /usr/share/keyrings/fastos-archive-keyring.gpg
sh -c 'echo "deb [signed-by=/usr/share/keyrings/fastos-archive-keyring.gpg] http://www.fastken.com/aptrepo/fastos/ fastos main" > /etc/apt/sources.list.d/fastos.list'
rm -f fastos-archive-keyring.gpg
apt update
- 安装服务端组件
- ubuntu、ubuntu1、ubuntu2服务器安装
apt install fastdir-server -y
apt install faststore-server -y
apt install fastcfs-auth-server -y
- ubuntu2、ubuntu3服务器安装
apt install fastcfs-fused -y
集群配置
fdir配置cluster.conf, root登录主控机 10.211.55.3
vim /etc/fastcfs/fdir/cluster.conf
# config the auth config filename
auth_config_filename = ../auth/auth.conf
[group-cluster]
# the default cluster port
port = 11011
[group-service]
# the default service port
port = 11012
[server-1]
host = 10.211.55.3 #节点1
[server-2]
host = 10.211.55.4 节点2
[server-3]
host = 10.211.55.5 #节点3
fdir配置server.conf, root登录主控机 10.211.55.3
vim /etc/fastcfs/fdir/server.conf
server.conf基本上用默认配置即可,如果需要开启存储插件,需要把[storage-engine]下面的enable=true,同时配置storage.conf。
拷贝fdir的cluster.conf到其他节点:
scp /etc/fastcfs/fdir/cluster.conf ubuntu1:/etc/fastcfs/fdir/cluster.conf
scp /etc/fastcfs/fdir/cluster.conf ubuntu2:/etc/fastcfs/fdir/cluster.conf
scp /etc/fastcfs/fdir/cluster.conf ubuntu3:/etc/fastcfs/fdir/cluster.conf
fstore配置cluster.conf, root登录主控机 10.211.55.3
vim /etc/fastcfs/fstore/cluster.conf
# the group count of the servers / instances
server_group_count = 1 # SGC=1
# all data groups must be mapped to the server group(s) without omission.
# once the number of data groups is set, it can NOT be changed, otherwise
# the data access will be confused!
data_group_count = 128 #DGC
# config the auth config filename
auth_config_filename = ../auth/auth.conf
[group-cluster]
# the default cluster port
port = 21014
[group-replica]
# the default replica port
port = 21015
[group-service]
# the default service port
port = 21016
[server-group-1]
server_ids = [1, 3]
data_group_ids = [1, 64]
data_group_ids = [65, 128]
[server-1]
host = 10.211.55.3
[server-2]
host = 10.211.55.4
[server-3]
host = 10.211.55.5
faststore配置server.conf
vim /etc/fastcfs/fstore/server.conf
server.conf基本上用默认配置即可,如果需要修改存储目录,需要修改storage.conf,如果有多个数据盘可以配置多个目录,充分利用硬盘空间
拷贝fstore的cluster.conf到其他节点:
scp /etc/fastcfs/fstore/cluster.conf ubuntu1:/etc/fastcfs/fstore/cluster.conf
scp /etc/fastcfs/fstore/cluster.conf ubuntu2:/etc/fastcfs/fstore/cluster.conf
scp /etc/fastcfs/fstore/cluster.conf ubuntu3:/etc/fastcfs/fstore/cluster.conf
fauth配置cluster.conf, root登录主控机 10.211.55.3
vim /etc/fastcfs/auth/cluster.conf
[group-cluster]
# the default cluster port
port = 31011
[group-service]
# the default service port
port = 31012
[server-1]
host = 10.211.55.3
[server-2]
host = 10.211.55.4
[server-3]
host = 10.211.55.5
fauth配置server.conf:
vim /etc/fastcfs/auth/server.conf
server.conf用默认配置即可
fauth配置auth.conf
默认不开启认证、本例不开启认证
拷贝cluster.conf到其他节点:
scp /etc/fastcfs/auth/cluster.conf ubuntu1:/etc/fastcfs/auth/cluster.conf
scp /etc/fastcfs/auth/cluster.conf ubuntu2:/etc/fastcfs/auth/cluster.conf
scp /etc/fastcfs/auth/cluster.conf ubuntu3:/etc/fastcfs/auth/cluster.conf
集群启动
启动顺序如下
1. fvote(可选)
2. fdir
3. fauth(可选)
4. fstore
5. fuseclient
root分别登录到ubuntu、ubuntu1、ubuntu2三个节点启动服务
systemctl restart fastdir
systemctl restart fastauth
systemctl restart faststore
服务端异常问题排查
如果启动有问题,请检查配置文件,具体启动日志可以查看/opt/fastcfs/下对应的auth、fdir、fstore三个目录里面的logs目录。
客户端启动
root登录到ubuntu2、ubuntu3客户端节点启动服务
systemctl restart fastcfs
客户端异常问题排查
1. 查看日志文件/opt/fastcfs/fcfs/logs/fcfs_fused.log看下启动是否有误
2. 如果无误可以通过df -h查看挂载的目录 /opt/fastcfs/fuse
常见问题
FastCFS支持单盘数据恢复吗?
支持。
- 实现机制:从本组的其他服务器上获取数据,恢复指定硬盘(即存储路径)上的所有数据。
- 使用场景:硬盘坏掉后更换为新盘,或者因某种原因重新格式化硬盘。
- 单盘故障恢复后,重启fs_serverd时,加上命令行参数 --data-rebuild <store_path>,其中 store_path为要恢复数据硬盘对应的存储路径。
FastCFS是如何防脑裂的?
- leader/master选举时采用过半数机制,一个分组的节点数最好为奇数(比如3个)。
- 配置项为 quorum,默认值为auto,表示节点数为奇数时开启,为偶数时关闭。
- 详情参见源码目录下的conf/full/cluster.conf
fdir和fstore多副本(如3副本)情况下,停机后重启不能写入数据
- 为了保证数据一致性,当停机时间超过配置参数max_shutdown_duration(默认配置300秒),
需要等待本组的其他服务器在线才可以选出master/leader。
- 以3副本为例,如果3台服务器停机均超过max_shutdown_duration,而有的服务器没有启动,
那么master/leader选举不出来,导致不能写入数据。
- 此时启动fdir_serverd需要加上命令行参数--force-master-election,启动fs_serverd需要加上命令行参数--force-leader-election
如何验证多个副本的数据一致性?
- faststore需要源码编译,修改make.sh,将
CFLAGS='-Wall'
修改为:
CFLAGS='-Wall -DFS_DUMP_SLICE_FOR_DEBUG=32'
- 启动fs_serverd,数据将导出到 $base_path/data/dump/slice.index
- 例如:/opt/fastcfs/fstore/data/dump/slice.index
- 文件格式:
类型 文件ID block偏移量 slice偏移量 slice长度 数据长度 数据CRC32
可以通过 diff 命令比较同一组服务器下的两个节点导出的slice.index是否相同。
- 注意:-DFS_DUMP_SLICE_FOR_DEBUG=32 这个编译选项仅供测试环境进行数据一致性验证,请不要在生产环境使用。
fuse客户端通过df看到的空间明显大于存储池配额
这是因为客户端没有启用auth,需要将配置文件/etc/fastcfs/auth/auth.conf中的auth_enabled设置为true,修改后重启fcfs_fused生效。
友情提示:如何配置auth服务请参阅 认证配置文档
- https://gitee.com/fastdfs100/FastCFS/blob/master/docs/AUTH-zh_CN.md
FastCFS作为NFS后端存储时NFS client mount失败
出错信息:reason given by server: No such file or directory
解决方案:
NFS v3直接使用服务端配置的目录如:/opt/fastcfs/fuse,而v4将服务端配置的路径作为基路径,mount要使用/
友情提示:
CentOS 6需要使用NFS v3挂载
/etc/exports中需要设置fsid=0,例如:/opt/fastcfs/fuse 172.16.168.130(fsid=0,rw,sync,no_root_squash,no_all_squash)
NFS挂载默认会使用最新的NFS协议,挂载命令示例(支持v4前提下使用):
mount -t nfs -onolock 172.16.168.131:/ /mnt/nfs
NFS v3挂载命令示例:
mount -t nfs -onolock 172.16.168.131:/opt/fastcfs/fuse /mnt/nfs
指定NFS v4挂载命令示例:
mount -t nfs -onolock,nfsvers=4 172.16.168.131:/ /mnt/nfs
为何删除了足够多的数据,df看到磁盘占用空间不见降低呢?
FastCFS基于trunk file进行空间分配,目前trunk file只会增加而不会释放。文件数据删除后空间会回收利用,通过fuse client上df命令可以看到FastCFS的可用空间将增加。
如何将fastore的数据清除干净?
一些特殊情况下,需要清除掉faststore的数据,此时要删除faststore的系统目录(server.conf中配置的base_path,默认为/opt/fastcfs/fstore)和用户数据存放目录(默认为/opt/faststore/data,配置多盘的情况要逐一删除数据目录),删除命令示例(文件删除后不可恢复,请再三确认后执行):
rm -rf /opt/fastcfs/fstore /opt/faststore/data
日志中报没有访问权限,如何进行排查?
/opt/fastcfs/fcfs/logs/fcfs_fused.log 中的错误示例:
[2023-02-25 06:39:08] ERROR - file: client_proto.c, line: 607, fdir server 192.168.3.210:11012 response message: response status 1, error info: Operation not permitted
问题排查:
依次查看各台fdir server上的日志文件 /opt/fastcfs/fdir/logs/fdir_serverd.log,找到对应的出错信息,然后使用最新版本的fdir_stat 查看对应的完整路径(文件名),根据文件或目录owner、权限、访问用户及其用户组进行排查。
友情提示:
如果采用的是装包方式,程序fdir_stat 所在的rpm包名为fastDIR-client,deb包名为fastdir-client
按文件或目录inode查询示例:
fdir_stat -Fn fs 9007199660325177
按父目录inode + 子目录名或者文件名查询示例:
fdir_stat -Fn fs 9007199667318991 test
FastCFS分布式存储系统官方地址
https://gitee.com/fastdfs100/FastCFS