fastdfs集群
title: fastdfs集群版搭建
之前电脑空间拮据
搭过一次,只能使用一台电脑不同端口来当服务器
搭建的单机版fastdfs
加了1T的硬盘,刚好有空
今天顺便来把真·集群版的也完成一遍
FastDFS介绍
参考:http://www.oschina.net/p/fastdfs
FastDFS 是一个开源的分布式文件系统
它对文件进行管理,功能包括:
文件存储、文件同步、文件访问(文件上传、文件下载)等
解决了大容量存储和负载均衡的问题。
特别适合以文件为载体的在线服务,如相册网站、视频网站等等
FastDFS 服务端有两个角色:跟踪器(tracker)和存储器(storage)
跟踪器主要做调度工作,在访问上起负载均衡的作用
存储节点存储文件,完成文件管理的所有功能:存储、同步和提供存取接口
创建虚拟机
本次的搭建环境为,在虚拟机下的搭建
使用的镜像为centos6.9
首先创建6台虚拟机
2个跟踪者集群,两个group,每个group两个存储者集群
规定好每台虚拟机ip,后面配置静态ip
指定静态ip
接下来,给每台虚拟机绑定静态ip
不然每次重启都会重新分配ip
使用命令
$ ifconfig
查看当前ip
关闭防火墙
在实际生产环境中,应该只开放用到的端口
因为此处是在本地的虚拟机
所以为了方便,笔者直接关闭每台虚拟机防火墙
使用命令
$ service iptables stop
此时,提示only use by root,需要root权限
于是我们先开启root权限
$ su root
然后输入当前用户的密码,验证通过后即具备root权限
这时候使用刚刚的命令关闭防火墙就没问题了
接下来,禁止防火墙开机自启动
使用命令
$ chkconfig iptables off
至此,虚拟机环境的准备工作就完成了
接下来就是搭建fastdfs了
下载工具包
后续用到的东西,笔者通过百度云分享在这里了
fastdfs相关
链接:https://pan.baidu.com/s/1mNVVmdA8luxzHkPUostgqw 密码:nt0f
nginx相关
链接:https://pan.baidu.com/s/1vVEarFoFJvtoDe1xZROH_A 密码:05wp
perl相关
链接: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虚拟机都需要
上传压缩包到虚拟机有很多种方式
笔者采用较方便的,直接挂载文件夹
挂载后,虚拟机中的/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首页
每台服务器的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