1. FastDFS
1.1 简介
FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
图中tracker就相当于仓库管理员,负责管理storage中的文件,
storage中每个组又有一些文件服务器,这些都是平级的,没有主从关系,不像redis,也不像MySQL
storage有心跳机制,每隔一段时间向tracker发送自己的状态等信息,心跳时间可以配置
1.2 上传图片的时序图
从中可以看到,Client想上传图片,它先向Tracker进行询问,Tracker查看一下登记信息之后,告诉Client哪个storage当前空闲,Tracker会把IP和端口号都返回给Client,Client在拿到IP和端口号之后,便不再需要通过Tracker,直接便向Storage进行上传图片,Storage在保存图片的同时,会向Tracker进行汇报,告诉Tracker它当前是否还留有剩余空间,以及剩余空间大小。汇报完之后,Storage将服务器上存储图片的地址返回给Client,Client可以拿着这个地址进行访问图片
1.3 下载图片时的时序图
1. client询问tracker下载文件的storage,参数为文件标识(卷名和文件名);
2. tracker返回一台可用的storage;
3. client直接和storage通讯完成文件下载。
2. FastDFS安装公共配置
2.1 安装包
用xftp连接服务器,上传安装包到 /iflytek/zhcs/software
FastDFS_v5.05.tar.gz
fastdfs-nginx-module_v1.16.tar.gz
libfastcommon-master.zip
nginx-1.10.1.tar.gz
安装zip
yum install zip unzip
解压安装包
unzip libfastcommon-master.zip -d /iflytek/zhcs/fast
tar -zxvf FastDFS_v5.05.tar.gz -C /iflytek/zhcs/fast
2.2 FastDFS集群图
FastDFS集群,我们搭建一个如下图所示的集群,总共需要8台虚拟机,我这边使用4台进行部署。
2.3 安装gcc
安装gcc,使用的命令:yum install make cmake gcc gcc-c++
在10.4.149.166、10.4.149.167、10.4.149.168、10.4.149.169虚拟机也都安装下gcc环境
2.4 安装vim
4台服务器使用命令:yum install vim-enhanced
之所以安装vim是因为安装vim会自动帮我们安装perl,否则我们使用./make.sh来编译的时候会报错,如下图所示。
2.5 编译libfastcommon-master
我们到/usr/local/fast/libfastcommon-master目录下,4台服务器使用命令:./make.sh来进行编译,接着执行./make.sh install命令
2.6 创建软链接
创建第一条软链接的命令:ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so,如下图所示
接着再创建三条软链接,总共4条命令依次如下
ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so
ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so
ln -s /usr/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so
ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so
四台机器创建完软链接之后,我们再查看软链接,如下图所示,发现有一条软链接是红色的,一闪一闪的,这是由于fastclient还未安装造成的,随着后续的安装,这个报警会自动消失
2.7 安装fastDFS包
四台服务器进入到/iflytek/zhcs/fast/FastDF目录下,依次执行./make.sh和./make.sh install命令进行安装。如下图所示
2.8 fdfs_trackerd 、fdfs_storaged修改配置路径
因为FastDFS服务脚本设置的bin目录为/usr/local/bin/下,但是实际我们安装在了/usr/bin/下面。所以我们需要修改FastDFS配置文件中的路径,也就是需要修改俩 个配置文件:
命令:vim /etc/init.d/fdfs_storaged ,
然后输入全局替换命令::%s+/usr/local/bin+/usr/bin并按回车即可完成替换,
替换完之后,保存退出该文件。
同样的步骤,输入第二条命令:vim /etc/init.d/fdfs_trackerd 进行全局替换,
替换命令::%s+/usr/local/bin+/usr/bin。
同样为10.4.149.166、10.4.149.167、10.4.149.168、10.4.149.169进行替换操作
3. FastDFS安装各节点配置
3.1 tracker配置
前面做的都是公共部分的配置,下面我们来配置
tracker1(10.4.149.166)和tracker2(10.4.149.168)。
我们先到cd /etc/fdfs/目录下,使用cp tracker.conf.sample tracker.conf
复制一份tracker.conf.sample并更名为tracker.conf
执行以下命令
编辑tracker.conf文件,需要修改的地方有两处,
第一处:base_path,将默认的路径修改为/fastdfs/tracker。
第二处:store_lookup,该值默认是2(即负载均衡策略),现在把它修改为0(即轮询策略,修改成这样方便一会儿我们进行测试,当然,最终还是要改回到2的。如果值为1的话表明要始终向某个group进行上传下载操作,这时下图中的"store_group=group2"才会起作用,如果值是0或2,则"store_group=group2"不起作用),修改完后复制一份tracker.conf到另一台服务器
3.2 创建目录
由于我们给base_path配置的路径/fastdfs/tracker当前并不存在,
因此我们需要在10.4.149.166和10.4.149.168上创建一下该目录,
创建命令:mkdir -p /fastdfs/tracker,其中-p表示递归创建目录。
3.3 防火墙配置
在启动前,我们需要先在10.4.149.166和10.4.149.168这两台设备上配置一下防火墙,添加端口22122,从而可以让其它设备可以访问22122端口。如果不起动防火墙,可以不配置
添加的内容:-A INPUT -m state --state NEW -m tcp -p tcp --dport 22122 -j ACCEPT,
如下图所示(注意所有的例子都是以一个为例,其它照着操作就可以了)
添加完之后,我们重启防火墙,如下图所示
3.4 trackerd启动
下面我们便使用命令:/etc/init.d/fdfs_trackerd start 进行启动,启动之后,我们再查看该目录/fastdfs/tracker, 发现多了两个目录data和logs,我们可以通过命令:ps -ef | grep fdfs来查看tracker是否正常启动,如下图所示。同理,我们启动一下10.4.149.166上的tracker,
如果想要停止tracker的话,就使用命令/etc/init.d/fdfs_trackerd stop
3.5 storage配置
3.5.1 配置group1
配置storage,按照我们的规划,10.4.149.166、10.4.149.167、10.4.149.168、10.4.149.169四台虚拟机将作为我们的存储节点,
四个节点中同一组的配置应该是相同的,也就是10.4.149.166、10.4.149.168一组(组名为group1),10.4.149.167、10.4.149.169一组(组名为group2)
进入4台机器的配置文件目录/etc/fdfs,然后进行复制storage.conf.sample并更名为storage.conf,使用的命令:cp storage.conf.sample storage.conf,如下图所示
接下来我们编辑storage.conf文件,对于group1的10.4.149.166、10.4.149.168这两台设备需要修改的配置如下。
base_path=/fastdfs/storage
store_path0=/fastdfs/storage
tracker_server=10.4.149.166:22122
tracker_server=10.4.149.168:22122
3.5.2 配置group2
配置完10.4.149.166、10.4.149.168,将storage.conf文件复制到10.4.149.167、10.4.149.169这二台设备上,把group_name由group1改为group2就可以了
3.5.3 创建目录/fastdfs/storage
四台服务器执行mkdir -p /fastdfs/storage
3.5.4 防火墙配置
启动storage之前,我们需要先对10.4.149.166、10.4.149.168、10.4.149.167、10.4.149.169这四台虚拟机的防火墙做下配置,添加端口23000,(不启动防火墙可以不配置)
添加语句:-A INPUT -m state --state NEW -m tcp -p tcp --dport 23000 -j ACCEPT
配置完防火墙之后,我们重启下这四台虚拟机的防火墙,如下图所示
3.5.5 storage启动
配置完防火墙之后,我们到storage所在的四台虚拟机的/fastdfs/storage目录下,
使用命令:/etc/init.d/fdfs_storaged start进行启动,
然后使用命令:tailf /fastdfs/storage/logs/storaged.log来查看启动信息
可以看到,10.4.149.166这台设备成功与两个tracker设备连接了,其中选举了10.4.149.168作为tracker集群的leader, 10.4.149.166和10.4.149.168这两台虚拟机同属一个分组(group1),因此可以从下图的信息中看到成功与10.4.149.168连接的信息。
10.4.149.168则是与10.4.149.166连接
10.4.149.167则是与10.4.149.169连接
10.4.149.169则是与10.4.149.167连接
4. 测试各节点配置
4.1 测试高可用
4.1.1 停止作为tracker的leader
看到上面的信息,说明我们的tracker和storage集群搭建好了,下面我们测试一下tracker的高可用性,
从上图我们可以看到10.4.149.168这台设备是作为tracker的leader的,我们现在人为关掉10.4.149.168的tracker。如下图所示
/etc/init.d/fdfs_tracker stop
关掉10.4.149.168的tracker之后,我们再看看storage所在的四台虚拟机的日志信息。如下图所示,可以看到10.4.149.166自动切换成leader角色了
4.1.2 启动停止掉的tracker
下面我们再启动10.4.149.168上的tracker,如下图所示。
启动后,再看看四台设备的日志信息,如下图所示,可以看到,都重新连接上该tracker了。只不过此时tracker的leader依然是10.4.149.166。
4.1.3 查看storage集群
当我们所有的tracker和storage节点都启动成功之后,我们可以在任意的一个存储节点上查看存储集群的信息,
命令:/usr/bin/fdfs_monitor /etc/fdfs/storage.conf,可以看到如下图所示的集群信息。可以看到tracker Server有两个,
当前提供服务的是192.168.156.5,group的数量是2,第一组的IP有192.168.156.7和192.168.156.8,
第二组的IP有192.168.156.9和192.168.156.10,与我们规划的集群完全一致
4.1.4 查看fdfs所有的命令
可以使用命令cd /usr/bin/ && ls | grep fdfs来查看fdfs所有的命令,如下图所示
4.2 测试上传图片
4.2.1 配置client.conf
由于目前还没有搭建完集群,因此我们暂且在tracker的一台设备上(我们就选择10.4.149.166这台设备)使用client来上传图片进行测试。
进入到/etc/fdfs/目录 cd /etc/fdfs/
使用命令:cp client.conf.sample client.conf复制一份该文件并命名为client.conf
修改client.conf配置文件
4.2.2 用命令上传图片
在/iflytek/zhcs/images目录下上传一张图片1.jpg
使用的命令:/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /iflytek/zhcs/images/1.jpg
得到group1/M00/00/00/CgSVplx0-ZyAYJyaAAGNxheY6tM377.jpg
使用命令:/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /iflytek/zhcs/images/3.jpg
得到group2/M00/00/00/CgSVp1x0_VaAN4s7AAF9l2sUAIs143.jpg
其中group1表示这张图片被保存在了哪个组当中,M00代表磁盘目录,如果电脑只有一个磁盘那就只有M00, 如果有多个磁盘,那就M01、M02...等等。00/00代表磁盘上的两级目录,每级目录下是从00到FF共256个文件夹,两级就是256*256个。CgSVplx0-ZyAYJyaAAGNxheY6tM377.jpg表示被存储到storage上的1.jpg被重命名的名字,这样做的目的是为了防止图片名字重复。
打开目录 cd /fastdfs/storage/data/00/00, 查看文档 ll,发现1.jpg上传到group1中,3.jpg上传到了group2中,因为我们在搭建集群的时候,配置的策略是轮询策略,
(这里说一个情况,那就是同处一个组的某台设备如果发生了故障,那么这时上传的文件将只能存放到其它同组设备上,等故障设备修复后,同组的其它设备会自动将数据同步到该故障设备上,这个不用我们干预)
5. 配置nginx
5.1 解压fastdfs-nginx-module_v1.16.tar.gz,修改配置
四台服务器都需操作
解压fastdfs-nginx-module_v1.16.tar.gz
cd /iflytek/zhcs/software
tar -xzvf fastdfs-nginx-module_v1.16.tar.gz -C /iflytek/zhcs/fast
进入目录cd /iflytek/zhcs/fast/fastdfs-nginx-module/src/
修改config配置文件 vim config的
CORE_INCS="$CORE_INCS /usr/local/include/fastdfs /usr/local/include/fastcommon/"
改为CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
实际执行make install安装时却安装在了/usr/include下面
5.2 安装nginx依赖包
把下面四条命令执行一遍。
yum install pcre
yum install pcre-devel
yum install zlib
yum install zlib-devel
5.3 安装nginx
5.3.1 解压nginx
进入目录/iflytek/zhcs/software
解压nginx 到当前目录 tar -xzvf /iflytek/zhcs/software/nginx-1.10.1.tar.gz
5.3.2 nginx安装fastdfs-nginx-module模块
四台服务器
进入目录 cd /iflytek/zhcs/software/nginx-1.10.1
添加模块并指定生成nginx配置的路径:
./configure --prefix=/iflytek/zhcs/fast/nginx --add-module=/iflytek/zhcs/fast/fastdfs-nginx-module/src/
执行编译安装make 和make install
安装完之后/iflytek/zhcs/fast目录下会多个nginx文件夹
5.3.3 拷贝并修改mod_fastdfs.conf
进入目录cd /iflytek/zhcs/fast/fastdfs-nginx-module/src
复制mod_fastdfs.conf到 /etc/fdfs目录下
命令cp mod_fastdfs.conf /etc/fdfs/
修改/etc/fdfs/目录下的mod_fastdfs.conf
需要修改的地方如下:
connect_timeout=10 //超时时长
tracker_server=10.4.149.166:22122 //tracker服务器
tracker_server=10.4.149.168:22122 //tracker服务器
storage_server_port=23000 //默认就是23000,不用做修改
url_have_group_name=true //是否允许从地址栏进行访问
store_path0=/fastdfs/storage //文件上传存储位置
group_name=group1 //当前服务器的storage所属群组group
group_count=2 //群组个数
[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/fastdfs/storage
[group2]
group_name=group2
storage_server_port=23000
store_path_count=1
store_path0=/fastdfs/storage
我们把10.4.149.166上的这个配置文件复制到其它三台设备上, 10.4.149.168不用改,10.4.149.167,10.4.149.169的group_name改为group2,/etc/fdfs/目录下的mod_fastdfs.conf
5.3.4 拷贝http.conf和mime,types到/etc/fdfs
四台服务器同时把/iflytek/zhcs/fast/FastDFS/conf/目录下的http.conf和mime.types两个文件复制到/etc/fdfs/目录下
cd /iflytek/zhcs/fast/FastDFS/conf/
cp http.conf mime.types /etc/fdfs
复制完之后,我们给四个节点都创建一下软链接,由于步骤都一样,因此在下面输入框中输入创建软链接命令:
ln -s /fastdfs/storage/data/ /fastdfs/storage/data/M00
并同时执行就可以了。如下图所示。
5.3.5 修改nginx的nginx.conf,使其监听8888端口
进入目录cd /iflytek/zhcs/fast/nginx/conf, 增加监听8888端口的server
server {
listen 8888;
server_name localhost;
location ~/group([0-9])/M00 {
ngx_fastdfs_module;
}
}
原因是因为我们在搭建storage的时候,storage.conf使用的端口是8888,因此这里也需要使用8888
配置好后,将nginx.conf拷贝到其他3台服务器
5.3.6 启动nginx
四台服务器全部启动
/iflytek/zhcs/fast/nginx/sbin/nginx -c /iflytek/zhcs/fast/nginx/conf/nginx.conf
启动完后可以查看之前上传的图片
5.4 防火墙配置
如果不启动防火墙,则可以不用配置
使用命令:vim /etc/sysconfig/iptables打开编辑界面,我们添加的一行内容是:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8888 -j ACCEPT
编辑完之后,保存退出,之后需要重新启动防火墙,重启的命令:service iptables restart