前言:php
因为公司项目须要,最近开始学习一下分布式存储相关知识,肯定使用FastDFS这个开源工具。利用周末的时间在虚拟机上搭建了分布式存储系统,在搭建过程当中,发现网上的资料说的并非很全,有些细节须要单独搜索或者本身判断,因此如今想写这篇博客尽可能记录一下本身在过程当中遇到的问题,以及是如何解决的,方便本身也但愿能帮忙到其余人。html
===============================================================长长的分割线====================================================================java
正文:nginx
本次的目的是利用VMware搭建一个属于本身的FastDFS集群。本次咱们选择的是VMware10,具体的安装步骤你们能够到网上搜索,资源不少。c++
在阅读本篇文章以前,你最好对FastDFS有一个初步的了解,我建议能够看看下面的连接文章中的介绍:api
http://blog.csdn.net/poechant/article/details/6977407浏览器
第一步,肯定目标:缓存
Tracker 192.168.224.20:22122 CentOS服务器
Group1-Storage11 192.168.224.25:23000 CentOS网络
Group1-Storage12 192.168.224.26:23000 CentOS
Group2-Storage21 192.168.224.28:23001 CentOS
Group2-Storage22 192.168.224.29:23001 CentOS
虽然上述集群结构中tracker是单一节点,若是在生产环境中,这是不正确的,但如今咱们主要是想经过此次的搭建熟悉基本的搭建流程,因此此处就暂时忽略吧。
第二步,肯定安装版本:
如上图能够看出,截止到2015年5月17日,fastdfsz的最新版本是5.05,区别于以往版本,这个版本将公共的一些函数等单独封装成了libfastcommon这个jar包,因此在安装fastdfs以前,咱们必须先安装libfastcommon。
同时,咱们搭建完的分布式环境,还须要nginx帮忙实现http访问以及负载均衡、缓存等功能,涉及了nginx-1.7.8.tar.gz,fastdfs-nginx-module_v1.16.tar.gz,ngx_cache_purge-2.1.tar.gz。
PS:顺道分享一个网址,这个网址中有不少nginx的模块包,可查询下载: http://labs.frickle.com/files/
第三步,安装虚拟机环境:
若是没有搭建过虚拟机环境,能够参考个人另外两篇博客http://www.cnblogs.com/PurpleDream/p/4263465.html和http://www.cnblogs.com/PurpleDream/p/4263421.html ,主要讲解了如何安装一个CentOS6.5的虚拟机以及如何配置虚拟机的网络,还有如何根据已有的虚拟机,克隆多台虚拟机。
第四步,文件夹初始化:
按照咱们第一步确认的目标,咱们能够如今自由选择一个路径,建立一些文件夹目录,这些目录后边会在配置tracker和storage的过程当中被用到。我在用虚拟机建立的时候,是在/opt这个目录下面建立相关的文件夹,详细以下,仅供参考:
1. 配置tracker所需的base_path: /opt/fastdfs_tracker。
2. 配置storage所需的日志目录: /opt/fastdfs_storage_info。 备注: 这个目录是用来存储storage之间同步文件等日志的
3. 配置storage所需的存储文件目录: /opt/fastdfs_storage_data。备注: 这个目录是用来存储文件的
其实,咱们在使用过程当中并非每一个物理机上都会同时部署tracker和storage,那么根据本身的实际状况,若是只部署storage,则就建立storage的那两个文件夹;反之则只建立tracker的那个文件夹。后边在解释配置文件如何配置的过程当中我将会按照上边的目录路径作配置,你们能够比对着看每一个路径对应哪一个配置。
第五步,安装libfastcommon-1.0.7.zip:
在安装libfastcommon的过程当中,涉及了解压缩、make安装等过程,第一次安装的时候,可能因为环境的缘由,会提示好比没有安装unzip、zip;没有安装perl;没有安装gcc等,逐一安装便可。
1. 利用unzip解压缩,若是提示没有安装 ,则按照下图中的命令安装便可:
2. 解压完成后,进入文件夹,会看到make.sh文件,执行./make.sh命令,可能会报没有安装gcc和perl的错误,截图以下:
3. 为了解决2中的问题,安装gcc和perl:
a. 执行 yum -y install gcc 和 yum -y install gcc-c++ 这了两个命令安装
b. 安装perl时,咱们能够直接用wget命令安装,我这里安装的版本是perl-5.20.2。
能够参考这篇文章安装perl http://blog.sina.com.cn/s/blog_68158ebf0100ndes.html
wget http://www.cpan.org/src/5.0/perl-5.20.2.tar.gz
tar zxvf perl-5.20.2.tar.gz
mkdir /usr/local/perl
./Configure -des -Dprefix=/usr/local/perl -Dusethreads -Uversiononly
make
make install
perl -version
4. 安装完perl后,从新依次执行 ./make.sh 和 ./make.sh install 这两个命令,完成libfastcommon的安装。
5. 注意,上述安装的路径在/usr/lib64/,可是FastDFS主程序设置的lib目录是/usr/local/lib,因此须要建立软链接以下:
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
第六步,安装fastdfs-5.05.tar.gz:
前边几步若是安装的都正确的话,这一步就比较简单了,解压缩fastdfs-5.05.tar.gz,而后依次执行 ./make.sh 和 ./make.sh install 这两个命令,过程当中没有报错,而且打开 /etc/fdfs 这个目录发现有配置文件存在,就说明安装成功了。
第七步,配置tracker:
前边的这六步不管是配置tracker仍是配置storage都是必须的,而tracker和storage的区别主要是在安装完fastdfs以后的配置过程当中。咱们在第一步确认目标时,计划在192.168.224.20这台虚拟机上配置tracker,因此咱们就在这台机器上演示。
1. 进入/etc/fdfs文件夹,执行命令: cp tracker.conf.sample tracker.conf。
2. 编辑tracker.conf,执行命令: vi tracker.conf ,将如下几个选项进行编辑:
a. disabled=false #启用配置文件
b. port=22122 #设置tracker的端口号,通常采用22122这个默认端口
c. base_path=/opt/fastdfs_tracker #设置tracker的数据文件和日志目录(预先建立)
d. http.server_port=8080 #设置http端口号 注意,这个配置在fastdfs5.05这个版本中已经不用配置,不用管这个!
3. 启动tracker,执行以下命令: /usr/local/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
注意,通常fdfs_trackerd等命令在/usr/local/bin中没有,而是在/usr/bin路径下,因此命令修改以下: /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
4. 启动完毕后,能够经过如下两个方法查看tracker是否启动成功:
a. netstat -unltp|grep fdfs,查看22122端口监听状况
b. 经过如下命令查看tracker的启动日志,看是否有错误: tail -100f /opt/fastdfs_tracker/logs/trackerd.log
5. 若是启动没有问题,能够经过如下步骤,将tracker的启动添加到服务器的开机启动中:
a. 打开文件 vi /etc/rc.d/rc.local
b. 将以下命令添加到该文件中 /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
第八步,配置storage:
其实配置storage和配置tracker相似,只不过配置文件和配置内容不同。咱们以配置192.168.224.29配置storage为例。
1. 进入/etc/fdfs文件夹,执行命令: cp storage.conf.sample storage.conf。
2. 编辑storage.conf,执行命令: vi storage.conf ,将如下几个选项进行编辑:
a. disabled=false #启用配置文件
b. group_name=group2 #组名,根据实际状况修改
c. port=23001 #设置storage的端口号,默认是23000,同一个组的storage端口号必须一致
d. base_path=/opt/fastdfs_storage_info #设置storage的日志目录(需预先建立)
e. store_path_count=1 #存储路径个数,须要和store_path个数匹配
f. store_path0=/opt/fastdfs_storage_data #存储路径
g. tracker_server=192.168.224.20:22122 #tracker服务器的IP地址和端口号
h. http.server_port=8080 #设置http端口号 注意,这个配置在fastdfs5.05这个版本中已经不用配置,不用管这个!
3. 启动storage,执行以下命令: /usr/local/bin/fdfs_storage /etc/fdfs/storage.conf restart
注意,通常fdfs_storage等命令在/usr/local/bin中没有,而是在/usr/bin路径下,因此命令修改以下: /usr/bin/fdfs_storage /etc/fdfs/storage.conf restart
4. 启动完毕后,能够经过如下两个方法查看storage是否启动成功:
a. netstat -unltp|grep fdfs,查看23001端口监听状况
b. 经过如下命令查看storage的启动日志,看是否有错误: tail -100f /opt/fastdfs_storage_info/logs/storage.log
5. 启动成功后,能够经过fdfs_monitor查看集群的状况,即storage是否已经注册到tracker服务器中
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf
查看192.168.224.29:23001 是ACTIVE状态便可
6. 若是启动没有问题,能够经过如下步骤,将storage的启动添加到服务器的开机启动中:
a. 打开文件 vi /etc/rc.d/rc.local
b. 将以下命令添加到该文件中 /usr/bin/fdfs_storage /etc/fdfs/storage.conf restart
===============================================================长长的分割线====================================================================
以上八步其实已经完成了fastdfs的配置,若是此时你用java等api编辑客户端,实际上就能够完成文件的上传、同步和下载。可是为何网上还会有不少人说须要nginx呢???其实主要缘由时由于,咱们能够经过配置nginx为下载提供基于http协议的下载等功能。
其实,storage中安装nginx,主要是为了为提供http的访问服务,同时解决group中storage服务器的同步延迟问题。而tracker中安装nginx,主要是为了提供http访问的反向代理、负载均衡以及缓存服务
第九步,安装nginx的准备:
不论是在tracker中仍是storage中安装nginx,前提都须要安装一些基础软件。一些大公司的服务器默认都会初始化这些软件,可是你在配置的时候可能仍是最好本身利用命令确认一下。
1. yum install -y gcc 这个前边在安装libfastcommon以前已经安装了
2. yum install -y gcc-c++ 这个前边在安装libfastcommon以前已经安装了
3. yum install -y pcre pcre-devel
4. yum install -y zlib zlib-devel
5. yum install -y openssl openssl-devel
第十步,在storage中安装nginx:
1. 建立nginx默认的安装文件夹: mkdir /usr/local/nginx
2. 提早将 nginx1.7.8.tar.gz 和 fastdfs-nginx-module_v1.16.tar.gz 解压缩,而后进入nginx1.7.8的文件夹目录,执行以下命令:
./configure --prefix=/usr/local/nginx --add-module=/myself_settings/fastdfs-nginx-module/fastdfs-nginx-module/src
3. 执行完上述命令,若是没有报错的话,咱们继续执行 make 命令,此时编译有可能会报错,那是由于咱们忘了作一项重要的工做,咱们能够参考下面这篇文章http://bbs.chinaunix.net/thread-4163021-1-1.html中的解答,其实汇总就是下面两个意思:
a. 咱们在解压缩fastdfs-nginx-module_v1.16.tar.gz以后,须要进入fastdfs-nginx-module/src目录,编辑config文件,找到包含CORE_INCS这个一行,将路径中local所有去掉,变为CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
b. 创建软链接,这个软链接咱们在第五步安装libfastcommon时的最后一个操做就已经创建了,因此此处不用再创建了。
4. 执行完3个步骤后,咱们在重复执行2中的命令,而后再依次执行 make 和 make install 这两个命令,没有报错误就是安装成功了。
5. 执行命令 cd /usr/local/nginx/conf,编辑 nginx.conf 这个文件,编辑以下:
listen 8080;
在server段中添加:
location ~/group[1-3]/M00{
root/fdfs/storage/data;
ngx_fastdfs_module;
}
注意,若是配置的storage是在group2组,则下面的location应该是 ~/group2/M00
6. 执行命令 cd /myself_settings/fastdfs5.0.5/fastdfs-5.05/conf,即进入fastdfs5.0.5的安装文件夹的conf目录下,将目录下面的http.conf和mime.types拷贝到/etc/fdfs/下,若是不执行这一步,后边在启动nginx时会报错。
7. 执行命令 cd /myself_settings/fastdfs_nginx_module/fastdfs-nginx-module/src,即进入fastdfs-nginx-module_v1.16的安装文件夹的src目录下,将目录下面的mod_fastdfs.conf这个文件拷贝到 /etc/fdfs 目录下。
8. 打开 /etc/fdfs 这个目录,编辑 mod_fastdfs.conf 这个文件,以下:
注意如下配置是group2的第二个storage 192.168.224.29的配置,按照第一步肯定的集群目标来配置的,供你们参考。
a. base_path=/opt/fastdfs_storage_info #保存日志目录
b. tracker_server=192.168.224.20:22122 #tracker服务器的IP地址以及端口号
c. storage_server_port=23001 #storage服务器的端口号
d. group_name=group2 #当前服务器的group名
c. url_have_group_name= true #文件url中是否有group名
d. store_path_count=1 #存储路径个数,须要和store_path个数匹配
e. store_path0=/opt/fastdfs_storage_data #存储路径
f. http.need_find_content_type=true #从文件扩展名查找文件类型(nginx时为true) 注意:这个配置网上通常都会列出,可是在fastdfs5.05的版本中是没有的
h. group_count= 2 #设置组的个数
i. 在文件的末尾,按照第一步肯定的集群目标,追加以下图的配置:
9. 创建软链接 ln -s /opt/fastdfs_storage_data/data /opt/fastdfs_storage_data/data/M00
10. 执行命令启动nginx: /usr/local/nginx/sbin/nginx ,若是/usr/local/nginx/logs/error.log中没有报错,同时访问192.168.224.29:8080这个url能看到nginx的欢迎页面。
第十一步,在tracker中安装nginx:
注意,tracker中nginx安装时比storage中的nginx安装时多安装一个nginx的缓存模块,同时在配置的时候有很大的不一样。
1. 建立nginx默认的安装文件夹: mkdir /usr/local/nginx
2. 提早将 nginx1.7.8.tar.gz、fastdfs-nginx-module_v1.16.tar.gz、ngx_cache_purge-2.1.tar.gz解压缩,而后进入nginx1.7.8的文件夹目录,执行以下命令:
./configure --prefix=/usr/local/nginx --add-module=/myself_settings/fastdfs-nginx-module/fastdfs-nginx-module/src --add-module=/myself_settings/ngx_cache_purge/ngx_cache_purge-2.1
3. 执行完上述命令,若是没有报错的话,咱们继续执行 make 命令,此时编译有可能会报错,那是由于咱们忘了作一项重要的工做,咱们能够参考下面这篇文章http://bbs.chinaunix.net/thread-4163021-1-1.html中的解答,其实汇总就是下面两个意思:
a. 咱们在解压缩fastdfs-nginx-module_v1.16.tar.gz以后,须要进入fastdfs-nginx-module/src目录,编辑config文件,找到包含CORE_INCS这个一行,将路径中local所有去掉,变为CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
b. 创建软链接,这个软链接咱们在第五步安装libfastcommon时的最后一个操做就已经创建了,因此此处不用再创建了。
4. 执行完3个步骤后,咱们在重复执行2中的命令,而后再依次执行 make 和 make install 这两个命令,没有报错误就是安装成功了。
5. 执行命令 cd /usr/local/nginx/conf,编辑 nginx.conf 这个文件,编辑以下:
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
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 /opt/cache/nginx/proxy_cache levels=1:2 keys_zone=http-cache:500m max_size=10g inactive=30d; proxy_temp_path /opt/cache/nginx/proxy_cache/tmp;
upstream fdfs_group1 { server 192.168.224.25:8080 weight=1 max_fails=2 fail_timeout=30s; server 192.168.224.26:8080 weight=1 max_fails=2 fail_timeout=30s; } upstream fdfs_group2 { server 192.168.224.28:8080 weight=1 max_fails=2 fail_timeout=30s; server 192.168.224.29:8080 weight=1 max_fails=2 fail_timeout=30s; }
server {
listen 8080; 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; } location ~/purge(/.*) { allow 127.0.0.1; allow 192.168.224.0/24; deny all; proxy_cache_purge http-cache $1$is_args$args; }
#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;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
6. 执行命令启动nginx: /usr/local/nginx/sbin/nginx ,若是/usr/local/nginx/logs/error.log中没有报错,同时访问192.168.224.20:8080这个url能看到nginx的欢迎页面。
第十二步,测试上传:
1. 打开 /etc/fdfs 文件夹,编辑 client.conf 文件,编辑内容以下:
a. base_path=/opt/fastdfs_tracker #存放路径
b. tracker_server=192.168.224.20:22122 #tracker服务器IP地址和端口号
c. http.tracker_server_port=8080 #tracker服务器的http端口号,注意,这个配置在fastdfs5.0.5中已经没有用了
2. 模拟上传文件,执行以下命令: /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /opt/1.txt
使用浏览器访问返回的url: http://192.168.224.20:8080/group1/M00/00/00/wKjgGlVYgi6AAv3tAAAADv4ZzcQ572.txt
也能够直接访问文件所在的storage: http://192.168.224.25:8080/group1/M00/00/00/wKjgGlVYgi6AAv3tAAAADv4ZzcQ572.txt
上述若是访问成功,会在 tracker 192.168.224.20 的 /opt/cache中产生缓存
咱们还能够经过在url中添加purge清除缓存,例如: http://192.168.224.20:8080/purge/group1/M00/00/00/wKjgGlVYgi6AAv3tAAAADv4ZzcQ572.txt
参考资料:
http://blog.csdn.net/lynnlovemin/article/details/39398043 fastdfs集群的配置教程
http://blog.csdn.net/poechant/article/details/6977407 fastdfs系列教程
http://m.blog.csdn.net/blog/hfty290/42030339 tracker-leader的选举
转载请注明来自博客园 http://www.cnblogs.com/PurpleDream/p/4510279.html,版权归本人和博客园全部,谢谢!