FastDfs集群docker化部署
初识分布式文件系统fastdfs…
1.分布式与集群的区别
区别:集群是个物理形态,分布式是个工作方式。只要是一堆机器,就可以叫集群,他们是不是一起协作着干活,这个谁也不知道;一个程序或系统,只要运行在不同的机器上,就可以叫分布式,一般系统现在都是前后端分离,c/s架构、b/s架构,一般服务端部署在内部服务器,而客户端分布在各个用户的机器好比手机、pc机等,这样的系统也是分布式系统。集群一般是物理集中、统一管理的,而分布式系统则不强调这一点。
联系:将一个应用程序拆分成多个功能模块或节点(分布式)后,可以对每一个功能模块或节点用集群的方式来部署,从而达到提升应用程序的整体性能以及高可用的优点。
1.1. 分布式概述
可以将分布式理解为,将某一个应用程序,拆分成多个模块来部署,各个模块负责不同的功能;分布式的优点是细化了应用程序的功能模块,同时也减轻了一个完整的应用程序部署在一台服务器上的负担,用了分布式拆分后,就相当于把一个应用程序的多个功能分配到多台服务器上去处理了。
1.2.集群概述
集群的意思就是将一个应用程序,部署到多台服务器上面,然后在这些服务器的前面通过负载均衡服务器来择优选择哪一台服务器去执行;集群的优点就是当其中的一个服务器宕机了,其他服务器可以接上继续工作;将应用程序部署在多台服务器时,也提供了数据的吞吐量。
2.fastdfs简介
fastdfs是由淘宝的余庆先生所开发,是一个轻量级、高性能的开源分布式文件系统,用纯c语言开发,包括文件存储、文件同步、文件访问(上传、下载)、存取负载均衡、在线扩容、相同内容只存储一份等功能,适合有大容量存储需求的应用或系统。做分布式系统开发时,其中要解决的一个问题就是图片、音视频、文件共享的问题,分布式文件系统正好可以解决这个需求。同类的分布式文件系统有谷歌的gfs、hdfs(hadoop)、tfs(淘宝)等,特别适合以中小文件(建议范围:4kb < file_size <500mb)为载体的在线服务。
fastdfs 系统有三个角色:跟踪服务器(tracker server)、存储服务器(storage server)和客户端(client)。
tracker server:跟踪服务器,主要做调度工作,起到均衡的作用;负责管理所有的 storage server和 group,每个 storage 在启动后会连接 tracker,告知自己所属 group 等信息,并保持周期性心跳。
storage server:存储服务器,主要提供容量和备份服务;以 group 为单位,每个 group 内可以有多台 storage server,数据互为备份。
client:客户端,上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。
2.1. fastdfs的存储策略
为了支持大容量,存储节点(服务器)采用了分卷(或分组)的组织方式。存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用。
在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。
2.2. fastdfs与其他文件系统的对比
2.2.1. 与单机文件系统的对比
2.2.2. 与其他文件系统的对比
2.3. fastdfs文件上传流程
fastdfs向使用者提供基本文件访问接口,比如upload、download、append、delete等,以客户端库的方式提供给用户使用。
storage server会定期的向tracker server发送自己的存储信息。当tracker server cluster中的tracker server不止一个时,各个tracker之间的关系是对等的,所以客户端上传时可以选择任意一个tracker。当tracker收到客户端上传文件的请求时,会为该文件分配一个可以存储文件的group,当选定了group后就要决定给客户端分配group中的哪一个storage server。当分配好storage server后,客户端向storage发送写文件请求,storage将会为文件分配一个数据存储目录。然后为文件分配一个fileid,最后根据以上的信息生成文件名存储文件。
如图:
简单总结一下:
1、client询问tracker上传到的storage,不需要附加参数;
2、tracker返回一台可用的storage;
3、client直接和storage通讯完成文件上传。
2.4. fastdfs的文件同步
写文件时,客户端将文件写至group内一个storage server即认为写文件成功,storage server写完文件后,会由后台线程将文件同步至同group内其他的storage server。每个storage写文件后,同时会写一份binlog,binlog里不包含文件数据,只包含文件名等元信息,这份binlog用于后台同步,storage会记录向group内其他storage同步的进度,以便重启后能接上次的进度继续同步;进度以时间戳的方式进行记录,所以最好能保证集群内所有server的时钟保持同步。storage的同步进度会作为元数据的一部分汇报到tracker上,tracke在选择读storage的时候会以同步进度作为参考。
2.5. fastdfs的文件下载
客户端uploadfile成功后,会拿到一个storage生成的文件名,接下来客户端根据这个文件名即可访问到该文件。
如图:
跟upload file一样,在downloadfile时客户端可以选择任意tracker server。tracker发送download请求给某个tracker,必须带上文件名信息,tracke从文件名中解析出文件的group、大小、创建时间等信息,然后为该请求选择一个storage用来服务读请求。
简单总结一下:
1、client询问tracker下载文件的storage,参数为文件标识(组名和文件名);
2、tracker返回一台可用的storage;
3、client直接和storage通讯完成文件下载。
3. fastdfs docker化集群搭建部署
3.1.准备工作
1)所有机器均能连接外网
2)已安装docker
3)关闭防火墙或防火墙开放对下面要使用的端口(端口在fastdfs集群启动前开放即可)
3.2.搭建步骤
1) 码云上下载该fastdfs_in_docker文件包 链接:https://gitee.com/zjg23/fastdfs_in_docker(文件内含文件如下)
2)将fastdfs_in_docker文件通过xftp传输到所有机器的/home/fastdfs目录下,并创建storage tracker目录。
$ mkdir –p /home/fastdfs/{storage,tracker}(指令方式)
192.168.1.9(tracker服务器)
192.168.1.7(storage服务器)
192.168.1.2(storage服务器)
如下图:
3)(每台机器)进入到fastdfs_in_docker文件目录,并执行docker build指令构建镜像fastdfs镜像。
$docker build -t unionman/fastdfs:2.0 .
此过程耗时会比较长,耐心等待。
4)如下图可以见到,已经成功构建镜像。
过docker images 指令查看当前已构建的镜像。
$docker images
5)接下来,在192.168.1.9上运行容器 部署tracker服务器。
$ docker run -d --name fdfs_tracker -v /home/fastdfs/tracker:/export/fastdfs/tracker --net=host -e tracker_base_path=/export/fastdfs/tracker -e tracker_port=22123 unionman/fastdfs:2.0 sh /usr/local/src/tracker.sh
成功运行容器后,通过docker ps指令查看正在运行的容器状态及容器id。可以看到,tracker容器已经搭建好了。
$docker ps -a
6)接下来,在192.168.1.7 及192.168.1.2上运行容器 部署storage服务器。
在192.168.1.7 上执行:
$ docker run -d --name fdfs_storage -v /home/fastdfs/storage:/export/fastdfs/storage --net=host -e storage_port=23001 -e storage_base_path=/export/fastdfs/storage -e storage_path0=/export/fastdfs/storage -e tracker_server=192.168.1.9:22123 -e group_count=2 -e http_server_port=8080 -e group_name=group1 unionman/fastdfs:2.0 sh /usr/local/src/storage.sh
在192.168.1.2上执行:
$ docker run -d --name fdfs_storage -v /home/fastdfs/storage:/export/fastdfs/storage --net=host -e storage_port=23001 -e storage_base_path=/export/fastdfs/storage -e storage_path0=/export/fastdfs/storage -e tracker_server=192.168.1.9:22123 -e group_count=2 -e http_server_port=8080 -e group_name=group2 unionman/fastdfs:2.0 sh /usr/local/src/storage.sh
同样成功运行容器后,通过docker ps指令查看正在运行的容器状态及容器id。可以看到,storage容器已经搭建好了。
$docker ps -a
到这里,简单的fastdfs集群就已经搭建完了。
在这里简单解释一下docker run的命令。
7)接下来,我们进入到tracker容器内部查看fastdfs详情。
$docker exec -it d9165515fb16 /bin/sh
$ vi /etc/fdfs/client.conf
执行指令查看监控状态
$ /usr/bin/fdfs_monitor /etc/fdfs/client.conf
如果出现如图下情况则,创建相应的文件目录。
再次输入指令
$ /usr/bin/fdfs_monitor /etc/fdfs/client.conf
接下来就可以看到详细的监控状态了。
如图为tracker服务器监控状态:
随便编写一个txt文件,测试上传
$vi zzf.txt
执行上传文件指令
$ /usr/bin/fdfs_test /etc/fdfs/client.conf upload zzf.txt
结果如下图所示
如图为使用fdfs_test客户端上传文件,返回结果集:
每个storage上装有nginx,所以文件也可以通过http的方式直接访问
4.总结
对于fastdnf集群搭建,我也是处于入门阶段,网上搜集很多前辈的资料,学习了几天,亲自搭建了一遍,也亲自把他们的内容归纳总结成这一篇博文。可能还存在一些漏洞。后期有更好的方案或者优化我再去作相应的更新,或者哪位笔友发现问题或者有好的解决方案也可以提供一下,作为博园新人,不足的地方望大家见谅,大家一起进步学习。
推荐阅读
-
FastDfs集群docker化部署
-
Docker部署SQL Server 2019 Always On集群的实现
-
自动化部署(一)jenkins+github+maven+docker
-
win10的jenkins+centos7的docker自动化部署前端项目
-
从零开始CentOS7的docker .net core自动化部署(一)
-
SpringBoot+Docker实现项目的Maven打包&镜像构建&容器中运行==简单自动化部署
-
基于Docker、Nginx和Jenkins实现前端自动化部署
-
Docker部署MySQL8集群(一主二从)的实现步骤
-
三分钟完成 ubuntu16.04初始化,Java,maven,docker环境的部署问题
-
Docker 部署kibana7.7.0 使用xpack监控ES集群