[TOC]
* * * * *
### 1. FastDFS介绍
FastDFS( Fast Distributed file system)是一款轻量级的、高性能的、阿里巴巴开源的分布式文件系统。该系统的作者是余庆 (happyfish100),github地址:https://github.com/happyfish100 ,使用Fastdfs可以解决大规模数据存储和负载均衡问题。该文件系统主要提供了一下功能:
* 文件存储
* 文件同步
* 文件访问(文件上传、下载和删除等功能)
fastdfs的设计充分考虑到了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。适合于在线的图片和视频分享的网站。
以其出色的表现,FastDFS已经在许多互联网公司得到了应用,其中包括京东、阿里巴巴、Lockbur等。
### 2. FastDFS架构
FastDFS文件系统结构示意图:
![](https://box.kancloud.cn/2016-07-22_5791e8035b51e.png)
### 2.1 系统服务角色
如上图,文件系统主要分为Tracker(跟踪器)和Storage(存储节点)两种角色,且两种节点都支持单节点和多节点部署。tracker和storage中的多个节点是对等关系并无没有主从之分,所以不存在大部分分布式系统中的单点问题。
1. tracker(跟踪器节点)
1)控制文件访问任务的调度和访问的负载均衡。系统运行时记录中所有存储组和存储服务器的状态信息, 是客户端和数据服务器交互的纽带。
2)tracker可以是单点和集群模式-多个tracker节点。系统运行时可以随时添加和移出tracker节点,不会影响线上服务。
2. storage(存储节点)
1)storage提供对文件的管理,包括文件存储、文件同步和文件访问功能,同时也提供对文件元数据(文件的属性的键值对列表)的管理,例如width=1024, 键是"width",值为 "1024".
2)定时主动向Tracker server报告其状态信息,包括磁盘剩余空间、文件同步状况、文件上传下载次数等统计信息
3)Storage支持集群模式,集群由多个group组成,而一个group由一个或者多个storage组成,这些storage具体体现为具有相同的group_name。
storage server具有以下七种状态:
~~~
FDFS_STORAGE_STATUS_INIT :初始化,尚未得到同步已有数据的源服务器
FDFS_STORAGE_STATUS_WAIT_SYNC :等待同步,已得到同步已有数据的源服务器
FDFS_STORAGE_STATUS_SYNCING :同步中
FDFS_STORAGE_STATUS_DELETED :已删除,该服务器从本组中摘除(注:本状态的功能尚未实现)
FDFS_STORAGE_STATUS_OFFLINE :离线
FDFS_STORAGE_STATUS_ONLINE :在线,尚不能提供服务
FDFS_STORAGE_STATUS_ACTIVE :在线,可以提供服务
~~~
### 2.2 数据存储
#### 2.2.1 存储架构
1. 文件的存储服务是由Storage server提供。
2. Storage集群由多个volume(卷)或称group(组)构成,volume/group之间的文件是独立的,整个系统的存储能力由这些volume/group的存储能力的总合决定。
3. 一个volume/group可以包含一个或者多个storage节点,这些storage节点之间的数据是相同的,起到容灾备份和负载均衡等功能。当向volume/group中添加storage server,volume中的文件会被自动地复制到这个新storage server当中,当数据复制完成后,系统会把该storage server转换为上线状态提供文件服务。
4. 当整个系统存储容量不足时,可以添加volume来扩容,文件的标识有volume名称和文件名确定。
#### 2.2.1 数据交互
配合架构图,更好理解交互过程。
1. 客户端上传文件
1. client询问tracker可以把文件上传哪个storage,不需要附加参数;
2. tracker通过负载均衡策略返回一台可用的storage信息(ip、port);
3. client利用tracker返回的信息与storage建立完成文件上传。
2. 客户端下载文件
1. client询问tracker到哪个storage上去下载文件,参数为文件标识(卷名和文件名);
2. tracker通过负载均衡策略返回一台可用的storage信息(ip、port);
3. client利用tracker返回的信息与storage建立连接,完成文件下载。
### 3. 同步机制
#### 3.1 storage server信息同步
1. storage server信息存在于tracker server和storage之中,且两者之间的信息时相互同步的。
2. tracker运行时会把storage server信息放在内存中,并且会把数据持久化到磁盘文件中,以免重启后数据丢失。
3. storage会记录本组所有的storage server信息,并且也会进行持久化。
##### 3.1.1 何时发生storage信息同步?
当新增storage server实例或者系统中的storage server状态发生变化时:
1. storage server主动连接tracker server
2. tracker server发现有新的storage server连接,将所在组的所有storage返回给新的storage,然后将最新的所有列表同步给组内其他storage。
当新增tracker时:
1. storage server连接该tracker server,发现该tracker server返回的本组storage server列表比本机记录的要少,就会将该tracker server上没有的storage server同步给该tracker server。
#### 3.2 数据同步
1. 当上传新文件时
前边讲到,客户端上传文件时首先会和tracker server通信,获得一个可用的storage server信息,接着与这台storage server进行文件上传(此时称这台服务器为源服务器),这时源服务器会将数据以push的方式同步给组内其他storage server(目标服务器)。数据同步按照以下规则:
1)数据同步是发生在同一组内的所有storage server之间
2)源头数据(client端最开始上传到系统的文件)需要同步,其他数据不需要,以免发生环路
2. 当有新storage加入时
由组中某一storage server将其所有的数据,同步给新storage。待同步完成后,系统将新storage server的转态转换为在线,此时该storage server可以提供服务。
因为文件同步采用的是异步的方式,所以可能会出现刚刚上传的文件client访问不到的问题
- Docker
- 什么是docker
- Docker安装、组件启动
- docker网络
- docker命令
- docker swarm
- dockerfile
- mesos
- 运维
- Linux
- Linux基础
- Linux常用命令_1
- Linux常用命令_2
- ip命令
- 什么是Linux
- SELinux
- Linux GCC编译警告:Clock skew detected. 错误解决办法
- 文件描述符
- find
- 资源统计
- LVM
- Linux相关配置
- 服务自启动
- 服务器安全
- 字符集
- shell脚本
- shell命令
- 实用脚本
- shell 数组
- 循环与判断
- 系统级别进程开启和停止
- 函数
- java调用shell脚本
- 发送邮件
- Linux网络配置
- Ubuntu
- Ubuntu发送邮件
- 更换apt-get源
- centos
- 防火墙
- 虚拟机下配置网络
- yum重新安装
- 安装mysql5.7
- 配置本地yum源
- 安装telnet
- 忘记root密码
- rsync+ crontab
- Zabbix
- Zabbix监控
- Zabbix安装
- 自动报警
- 自动发现主机
- 监控MySQL
- 安装PHP常见错误
- 基于nginx安装zabbix
- 监控Tomcat
- 监控redis
- web监控
- 监控进程和端口号
- zabbix自定义监控
- 触发器函数
- zabbix监控mysql主从同步状态
- Jenkins
- 安装Jenkins
- jenkins+svn+maven
- jenkins执行shell脚本
- 参数化构建
- maven区分环境打包
- jenkins使用注意事项
- nginx
- nginx认证功能
- ubuntu下编译安装Nginx
- 编译安装
- Nginx搭建本地yum源
- 文件共享
- Haproxy
- 初识Haproxy
- haproxy安装
- haproxy配置
- virtualbox
- virtualbox 复制新的虚拟机
- ubuntu下vitrualbox安装redhat
- centos配置双网卡
- 配置存储
- Windows
- Windows安装curl
- VMware vSphere
- 磁盘管理
- 增加磁盘
- gitlab
- 安装
- tomcat
- Squid
- bigdata
- FastDFS
- FastFDS基础
- FastFDS安装及简单实用
- api介绍
- 数据存储
- FastDFS防盗链
- python脚本
- ELK
- logstash
- 安装使用
- kibana
- 安准配置
- elasticsearch
- elasticsearch基础_1
- elasticsearch基础_2
- 安装
- 操作
- java api
- 中文分词器
- term vector
- 并发控制
- 对text字段排序
- 倒排和正排索引
- 自定义分词器
- 自定义dynamic策略
- 进阶练习
- 共享锁和排它锁
- nested object
- 父子关系模型
- 高亮
- 搜索提示
- Redis
- redis部署
- redis基础
- redis运维
- redis-cluster的使用
- redis哨兵
- redis脚本备份还原
- rabbitMQ
- rabbitMQ安装使用
- rpc
- RocketMQ
- 架构概念
- 安装
- 实例
- 好文引用
- 知乎
- ACK
- postgresql
- 存储过程
- 编程语言
- 计算机网络
- 基础_01
- tcp/ip
- http转https
- Let's Encrypt免费ssl证书(基于haproxy负载)
- what's the http?
- 网关
- 网络IO
- http
- 无状态网络协议
- Python
- python基础
- 基础数据类型
- String
- List
- 遍历
- Python基础_01
- python基础_02
- python基础03
- python基础_04
- python基础_05
- 函数
- 网络编程
- 系统编程
- 类
- Python正则表达式
- pymysql
- java调用python脚本
- python操作fastdfs
- 模块导入和sys.path
- 编码
- 安装pip
- python进阶
- python之setup.py构建工具
- 模块动态导入
- 内置函数
- 内置变量
- path
- python模块
- 内置模块_01
- 内置模块_02
- log模块
- collections
- Twisted
- Twisted基础
- 异步编程初探与reactor模式
- yield-inlineCallbacks
- 系统编程
- 爬虫
- urllib
- xpath
- scrapy
- 爬虫基础
- 爬虫种类
- 入门基础
- Rules
- 反反爬虫策略
- 模拟登陆
- problem
- 分布式爬虫
- 快代理整站爬取
- 与es整合
- 爬取APP数据
- 爬虫部署
- collection for ban of web
- crawlstyle
- API
- 多次请求
- 向调度器发送请求
- 源码学习
- LinkExtractor源码分析
- 构建工具-setup.py
- selenium
- 基础01
- 与scrapy整合
- Django
- Django开发入门
- Django与MySQL
- java
- 设计模式
- 单例模式
- 工厂模式
- java基础
- java位移
- java反射
- base64
- java内部类
- java高级
- 多线程
- springmvc-restful
- pfx数字证书
- 生成二维码
- 项目中使用log4j
- 自定义注解
- java发送post请求
- Date时间操作
- spring
- 基础
- spring事务控制
- springMVC
- 注解
- 参数绑定
- springmvc+spring+mybatis+dubbo
- MVC模型
- SpringBoot
- java配置入门
- SpringBoot基础入门
- SpringBoot web
- 整合
- SpringBoot注解
- shiro权限控制
- CommandLineRunner
- mybatis
- 静态资源
- SSM整合
- Aware
- Spring API使用
- Aware接口
- mybatis
- 入门
- mybatis属性自动映射、扫描
- 问题
- @Param 注解在Mybatis中的使用 以及传递参数的三种方式
- mybatis-SQL
- 逆向生成dao、model层代码
- 反向工程中Example的使用
- 自增id回显
- SqlSessionDaoSupport
- invalid bound statement(not found)
- 脉络
- beetl
- beetl是什么
- 与SpringBoot整合
- shiro
- 什么是shiro
- springboot+shrio+mybatis
- 拦截url
- 枚举
- 图片操作
- restful
- java项目中日志处理
- JSON
- 文件工具类
- KeyTool生成证书
- 兼容性问题
- 开发规范
- 工具类开发规范
- 压缩图片
- 异常处理
- web
- JavaScript
- 基础语法
- 创建对象
- BOM
- window对象
- DOM
- 闭包
- form提交-文件上传
- td中内容过长
- 问题1
- js高级
- js文件操作
- 函数_01
- session
- jQuery
- 函数01
- data()
- siblings
- index()与eq()
- select2
- 动态样式
- bootstrap
- 表单验证
- 表格
- MUI
- HTML
- iframe
- label标签
- 规范编程
- layer
- sss
- 微信小程序
- 基础知识
- 实践
- 自定义组件
- 修改自定义组件的样式
- 基础概念
- appid
- 跳转
- 小程序发送ajax
- 微信小程序上下拉刷新
- if
- 工具
- idea
- Git
- maven
- svn
- Netty
- 基础概念
- Handler
- SimpleChannelInboundHandler 与 ChannelInboundHandler
- 网络编程
- 网络I/O
- database
- oracle
- 游标
- PLSQL Developer
- mysql
- MySQL基准测试
- mysql备份
- mysql主从不同步
- mysql安装
- mysql函数大全
- SQL语句
- 修改配置
- 关键字
- 主从搭建
- centos下用rpm包安装mysql
- 常用sql
- information_scheme数据库
- 值得学的博客
- mysql学习
- 运维
- mysql权限
- 配置信息
- 好文mark
- jsp
- jsp EL表达式
- C
- test