高可用高性能分布式文件系统FastDFS进阶keepalived+nginx对多tracker进行高可用热备
在上一篇 分布式文件系统FastDFS如何做到高可用 中已经介绍了FastDFS的原理和怎么搭建一个简单的高可用的分布式文件系统及怎么访问。
高可用是实现了,但由于我们只设置了一个group,如果现在有5台服务器那将会出现5台只有一个group,每台服务器内的文件内容都相同(互备份)如下图,会造成资源浪费。

因此下面就5台服务器进行优化改造,进一步添加keepalived+nginx多tracker 架构,做到真正的高可用和高性能。
FastDFS集群服务器分布

其中keepalived+nginx用作30和31 tracker服务器作热备。用虚拟VIP 27作统一入口。
我们将按上面的架构分服务器:
虚拟VIP用192.168.80.27
keepalived+nginx 热备、负载均衡 : 28、29
tracker:
30和31服务器
storage:
group1:32、33
group2:34、35
虽然每个服务器上都有Nginx,但这里还是先强调一下这里Nginx的用途:
- 首先所有的Nginx都是用于上传后的文件访问用的,跟上传无关。
- 28、29上面的就是常见的端口负载,这里是对两个tracker访问文件端口8000(自己设置)负载。
- tracker 上安装的 nginx 主要为了提供 http 访问的反向代理、负载均衡以及缓存服务。
- 每一台storage服务器主机上部署Nginx及FastDFS扩展模块,由Nginx模块对storage存储的文件提供http下载服务, 仅当当前storage节点找不到文件时会向源storage主机发起redirect或proxy动作。
注:图中的tracker可能为多个tracker组成的集群;且当前FastDFS的Nginx扩展模块支持单机多个group的情况
tracker跟踪节点30、31
安装配置步骤前文一致,配置tracker.conf 和client.conf,主要注意防火墙 开启端口22122
记得手动创建两个文件夹:
/data/fastdfs/tracker
/data/fastdfs/client
两个节点内容一样。
storage存储节点32到35
记得手动创建两个文件夹:/data/fastdfs/storage
安装步骤与上文一致,配置:
/etc/fdfs/storage.conf
group_name=group1 # 组名(第一组为group1,第二组为group2,依次类推...)
base_path=/data/fastdfs/storage # 数据和日志文件存储根目录
store_path0=/data/fastdfs/storage # 第一个存储目录,第二个存储目录起名为:store_path1=xxx,其它存储目录名依次类推... tracker_server=192.168.80.30:# tracker服务器IP和端口
tracker_server=192.168.80.31:# tracker服务器IP和端口
注意:
32和33 group_name=group1
34和35 group_name=group2
其他配置一样默认,注意防火墙 开启端口23000。
开启两个tracker,并加入开机启动:
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf
chkconfig fdfs_trakcerd on
开启4个storage,并加入开机启动:
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf
chkconfig fdfs_storaged on
查看集群状态,会显示整体内容:
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf

