整理了近期在项目上做的一些技术研究,希望与大家共同探讨交流。
在项目中经常推荐客户选择分布式文件存储服务,并且使用阿里云的OSS服务,但也遇到过客户是私有云无法使用OSS或者客户要求必须提供非阿里云方案的情况。此时,有几种方案可供选择,如FastDFS、ceph、hdfs等,我们在项目中首先使用了FastDFS,因此本文就在私有云环境下搭建FastDFS环境进行描述。
应用场景:
三台服务器分别做三组存储,并且需要至少两台tracker地址做主备关系,当一台down机后需要另外一台可以提供正常的访问连接
注:如果需要保障数据不丢失,可以分别每台存储配置两组group(相同group之间数据会自动备份) ,三台服务器group参考如下配置:
# 第一台服务器:group1 group2
# 第二台服务器:group1 group3
# 第三台服务器:group2 group3
涉及FastDFS单台服务器一个tracker多个storage的配置
本次配置没有考虑存储数据安全性,即没有备份,每台存储一个组
搭建服务的部署图
一、安装准备工作
提前安装相关操作系统包
yum install unzip zip gcc-c++
创建一个文件夹/home/admin/fastDFS,用来保存相关软件
公共函数库:libfastcommon-master.zip
主程序:fastdfs-5.10.tar.gz
NGINX与DFS链接模块: fastdfs-nginx-module_v1.16.tar.gz
下载完之后通过ftp工具直接传送到服务器
二、安装步骤
2.1 libfastcommon包安装
FastDFS 将以前版本的公共的一些函数单独封装成了libfastcommon包,所以在安装FastDFS之前我们还必须安装libfastcommon。
2.1.1 解压缩
unzip libfastcommon-master.zip
执行编译步骤:
./make.sh
执行安装步骤:
./make.sh install
libfastcommon.so 默认安装到了/usr/lib64/libfastcommon.so,但是FastDFS主程序设置的lib目录是/usr/local/lib,
所以此处重新设置软链接:
ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so;
ln -s /usr/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so;
ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so;
2.2 FastDFS 安装
执行如下命令:
unzip fastdfs-master.zip
cd fastdfs-master
./make.sh
./mae.sh install
cd /etc/fdfs/
对三个配置文件进行拷贝,备用
cp client.conf.sample client.conf
cp storage.conf.sample storage.conf
cp tracker.conf.sample tracker.conf
2.3 Tracker 安装
创建Tracker服务器的文件路径,用于存储Tracker的数据文件和日志文件等:
mkdir /home/admin/fastDFS/fastdfs_tracker
编辑tracker配置文件/etc/fdfs/tracker.conf,部分配置参数释义如下:
vim /etc/fdfs/tracker.conf
disabled=false #启用配置文件(默认false)
bind_addr= #解析主机地址,空则解析所有主机
port=22122 #tracker服务端口
connect_timeout=30 #连接超时时间30S
network_timeout=60 #网络超时时间60S
base_path=/home/admin/fastDFS/fastdfs_tracker #tracker基础数据存储路径及日志存放路径
max_connections=256 #最大并发连接数
work_threads=4 #工作线程数,最好和cpu核数保持一致
store_lookup=0 #选择上传文件模式 0代表group轮询 1指定特定group 2选择空间最大的group
#store_group= #上传文件组,如果模式为1,则必须设置成核特定group一致的组名
store_server=0 #选择存储服务器上传文件 0代表轮询,1根据通过IP第的顺序 2通过优先级
store_path=0 #选择哪块存储盘上传文件 0代表轮询,2代表优先最大存储空间盘(路径)
download_server=0 #选择哪台存储服务器下载文件0代表轮询,1代表当前文件上传的源服务器
reserved_storage_space = 10% #系统保留存储空间10%
######其余都默认就好
为启动脚本创建软链接,fdfs_trackerd等命令在/usr/local/bin中并没有,而是在/usr/bin路径下:
ln -s /usr/bin/fdfs_trackerd /usr/local/bin
ln -s /usr/bin/stop.sh /usr/local/bin
ln -s /usr/bin/restart.sh /usr/local/bin
最后通过命令启动Tracker服务器:
service fdfs_trackerd start
如果启动命令执行成功,那么同时在刚才创建的tracker文件目录/home/admin/fastDFS/fastdfs_tracker中就可以看到启动后新生成的data和logs目录,tracker服务的端口也应当被正常监听,最后再通过netstat命令查看一下端口监听情况:
netstat -unltp|grep fdfs
检查服务运行的22122端口是否正常
2.4 Storage安装
创建Storage服务器的文件目录,注意同Tracker相比要多建一个目录,因为Storage还需要一个文件存储路径,用于存放接收的文件:
mkdir /home/admin/fastDFS/fastdfs_storage
mkdir /home/admin/fastDFS/fastdfs_storage_data
接下来修改/etc/fdfs/storage.conf配置文件,部分配置参数释义如下:
vim /etc/fdfs/storage.conf
group_name=group1 #存储组名
client_bind=true #当连接其他服务器时解析该主机地址
port=23000 #storage端口 23000
store_path_count=1 #存储路径个数,需要和store_path个数匹配
base_path=/home/admin/fastDFS/fastdfs_storage #基础存储数据和日志文件
store_path0=/home/admin/fastDFS/fastdfs_storage_data #group所占用的目录或硬盘,有几个写几个
tracker_server=10.124.164.137:22122 #指定tracker1服务器
tracker_server=10.124.164.138:22122 #指定tracker2服务器
tracker_server=10.124.164.139:22122 #指定tracker3服务器
配置完成后同样要为Storage服务器的启动脚本设置软链接:
ln -s /usr/bin/fdfs_storaged /usr/local/bin
启动Storage服务:
service fdfs_storaged start
验证成功启动的方法:
netstat -unltp|grep fdfs
查看是否有23000,22122,两个端口在。成功后,将在/home/admin/fastDFS/fastdfs_storage_data/data目录下生成文件夹,data下有256个1级目录,每级目录下又有256个2级子目录,总共65536个文件夹。
新写的文件会以hash的方式被路由到其中某个子目录下,然后将文件数据直接作为一个本地文件存储到该目录中。
最后再检查一下storage服务的端口监听情况:
查看storage服务器是否已经登记到 tracker服务器,运行以下命令:
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf
看到10.124.164.137 ACTIVE 字样即可说明storage服务器已经成功登记到了tracker服务器
至此已经完成了fastdfs的全部配置,此时可以用客户端工具进行文件上传下载的测试了。
2.5 修改本地客户端配置
创建了客户端基础数据和日志文件目录
mkdir /home/admin/fastDFS/client
vim /etc/fdfs/client.conf
base_path=/home/admin/fastDFS/client #基础数据和日志文件
tracker_server=10.124.164.137:22122 #tracker1服务器
tracker_server=10.124.164.138:22122 #tracker2服务器
tracker_server=10.124.164.139:22122 #tracker3服务器
2.6 fastdfs-nginx-module
FastDFS目前已不支持http协议
余庆大大提供了nginx上使用FastDFS的模块fastdfs-nginx-module,
这样做最大的好处就是提供了HTTP服务并且解决了group中storage服务器的同步延迟问题,
安装nginx模块依赖lib库
yum -y install pcre pcre-devel
yum -y install zlib zlib-devel
yum -y install openssl openssl-devel
下载模块fastdfs-nginx-module,并编译安装Nginx
进入源码nginx安装文件夹
解压成功后就可以编译安装nginx了,进入nginx目录并输入以下命令进行配置:
./configure --sbin-path=/home/admin/nginx/sbin/nginx --modules-path=/home/admin/nginx/modules --conf-path=/home/admin/nginx/conf/nginx.conf --pid-path=/home/admin/nginx/logs/nginx.pid --error-log-path=/home/admin/nginx/logs/error.log --prefix=/home/admin/nginx --http-log-path=/home/admin/nginx/logs/access.log --add-module=/home/admin/fastDFS/fastdfs-nginx-module-master/src
make
make install
拷贝配置文件
cp /home/admin/fastDFS/fastdfs-master/conf/http.conf /etc/fdfs/
cp /home/admin/fastDFS/fastdfs-master/conf/mime.types /etc/fdfs/
cp /home/admin/fastDFS/fastdfs-nginx-module-master/src/mod_fastdfs.conf /etc/fdfs/
编辑mod_fastdfs.conf文件
vim /etc/fdfs/mod_fastdfs.conf:
base_path=/home/admin/fastDFS/fastdfs_storage #修改成和storage 存放路径一致
tracker_server=10.124.164.137:22122 #配置成tracker server 地址和端口
tracker_server=10.124.164.138:22122 #配置成tracker server 地址和端口
tracker_server=10.124.164.139:22122 #配置成tracker server 地址和端口
url_have_group_name = true #url中是否包组名(默认为false,需要改成true)
store_path0=/home/admin/fastDFS/fastdfs_storage_data #文件存放路径,与storage 一致
group_count = 3 #0代表单组,非零代表多组,一般设置几就为几组
[group1] #设置了group_count = 3,接下来就需要在文件尾部追加这3个group setting
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/home/admin/fastDFS/fastdfs_storage_data
[group2]
group_name=group2
storage_server_port=23000
store_path_count=1
store_path0=/home/admin/fastDFS/fastdfs_storage_data
[group3]
group_name=group3
storage_server_port=23000
store_path_count=1
store_path0=/home/admin/fastDFS/fastdfs_storage_data
以下为nginx的配置
10.124.164.137 nginx配置
vim /home/admin/nginx/conf/nginx.conf
user root;
worker_processes 4;
events {
worker_connections 40960;
use epoll;
}
http {
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 300m;
sendfile on;
tcp_nopush on;
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;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
upstream fdfs_group1 {
server 10.124.164.137:8080 weight=1 max_fails=2 fail_timeout=30s;
}
upstream fdfs_group2 {
server 10.124.164.138:8080 weight=1 max_fails=2 fail_timeout=30s;
}
upstream fdfs_group3 {
server 10.124.164.139:8080 weight=1 max_fails=2 fail_timeout=30s;
}
include /home/admin/nginx/conf.d/*.conf;
}
10.124.164.137 tracker.conf 配置
vim /home/admin/nginx/conf.d/tracker.conf
server {
listen 9999;
server_name 10.124.164.137;
location ~ /group1/M00 {
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_pass http://fdfs_group1;
expires 30d;
}
location ~ /group2/M00 {
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_pass http://fdfs_group2;
expires 30d;
}
location ~ /group3/M00 {
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_pass http://fdfs_group3;
expires 30d;
}
}
10.124.164.137 storage.conf配置
vim /home/admin/nginx/conf.d/storage.conf
server {
listen 8080;
server_name 10.124.164.137;
location ~ /group1/M00 {
root /home/admin/fastDFS/fastdfs_storage_data/data;
index index.html index.htm;
ngx_fastdfs_module;
}
}
另外两台服务器配置,同理
最后启动nginx:
/home/admin/nginx/sbin/nginx
三、使用
3.1 使用java客户端
从https://github.com/happyfish100/fastdfs-client-java下载测试代码
配置fdfs_client.conf文件
tracker_server = 10.124.164.137:22122
tracker_server = 10.124.164.138:22122
tracker_server = 10.124.164.139:22122
配置fastdfs-client.properties
fastdfs.http_tracker_http_port = 8080
fastdfs.tracker_servers = 10.124.164.137:22122,10.124.164.138:22122,10.124.164.139:22122
运行时配置:指定配置文件和要上传的文件路径
运行Test.java
3.2 使用本地Client
查看状态是否正常
fdfs_monitor /etc/fdfs/client.conf
1. 编辑3个文件:
echo “aaa” >>/opt/1.txt && echo “bbb” >>/opt/2.txt && echo “ccc” >>/opt/3.txt
2. 上传文件:
/usr/bin/fdfs_test /etc/fdfs/client.conf upload 1.txt
/usr/bin/fdfs_test /etc/fdfs/client.conf upload 2.txt
/usr/bin/fdfs_test /etc/fdfs/client.conf upload 3.txt
返回结果中会把上传完成的url 打印出来,如都成功则 复制URL在浏览器中打开看是否正常
upload:上传普通文件,包括主文件
upload_appender:上传appender文件,后续可以对其进行append、modify和truncate操作
upload_slave:上传从文件
download:下载文件
delete:删除文件
append:在appender文件后追加内容
modify:appender文件修改
set_metadata:设置文件附加属性
get_metadata:获取文件附加属性