- A+
所属分类:FastDFS
-- 开源的分布式文件系统 由阿里巴巴开发
工作原理
1. FastDFS服务端有2个角色 分别是tracker(跟踪器(或说是调度器会更合适)) 和 storage(存储节点)。
2. tracker负责调度和负载均衡,并不需要存储文件的索引信息,因为文件上传后 stroage 返回给客户端的文件ID中就包含了组名、文件相对路径和文件名等(文件ID还包含了文件大小、时间戳、源storage server IP地址、文件内容校验码、随机数等), client可以根据文件ID直接定位到文件所在的组(但具体哪个storage server下载就需要询问tracker server)。
3. storage负责文件的管理(包括: 存储,同步,提供存取接口),并对文件的meta data(元数据)进行管理,meta data就是指文件的相关属性,以键值对(key value pair)方式表示,如:width=1024,文件的meta data是文件属性列表,可以包含多个键值对。
4. tracker 和 storage都可以由一台或多台服务器构成,均可以随时增加或减少而不影响线上服务(存储卷中只有一台服务器除外,详细见存储原理)。其中 tracker 所有服务器都是对等的,可以根据服务器的压力情况随时增加或减少。
存储原理
1. 为了支持大容量,storage采用了 "分卷" 的组织方式,整个存储系统由一个或多个卷组成(相当于raid0)
2. 卷与卷之间的文件是相互独立的,所有卷的容量累加起来就是整个存储系统的容量。
3. 其中一个卷 可以由一台或多台存储服务器组成,同一个卷下的存储服务器中的文件都是相同的(相当于raid1,所以一般由2台服务器组成一个卷,卷的容量以卷内服务器磁盘空间最小的为准),卷中的多台存储服务器起到了冗余和负载均衡的作用。
4. 经过第 1、3点的介绍,就可以知道,整个FastDFS的存储是类似raid10的逻辑,底层分卷 卷中做raid1 再把所有卷通过raid0逻辑叠加起来。
5. storage接收到写文件请求时,会根据配置好的规则 选择其中一个存储目录来存储文件。
6. 为了避免单个目录下的文件数太多,storage第一次启动时,会在每个数据存储目录里创建2级子目录,每级256个,总共65536个文件,新写的文件会以hash的方式被路由到其中某个子目录下,然后直接以本地文件存储到该目录中。(所以才能用nginx的方式来读取该文件 见后面的实验)
6. 在卷中增加服务器时,同步文件由系统自动完成,同步完成后,系统会自动将新增服务器上线提供服务
7. 当存储空间不足时,只需要动态添加卷,这样就扩大了存储系统的容量
FastDFS上传和下载过程
-- 注: FastDFS的文件标识由两个部分组成: 卷名和文件名 缺一不可
上传过程
1. client询问tracker上传到的storage,不需要附加参数;
2. tracker返回一台可用的storage;
3. client直接和storage通讯完成文件上传。
下载过程
1. client询问tracker下载文件的storage,参数为文件标识(卷名和文件名);
2. tracker返回一台可用的storage;
3. client直接和storage通讯完成文件下载。
服务器角色
192.168.5.231 tracker
192.168.5.233 group1/stroage1
192.168.5.234 group1/storage2
下载fastdfs v5.05
1 |
# wget https://github.com/happyfish100/fastdfs/archive/V5.05.tar.gz |
安装fastdfs
------------------- 这些为安装fastdfs的通用命令部分 ----------------------------------
-- 可以查看源码安装包里面的INSTALL文件 有详细部署说明
-- 下载并安装libfastcommon
1 2 3 4 5 6 |
官网: https://github.com/happyfish100/libfastcommon/releases wget https://github.com/happyfish100/libfastcommon/archive/V1.0.7.tar.gz tar -xzvf V1.0.7.tar.gz cd libfastcommon-1.0.7/ ./make.sh -- 里面自带的安装脚本 ./make.sh install |
-- 安装fastdfs
1 2 3 4 5 |
cd .. tar -xzvf V5.05.tar.gz cd fastdfs-5.05 ./make.sh -- 里面自带的安装脚本 ./make.sh install |
-- 安装后 命令在/usr/bin/目录下 配置文件在 /etc/fdfs/目录下
------------------------------------------------------------------------------------------
部署tracker节点 -- 在192.168.5.231上
-- 安装fastdfs 步骤请看上面安装fastdfs区域
-- 生成tracker配置文件
1 |
cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf |
-- 修改tracker配置文件
1 2 3 4 5 6 7 |
vim /etc/fdfs/tracker.conf 修改以下内容 disabled=false -- 表示此配置文件有效 port=22122 -- tracker的端口 默认也是22122 base_path=/home/fastdfs -- tracker存放数据文件(记录storage和tracker情况的文件)和日志的目录(需要预先创建) store_lookup=2 -- 上传文件时 选择哪个组(卷)的策略 数字意思看配置文件 http.server_port=8080 -- 从4.05版本就移除了此功能 配了也没用 |
-- 创建数据目录(刚刚配置文件指定的目录)
1 |
mkdir /home/fastdfs |
-- 启动tracker
1 |
fdfs_trackerd /etc/fdfs/tracker.conf start |
-- 查看各种情况
1 2 3 4 5 |
netstat -tnlp | grep 22122 -- 查看监听情况 tcp 0 0 0.0.0.0:22122 0.0.0.0:* LISTEN 28803/fdfs_trackerd tail -f /home/fastdfs/logs/trackerd.log -- 查看tracker的日志 看有没有报错 ls /home/fastdfs/data/ -- 查看数据目录情况 fdfs_trackerd.pid storage_changelog.dat -- pid文件和数据变动日志文件(还不知道会记录什么 待观察) |
-- 设置开机自启动
1 |
echo 'fdfs_trackerd /etc/fdfs/tracker.conf start' >> /etc/rc.local |
部署storage节点
-- 安装fastdfs 步骤请看上面安装fastdfs区域
-- 生成storage配置文件
1 |
cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf |
-- 修改storage配置文件
1 2 3 4 5 6 7 8 9 10 |
vim /etc/fdfs/storage.conf 修改以下内容 disabled=false -- 表示此配置文件有效 group_name=group1 -- 组名(组就是上面介绍的卷) port=23000 -- 端口 23000 默认也是23000 同一组内的节点 端口必须一致(其实也没必要改 建议所有组所有节点都一致) base_path=/home/fastdfs -- storage的日志目录(需要启动前创建) store_path_count=1 -- 表示有多少个存储目录 需要与存储目录数量匹配 store_path0=/home/fastdfs -- 真正存储数据的目录 生产环境中应该和日志目录分开 而且是一个拥有大空间的分区 可以设置多个存储路径(如 store_path1) tracker_server=192.168.5.231:22122 -- 指定tracker_server的IP http.server_port=8888 -- 从4.05版本就移除了此功能 配了也没用 |
-- 创建存储目录
1 |
mkdir /home/fastdfs |
-- 运行storage
1 |
fdfs_storaged /etc/fdfs/storage.conf start -- 第一次启动时会卡一阵子 因为在创建6万多个二级目录 |
-- 查看各种情况
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
netstat -tnlp -- 查看端口监听情况 tcp 0 0 0.0.0.0:23000 0.0.0.0:* LISTEN 30907/fdfs_storaged tail -f /home/fastdfs/logs/storaged.log -- 查看日志 查看启动情况 mkdir data path: FC ... -- 创建真正放数据的二级目录 mkdir data path: FD ... mkdir data path: FE ... mkdir data path: FF ... data path: /home/fastdfs/data, mkdir sub dir done. tree /home/fastdfs/data/ | head -n 4 -- 查看存储目录的目录结构 /home/fastdfs/data/ ├── 00 -- 第1级目录 │ ├── 00 -- 第2级目录 会创建2级目录来避免文件数量太多 │ ├── 01 -- 中间略 ├── fdfs_storaged.pid -- 存放程序pid -- 中间略 ├── storage_stat.dat -- 记录着本storage节点 文件的 增删改读 的次数 └── sync ├── binlog.000 -- 这个 应该是同步时使用的 记录着自己节点的文件变化情况 类mysql的binlog 具体怎么用 后面补充 ├── binlog.index └── 192.168.5.234_23000.mark -- 应该是记录着同步情况 同步进度 类mysql的master.info文件 |
-- 查看连接情况
1 2 3 4 5 6 7 8 |
netstat -an | grep 22122 -- 与tracker的连接情况 tcp 0 0 192.168.5.233:46202 192.168.5.231:22122 ESTABLISHED tcp 0 0 192.168.5.233:43448 192.168.5.232:22122 ESTABLISHED netstat -an | grep 23000 -- 与同组storage的连接情况 tcp 0 0 0.0.0.0:23000 0.0.0.0:* LISTEN tcp 0 0 192.168.5.233:23000 192.168.5.234:58903 ESTABLISHED -- 因为会互相同步文件 所以会互相建立连接 tcp 0 0 192.168.5.233:34217 192.168.5.234:23000 ESTABLISHED |
-- 记得在5.233 和 5.234上都部署为storage 并且在同一个组(group 或叫卷) 然后再继续下面的步骤
-- 使用monitor命令查看storage情况 -- 在任意一台storage上操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
fdfs_monitor /etc/fdfs/storage.conf ------------------------ 以下为部分重要输出 ---------------------------- ---- tracker server日志输出部分 [2016-10-25 11:18:31] DEBUG - base_path=/home/fastdfs, connect_timeout=30, network_timeout=60, tracker_server_count=1, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=0, g_connection_pool_max_idle_time=3600s, use_storage_id=0, storage server id count: 0 ---- tracker server情况部分 server_count=1, server_index=0 -- 表示总共有1台tracker server 这台的编号为0 tracker server is 192.168.5.231:22122 -- 这台的IP地址是 192.168.5.231 ---- 组(卷)的情况部分 group count: 1 -- 一共有1个组(卷) Group 1: -- 第1个组的情况 group name = group1 -- 组名称为 group1 disk total space = 47786 MB -- 这个组的空间总大小 (以组中存储空间最小的节点为准) disk free space = 45043 MB -- 这个组的空间剩余大小 trunk free space = 0 MB -- 小文件合并 这个这里没有做 storage server count = 2 -- 表示这个组一共由2台storage节点组成 active server count = 2 -- 存活的storage节点 =2 表示全部存活(正常) storage server port = 23000 -- storage的端口 storage HTTP port = 8888 -- 这个其实已经没有意义了 store path count = 1 -- 一共有多少个存储路径 subdir count per path = 256 -- 每一级目录有多少个子目录 current write server index = 0 current trunk file id = 0 ---- storage(存储节点)的情况部分 Storage 1: -- 第1个存储节点 id = 192.168.5.233 -- id(与IP相同 应该是取之IP) ip_addr = 192.168.5.233 ACTIVE -- 重点: ACTIVE表示该节点正常 http domain = version = 5.05 -- 版本 join time = 2016-10-25 10:40:43 -- 该节点加入组的时间 up time = 2016-10-25 10:40:43 -- 该节点的启动时间 total storage = 47786 MB -- 节点的存储容量情况 free storage = 45043 MB upload priority = 10 -- 上传优先级 store_path_count = 1 -- 都是配置文件里面配置的信息 subdir_count_per_path = 256 storage_port = 23000 storage_http_port = 8888 current_write_path = 0 source storage id = if_trunk_server = 0 connection.alloc_count = 256 connection.current_count = 1 connection.max_count = 1 |
-- 再往下的内容 就是 storage_stat.dat 里面读到的内容了 记录着本storage节点 文件的 增删改读 的次数
上传文件到fastdfs
-- 上传文件使用命令上传(当然 程序要使用api) 下载则要另外配置nginx 这个稍后介绍
-- 为了不再部署一次fdfs 这里就使用其中一台storage去做client 所以client配置文件的base_path目录 要不和storage配置文件的base_path目录冲突
-- 生成client配置文件
1 |
cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf |
-- 修改client配置文件
1 2 3 4 |
vim /etc/fdfs/client.conf 修改以下内容 base_path=/tmp -- 这里先临时放tmp目录下 tracker_server=192.168.5.231:22122 -- 指定tracker_server的IP地址 |
-- 上传文件
1 2 |
fdfs_upload_file /etc/fdfs/client.conf /root/software/pycharm.png -- 上传/root/software/pycharm.png这个文件到fastdfs group1/M00/00/00/wKgF6VgO69WAW6kgAAULPRl0gCs682.png -- 上传成功后 会返回这个文件的访问路径 这个路径要记录下来 以后的实验需要用到 |
-- 访问路径解释
group1 -- 表示上传到了哪个组(卷) 对应storage节点配置的 group_name
M00 -- 还不知道
00 -- 存储目录中里的1级目录
00 -- 2级目录
wKgF6VgO69WAW6kgAAULPRl0 gCs682.png -- 文件传上去后 实际在fastdfs里保存的名称
-- 到此为止 fastdfs的 已经部署完毕 通过fdfs命令或者其他编程语言使用api已经可以实现文件的上传、同步和下载 但如果需要实现基于http的下载 请查看 FastDFS + Nginx 实现http协议下载

微信公众号
扫一扫关注运维生存时间公众号,获取最新技术文章~