测试服务
/usr/bin/fdfs_test /etc/fdfs/client.conf upload /etc/fdfs/anti-steal.jpg
以上就是FastDFS的安装与配置。下面就与Nginx模块结合作介绍。
将nginx和fastdfs-nginx-module上传到 storage存储节点32到35
fastdfs-nginx-module的作用已经在上篇介绍过,在此主要是配置。
上传fastdfs-nginx-module.tar.gz到/opt文件夹下
解压插件压缩包
unzip fastdfs-nginx-module.zip
nginx编译安装
cd nginx
对nginx重新config
./configure \
--prefix=/opt/nginx \
--pid-path=/opt/nginx/nginx.pid \
--lock-path=/opt/nginx.lock \
--error-log-path=/opt/nginx/log/error.log \
--http-log-path=/opt/nginx/log/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/opt/nginx/client \
--http-proxy-temp-path=/opt/nginx/proxy \
--http-fastcgi-temp-path=/opt/nginx/fastcgi \
--http-uwsgi-temp-path=/opt/nginx/uwsgi \
--http-scgi-temp-path=/opt/nginx/scgi \
--add-module=/opt/fastdfs-nginx-module/src
再进行 make && make install
将mod_fastdfs.conf 拷贝到fdfs下进行配置
cd fastdfs-nginx-module/src
cp mod_fastdfs.conf /etc/fdfs/ #将mod_fastdfs.conf 拷贝到fdfs下进行配置
vim /etc/fdfs/mod_fastdfs.conf
base_path=/data/fastdfs/storage
tracker_server=192.168.80.30:
tracker_server=192.168.80.31:
storage_server_port=23000
group_name=group1 # 第一组storage的组名
url_have_group_name=true
store_path0=/data/fastdfs/storage
group_count=
[group1]
group_name=group1
storage_server_port=
store_path_count=
store_path0=/data/fastdfs/storage
[group2]
group_name=group2
storage_server_port=
store_path_count=
store_path0=/data/fastdfs/storage
注意:
32和33 group_name=group1
34和35 group_name=group2
配置nginx
vim /opt/nginx/conf/nginx.conf
在nginx的配置文件中添加一个Server:
server {
listen 8888;
server_name localhost; location ~/group([0-9])/M00/{
ngx_fastdfs_module;
}
}
8888的请求且有group的都转给 ngx_fastdfs_module 插件处理,防火墙什么的就不说了。
启动Nginx,并加和自启动
shell> /opt/nginx/sbin/nginx
浏览器访问测试时上传的文件,应该都能正常访问。
http://192.168.80.32:8888/group1/M00/00/00/CgNXGVpddOKANpzbAABdrZgsqUU369_big.jpg
http://192.168.80.34:8888/group2/M00/00/00/CgNXGVpddOKANpzbAABdrZgsqUU369_big.jpg
跟踪节点安装Nginx和ngx_cache_purge模块
说明:每个节点执行相同的操作
tracker节点:30,31
在 tracker 上安装的 nginx 主要为了提供 http 访问的反向代理、负载均衡以及缓存服务。
同样都上传nginx和ngx_cache_purge包
解压文件到/opt文件夹下
tar -zxvf ngx_cache_purge-2.3.tar.gz
然后对nginx进行编译安装
cd nginx
./configure --prefix=/opt/nginx --sbin-path=/usr/bin/nginx --add-module=/opt/ngx_cache_purge-2.3
make && make install
配置Nginx,设置tracker负载均衡以及缓存
vi /opt/nginx/conf/nginx.conf
添加以下内容
#设置缓存
server_names_hash_bucket_size ;
client_header_buffer_size 32k;
large_client_header_buffers 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 ;
proxy_send_timeout ;
proxy_read_timeout ;
proxy_buffer_size 16k;
proxy_buffers 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k; #设置缓存存储路径、存储方式、分配内存大小、磁盘最大空间、缓存期限
proxy_cache_path /data/fastdfs/cache/nginx/proxy_cache keys_zone=http-cache:100m;
#设置 group1 的服务器
upstream fdfs_group1 {
server 192.168.80.32: weight= max_fails= fail_timeout=30s;
server 192.168.80.33: weight= max_fails= fail_timeout=30s;
}
#设置 group2 的服务器
upstream fdfs_group2 {
server 192.168.80.34: weight= max_fails= fail_timeout=30s;
server 192.168.80.35: weight= max_fails= fail_timeout=30s;
} server {
listen 8000;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main; #设置 group 的负载均衡参数
location /group1/M00 {
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_cache http-cache;
proxy_cache_valid 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 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.80.0/;
deny all;
proxy_cache_purge http-cache $$is_args$args;
}
#error_page /.html;
# redirect server error pages to the static page /50x.html
#
error_page /50x.html;
location = /50x.html {
root html;
}
}
上面配置的是当请求8000端口时根据group1还是group2进行选择到对应的服务器响应。
要注意的已标色。还要提前创建缓存目录:/data/fastdfs/cache/nginx/proxy_cache
启动Nginx
/opt/nginx/sbin/nginx
设置开机启动:
vi /etc/rc.local## 加入以下配置
/opt/nginx/sbin/nginx
chmod +x /etc/rc.local #centos7
文件访问测试
前面直接通过访问Storage节点中的Nginx访问文件:
http://192.168.80.32:8888/group1/M00/00/00/CgNXGVpddOKANpzbAABdrZgsqUU369_big.jpg
http://192.168.80.34:8888/group2/M00/00/00/CgNXGVpddOKANpzbAABdrZgsqUU369_big.jpg
现在可以通过Tracker中的Nginx来进行访问:
(1)、通过 Tracker1 中的 Nginx 来访问
http://192.168.80.30:8000/group1/M00/00/00/CgNXGVpddOKANpzbAABdrZgsqUU369_big.jpg
http://192.168.80.30:8000/group2/M00/00/00/CgNXGVpddOKANpzbAABdrZgsqUU369_big.jpg
(2)、通过 Tracker2 中的 Nginx 来访问
http://192.168.80.31:8000/group1/M00/00/00/CgNXGVpddOKANpzbAABdrZgsqUU369_big.jpg
http://192.168.80.31:8000/group2/M00/00/00/CgNXGVpddOKANpzbAABdrZgsqUU369_big.jpg

