fastdfs集群


title: fastdfs集群版搭建

之前电脑空间拮据
搭过一次,只能使用一台电脑不同端口来当服务器
搭建的单机版fastdfs
加了1T的硬盘,刚好有空
今天顺便来把真·集群版的也完成一遍

FastDFS介绍

参考:http://www.oschina.net/p/fastdfs

FastDFS 是一个开源的分布式文件系统
它对文件进行管理,功能包括:
文件存储、文件同步、文件访问(文件上传、文件下载)等
解决了大容量存储和负载均衡的问题。
特别适合以文件为载体的在线服务,如相册网站、视频网站等等
FastDFS 服务端有两个角色:跟踪器(tracker)和存储器(storage)
跟踪器主要做调度工作,在访问上起负载均衡的作用
存储节点存储文件,完成文件管理的所有功能:存储、同步和提供存取接口
fastdfs集群

创建虚拟机

本次的搭建环境为,在虚拟机下的搭建
使用的镜像为centos6.9
首先创建6台虚拟机
2个跟踪者集群,两个group,每个group两个存储者集群
规定好每台虚拟机ip,后面配置静态ip
fastdfs集群

指定静态ip

接下来,给每台虚拟机绑定静态ip
不然每次重启都会重新分配ip
fastdfs集群
使用命令

$ ifconfig

查看当前ip

关闭防火墙

在实际生产环境中,应该只开放用到的端口
因为此处是在本地的虚拟机
所以为了方便,笔者直接关闭每台虚拟机防火墙
使用命令

$ service iptables stop

此时,提示only use by root,需要root权限
于是我们先开启root权限

$ su root

然后输入当前用户的密码,验证通过后即具备root权限
这时候使用刚刚的命令关闭防火墙就没问题了
接下来,禁止防火墙开机自启动
使用命令

$ chkconfig iptables off

至此,虚拟机环境的准备工作就完成了
接下来就是搭建fastdfs了

下载工具包

后续用到的东西,笔者通过百度云分享在这里了
fastdfs相关
fastdfs集群
链接:https://pan.baidu.com/s/1mNVVmdA8luxzHkPUostgqw 密码:nt0f
nginx相关
fastdfs集群
链接:https://pan.baidu.com/s/1vVEarFoFJvtoDe1xZROH_A 密码:05wp
perl相关
fastdfs集群
链接:https://pan.baidu.com/s/1iEeunTzU_voTjLSxx3ALyg 密码:2koi

规定好存储路径

在每台tracker里:
使用命令

$ mkdir /opt/fastdfs_tracker

创建/opt/fastdfs_tracker目录,作为tracker的base_path
在每台storager里:

$ mkdir /opt/fastdfs_storage_info
$ mkdir /opt/fastdfs_storage_data

创建/opt/fastdfs_storage_info目录,作为存储storage间同步文件的存储目录
创建/opt/fastdfs_storage_data目录,作为storage的存储目录

安装libfastcommon

此步每台fastdfs虚拟机都需要

上传压缩包到虚拟机有很多种方式
笔者采用较方便的,直接挂载文件夹
fastdfs集群
挂载后,虚拟机中的/mnt/hgfs/下,就会具备挂载到的本机目录
如果没有hgfs目录,手动创建一下,重新启用共享就好了
进入挂载目录(此处以挂载到桌面文件夹为例)

$ cd /mnt/hgfs/桌面/

解压命令

$ tar zxf libfastcommonV1.0.7.tar.gz -C /

-C / 参数代表指定解压到根目录,此处C必须大写
进入解压后的目录
执行make命令

$ cd /libfastcommon-1.0.7/
$ ./make.sh
$ ./make.sh install

根据安装信息,发现是在/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

如果报缺乏gcc和perl环境的错误
先安装gcc和perl
使用命令

$ yum -y install gcc
$ yum -y install gcc-c++

安装gcc
接着安装perl
和刚刚一样,先解压perl的压缩包

$ tar zxf perl-5.20.2.tar.gz -C /
$ makedir /usr/local/perl
$ ./Configure-des-Dprefix=/usr/local/perl-Dusethreads=Uversiononly
$ make
$ make install
$ perl -version

然后就可以使用刚刚的两个命令安装libfastcommon,并创建软连接了

安装fastdfs

此步每台fastdfs虚拟机都需要

进入挂载目录(此处以挂载到桌面文件夹为例)

$ cd /mnt/hgfs/桌面/

解压命令

$ tar zxf FastDFS_v5.05.tar.gz -C /

-C / 参数代表指定解压到根目录,此处C必须大写
进入解压后的目录
执行make命令

$ cd /FastDFS/
$ ./make.sh
$ ./make.sh install

至此,所有fastdfs服务机必备的步骤就完成,接下来就是分别对tracker和storage配置了

配置tracker

以下操作对于两台tracker进行
复制并编辑配置文件

$ cd /etc/fdfs
$ cp tracker.conf.sample trakcer.conf
$ vi trakcer.conf

