1 Fastdfs简单介绍
1.1 什么是fastdfs
FastDFS是一个开源的轻量级分布式文件系统。它解决了大数据量存储和负载均衡等问题。特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务,如相册网站、视频网站等等。在UC基于FastDFS开发向用户提供了:网盘,社区,广告和应用下载等业务的存储服务。
FastDFS是一款开源的轻量级分布式文件系统纯C实现,支持Linux、FreeBSD等UNIX系统类google FS,不是通用的文件系统,只能通过专有API访问,目前提供了C、Java和PHP API为互联网应用量身定做,解决大容量文件存储问题,追求高性能和高扩展性FastDFS可以看做是基于文件的key value pair存储系统,称作分布式文件存储服务更为合适。
1.2 Fastdfs特性
- 文件不分块存储,上传的文件和OS文件系统中的文件一一对应
- 支持相同内容的文件只保存一份,节约磁盘空间
- 下载文件支持HTTP协议,可以使用内置Web Server,也可以和其他Web Server配合使用
- 支持在线扩容
- 支持主从文件
- 存储服务器上可以保存文件属性(meta-data)V2.0网络通信采用libevent,支持大并发访问,整体性能更好
1.3Fastdfs相关概念
FastDFS服务端有三个角色:跟踪服务器(tracker server)、存储服务器(storage server)和客户端(client)。
1.3.1 Tracker-server
跟踪服务器,主要做调度工作,起负载均衡的作用。在内存中记录集群中所有存储组和存储服务器的状态信息,是客户端和数据服务器交互的枢纽。相比GFS中的master更为精简,不记录文件索引信息,占用的内存量很少。 Tracker是FastDFS的协调者,负责管理所有的storage server和group,每个storage在启动后会连接Tracker,告知自己所属的group等信息,并保持周期性的心跳,tracker根据storage的心跳信息,建立group==>[storage server list]的映射表。 Tracker需要管理的元信息很少,会全部存储在内存中;另外tracker上的元信息都是由storage汇报的信息生成的,本身不需要持久化任何数据,这样使得tracker非常容易扩展,直接增加tracker机器即可扩展为tracker cluster来服务,cluster里每个tracker之间是完全对等的,所有的tracker都接受stroage的心跳信息,生成元数据信息来提供读写服务。
1.3.2 Storage-server
存储服务器(又称:存储节点或数据服务器),文件和文件属性(meta data)都保存到存储服务器上。Storage server直接利用OS的文件系统调用管理文件。 Storage server(后简称storage)以组(卷,group或volume)为单位组织,一个group内包含多台storage机器,数据互为备份,存储空间以group内容量最小的storage为准,所以建议group内的多个storage尽量配置相同,以免造成存储空间的浪费。 以group为单位组织存储能方便的进行应用隔离、负载均衡、副本数定制(group内storage server数量即为该group的副本数),比如将不同应用数据存到不同的group就能隔离应用数据,同时还可根据应用的访问特性来将应用分配到不同的group来做负载均衡;缺点是group的容量受单机存储容量的限制,同时当group内有机器坏掉时,数据恢复只能依赖group内地其他机器,使得恢复时间会很长。 group内每个storage的存储依赖于本地文件系统,storage可配置多个数据存储目录,比如有10块磁盘,分别挂载在/data/disk1-/data/disk10,则可将这10个目录都配置为storage的数据存储目录。 storage接受到写文件请求时,会根据配置好的规则(后面会介绍),选择其中一个存储目录来存储文件。为了避免单个目录下的文件数太多,在storage第一次启动时,会在每个数据存储目录里创建2级子目录,每级256个,总共65536个文件,新写的文件会以hash的方式被路由到其中某个子目录下,然后将文件数据直接作为一个本地文件存储到该目录中。
1.3.3Client
客户端,作为业务请求的发起方,通过专有接口,使用TCP/IP协议与跟踪器服务器或存储节点进行数据交互。FastDFS向使用者提供基本文件访问接口,比如upload、download、append、delete等,以客户端库的方式提供给用户使用。
1.3.4Group
组, 也可称为卷。 同组内服务器上的文件是完全相同的 ,同一组内的storage server之间是对等的, 文件上传、 删除等操作可以在任意一台storage server上进行 。
1.3.5Meta-data
文件相关属性,键值对( Key Value Pair) 方式,如:width=1024,heigth=768
1.3.6部署图
2 准备工作
个人使用附件服务建议直接搭建在虚拟机上,方便使用 所需软件: VMware上安装centos7且能联网的虚拟机
3.安装docker
3.1docke环境准备
Docker支持以下的CentOS版本: 1、Docker运行在CentOS 7(64-bit)上要求系统为64位,系统内核版本为3.10以上 2、Docker运行在Centos 6.5或者更高的版本上,要求系统为64位,系统内核版本为2.6.32-431或者更高版本
3.2查看centos版本和内核版本
查看系统版本:cat /etc/centos-release 查看内核版本:uname -a
3.3docker 安装
1、安装系统依赖工具
代码语言:javascript复制sudo yum install -y yum-utils device-mapper-persistent-data lvm2
2、yum的配置管理,添加docker的软件源地址
代码语言:javascript复制sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3、更新yum缓存
代码语言:javascript复制sudo yum makecache fast
4、可以查看所有仓库中所有docker版本,并选择特定版本安装
代码语言:javascript复制yum list docker-ce --showduplicates | sort -r
5、选择docker版本安装,由于repo中默认只开启stable仓库,这里安装的是最新版本
代码语言:javascript复制sudo yum install docker-ce
6、启动docker服务
代码语言:javascript复制sudo systemctl start docker
7、加入开机启动项
代码语言:javascript复制sudo systemctl enable docker
8、查看docker版本
代码语言:javascript复制docker version
4. 使用docker搭建FastDFS文件系统
1.首先下载FastDFS文件系统的docker镜像
代码语言:javascript复制[root@localhost /]# docker search fastdfs
安装镜像
[root@localhost ~]# docker pull season/fastdfs
[root@localhost ~]# docker images
2.使用docker镜像构建tracker容器(跟踪服务器,起到调度的作用): 关闭防火墙
代码语言:javascript复制[root@localhost /]# systemctl stop firewalld
这里的防火墙也要关 进入编辑模式:
代码语言:javascript复制[root@localhost /]# vi /etc/sysconfig/selinux
将SELINUX的值改成disabled,如下:
改完配置后重启
代码语言:javascript复制[root@localhost /]# reboot
创建tracker容器
代码语言:javascript复制[root@localhost /]# docker run -ti -d --name trakcer -v ~/tracker_data:/fastdfs/tracker/data --net=host season/fastdfs tracker
Tracker服务器的端口默认是22122,你可以查看是否启用端口
代码语言:javascript复制[root@localhost /]# netstat -aon | grep 22122
3.使用docker镜像构建storage容器(存储服务器,提供容量和备份服务): (注意修改自己的ip)
代码语言:javascript复制docker run -tid --name storage -v ~/storage_data:/fastdfs/storage/data -v ~/store_path:/fastdfs/store_path --net=host -e TRACKER_SERVER:192.168.115.130:22122 -e GROUP_NAME=group1 season/fastdfs storage
4.此时两个服务都已启动,进行服务的配置。 进入storage容器,到storage的配置文件中配置http访问的端口,配置文件在fdfs_conf目录下的storage.conf。
代码语言:javascript复制[root@localhost /]# docker exec -it storage bash
[root@localhost:/# cd fdfs_conf
[root@localhost:/fdfs_conf# more storage.conf
往下拉,你会发现storage容器的ip不是你linux的ip,如下:
接下来,退出storage容器,并将配置文件拷贝一份出来:
代码语言:javascript复制[root@localhost ~]# docker cp storage:/fdfs_conf/storage.conf ~/
[root@localhost ~]# vi ~/storage.conf
将修改后的配置文件拷贝到storagee的配置目录下:
代码语言:javascript复制[root@localhost ~]# docker cp ~/storage.conf storage:/fdfs_conf/
重新启动storage容器:
代码语言:javascript复制[root@localhost ~]# docker stop storage
[root@localhost ~]# docker start storage
查看tracker容器和storage容器的关联
代码语言:javascript复制[root@localhost ~]# docker exec -it storage bash
[root@localhost:/# cd fdfs_conf
[root@localhost:/fdfs_conf# fdfs_monitor storage.conf
5.在docker模拟客户端上传文件到storage容器
开启一个客户端
代码语言:javascript复制[root@localhost 00]# docker run -tid --name fdfs_sh --net=host season/fastdfs sh
更改配置文件,因为之前已经改过一次了,所以现在直接拷贝
代码语言:javascript复制[root@localhost 00]# docker cp ~/storage.conf fdfs_sh:/fdfs_conf/
创建一个txt文件
代码语言:javascript复制[root@localhost 00]# docker exec -it fdfs_sh bash
[root@localhost:/# echo hello>a.txt
进入fdfs_conf目录,并将文件上传到storage容器
代码语言:javascript复制[root@localhost:/# cd fdfs_conf
[root@localhost:/fdfs_conf# fdfs_upload_file storage.conf /a.txt
/a.txt:指要上传的文件 上传之后,根据返回的路径去找a.txt
退出去查看上传的txt文件
代码语言:javascript复制[root@localhost ~]# cd ~/store_path/data/00/00
[root@localhost 00]# ls
[root@localhost 00]# more wKhzg1wGsieAL-3RAAAABncc3SA337.txt
别忘了关防火墙 到此已经配置完成