喻轩Blog - 存储
type: channel
link: https://blog.yuxuan.io/categories/storage
items: OSS云储存实战
items: OSS存储开放接口规范和错误响应
items: OSS云存储的权限控制
items: OSS功能详解
items: OSS云存储基本概念
items: 阿里云OSS云存储简介
items: FastDFS应用实战
items: FastDFS集群和配置优化
items: FastDFS系统架构和功能原理
items: FastDFS基础

OSS云储存实战
type: item
date: 2020-09-10T01:07:21+08:00
description: 快速入门案例描述图片上传配置环境pom.xml<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.oss</groupId> <artifactId>oss-project01</artifactId> <version>1.0-SNAPSHOT</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.5</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.8.0</version> </dependency> </dependencies> </project>图片上传代码实现package com.oss; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; public class FileUpLoad { public static void main(String[] args) throws FileNotFoundException { // Endpoint以杭州为例，其它Region请按实际情况填写。 //String endpoint = "http://oss-cn-hangzhou.aliyuncs.com"; String endpoint = "http://oss-cn-beijing.aliyuncs.com"; // 云账号AccessKey有所有API访问权限，建议遵循阿里云安全最佳实践 创建并使用RAM子账号进行API访问或日常运维， String accessKeyId = "LTAI4GD1XcQgrQuvkKnZYhhA"; String accessKeySecret = "1n2i3VNxd5gWr9YPYuJbVMophsXUQr"; // 创建OSSClient实例。 OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); // 上传文件流。 InputStream inputStream = new FileInputStream(new File("src\\main\\resources\\1.png")); ossClient.putObject("test-imgs", "1.png", inputStream); // 关闭OSSClient。 ossClient.shutdown(); } }java API操作需求描述1）创建Bucket2）把字符串存入OSS，Object的名称为fir…

OSS存储开放接口规范和错误响应
type: item
date: 2020-09-10T00:19:23+08:00
description: 开放接口规范开发者在发送请求给 OSS 时，既可以使用 带签名认证的请求，也可以使用匿名访问。OSS提供的相关API接口如下:关于Service操作API描述getService (listBuckets)返回请求者拥有的所有Bucket关于Bucket的操作API描述createBucket创建BucketputBucketACL设置Bucket访问权限putBucketLogging开启Bucket日志putBucketWebsite设置Bucket为静态网站托管模式putBucketReferer设置Bucket的防盗链规则putBucketLifecycle设置Bucket中Object的生命周期规则getBucket(ListObject)列出Bucket中所有Object的信息getBucketAcl获得Bucket访问权限getBucketLocation获得Bucket所属的数据中心位置信息getBucketInfo获取Bucket信息getBucketLogging查看Bucket的访问日志配置情况getBucketWebsite查看Bucket的静态网站托管状态getBucketReferer查看Bucket的防盗链规则getBucketLifecycle查看Bucket中Object的生命周期规则deleteBucket删除BucketdeleteBucketLogging关闭Bucket访问日志记录功能deleteBucketWebsite关闭Bucket的静态网站托管模式deleteBucketLifecycle删除Bucket中Object的生命周期规则putBucketEncryption配置Bucket的加密规则getBucketEncryption获取Bucket的加密规则deleteBucketEncryption删除Bucket的加密规则关于Object的操作API描述putObject上传ObjectcopyObject拷贝一个Object成另外一个ObjectgetObject获取ObjectappendObject在Object尾追加上传数据deleteObject删除ObjectdeleteMultipleObjects删除多个ObjectheadObject只返回某个Object的meta信息，不返回文件内容getObjectMeta返回Object的基本meta信息，包括该Object的ETag、Size（文件大小）、LastModified，不返回文件内容postObject使用Post上传ObjectputObjectACL设置ObjectACLgetObjectACL获取ObjectACL信息callback上传回调putSymlink创建软链接getSymlink获取软链接restoreObject解冻文件selectObject用SQL语法查询Object内容putObjectTagging设置或更新对象标签getObjectTagging获取对象标签信息deleteObjectTagging删除指定的对象标签关于Multipart Upload的操作API描述InitiateMultipartUpload初始化MultipartUpload事件uploadPart分块上传文件uploadPartCopy分块复制上传文件completeMultipartUpload完成整个文件的MultipartUpload上传abortMultipartUpload取消MultipartUpload事件listMultipartUploads罗列出所有执行中的MultipartUpload事件listParts罗列出指定UploadID所属的所有已经上传成功Part跨域资源共享（CORS）API描述putBucketcors在指定Bucket设定一个CORS的规则getBucketcors获取指定的Bucket目前的CORS规则deleteBucketcors关闭指定Bucket对应的CORS功能并清空所有规则optionObject跨域访问preflight请求关于Live Channel的操作API描述putLiveChannelStatus切换LiveChannel的状态putLiveChannel创建LiveChannelgetVodPlaylist获取播放列表postVodPlaylist生成播放列表get LiveChannelStat获取LiveChannel的推流状态信息getLiveChannelInfo获取LiveChannel的配置信息getLiveChannelHistory获取LiveChannel的推流记录listLiveChannel列举LiveCha…

OSS云存储的权限控制
type: item
date: 2020-09-09T23:42:20+08:00
description: 权限控制方式针对存放在 Bucket 的 Object 的访问，OSS 提供了多种权限控制方式，包括 ACL、RAM Policy 和 Bucket Policy。ACL：OSS 为权限控制提供访问控制列表（ACL）。ACL是基于资源的授权策略，可授予 Bucket 和 Object 访问权限。 可以在创建 Bucket 或上传 Object 时设置ACL，也可以在创建 Bucket 或上传Object 后的任意时间内修改 ACL。RAM Policy：RAM （Resource Access Management）是阿里云提供的资源访问控制服务。RAM Policy 是基于用户的授权策略。Bucket Policy：Bucket Policy 是基于资源的授权策略。相比于 RAM Policy，Bucket Policy 操作简单，支持在控制台直接进行图形化配置。ACLBucket ACLBucket ACL是 Bucket 级别的权限访问控制。目前有三种访问权限：public-read-write，publicread 和 private，含义如下：权限值中文名称权限对访问者的限制public-read-write公共读写任何人（包括匿名访问）都可以对该 Bucket 中的 Object 进行读/写/删除操作；所有这些操作产生的费用由该 Bucket 的 Owner 承担，请慎用该权限。public-read公共读，私有写只有该 Bucket 的 Owner 或者授权对象可以对存放在其中的 Object 进行写/删除操作；任何人（包括匿名访问）可以对 Object 进行读操作。private私有读写只有该 Bucket 的 Owner 或者授权对象可以对存放在其中的 Object 进行读/写/删除操作；其他人在未经授权的情况下无法访问该 Bucket 内的 Object。操作方式:操作方式特点控制台Web应用程序，直观易用图形化工具ossbrowser图形化工具，易操作Java SDK丰富、完整的各类语言SDK demoObject ACLObject ACL是Object 级别的权限访问控制。目前有四种访问权限：private、public-read、publicread-write、default。PutObjectACL 操作通过 Put 请求中的x-oss-object-acl 头来设置，这个操作只有 Bucket Owner 有权限执行。Object ACL 的四种访问权限含义如下：权限值中文名称权限对访问者的限制public-read-write公共读写该 ACL 表明某个 Object 是公共读写资源，即所有用户拥有对该 Object 的读写权限。public-read公共读，私有写该 ACL 表明某个 Object 是公共读资源，即非 Object Owner 只有该 Object 的读权限，而 Object Owner 拥有该 Object 的读写权限。private私有读写该 ACL 表明某个 Object 是私有资源，即只有该 Object 的 Owner 拥有该 Object 的读写权限，其他的用户没有权限操作该 Object。default默认权限该 ACL 表明某个 Object 是遵循 Bucket 读写权限的资源，即 Bucket 是什么权限，Object 就是什么权限。操作方式和上面类似 参考官方文档即可https://help.aliyun.com/document_detail/100676.html?spm=a2c4g.11186623.2.9.695b5a5bnz0mcm#concept-blw-yqm-2gbRAM PolicyRAM（Resource Access Management）是阿里云提供的资源访问控制服务，RAM Policy是基于用户的授权策略。使用RAM，您可以创建、管理RAM用户，并可以控制这些RAM用户对资源的操作权限。当您的企业存在多用户协同操作资源时，使用RAM可以让您避免与其他用户共享云账号密钥，按需为用户分配最小权限，管理更加方便，权限更加明确，信息更加安全。注意如果您选择使用RAM Policy，建议您通过官方工具RAM策略编辑器快速生成所需的RAM Policy。RAM Policy操作比较复杂，强烈推荐您使用简单易用的图形化配置方式Bucket Policy。https://help.aliyun.com/document_detail/102600.html?spm=a2c4g.11186623.6.693.143258f6f33HSTBucket PolicyBucket Policy是基于资源的授权策略。相比于RAM Policy，Buc…

OSS功能详解
type: item
date: 2020-09-09T23:22:59+08:00
description: 基本功能使用阿里云管理控制台来完成 OSS 基本操作的流程如下：开通OSS服务器前提条件在使用阿里云 OSS 服务之前，请确保您已经注册了阿里云账号并完成实名认证。如果您还没有创建阿里云账号，系统会在您开通 OSS 时提示您注册账号。操作步骤1）登录阿里云官网。2）将鼠标移至产品，单击对象存储 OSS，打开 OSS 产品详情页面。3）在 OSS 产品详情页，单击立即开通。1）开通服务后，在 OSS 产品详情页单击管理控制台直接进入 OSS 管理控制台界面。您也可以单击位于官网首页右上方菜单栏的控制台，进入阿里云管理控制台首页，然后单击左侧的对象存储 OSS 菜单进入 OSS 管理控制台界面。创建存储空间1）登录OSS管理控制台。2）单击Bucket列表，之后单击创建Bucket。您也可以单击概览，之后单击右侧的创建Bucket。3）在创建Bucket页面配置Bucket参数。上传文件1）登录OSS管理控制台。2）单击Bucket列表，之后单击目标Bucket名称。3）单击文件管理 > 上传文件。4）在上传文件页面，设置上传文件的参数。5）在上传任务页面等待任务完成，之后关闭对话框。下载文件1）登录OSS管理控制台。2）进入目标Bucket。单击Bucket列表，之后单击目标Bucket名称。3）单击文件管理页签，您可以进行以下操作：删除文件1）登录OSS管理控制台。2）进入目标Bucket。单击Bucket列表，之后单击目标Bucket名称。3）选择一个或多个文件，选择批量操作 > 删除。您也可以选择目标文件右侧删除来删除单个文件。4）在删除文件对话框中，单击确定。删除存储空间进入OSS管理控制台界面。进入目标Bucket，找到删除Bucket按钮。单击基础设置页签，找到Bucket管理区域。3. 单击删除Bucket。在弹出的对话框中，单击确定。Object外链地址的构成规则如果一个bucket设置成公开读权限，意味着允许其他用户来访问属于你的object。你的object的外链地址构成规则如下：http://<你的bucket名字>.<数据库中心服务域名>/<你的object名字>构成规则的示意图如下：假设 oss-example 这个 bucket 在青岛数据中心，这个 object 的外链 URL 为：http://oss-example.oss-cn-qingdao.aliyuncs.com/aliyun-logo.png用户可以直接该URL链接放入HTML中使用： OSS 的短域名（oss.aliyuncs.com）作为 OSS 杭州数据中心的另一个域名仍然可以使用，但只能处理 bucket 属于杭州数据中心的请求。 为了统一起见，本 文接下来章节的例子中， 都将以 oss-cnhangzhou 域名为例。 请用户根据自己 bucket 所属的数据中心自行替换请求所访问的 Host。注意:在使用 OSS 时，请一直使用 OSS 服务域名，而不要使用固定的 IP 地址。OSS防盗链OSS 是按使用收费的服务， 为了防止用户在 OSS 上的数据被其他人盗链， OSS 支持基于 HTTP header 中表头字段 referer 的防盗链方法。通过 OSS 的控制台--权限管理--防盗链,可以对一个 bucket 设置 referer 字段的白名单和是否允许 referer 字段为空的请求访问。例如， 对于一个名为 ossexample的 bucket，设置其referer 白名单为 http://www.aliyun.com。则所有 referer 为 http://www.aliyun.com 的请求才能访问 oss-example 这个 bucket 中的 Object。细节分析：1) 用户只有通过 URL 签名或者匿名访问 Object 时，才会做防盗链验证。请求 的 Header 中有“Authorization”字段的，不会做防盗链验证。2) 一个 bucket 可以支持多个 referer 参数，这些参数之间由“，”号分隔。oss控制台配置时 使用换行3) Referer 参数支持通配符“*”和“？”。4) 用户可以设置是否允许 referer 字段为空的请求访问。5) 白名单为空时，不会检查 referer 字段是否为空（不然所有的请求都会被拒绝）。6) 白名单不为空，且设置了不允许 referer 字段为空的规则；则只有 referer 属于 白名单的请求被允许，其他请求（包括 referer 为空的请求）会被拒绝。7) 如果白名单不为空，但设置了允许 referer 字段为空的规则；则 referer 为空的 请求和符合白名单的请求会被允许；其他请求都会被拒绝。8) Bucket 的三种权限（priv…

OSS云存储基本概念
type: item
date: 2020-09-09T22:36:56+08:00
description: 存储空间（Bucket）存储空间是用户用于存储对象（Object）的容器，所有的对象都必须隶属于某个存储空间。存储空间具有各种配置属性，包括地域、访问权限、存储类型等。用户可以根据实际需求，创建不同类型的存储空间来存储不同的数据。同一个存储空间的内部是扁平的，没有文件系统目录的概念，所有的对象都直接隶属于其对应的存储空间。每个用户可以拥有多个存储空间。存储空间的名称在 OSS 范围内必须是全局唯一的，一旦创建之后无法修改名称。存储空间内部的对象数目没有限制。存储空间的命名规范如下：只能包括小写字母、数字和短横线（-）。必须以小写字母或者数字开头和结尾。长度必须在 3–63 字节之间。对象/文件（Object）对象是 OSS 存储数据的基本单元，也被称为 OSS 的文件。对象由元信息（Object Meta），用户数据（Data）和文件名（Key）组成。对象由存储空间内部唯一的 Key 来标识。对象元信息是一组键值对，表示了对象的一些属性，比如最后修改时间、大小等信息，同时用户也可以在元信息中存储一些自定义的信息。对象的生命周期是从上传成功到被删除为止。在整个生命周期内，只有通过追加上传的 Object 可以继续通过追加上传写入数据，其他上传方式上传的 Object 内容无法编辑，您可以通过重复上传同名的对象来覆盖之前的对象。对象的命名规范如下：使用 UTF-8 编码。长度必须在 1–1023 字节之间。不能以正斜线（/）或者反斜线（\）开头。Region（地域）Region 表示 OSS 的数据中心所在物理位置。用户可以根据费用、请求来源等选择合适的地域创建Bucket。一般来说，距离用户更近的 Region 访问速度更快。Region 是在创建 Bucket 的时候指定的，一旦指定之后就不允许更改。该 Bucket 下所有的 Object 都存储在对应的数据中心，目前不支持 Object 级别的 Region 设置。Endpoint（访问域名）Endpoint 表示 OSS 对外服务的访问域名。OSS 以 HTTP RESTful API 的形式对外提供服务，当访问不同的 Region 的时候，需要不同的域名。通过内网和外网访问同一个 Region 所需要的 Endpoint 也是不同的。例如杭州 Region 的外网 Endpoint 是 oss-cn-hangzhou.aliyuncs.com，内网 Endpoint 是 osscn-hangzhou-internal.aliyuncs.com。AccessKey（访问密钥）AccessKey（简称 AK）指的是访问身份验证中用到的 AccessKeyId 和 AccessKeySecret。OSS 通过使用 AccessKeyId 和 AccessKeySecret 对称加密的方法来验证某个请求的发送者身份。AccessKeyId 用于标识用户；AccessKeySecret 是用户用于加密签名字符串和 OSS 用来验证签名字符串的密钥，必须保密。对于 OSS 来说，AccessKey 的来源有：Bucket 的拥有者申请的 AccessKey。被 Bucket 的拥有者通过 RAM 授权给第三方请求者的 AccessKey。被 Bucket 的拥有者通过 STS 授权给第三方请求者的 AccessKey。注意:可以登录阿里云官网-“用户中心” -“我的帐户” -“安全认证” 获取 Access Key ID 和 Access Key Secret，一个阿里云帐号可以生成 5 对 Access Key ID 和 Access Key Secret。并支持启用/禁用设置。ServiceOSS 提供给用户的虚拟存储空间，在这个虚拟空间中，每个用户可拥有一个到多个 Bucket。

阿里云OSS云存储简介
type: item
date: 2020-09-09T22:32:25+08:00
description: 阿里云OSS云存储简介阿里云对象存储服务（Object Storage Service，简称 OSS），是阿里云提供的海量、安全、低成本、高可靠的云存储服务。其数据设计持久性不低于99.9999999999%（12 个 9），服务设计可用性（或业务连续性）不低于 99.995%。可以使用阿里云提供的 API、SDK 接口或者 OSS 迁移工具轻松地将海量数据移入或移出阿里云 OSS。数据存储到阿里云 OSS 以后，可以选择标准存储（Standard）作为移动应用、大型网站、图片分享或热点音视频的主要存储方式，也可以选择成本更低、存储期限更长的低频访问存储（Infrequent Access）和归档存储（Archive）作为不经常访问数据的存储方式。OSS 具有与平台无关的 RESTful API 接口，可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。OSS与自建存储对比的优势对比项对象存储OSS自建服务器存储可靠性OSS作为阿里巴巴全集团数据存储的核心基础设施，多年支撑双11业务高峰，历经高可用与高可靠的严苛考验。OSS的多重冗余架构设计，为数据持久存储提供可靠保障。同时，OSS基于高可用架构设计，消除单节故障，确保数据业务的持续性。服务设计可用性不低于99.995%。数据设计持久性不低于99.9999999999%（12个9）。规模自动扩展，不影响对外服务。数据自动多重冗余备份。受限于硬件可靠性，易出问题，一旦出现磁盘坏道，容易出现不可逆转的数据丢失。人工数据恢复困难、耗时、耗力。 安全提供企业级多层次安全防护，包括服务端加密、客户端加密、防盗链、IP黑白名单、细粒度权限管控、日志审计、WORM特性等。多用户资源隔离机制，支持异地容灾机制。获得多项合规认证，包括SEC和FINRA 等，满足企业数据安全与合规要求。需要另外购买清洗和黑洞设备。需要单独实现安全机制。成本多线BGP骨干网络，无带宽限制，上行流量免费。无需运维人员与托管费用，0成本运维。存储受硬盘容量限制，需人工扩容。单线或双线接入速度慢，有带宽限制，峰值时期需人工扩容。需专人运维，成本高。智能存储提供多种数据处理能力，如图片处理、视频截帧、文档预览、图片场景识别、人脸识别、SQL就地查询等，并无缝对接Hadoop生态、以及阿里云函数计算、EMR、DataLakeAnalytics、BatchCompute、MaxCompute、DBS等产品，满足企业数据分析与管理的需求。需要额外采购，单独部署。应用场景图片和音视频等应用的海量存储网页或者移动应用的静态和动态资源分离云端数据处理计量计费阿里云对象存储 OSS 服务费用的各项组成部分及计费方式分为按量计费和包年包月两种。按量付费：按实际使用量*单价的方式计费，每小时统计前一小时的实际用量并从账户余额中扣除实际消费金额。例如当前时间是 9:30，结算的是 8:00-9:00 产生的费用。包年包月：预先购买指定资源包，之后使用资源时，扣除相应的额度。一般情况下，包年包月比按量付费更加优惠。资源包目前仅提供标准（LRS）存储包、低频（LRS）存储包、归档（LRS）存储包、标准（ZRS）存储包、低频（ZRS）存储包、下行流量包、 回源流量包、传输加速包，可购买地域请参见购买对象存储 OSS 资源包。这个看一个实际的计费案例即可：https://help.aliyun.com/document_detail/109686.html?spm=a2c4g.11186623.6.562.4bbd7c28AAnl9D

FastDFS应用实战
type: item
date: 2020-09-09T22:21:01+08:00
description: SpringBoot访问FastDFS引入jar依赖<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.5.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.github.tobato</groupId> <artifactId>fastdfs-client</artifactId> <version>1.26.1-RELEASE</version> </dependency> </dependencies>配置文件application.ymlfdfs: connectTimeout: 600 trackerList: - 192.168.211.130:22122 - 192.168.211.135:22122 - 192.168.211.136:22122 server: port: 8899编写上传下载文件的服务类package com.fastdfs.service; import com.github.tobato.fastdfs.domain.StorePath; import com.github.tobato.fastdfs.proto.storage.DownloadByteArray; import com.github.tobato.fastdfs.service.FastFileStorageClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.io.ByteArrayInputStream; import java.io.IOException; @Component public class FastDFSClientService { @Autowired private FastFileStorageClient fastFileStorageClient; /* * 文件上传 * * @param bytes 文件字节 * @param fileSize 文件大小 * @param extension 文件扩展名 * @return fastDfs路径 */ public String uploadFile(byte[] bytes, long fileSize, String extension) { ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes); StorePath storePath = fastFileStorageClient.uploadFile(byteArrayInputStream, fileSize, extension, null); System.out.println(storePath.getGroup() + ":" + storePath.getPath() + ":" + storePath.getFullPath()); return storePath.getFullPath(); } /* * 下载文件 * * @param fileUrl 文件URL * @return 文件字节 * @throws IOException */ public byte[] downloadFile(String fileUrl) throws IOException { String group = fileUrl.substring(0, fileUrl.indexOf("/")); String path = fileUrl.substring(fileUrl.indexOf("/") + 1); DownloadByteArray downloadByteArray = new DownloadByteArray(); byte[] bytes = fastFileStorageClient.downloadFile(group, path, do…

FastDFS集群和配置优化
type: item
date: 2020-09-09T22:09:27+08:00
description: FastDFS集群架构设置3台CentOS 7 虚拟机3个tracker 3个storage192.168.211.130192.168.211.136192.168.211.135trackertrackertrackerstorage（group1）storage（group1）storage（group2）nginxnginxnginx按照之前的单机方式先进行安装FastDFS集群架构详细配置配置tracker集群 三台相同vi /etc/fdfs/tracker.conf# 0是轮询，1是指定组，2是剩余存储空间多的group优先 store_lookup=0 配置storage集群并启动vi /etc/fdfs/storage.conftracker_server=192.168.211.130:22122 tracker_server=192.168.211.136:22122 tracker_server=192.168.211.135:22122 #注意组名 192.168.211.135 配置是 group2 group_name=group1 #storage 的端口号，同一个组的 storage 端口号必须相同 port=23000 /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart /usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart查看storage的日志和查看tracker集群信息cat /home/fastdfs/logs/storaged.log访问FastDFS时 可以把Tracker 理解成对等的,但实际底层多个Tracker时在运行过程中会选择其中一个作为Leader，由该Leader执行一些唯一性的操作。在早期版本中Tracker-Leader有两个作用，分别是：为新加入的Storage分配一个源Storage；为开启合并存储的Group选择Trunk-Server。但是在最新的版本中实际上只有第二个作用，也就是选择Trunk-Server。查看之后，如果连接不上，注意关闭防火墙（或开放通信端口）systemctl stop firewalld查看存储集群信息/usr/bin/fdfs_monitor /etc/fdfs/storage.conf测试上传vim /etc/fdfs/client.conftracker_server=192.168.211.130:22122 tracker_server=192.168.211.136:22122 tracker_server=192.168.211.135:22122/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /root/fastdfs/1.png find / -name group*/*/*/*/xxx.png使用Nginx和FastDFS集群结合vi /etc/fdfs/mod_fastdfs.conftracker_server=192.168.211.130:22122 tracker_server=192.168.211.136:22122 tracker_server=192.168.211.135:22122 #注意组名 如果是group2 则一定要改 group_name=group1 vim /usr/local/nginx/conf/nginx.conf#添加如下配置 server { listen 8888; server_name localhost; location ~/group[0-9]/ { ngx_fastdfs_module; } }启动nginx/usr/local/nginx/sbin/nginx测试文件服务器通过任意一台nginx访问http://192.168.211.130/group1/M00/00/00/xxx.pnghttp://192.168.211.135/group1/M00/00/00/xxx.pngFastDFS配置优化最大连接数设置配置文件：tracker.conf 和 storage.conf参数名：max_connections缺省值：256说明：FastDFS为一个连接分配一个task buffer，为了提升分配效率，FastDFS采用内存池的做法。FastDFS老版本直接事先分配 max_connections 个buffer，这个做法显然不是太合理，在 max_connections 设置过大的情况下太浪费内存。v5.04对预分配采用增量方式，tracker一次预分配1024个，storage一次预分…

FastDFS系统架构和功能原理
type: item
date: 2020-09-09T21:48:41+08:00
description: 架构详解storage server：存储服务器（又称存储节点或数据服务器），文件和文件属性（meta data）都保存到存储服务器上。Storage server直接利用OS的文件系统调用管理文件。Storage server（后简称storage）以组（卷，group或volume）为单位组织，一个group内包含多台storage机器，数据互为备份，存储空间以group内容量最小的storage为准，所以建议group内的多个storage尽量配置相同，以免造成存储空间的浪费。以group为单位组织存储能方便的进行应用隔离、负载均衡、副本数定制（group内storage server数量即为该group的副本数），比如将不同应用数据存到不同的group就能隔离应用数据，同时还可根据应用的访问特性来将应用分配到不同的group来做负载均衡；缺点是group的容量受单机存储容量的限制，同时当group内有机器坏掉时，数据恢复只能依赖group内的其它机器，使得恢复时间会很长。group内每个storage的存储依赖于本地文件系统，storage可配置多个数据存储目录，比如有10块磁盘，分别挂载在/data/disk1-/data/disk10 ，则可将这10个目录都配置为storage的数据存储目录。storage接受到写文件请求时，会根据配置好的规则，选择其中一个存储目录来存储文件。为了避免单个目录下的文件数太多，在storage第一次启动时，会在每个数据存储目录里创建2级子目录，默认每级256个，总共65536个文件，新写的文件会以hash的方式被路由到其中某个子目录下，然后将文件数据直接作为一个本地文件存储到该目录中。group：组，也可称为卷。同组内服务器上的文件是完全相同的，同一组内的storage server之间是对等的，文件上传、删除等操作可以在任意一台storage server上进行。meta data：文件相关属性，键值对（ Key Value Pair）方式，如：width: 1118。tracker server：跟踪服务器，主要做调度工作，起负载均衡的作用。在内存中记录集群中所有存储组和存储服务器的状态信息，是客户端和数据服务器交互的枢纽。因为不记录文件索引信息，所以占用的内存量很少。Tracker是FastDFS的协调者，负责管理所有的storage server和group，每个storage在启动后会连接Tracker，告知自己所属的group等信息，并保持周期性的心跳，tracker根据storage的心跳信息，建立group==>[storage server list]的映射表。Tracker需要管理的元信息很少，会全部存储在内存中；另外tracker上的元信息都是由storage汇报的信息生成的，本身不需要持久化任何数据，这样使得tracker非常容易扩展，直接增加tracker机器即可扩展为tracker cluster来服务，cluster里每个tracker之间是完全对等的，所有的tracker都接受stroage的心跳信息，生成元数据信息来提供读写服务。client：客户端，作为业务请求的发起方，通过专有接口，使用TCP/IP协议与跟踪器服务器或存储节点进行数据交互。FastDFS向使用者提供基本文件访问接口，比如upload、download、append、delete等，以客户端库的方式提供给用户使用。设计理念轻量级FastDFS服务端只有两个角色：Tracker server和Storage server。Tracker server在内存中记录分组和Storage server的状态等信息，不记录文件索引信息，占用的内存量很少。另外，客户端（应用）和Storage server访问Tracker server时，Tracker server扫描内存中的分组和Storage server状态信息，然后给出应答。由此可以看出Tracker server非常轻量化，不会成为系统瓶颈。FastDFS中的Storage server直接利用OS的文件系统存储文件。FastDFS不会对文件进行分块存储，客户端上传的文件和Storage server上的文件一一对应。对于互联网应用，文件分块存储没有多大的必要。它既没有带来多大的好处，又增加了系统的复杂性。FastDFS不对文件进行分块存储，与支持文件分块存储的DFS相比，更加简洁高效，并且完全能满足绝大多数互联网应用的实际需要。在FastDFS中，客户端上传文件时，文件ID不是由客户端指定，而是由Storage server生成后返回给客户端的。文件ID中包含了组名、文件相对路径和文件名，Storage server可以根据文件…

FastDFS基础
type: item
date: 2020-09-09T21:31:19+08:00
description: 为什么要有分布式文件系统单机时代优点：文件访问比较便利，项目直接引用，实现起来简单，无需任何复杂技术，保存文件和访问文件都很方便。缺点：一方面，文件和代码耦合在一起，文件越多存放越混乱。另一方面，如果流量比较大，静态文件访问会占据一定的资源，影响正常业务进行，不利于网站快速发展。独立文件服务器优点：Web/App服务器可以更专注发挥动态处理的能力。独立存储，更方便做扩容、容灾和数据迁移；方便做图片等资源请求的负载均衡，方便应用各种缓存策略（HTTP Header、Proxy Cache等），也更加方便迁移到CDN。缺点：单机存在性能瓶颈，容灾、垂直扩展性稍差分布式文件系统优点：扩展能力: 毫无疑问，扩展能力是一个分布式文件系统最重要的特点；高可用性: 在分布式文件系统中，高可用性包含两层，一是整个文件系统的可用性，二是数据的完整和一致性；弹性存储: 可以根据业务需要灵活地增加或缩减数据存储以及增删存储池中的资源，而不需要中断系统运行。缺点：系统复杂度稍高，需要更多服务器。分布式存储解决方案对比指标适合类型文件分布复杂度FUSEPOSIX备份机制通讯协议接口社区支持开发语言FastDFS4KB~500MB小文件合并存储不分片处理简单不支持不支持组内冗余备份Api http国内用户群CTFS所有文件小文件合并，以block组织分片复杂不支持不支持Block存储多份，主辅灾备Api http少C++MFS大于64K分片存储复杂支持支持多点备份动态冗余使用fuse较多PerlHDFS大文件大文件分片分块存储简单支持支持多副本原生api较多JavaCeph对象文件块OSD一主多从复杂支持支持多副本原生api较少C++MogileFS海量小图片不分片存储复杂可以支持不支持动态冗余http原生api文档少Perl什么是FastDFSFastDFS是用C语言编写的一款开源的轻量级分布式文件系统。它对文件进行管理，功能包括：文件存储、文件同步、文件访问（文件上传、文件下载）等，解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务，如相册网站、视频网站等等。FastDFS为互联网量身定制，充分考虑了冗余备份、负载均衡、线性扩容等机制，并注重高可用、高性能等指标，使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。FastDFS特性分组存储，灵活简洁、对等结构，不存在单点文件不分块存储，上传的文件和OS文件系统中的文件一一对应文件ID由FastDFS生成，作为文件访问凭证，FastDFS不需要传统的name server和流行的web server无缝衔接，FastDFS已提供apache和nginx扩展模块中、小文件均可以很好支持，支持海量小文件存储支持多块磁盘，支持单盘数据恢复支持相同内容的文件只保存一份，节约磁盘空间支持在线扩容 支持主从文件存储服务器上可以保存文件属性（meta-data）V2.0网络通信采用libevent，支持大并发访问，整体性能更好下载文件支持多线程方式，支持断点续传FastDFS的构成FastDFS由客户端(Client)、 跟踪服务器(Tracker Server)和存储服务器(Storage Server)构成。客户端（client）客户端（client），作为业务请求的发起方，通过专有接口，使用TCP/IP协议与跟踪器服务器或存储节点进行数据交互。跟踪器（tracker）Trackerserver作用是负载均衡和调度，通过Tracker server在文件上传时可以根据一些策略找到Storage server提供文件上传服务。可以将tracker称为追踪服务器或调度服务器。跟踪器在访问上起负载均衡的作用。可以随时增加或下线而不会影响线上服务。存储节点（storage）Storageserver作用是文件存储，客户端上传的文件最终存储在Storage服务器上，Storage server没有实现自己的文件系统而是利用操作系统的文件系统来管理文件。可以将storage称为存储服务器。存储节点中的服务器均可以随时增加或下线而不会影响线上服务。Linux下FastDFS 安装安装编译环境yum install git gcc gcc-c++ make automake vim wget libevent -y安装libfastcommon 基础库mkdir /root/fastdfs cd /root/fastdfs git clone https://github.com/happyfish100/libfastcommon.git --depth 1 cd libfastcommon/ ./make.sh && ./make.sh install安装FastDFScd /ro…