一、集群规划: Nginx代理服务器:192.168.0.227:8001(nginx监听端口号 8001) 跟踪服务器1:192.168.0.221:22122 (nginx监听端口号 8000)
一、集群规划:
Nginx代理服务器:192.168.0.227:8001 (nginx监听端口号 8001)
跟踪服务器1:192.168.0.221:22122 (nginx监听端口号 8000)
跟踪服务器2:192.168.0.222:22122 (nginx监听端口号 8000)
存储服务器1:192.168.0.223:23000 (nginx监听端口号 8888)
存储服务器2:192.168.0.224:23000 (nginx监听端口号 8888)
存储服务器3:192.168.0.225:23001 (nginx监听端口号 8888)
存储服务器4:192.168.0.226:23001 (nginx监听端口号 8888)
操作系统:CentOS 6.7
用户:root
安装包:
libfastcommon-master.zip
perl-5.20.2.tar.gz
FastDFS_v5.05.tar.gz
fastdfs-nginx-module_v1.16.tar.gz
nginx-1.6.2.tar.gz
安装包下载:http://pan.baidu.com/s/1dFMkE6t
开始前,先将所有安装包下载到各个节点的/usr/local/src目录中。
1> 本文称节点IP最后一段就代表某个节点,如:192.168.1.206,文中提到206节点,就代表192.168.1.206。
2> 本文称tracker或跟踪服务器是同一个意思
3> 本文称storage或存储服务器是同一个意思
FastDFS集群架构图
二、安装所有集群节点:
(一)所有跟踪服务器和存储服务器均执行如下操作:
1、编译和安装所需的依赖包:
# yum install make cmake gcc gcc-c++
2、安装 libfastcommon:
(1)上传或下载 libfastcommon-master.zip 到/usr/local/src 目录
(2)解压
# cd /usr/local/src/
# unzip libfastcommon-master.zip
如果遇到unzip: command not found,则需要安装unzip : yum -y install unzip
# cd libfastcommon-master
解压完成后,进入文件夹,会看到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 (为了便于操作,可提前下载好压缩包上传到系统)
如果没有安装wget,需要先安装wget, 命令为:yum -y install wget
然后继续安装perl, 执行
tar zxvf perl-5.20.2.tar.gz
mkdir /usr/local/perl
进入文件夹: cd perl-5.20.2
./Configure -des -Dprefix=/usr/local/perl -Dusethreads -Uversiononly
make
make install
perl -version
4. 安装完perl后,重新依次执行 ./make.sh 和 ./make.sh install 这两个命令,完成libfastcommon的安装。
(3) 编译、安装
# ./make.sh
# ./make.sh install
libfastcommon 默认安装到了
/usr/lib64/libfastcommon.so
/usr/lib64/libfdfsclient.so
(4)因为 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
3、安装 FastDFS
(1)上传或下载 FastDFS 源码包(FastDFS_v5.05.tar.gz)到/usr/local/src 目录
(2)解压
# cd /usr/local/src/
# tar -zxvf FastDFS_v5.05.tar.gz
# cd FastDFS
(3)编译、安装(编译前要确保已经成功安装了 libfastcommon)
# ./make.sh
# ./make.sh install
采用默认安装的方式安装,安装后的相应文件与目录:
A、服务脚本在:
/etc/init.d/fdfs_storaged
/etc/init.d/fdfs_tracker
B、配置文件在(样例配置文件):
/etc/fdfs/client.conf.sample
/etc/fdfs/storage.conf.sample
/etc/fdfs/tracker.conf.sample
C、命令工具在/usr/bin/目录下的:
fdfs_appender_test
fdfs_appender_test1
fdfs_append_file
fdfs_crc32
fdfs_delete_file
fdfs_download_file
fdfs_file_info
fdfs_monitor
fdfs_storaged
fdfs_test
fdfs_test1
fdfs_trackerd
fdfs_upload_appender
fdfs_upload_file stop.sh
restart.sh
(4)因为 FastDFS 服务脚本设置的 bin 目录是/usr/local/bin,但实际命令安装在/usr/bin,可以进入
/user/bin 目录使用以下命令查看 fdfs 的相关命令:
# cd /usr/bin/
# ls | grep fdfs
因此需要修改 FastDFS 服务脚本中相应的命令路径,也就是把/etc/init.d/fdfs_storaged 和/etc/init.d/fdfs_tracker 两个脚本中的/usr/local/bin 修改成/usr/bin:
# vi fdfs_trackerd 使用查找替换命令进统一修改:%s+/usr/local/bin+/usr/bin
# vi fdfs_storaged 使用查找替换命令进统一修改:%s+/usr/local/bin+/usr/bin
(二)配置跟踪器(Tracker)
每个tracker服务器执行如下操作
1、 复制 FastDFS 跟踪器样例配置文件,并重命名:
# cd /etc/fdfs/
# cp tracker.conf.sample tracker.conf
2、 编辑跟踪器配置文件:
# vi /etc/fdfs/tracker.conf 修改的内容如下:
disabled=false
port=22122
base_path=/fastdfs/tracker
(其它参数保留默认配置,具体配置解释请参考官方文档说明:http://bbs.chinaunix.net/thread-1941456-1-1.html )
3、 创建基础数据目录(参考基础目录 base_path 配置):
# mkdir -p /fastdfs/tracker
4、 防火墙中打开跟踪器端口(默认为 22122):
# vi /etc/sysconfig/iptables 添加如下端口行:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22122 -j ACCEPT 重启防火墙:
# service iptables restart
5、 启动 Tracker:
# /etc/init.d/fdfs_trackerd start
(初次成功启动,会在/fastdfs/tracker 目录下创建 data、logs 两个目录) 查看 FastDFS Tracker 是否已成功启动:
# ps -ef | grep fdfs
6、 关闭 Tracker:
# /etc/init.d/fdfs_trackerd stop
7、 设置 FastDFS 跟踪器开机启动:
# vi /etc/rc.d/rc.local 添加以下内容:
## FastDFS Tracker
/etc/init.d/fdfs_trackerd start
(三)配置存储器(Storage)
group1: 192.168.0.223,192.168.0.224
group2: 192.168.0.225,192.168.0.226
每个storage服务器执行如下操作
1、 复制 FastDFS 存储器样例配置文件,并重命名:
# cd /etc/fdfs/
# cp storage.conf.sample storage.conf
2、 编辑存储器样例配置文件:
# vi /etc/fdfs/storage.conf 修改的内容如下:
# 修改的内容如下:
disabled=
false
# 启用配置文件
port=
23000
# storage服务端口 默认是23000,同一个组的storage端口号必须一致
group_name=group1
(223、224服务器配group1,225、226服务器配group2)
# 组名(第一组为group1,第二组为group2,依次类推...)
base_path=/fastdfs/storage # 数据和日志文件存储根目录
store_path0=/fastdfs/storage # 第一个存储目录,第二个存储目录起名为:store_path1=xxx,其它存储目录名依次类推...
store_path_count=
1
# 存储路径个数,需要和store_path个数匹配
tracker_server=
192.168
.
0.221
:
22122
# tracker服务器IP和端口
tracker_server=
192.168
.
0.222
:
22122
# tracker服务器IP和端口
http.server_port=
8888
# http访问文件的端口
(其它参数保留默认配置,具体配置解释请参考官方文档说明:http://bbs.chinaunix.net/thread-1941456-1-1.html )
(注意:
store_lookup=2
# 上传组(卷) 的方式 0:轮询方式 1: 指定组 2: 平衡负载(选择最大剩余空间的组(卷)上传)
# 这里如果在应用层指定了上传到一个固定组,那么这个参数被绕过
store_group=group2
# 当上一个参数设定为1 时 (store_lookup=1,即指定组名时),必须设置本参数为系统中存在的一个组名。如果选择其他的上传方式,这个参数就没有效了。
store_server=0
# 选择哪个storage server 进行上传操作(一个文件被上传后,这个storage server就相当于这个文件的storage server源,会对同组的storage server推送这个文件达到同步效果)
# 0: 轮询方式
# 1: 根据ip 地址进行排序选择第一个服务器(IP地址最小者)
# 2: 根据优先级进行排序(上传优先级由storage server来设置,参数名为upload_priority)
store_path=0
# 选择storage server 中的哪个目录进行上传。storage server可以有多个存放文件的base path(可以理解为多个磁盘)。
# 0: 轮流方式,多个目录依次存放文件
# 2: 选择剩余空间最大的目录存放文件(注意:剩余磁盘空间是动态的,因此存储到的目录或磁盘可能也是变化的)
download_server=0
# 选择哪个 storage server 作为下载服务器
# 0: 轮询方式,可以下载当前文件的任一storage server
# 1: 哪个为源storage server 就用哪一个 (前面说过了这个storage server源 是怎样产生的) 就是之前上传到哪个storage server服务器就是哪个了)
3、 创建基础数据目录(参考基础目录 base_path 配置):
# mkdir -p /fastdfs/storage
4、 防火墙中打开存储器端口(默认为 23000):
# vi /etc/sysconfig/iptables 添加如下端口行:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 23000 -j ACCEPT 重启防火墙:
# service iptables restart
5、 启动 Storage:
# /etc/init.d/fdfs_storaged start
(初次成功启动,会在/fastdfs/storage 目录下创建 data、logs 两个目录) 查看 FastDFS Storage 是否已成功启动
# ps -ef | grep fdfs
6、 关闭 Storage:
# /etc/init.d/fdfs_storaged stop
7、 设置 FastDFS 存储器开机启动:
# vi /etc/rc.d/rc.local 添加:
# FastDFS Storage
/etc/init.d/fdfs_storaged start
(四)文件上传测试
1、修改 Tracker 服务器中的客户端配置文件:
# cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf
# vi /etc/fdfs/client.conf
base_path=/fastdfs/tracker
tracker_server=192.168.0.221:22122
tracker_server=192.168.0.222:22122
2、执行如下文件上传命令:
# /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /usr/local/src/FastDFS_v5.05.tar.gz
返回以下ID号,说明文件上传成功:
group1/M00/00/00/wKgxxxxxxxxAVFOL7FJU4.tar.gz
group2/M00/00/00/wKgBxxxxxxxxxxxxxxFJU4.tar.gz
(从返回的ID号中也可以看出,同一个文件分别存储在两个组内group1和group2,但也有可能在同一组中,具体策略是由FastDFS根据服务器的存储情况来分配的)
三、存储节点的Nginx安装
storage中安装nginx,主要是为了提供http的访问服务,同时解决group中storage服务器的同步延迟问题。而tracker中安装nginx,主要是为了提供http访问的反向代理、负载均衡以及缓存服务 。
说明:每个节点执行相同的操作
1、fastdfs-nginx-module 作用说明
FastDFS 通过 Tracker 服务器,将文件放在 Storage 服务器存储,但是同组存储服务器之间需要进入 文件复制,有同步延迟的问题。假设 Tracker 服务器将文件上传到了 192.168.4.125,上传成功后文件 ID 已经返回给客户端。此时 FastDFS 存储集群机制会将这个文件同步到同组存储 192.168.4.126,在文件还 没有复制完成的情况下,客户端如果用这个文件 ID 在 192.168.4.126 上取文件,就会出现文件无法访问的 错误。而 fastdfs-nginx-module 可以重定向文件连接到源服务器取文件,避免客户端由于复制延迟导致的 文件无法访问错误。(解压后的 fastdfs-nginx-module 在 nginx 安装时使用)
2、上传 fastdfs-nginx-module_v1.16.tar.gz 到/usr/local/src 3、解压
# cd /usr/local/src/
# tar -zxvf fastdfs-nginx-module_v1.16.tar.gz
4、修改 fastdfs-nginx-module 的 config 配置文件
# cd fastdfs-nginx-module/src
# vi config
CORE_INCS="$CORE_INCS /usr/local/include/fastdfs /usr/local/include/fastcommon/" 修改为:
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
(注意:这个路径修改是很重要的,不然在 nginx 编译的时候会报错的)
5、上传当前的Nginx(nginx-1.6.2.tar.gz)到/usr/local/src 目录,其实nginx版本已经到了1.12.0、1.13.0了,只是当时测试用的是1.6.2的版本
6、安装编译 Nginx 所需的依赖包
# yum install gcc gcc-c++ make automake autoconf libtool pcre* zlib openssl openssl-devel
7、编译安装 Nginx(添加 fastdfs-nginx-module 模块)
# cd /usr/local/src/
# tar -zxvf nginx-1.6.2.tar.gz
# cd nginx-1.6.2
# ./configure --add-module=/usr/local/src/fastdfs-nginx-module/src (./configure --prefix=/你的安装目录 --add-module=/第三方模块目录 )
# make && make install
8、复制 fastdfs-nginx-module 源码中的配置文件到/etc/fdfs 目录,并修改
# cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/
# vi /etc/fdfs/mod_fastdfs.conf
修改以下配置:
第一组存储服务器的mod_fastdfs.conf配置:
connect_timeout=
10
base_path=/tmp
tracker_server=
192.168
.
1.200
:
22122
tracker_server=
192.168
.
1.201
:
22122
storage_server_port=
23000
group_name=group1 # 第一组storage的组名
url_have_group_name=
true
store_path0=/fastdfs/storage
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
第二组存储服务器的mod_fastdfs.conf配置:
第二组的mod_fastdfs.confg配置与第一组的配置只有group_name和storage_server_port不同:group_name=group2、storage_server_port=23001
9、复制 FastDFS 的部分配置文件到/etc/fdfs 目录
# cd /usr/local/src/FastDFS/conf
# cp http.conf mime.types /etc/fdfs/
10、在/fastdfs/storage 文件存储目录下创建软连接,将其链接到实际存放数据的目录
# ln -s /fastdfs/storage/data/ /fastdfs/storage/data/M00
11、配置 Nginx
简洁版 nginx 配置样例:
user root;
worker_processes 1;
events {
worker_connections 1024;
}
http {
includemime.types;
default_type application/octet-stream;
sendfileon;
keepalive_timeout 65;
server {
listen 8888;
server_name localhost;
# FastDFS 文件访问配置(fastdfs-nginx-module模块)
location ~/group([
0
-
9
])/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 后重新启动。
12、防火墙中打开 Nginx 的 8888 端口
# vi /etc/sysconfig/iptables 添加:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8888 -j ACCEPT
# service iptables restart
13、启动 Nginx
# /usr/local/nginx/sbin/nginx
ngx_http_fastdfs_set pid=xxx
(重启 Nginx 的命令为:/usr/local/nginx/sbin/nginx -s reload)
14、通过浏览器访问测试时上传的文件 http://192.168.0.223:8888/group1/M00/00/00/wKgEfVUYNYeAb7XFAAVFOL7FJU4.tar.gz
http://192.168.0.224:8888/group1/M00/00/00/wKgEfVUYNYeAb7XFAAVFOL7FJU4.tar.gz
四、跟踪节点的Nginx安装
说明:每个节点执行相同的操作
1、上传当前的稳定版本 Nginx(nginx-1.6.2.tar.gz)到/usr/local/src 目录
2、安装编译 Nginx 所需的依赖包
# yum install gcc gcc-c++ make automake autoconf libtool pcre* zlib openssl openssl-devel
3、编译安装 Nginx(跟踪节点可不添加 fastdfs-nginx-module 模块)
# cd /usr/local/src/
# tar -zxvf nginx-1.6.2.tar.gz
# cd nginx-1.6.2
# ./configure (./configure --prefix=/你的安装目录 --add-module=/第三方模块目录 )
# make && make install
4、配置 Nginx
# cd /usr/local/nginx/conf/
# vi nginx.conf
user root;
worker_processes 1;
events {
worker_connections 1024;
}
http {
includemime.types;
default_type application/octet-stream;
sendfileon;
keepalive_timeout 65;
#设置 group1 的服务器
upstream fdfs_group1 {
server
192.168
.
0.223
:
8888
weight=
1
max_fails=
2
fail_timeout=30s;
server
192.168
.
0.224
:
8888
weight=
1
max_fails=
2
fail_timeout=30s;
}
#设置 group2 的服务器
upstream fdfs_group2 {
server
192.168
.
0.225
:
8888
weight=
1
max_fails=
2
fail_timeout=30s;
server
192.168
.
0.226
:
8888
weight=
1
max_fails=
2
fail_timeout=30s;
}
server {
listen 8000;
server_name localhost;
#设置 group 的负载均衡参数
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;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
roothtml;
}
}
}
5、防火墙中打开 Nginx 的 8000 端口
# vi /etc/sysconfig/iptables 添加:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8000 -j ACCEPT
# service iptables restart
6、启动 Nginx
# /usr/local/nginx/sbin/nginx
ngx_http_fastdfs_set pid=xxx
(重启 Nginx 的命令为:/usr/local/nginx/sbin/nginx -s reload)
7、通过浏览器访问测试时上传的文件 http://192.168.0.221:8000/group1/M00/00/00/wKgEfVUYNYeAb7XFAAVFOL7FJU4.tar.gz
http://192.168.0.222:8000/group1/M00/00/00/wKgEfVUYNYeAb7XFAAVFOL7FJU4.tar.gz
五、配置Nginx对Tracker的负载均衡
1、上传当前的稳定版本 Nginx(nginx-1.6.2.tar.gz)到/usr/local/src 目录
2、安装编译 Nginx 所需的依赖包
# yum install gcc gcc-c++ make automake autoconf libtool pcre* zlib openssl openssl-devel
3、编译安装 Nginx(跟踪节点可不添加 fastdfs-nginx-module 模块)
# cd /usr/local/src/
# tar -zxvf nginx-1.6.2.tar.gz
# cd nginx-1.6.2
# ./configure (./configure --prefix=/你的安装目录 --add-module=/第三方模块目录 )
# make && make install
4、配置 Nginx
# cd /usr/local/nginx/conf/
# vi nginx.conf
user root;
worker_processes 1;
events {
worker_connections 1024;
}
http {
includemime.types;
default_type application/octet-stream;
sendfileon;
keepalive_timeout 65;
## FastDFS Tracker Proxy
upstream fastdfs_tracker {
server 192.168.0.221:8000 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.0.222:8000 weight=1 max_fails=2 fail_timeout=30s;
}
server {
listen 8001;
server_name localhost;
location / {
root html;
index index.html index.htm;
proxy_pass http://fastdfs_tracker/;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
roothtml;
}
}
}
5、防火墙中打开 Nginx 的 8001 端口
# vi /etc/sysconfig/iptables 添加:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8001 -j ACCEPT
# service iptables restart
6、启动 Nginx
# /usr/local/nginx/sbin/nginx
ngx_http_fastdfs_set pid=xxx
(重启 Nginx 的命令为:/usr/local/nginx/sbin/nginx -s reload)
7、通过浏览器访问测试时上传的文件 http://192.168.0.227:8001/group1/M00/00/00/wKgEfVUYNYeAb7XFAAVFOL7FJU4.tar.gz
http://192.168.0.227:8001/group1/M00/00/00/wKgEfVUYNYeAb7XFAAVFOL7FJU4.tar.gz