每一个Tracker中的Nginx都单独对后端的Storage组做了负载均衡,但整套FastDFS集群,如果想对外提供统一的文件访问地址,还需要对两个Tracker中的Nginx进行HA集群
配置Tracker服务器高可用、反向代理与负载均衡
其实上面可以通过30或31的8000端口进行文件访问了,下面统一端口,对30和31再进行一次负载均衡。
使用Keepalived + Nginx组成的高可用负载均衡集群,做两个Tracker节点中Nginx的负载均衡。
这里Nginx也可以用Haproxy代替。关于Keepalived和 Haproxy的安装和介绍,在 备胎的养成记KeepAlived实现热备负载 和 入坑系列之HAProxy负载均衡 中作过详细描述。
这里使用Nginx,将Keepalived 和 Nginx 安装到 28和29上,VIP为27。
vi /opt/nginx/conf/nginx.conf
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout ;
## FastDFS Tracker Proxy
upstream fastdfs_tracker {
server 192.168.80.30: weight= max_fails= fail_timeout=30s;
server 192.168.80.31: weight= max_fails= fail_timeout=30s;
}
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page /50x.html;
location = /50x.html {
root html;
}
## FastDFS Proxy
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;
}
}
}
启动Nginx
/opt/nginx/sbin/nginx
设置开机启动:
vi /etc/rc.local## 加入以下配置
/opt/nginx/sbin/nginx
chmod +x /etc/rc.local #centos7
通过VIP访问文件
http://192.168.80.27:8000/dfs/group1/M00/00/00/CgNXGVpddOKANpzbAABdrZgsqUU369_big.jpg
http://192.168.80.27:8000/dfs/group2/M00/00/00/CgNXGVpddOKANpzbAABdrZgsqUU369_big.jpg
以上就是整个配置过程,看起来是非常的繁杂,所以一定要先弄清整个的部署架构,然后每个插件是用来做什么的都要清楚,后面如果要扩展的话就有个清晰的思路。
环境搭建只是开始,真正的使用、优化才是重点,所以耐心的看吧。
高可用高性能分布式文件系统FastDFS进阶keepalived+nginx对多tracker进行高可用热备的更多相关文章
- 高可用高性能分布式文件系统FastDFS实践Java程序
在前篇 高可用高性能分布式文件系统FastDFS进阶keepalived+nginx对多tracker进行高可用热备 中已介绍搭建高可用的分布式文件系统架构. 那怎么在程序中调用,其实网上有很多栗子, ...
- Keepalived+Nginx提供前端负载均衡+主从双机热备+自动切换
原文链接:http://unun.in/linux/156.html 方案: 采用两台Nginx服务器作为前端,提供静态web内容,分发web请求,一主一从,Keepalived实现状态监测,保证 N ...
- 分布式文件系统FastDFS动态扩容
当用户量越来越大,则集群中某个group总会到达其极限,这时就得扩展集群的容量了. FastDFS的扩容分为对group纵向扩容和横向扩容 纵向扩容 指在同一个group组中增加服务器,实现数据冗余, ...
- 【FastDFS】如何打造一款高可用的分布式文件系统?这次我明白了!!
写在前面 前面我们学习了如何基于两台服务器搭建FastDFS环境,而往往在生产环境中,需要FastDFS做到高可用,那如何基于FastDFS打造一款高可用的分布式文件系统呢?别急,今天,我们就一起来基 ...
- FastDFS是使用c语言编写的开源高性能分布式文件系统
FastDFS是什么 FastDFS是使用c语言编写的开源高性能分布式文件系统 是由淘宝开发平台部资深架构师余庆开发,FastDFS孵化平台板块 他对文件进行管理,功能包括文件存储,文件同步,文件访问 ...
- [转]分布式文件系统FastDFS架构剖析
[转]分布式文件系统FastDFS架构剖析 http://www.programmer.com.cn/4380/ 文/余庆 FastDFS是一款类Google FS的开源分布式文件系统,它用纯C语言实 ...
- (转)淘淘商城系列——分布式文件系统FastDFS
http://blog.csdn.net/yerenyuan_pku/article/details/72801777 商品添加的实现,包括商品的类目选择,即商品属于哪个分类?还包括图片上传,对于图片 ...
- 【转】分布式文件系统FastDFS架构剖析
FastDFS是一款类Google FS的开源分布式文件系统,它用纯C语言实现,支持Linux.FreeBSD.AIX等UNIX系统.它只能通过专有API对文件进行存取访问,不支持POSIX接口方式, ...
- 分布式文件系统 - FastDFS 简单了解一下
别问我在哪里 也许我早已不是我自己,别问我在哪里,我一直在这里. 突然不知道说些什么了... 初识 FastDFS 记得那是我刚毕业后进入的第一家公司,一个技术小白进入到当时的项目组后,在开发中上传用 ...
随机推荐
- redis设置开机启动
方式一 1.设置redis.conf中daemonize为yes,确保守护进程开启,也就是在后台可以运行.(设置为yes后,启动时好像没有redis的启动界面,不知道为什么) #vi编辑redis安装 ...
- MongodDB学习笔记(二)(复制)
mongoDB的复制非常容易配置,其实现有两种方式,一种是主从复制,一种是复制集,前者的好处是容易配置,但是如果主服务器宕掉了,整个系统就崩溃了,后者的好处是如果主服务器宕掉了,其他服务器会通过投票选 ...
- Android百分比布局成功导入及简单使用
最近学习第一行代码第二版这本书,里面有介绍百分比布局的使用,经过一番摸索,终于是成功导入了百分比布局 就是这样,appcompat是25.3.1,那么百分比布局percent也是25.3.1 这样便是 ...
- jemeter——badboy导入的jmx文件自带元件解析
线程组设置与解析 含义:1秒启动100个线程,每个线程循环调用20次请求 (包括FTP请求.Java请求.http请求,根据你提交的请求而定) delay thread creation until ...
- Android LayoutInflator 解析
一.实际使用场景引入: 在ListView的Adapter的getView方法中基本都会出现,使用inflate方法去加载一个布局,用于ListView的每个Item的布局. 同样,在使用ViewP ...
- 手动安装cloudera manager 5.x(tar包方式)详解
官方共给出了3中安装方式:第一种方法必须要求所有机器都能连网,由于最近各种国外的网站被墙的厉害,我尝试了几次各种超时错误,巨耽误时间不说,一旦失败,重装非常痛苦.第二种方法下载很多包.第三种方法对系统 ...
- node.js stream
stream是一个接口,流是可以从一个读取或写入数据的目标对象 ,Node 中有很多对象实现了这个接口 一.nodejs stream类型 1. Readable - 可读操作. Writable ...
- 什么是AJAX? AJAX:”Asynchronous JavaScript and XML”中文意思:异步JavaScript和XML。
指一种创建交互式网页应用的网页开发技术. AJAX并非缩写词,而是由Jesse James Gaiiett创造的名词. 不是指一种单一的技术,而是有机地利用了一系列相关的技术: web标准( Stan ...
- 字符串MD5加密运算
public static string GetMd5String(string str) { MD5 md5 = MD5.Create(); by ...
- Golang 中的坑 一
Golang 中的坑 短变量声明 Short variable declarations 考虑如下代码: package main import ( "errors" " ...