一、简介
FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
FastDFS服务端有两个角色:跟踪器(tracker)和存储节点(storage)。跟踪器主要做调度工作,在访问上起负载均衡的作用。
存储节点存储文件,完成文件管理的所有功能:就是这样的存储、同步和提供存取接口,FastDFS同时对文件的metadata进行管理。所谓文件的meta data就是文件的相关属性,以键值对(key value)方式表示,如:width=1024,其中的key为width,value为1024。文件metadata是文件属性列表,可以包含多个键值对。
跟踪器和存储节点都可以由一台或多台服务器构成。跟踪器和存储节点中的服务器均可以随时增加或下线而不会影响线上服务。其中跟踪器中的所有服务器都是对等的,可以根据服务器的压力情况随时增加或减少。
为了支持大容量,存储节点(服务器)采用了分卷(或分组)的组织方式。存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用。
在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。
当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。
FastDFS中的文件标识分为两个部分:卷名和文件名,二者缺一不可。
安装顺序:
1、FDFS的Tracker
2、FDFS的Storage
3、Tracker安装Nginx
4、Storage安装Fast-nginx-module、Nginx
5、安装代理:Nginx1、Nginx2+keepalive
fastdfs-nginx-module 作用说明
老版本存在的问题,文件过程中存在延迟问题?
解决方法:安装fastdfs-nginx-module
FastDFS 通过 Tracker 服务器,将文件放在 Storage 服务器存储,但是同组存储服务器之间需要进行文件复制, 复制的过程中会造成同步延迟的问题。
假设 Tracker 服务器将文件上传到了 192.168.56.11,上传成功后文件 ID已经返回给客户端。此时 FastDFS 存储集群机制会将这个文件同步到同组存储 192.168.56.12,在文件还没有复制完成的情况下,客户端如果用这个文件 ID 在 192.168.56.12 上取文件,就会出现文件无法访问的错误。而 fastdfs-nginx-module 可以重定向文件连接到源服务器取文件,避免客户端由于复制延迟导致的文件无法访问错误。
(解压后的 fastdfs-nginx-module 在 nginx 安装时使用)
二、服务器规划
2.1、主机规划
2.2、FastDFS系统结构图
2.3、磁盘目录规划
#这里我为了方便把日志什么的都放到了dfs
三、公共组件安装
以下服务器安装的公共组件,不有做任何配置,仅安装组件。
3.1、安装公共组件的查看主机表格。
3.2、编译环境:
3.2.1、依赖软件包:
yum install git gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl-devel wget vim -y
3.2.2、系统环境准备:
[root@ ~]# uname -r
3.10.0-327.el7.x86_64
[root@ ~]# sestatus
SELinux status: disabled
[root@ ~]# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
3.3、安装公共组件说明
安装公共组件的主机包含:192.168.56.11、192.168.56.12、192.168.56.13、192.168.56.14、192.168.56.40、192.168.56.45
3.3.1、目录创建
mkdir /home/dfs #创建数据存储目录 cd /usr/local/src #切换到安装目录准备下载安装包
3.3.2、安装libfatscommon
git clone https://github.com/happyfish100/libfastcommon.git --depth 1 cd libfastcommon/ ./make.sh && ./make.sh install #编译安装
3.3.3、安装FastDFS
cd ../ #返回上一级目录 git clone https://github.com/happyfish100/fastdfs.git --depth 1 cd fastdfs/ ./make.sh && ./make.sh install #编译安装
#配置文件准备
cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf #客户端文件,测试用
再次提醒:以上组件需要在Tracker1、Tracker2、Storage1、Storage2、Storage3、Storage4。
四、配置tracker服务器(192.168.56.40、192.168.0.45)
4.1、修改tracker配置文件
vim /etc/fdfs/tracker.conf # 修改的内容如下: disabled=false # 启用配置文件 port=22122 # tracker服务器端口(默认22122) base_path=/home/dfs # 存储日志和数据的根目录 store_lookup=0 # 轮询方式上传
4.2、启动tracker服务器
cp /usr/local/src/fastdfs/init.d/fdfs_storaged
chmod +x /etc/rc.d/init.d/fdfs_trackerd
/etc/init.d/fdfs_trackerd start 或者 systemctl start fdfs_trackerd 或者 fdfs_trackerd /etc/fdfs/tracker.conf start
初次启动,会在/data/fastdfs/tracker目录下生成logs、data两个目录。
drwxr-xr-x 2 root root 178 May 3 22:34 data drwxr-xr-x 2 root root 26 May 2 18:57 logs
检查FastDFS Tracker Server是否启动成功:
ps aux | grep fdfs_trackerd
4.3、tracker server的关闭命令
/etc/init.d/fdfs_trackerd stop 或者 systemctl stop fdfs_trackerd 或者 fdfs_trackerd /etc/fdfs/tracker.conf stop
4.4、设置tracker server开机启动
chkconfig fdfs_trackerd on
配置文件准备:cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf 4.5、192.168.56.11、192.168.56.12修改storage配置文件
vim /etc/fdfs/storage.conf # 修改的内容如下: disabled=false # 启用配置文件 port=23000 # storage的端口号,同一个组的 storage 端口号必须相同
group_name=group1 base_path=/home/dfs # 存储日志和数据的根目录 store_path0=/home/dfs # 第一个存储目录 store_path_count=1 #存储路径个数,需要和store_path个数匹配 tracker_server=192.168.56.40:22122 # tracker服务器的IP地址和端口 tracker_server=192.168.56.45:22122 # 多个tracker直接添加多条配置
配置group_name
不同分组配置不同group_name,第一组为group1, 第二组为group2
4.6、192.168.56.13、192.168.56.14修改storage配置文件
vim /etc/fdfs/storage.conf # 修改的内容如下: disabled=false # 启用配置文件 port=23000 # storage的端口号,同一个组的 storage 端口号必须相同
group_name=group2 base_path=/home/dfs # 存储日志和数据的根目录 store_path0=/home/dfs # 第一个存储目录 store_path_count=1 #存储路径个数,需要和store_path个数匹配 tracker_server=192.168.56.40:22122 # tracker服务器的IP地址和端口 tracker_server=192.168.56.45:22122 # 多个tracker直接添加多条配置
4.7、启动storage服务器
/etc/init.d/fdfs_storaged start 或者 systemctl start fdfs_storaged 或者 fdfs_storaged /etc/fdfs/tracker.conf start
初次启动,会在/home/dfs目录下生成logs、data两个目录。
drwxr-xr-x 259 root root 8192 May 3 23:06 data drwxr-xr-x 2 root root 26 May 2 19:12 logs
检查FastDFS Tracker Server是否启动成功:
ps aux | grep fdfs_storaged
所有 Storage 节点都启动之后,可以在任一 Storage 节点上使用如下命令查看集群信息:
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf
部分截图信息
看到存储节点状态为 ACTIVE 则表示已生效。
4.8、storage server的关闭命令
/etc/init.d/fdfs_storaged stop 或者 systemctl stop fdfs_storaged 或者 fdfs_storaged /etc/fdfs/tracker.conf stop
4.9、设置storage server开机启动
chkconfig fdfs_storaged on
五、文件上传测试(192.168.56.14)
5.1、修改Tracker服务器客户端配置文件
cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf vim /etc/fdfs/client.conf # 修改以下配置,其它保持默认 base_path=/home/dfs tracker_server=192.168.56.40:22122 # tracker服务器IP和端口 tracker_server=192.168.56.45:22122 #tracker服务器IP2和端口
5.2、执行文件上传命令
#/usr/local/src/beijing.jpg 是需要上传文件路径 /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /usr/local/src/beijing.jpg 返回文件ID号:group2/M00/00/00/wKg4DV2x5f2AVOoHAAR_vqG9FTg399.jpg
(能返回以上文件ID,说明文件已经上传成功)
5.3、报错修改
修改vim /etc/fdfs/client.conf 修改两处
六、在storage节点安装Nginx和fastdfs-nginx-module模块
需要安装的主机含:192.168.56.11、192.168.56.12、192.168.56.13、192.168.56.14
6.1、Nginx和fastdfs-nginx-module安装方法
6.1.1、安装fastdfs-nginx-module
cd ../ #返回上一级目录 git clone https://github.com/happyfish100/fastdfs-nginx-module.git --depth 1 cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs
6.1.2、安装nginx
wget http://nginx.org/download/nginx-1.16.1.tar.gz #下载nginx压缩包 tar -zxvf nginx-1.16.1.tar.gz #解压 cd nginx-1.16.1 #添加fastdfs-nginx-module模块 ./configure --add-module=/usr/local/src/fastdfs-nginx-module/src/ make && make install #编译安装
6.2、fastdfs-nginx-module配置修改
6.2.1、复制 fastdfs-nginx-module 源码中的配置文件到 /etc/fdfs 目录,并修改
cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/ vim /etc/fdfs/mod_fastdfs.conf
6.2.2、192.168.56.11和192.168.56.12修改配置:
vim /etc/fdfs/mod_fastdfs.conf #需要修改的内容如下 tracker_server=192.168.56.40:22122 # 服务器1 tracker_server=192.168.56.45:22122 # 服务器2 url_have_group_name=true store_path0=/home/dfs
group_name=group1
6.2.3、192.168.56.13和192.168.56.14修改配置:
vim /etc/fdfs/mod_fastdfs.conf
#需要修改的内容如下
tracker_server=192.168.56.40:22122 # 服务器1
tracker_server=192.168.56.45:22122 # 服务器2
url_have_group_name=true
store_path0=/home/dfs
group_name=group2
注意group_name的设置,如果是group1就设置为group1,如果是group2就设置为group2。
6.2.4、复制http.conf、mime.types
cd /usr/local/src/fastdfs/conf
cp http.conf mime.types /etc/fdfs/
提示:如果没有这两个文件,会出现不能访问nginx:8888的端口
6.2.5、192.168.56.11、12、13、14配置 Nginx,简洁版nginx配置样例
user nobody; worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 8888; server_name localhost; location ~/group[1-2]/M00 { ngx_fastdfs_module; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
说明:
A、8888 端口值是要与/etc/fdfs/storage.conf中的 http.server_port=8888 相对应,因为 http.server_port 默认为 8888,如果想改成 80,则要对应修改过来。
B、Storage 对应有多个 group 的情况下,访问路径带 group 名,如/group1/M00/00/00/xxx,对应的 Nginx 配置为:
location ~/group([0-9])/M00 { ngx_fastdfs_module; }
C、如查下载时如发现老报 404,将 nginx.conf 第一行 user nobody 修改为 user root 后重新启动。
6.2.7、启动Nginx
/usr/local/nginx/sbin/nginx
6.2.8、通过浏览器访问测试时上传的文件
七、在tracker节点(192.168.56.40、192.168.56.45)安装Nginx
7.1、 在 tracker 上安装的 nginx 主要提供 http 访问的反向代理、负载均衡以及缓存服务 cd nginx-1.16.1 ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --with-pcre --with-http_realip_module make && make install
7.2、配置nginx负载均衡和缓存
user root; worker_processes 1; events { worker_connections 1024; use epoll; } http { include mime.types; default_type application/octet-stream; sendfile on; tcp_nopush on; keepalive_timeout 65; upstream fdfs_group1 { server 192.168.56.11:8888 weight=1 max_fails=2 fail_timeout=30s; server 192.168.56.12:8888 weight=1 max_fails=2 fail_timeout=30s; } upstream fdfs_group2 { server 192.168.56.13:8888 weight=1 max_fails=2 fail_timeout=30s; server 192.168.56.14:8888 weight=1 max_fails=2 fail_timeout=30s; } server { listen 8000; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; #设置 group 的负载均衡参数 location /group1/M00 { proxy_pass http://fdfs_group2; } location /group2/M00 { proxy_pass http://fdfs_group2; } } }
7.3、启动Nginx
/usr/local/nginx/sbin/nginx
八、在Nginx代理(192.168.56.20、192.168.56.25)安装HA
8.1、复制http.conf、mime.types
cd /usr/local/src/fastdfs/conf
cp http.conf mime.types /etc/fdfs/
8.2、两台服务器做Nginx+keepalive组建的HA集群;
user root; worker_processes 1; events { worker_connections 1024; use epoll; } http { include mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log logs/access.log main; sendfile on; tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server_names_hash_bucket_size 128; client_header_buffer_size 32k; large_client_header_buffers 4 32k; client_max_body_size 300m; proxy_redirect off; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 16k; proxy_buffers 4 64k; proxy_busy_buffers_size 128k; proxy_temp_file_write_size 128k; proxy_cache_path /tmp/cache/nginx/proxy_cache levels=1:2 keys_zone=http-cache:200m max_size=1g inactive=30d; proxy_temp_path /tmp/cache/nginx/proxy_cache/tmp; upstream fdfs_group1 { server 192.168.56.40:8000 weight=1 max_fails=2 fail_timeout=30s; server 192.168.56.45:8000 weight=1 max_fails=2 fail_timeout=30s; } upstream fdfs_group2 { server 192.168.56.40:8000 weight=1 max_fails=2 fail_timeout=30s; server 192.168.56.45:8000 weight=1 max_fails=2 fail_timeout=30s; } server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location /group1/M00 { proxy_next_upstream http_502 http_504 error timeout invalid_header; proxy_cache http-cache; proxy_cache_valid 200 304 12h; proxy_cache_key $uri$is_args$args; proxy_pass http://fdfs_group1; expires 30d; } location /group2/M00 { proxy_next_upstream http_502 http_504 error timeout invalid_header; proxy_cache http-cache; proxy_cache_valid 200 304 12h; proxy_cache_key $uri$is_args$args; proxy_pass http://fdfs_group2; expires 30d; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
8.3、建立缓存目录
mkdir -p /tmp/cache/nginx/proxy_cache mkdir -p /tmp/cache/nginx/proxy_cache/tmp
8.4、启动服务
/usr/local/nginx/sbin/nginx -t
/usrl/local/nginx/sbin/nginx
9、测试
[root@192.168.56.40 src]# fdfs_upload_file /etc/fdfs/client.conf beijing1.jpg
group2/M00/00/00/wKg4DV2wbUCAehX0AA_O6LMvcdg092.jpg
浏览器访问:http://192.168.56.150/group2/M00/00/00/wKg4DV2wbUCAehX0AA_O6LMvcdg092.jpg
[root@192.168.56.45 src]# fdfs_upload_file /etc/fdfs/client.conf beijing2.jpg
group1/M00/00/00/wKg4DF2wbTSAHksAAAStIAR5bms782.jpg
浏览器访问:http://192.168.56.150/group1/M00/00/00/wKg4DF2wbTSAHksAAAStIAR5bms782.jpg