修改如下几个选项(#及后面内容不用输入进去)

disabled=false  #启用配置文件
port=22122  #使用端口
base_path=/opt/fastdfs_tracker  #数据和日志文件存储目录

按Esc
输入wq,回车保持并退出
启动tracker

$ /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart

修改用户自定义开机脚本,配置开机自动启动tracker

$ vi /etc/rc.d/rc.local

在文件末尾加上开启tracker的命令
查看端口

$ netstat -untlp|grep 22122

有显示就是启动成功了
至此,完成了tracker的搭建
tracker的nginx负载均衡我们搭完storage再搭建
因为涉及到storage的缓存

配置storage

以下操作对于四台storage进行
不同的group对group_name进行修改
同一个group的storage的port必须使用一样的
复制并编辑配置文件

$ cd /etc/fdfs
$ cp storage.conf.sample storage.conf
$ vi storage.conf

修改如下几个选项(#及后面内容不用输入进去)

disabled=false	#启用配置文件

group_name=group1	#组名(第一组为 group1,第二组为 group2)

port=23001	#storage 的端口号,同一个组的 storage 端口号必须相同

base_path=/opt/fastdfs_storage_info	#设置 storage 的日志目录

store_path0=/opt/fastdfs_storage_data	#存储路径

store_path_count=1	#存储路径个数,需要和 store_path 个数匹配

tracker_server=192.168.156.151:22122	#tracker 服务器的 IP 地址和端口

tracker_server=192.168.156.152:22122	#多个 tracker 直接添加多条配置

按Esc
输入wq,回车保持并退出
启动storage

$ /usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart

修改用户自定义开机脚本,配置开机自动启动tracker

$ vi /etc/rc.d/rc.local

在文件末尾加上开启storage的命令
查看端口

$ netstat -untlp|grep 23001

有显示就是启动成功了
至此,完成了storage的搭建

查看所有节点

完成所有tracker和storage的启动后
可以在任意storage机器使用命令

/usr/bin/fdfs_monitor /etc/fdfs/storage.conf

查看整个fastdfs系统的信息

测试文件上传

复制,修改任意tracker机器里的client.conf配置文件

$ cd /etc/fdfs
$ cp client.conf.sample client.conf
$ vi client.conf

改动base_path和配置tracker_server

base_path=/opt/fastdfs_storage_info
tracker_server=192.168.156.151:22122
tracker_server=192.168.156.152:22122

上传命令(最后一个参数代表要上传的文件,此处为了方便使用client.conf上传测试)

$ /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /etc/fdfs/client.conf

如果有返回一个以group开头的字符串则是上传成功
至此,fastdfs的搭建我们已经完成近一半

storage安装nginx模块

此步骤每台storage都要安装
storage安装nginx的目的是作为服务器提供http方式访问文件,并解决不同storage之间同步延迟的问题
先创建一个安装nginx的目录

$ mkdir /usr/local/nginx
$ cd /usr/local/nginx

解压安装包修改配置

$ tar zxf /mnt/hgfs/桌面/fastdfs-nginx-module_v1.16.tar.gz -C .
$ tar zxf /mnt/hgfs/桌面/nginx-1.8.0.tar.gz -C .
$ cd fastdfs-nginx-module
$ vi src/config

修改CORE_INCS的值

CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"

安装编译nginx需要的依赖

$ yum install gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl openssl-devel

进入nginx目录并安装module

$ cd /usr/local/nginx/nginx-1.8.0
$ ./configure --prefix=/usr/local/nginx --add-module=/usr/local/nginx/fastdfs-nginx-module/src
$ make && make install

配置nginx

$ cd /usr/local/nginx
$ vi conf/nginx.conf

在listen 80那个server里面添加

location ~/group1/M00{
root /opt/fastdfs_storage_data/data;
ngx_fastdfs_module;
}

不同的group对应不同的路径
比如对于group2里的storage
location就是 ~/group2/M00

复制nginx模块的配置文件并配置

$ cp /usr/local/nginx/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs
$ vi /etc/fdfs/mod_fastdfs.conf

修改对应内容,此处以group1为例

connect_timeout=10

base_path=/opt/fastdfs_storage_info

tracker_server=192.168.156.151:22122

tracker_server=192.168.156.152:22122

storage_server_port=23001

group_name=group1

url_have_group_name = true

store_path0=/opt/fastdfs_storage_data

group_count = 2

[group1]

group_name=group1

storage_server_port=23001

store_path_count=2

store_path0=/opt/fastdfs_storage_data

store_path1=/opt/fastdfs_storage_data

[group2]

group_name=group2

storage_server_port=23002

store_path_count=2

store_path0=/opt/fastdfs_storage_data

store_path1=/opt/fastdfs_storage_data

复制fastdfs提供的配置文件

$ cd /FastDFS/conf
$ cp http.conf mime.types /etc/fdfs/

建立软连接,
将storage文件存储目录链接到实际存放数据的目录

$ ln -s /opt/fastdfs_storage_data/data /opt/fastdfs_storage_data/data/M00

启动nginx

$ /usr/local/nginx/sbin/nginx

因为我们用的是80端口
在浏览器输入http://storage的ip地址
能访问到nginx的界面则代表storage配合nginx成功了
将启动nginx命令写入开机文件

$ vi /etc/rc.d/rc.local

tracker中安装nginx

tracker安装nginx主要目的是负载均衡,反向代理以及缓存服务
以下步骤对于所有tracker都是必须
创建缓存目录

$ mkdir -p /opt/cache/nginx/proxy_cache
$ mkdir -p /opt/cache/nginx/proxy_cache/tmp

创建安装nginx的目录

$ mkdir /usr/local/nginx
$ cd /usr/local/nginx

解压安装包修改配置

$ tar zxf /mnt/hgfs/桌面/nginx-1.8.0.tar.gz -C .
$ tar zxf /mnt/hgfs/桌面/ngx_cache_purge-2.3.tar.gz -C .

安装编译nginx需要的依赖

$ yum install gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl openssl-devel

安装nginx

$ cd /usr/local/nginx/nginx-1.8.0
$ ./configure --prefix=/usr/local/nginx --add-module=/usr/local/nginx/ngx_cache_purge-2.3
$ make && make install

###配置nginx

$ vi /usr/local/nginx/conf/nginx.conf

修改内容


events {
    worker_connections  1024;
    use epoll;
}
http{
	tcp_nopush	on;
	
	#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:200m max_size=1g inactive=30d;
	proxy_temp_path /opt/cache/nginx/proxy_cache/tmp;

	#设置 group1 的服务器

	upstream fdfs_group1 {

	server 192.168.156.153 weight=1 max_fails=2 fail_timeout=30s; 
	server 192.168.156.154 weight=1 max_fails=2 fail_timeout=30s;

	}

	#设置 group2 的服务器

	upstream fdfs_group2 {

	server 192.168.156.155 weight=1 max_fails=2 fail_timeout=30s; 
	server 192.168.156.156 weight=1 max_fails=2 fail_timeout=30s;

	}
	server {

	listen	80;

	server_name	localhost;

	#设置 group 的负载均衡参数

	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.1.0/24;
	deny all;
	proxy_cache_purge http-cache $1$is_args$args;
	}

	}
	
}

启动nginx

$ /usr/local/nginx/sbin/nginx

因为我们用的是80端口
在浏览器输入http://storage的ip地址
能访问到nginx的界面则代表storage配合nginx成功了
将启动nginx命令写入开机文件

$ vi /etc/rc.d/rc.local

测试

机器测试

首先,访问每台服务器的nginx首页
fastdfs集群
每台服务器的nginx都可以访问
OK!!!
如果有某一台访问不了
查看nginx目录下log目录里的日志文件
根据提示查错

上传测试

复制,修改任意tracker机器里的client.conf配置文件

$ cd /etc/fdfs
$ cp client.conf.sample client.conf
$ vi client.conf

改动base_path和配置tracker_server

base_path=/opt/fastdfs_storage_info
tracker_server=192.168.156.151:22122
tracker_server=192.168.156.152:22122

上传命令(最后一个参数代表要上传的文件,此处为了方便使用client.conf上传测试)

$ /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /etc/fdfs/client.conf

上传后得到一个返回的文件名

group2/M00/00/00/wKicm1saiXGALps_AAAF4Qywnmo39.conf

这时候我们在浏览器访问任意一台tracker的ip加上这个文件名
http://trackerip/group2/M00/00/00/wKicm1saiXGALps_AAAF4Qywnmo39.conf
都可以下载该文件
nginx会自动根据group选择不同的upstream,并根据负载均衡计算
跳转到某个storage服务器,看浏览器地址变化就明白了
至此,我们完成了采用Epoll进行负载均衡的fastdfs的搭建

进阶内容–keepalived实现tracker高可用负载

在每台tracker上
修改nginx的配置文件

$ vi /usr/local/nginx/conf/nginx.conf

修改内容


events {
    worker_connections  1024;
    #use epoll;
}
http{
	#tcp_nopush	on;
	
	#gzip on;

	keepalive_timeout	65;

	# Tracker Proxy

	upstream fastdfs_tracker {

	server 192.168.156.151 weight=1 max_fails=2 fail_timeout=30s; 
	server 192.168.156.152 weight=1 max_fails=2 fail_timeout=30s;
	
	}
	
	location /dfs {		
	root	html;		
	index	index.html index.htm;

	proxy_pass	http://fastdfs_tracker/;

	proxy_set_header Host	$http_host;

	proxy_set_header Cookie $http_cookie;

	proxy_set_header X-Real-IP $remote_addr;

	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
	proxy_set_header X-Forwarded-Proto $scheme; client_max_body_size 300m;

	}
}

这个时候,下载文件的路径就不再是trackerip+返回的文件名了
而是通过这个trackerip/dfs/+返回的文件名
这时候由keepalived程序计算
判断访问哪边的tracker,实现高可用
keepalived就是通过定时互相发送心跳,定时检查主从服务机的健康状态
判断服务机是否还活着,当主服务器死了,就由从服务器接手
配置完毕,重启nginx

$ /usr/local/nginx/sbin/nginx -s reload

更多精彩内容

请移步

个人主页: yangyitao.top