mirror of
https://gitee.com/sjqzhang/go-fastdfs.git
synced 2024-11-29 17:57:41 +08:00
907 lines
90 KiB
HTML
907 lines
90 KiB
HTML
|
||
<!DOCTYPE HTML>
|
||
<html lang="" >
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
|
||
<title>问题汇总 · GitBook</title>
|
||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||
<meta name="description" content="">
|
||
<meta name="generator" content="GitBook 3.2.3">
|
||
|
||
|
||
|
||
|
||
<link rel="stylesheet" href="gitbook/style.css">
|
||
|
||
|
||
|
||
|
||
<link rel="stylesheet" href="gitbook/gitbook-plugin-highlight/website.css">
|
||
|
||
|
||
|
||
<link rel="stylesheet" href="gitbook/gitbook-plugin-search/search.css">
|
||
|
||
|
||
|
||
<link rel="stylesheet" href="gitbook/gitbook-plugin-fontsettings/website.css">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<meta name="HandheldFriendly" content="true"/>
|
||
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
|
||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||
<meta name="apple-mobile-web-app-status-bar-style" content="black">
|
||
<link rel="apple-touch-icon-precomposed" sizes="152x152" href="gitbook/images/apple-touch-icon-precomposed-152.png">
|
||
<link rel="shortcut icon" href="gitbook/images/favicon.ico" type="image/x-icon">
|
||
|
||
|
||
<link rel="next" href="QA.html" />
|
||
|
||
|
||
<link rel="prev" href="api.html" />
|
||
|
||
|
||
</head>
|
||
<body>
|
||
|
||
<div class="book">
|
||
<div class="book-summary">
|
||
|
||
|
||
<div id="book-search-input" role="search">
|
||
<input type="text" placeholder="Type to search" />
|
||
</div>
|
||
|
||
|
||
<nav role="navigation">
|
||
|
||
|
||
|
||
<ul class="summary">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="chapter " data-level="1.1" data-path="./">
|
||
|
||
<a href="./#vision">
|
||
|
||
|
||
愿景
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li class="chapter " data-level="1.2" data-path="./">
|
||
|
||
<a href="./#background">
|
||
|
||
|
||
背景
|
||
|
||
</a>
|
||
|
||
|
||
|
||
<ul class="articles">
|
||
|
||
|
||
<li class="chapter " data-level="1.2.1" data-path="./">
|
||
|
||
<a href="./#what">
|
||
|
||
|
||
go-fastdfs是什么?
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
|
||
</ul>
|
||
|
||
</li>
|
||
|
||
<li class="chapter " data-level="1.3" data-path="./">
|
||
|
||
<a href="./#character">
|
||
|
||
|
||
特性
|
||
|
||
</a>
|
||
|
||
|
||
|
||
<ul class="articles">
|
||
|
||
|
||
<li class="chapter " data-level="1.3.1" data-path="./">
|
||
|
||
<a href="./#advantage">
|
||
|
||
|
||
go-fastdfs优点
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
|
||
</ul>
|
||
|
||
</li>
|
||
|
||
<li class="chapter " data-level="1.4" data-path="install.html">
|
||
|
||
<a href="install.html">
|
||
|
||
|
||
安装
|
||
|
||
</a>
|
||
|
||
|
||
|
||
<ul class="articles">
|
||
|
||
|
||
<li class="chapter " data-level="1.4.1" data-path="install.html">
|
||
|
||
<a href="install.html#quick">
|
||
|
||
|
||
极速体验
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li class="chapter " data-level="1.4.2" data-path="install.html">
|
||
|
||
<a href="install.html#docker">
|
||
|
||
|
||
Docker体验
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li class="chapter " data-level="1.4.3" data-path="install.html">
|
||
|
||
<a href="install.html#compiler_install">
|
||
|
||
|
||
编译安装
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li class="chapter " data-level="1.4.4" data-path="install.html">
|
||
|
||
<a href="install.html#small-cluster">
|
||
|
||
|
||
小集群安装
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li class="chapter " data-level="1.4.5" data-path="install.html">
|
||
|
||
<a href="install.html#big-cluster">
|
||
|
||
|
||
海量集群安装(推荐)
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li class="chapter " data-level="1.4.6" data-path="ca.html">
|
||
|
||
<a href="ca.html">
|
||
|
||
|
||
https证书生成
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
|
||
</ul>
|
||
|
||
</li>
|
||
|
||
<li class="chapter " data-level="1.5" data-path="authentication.html">
|
||
|
||
<a href="authentication.html">
|
||
|
||
|
||
认证
|
||
|
||
</a>
|
||
|
||
|
||
|
||
<ul class="articles">
|
||
|
||
|
||
<li class="chapter " data-level="1.5.1" data-path="authentication.html">
|
||
|
||
<a href="authentication.html#fingerprint">
|
||
|
||
|
||
按文件指纹认证
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li class="chapter " data-level="1.5.2" data-path="authentication.html">
|
||
|
||
<a href="authentication.html#google">
|
||
|
||
|
||
按google认证码认证
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li class="chapter " data-level="1.5.3" data-path="authentication.html">
|
||
|
||
<a href="authentication.html#custom">
|
||
|
||
|
||
用户自定义认证
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
|
||
</ul>
|
||
|
||
</li>
|
||
|
||
<li class="chapter " data-level="1.6" data-path="usage.html">
|
||
|
||
<a href="usage.html">
|
||
|
||
|
||
语言"SDK"
|
||
|
||
</a>
|
||
|
||
|
||
|
||
<ul class="articles">
|
||
|
||
|
||
<li class="chapter " data-level="1.6.1" data-path="usage.html">
|
||
|
||
<a href="usage.html#description">
|
||
|
||
|
||
统一说明(重要)
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li class="chapter " data-level="1.6.2" data-path="usage.html">
|
||
|
||
<a href="usage.html#cmdline">
|
||
|
||
|
||
命令行上传
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li class="chapter " data-level="1.6.3" data-path="usage.html">
|
||
|
||
<a href="usage.html#web">
|
||
|
||
|
||
浏览器上传
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li class="chapter " data-level="1.6.4" data-path="usage.html">
|
||
|
||
<a href="usage.html#python">
|
||
|
||
|
||
Python语言
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li class="chapter " data-level="1.6.5" data-path="usage.html">
|
||
|
||
<a href="usage.html#go">
|
||
|
||
|
||
GO使用
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li class="chapter " data-level="1.6.6" data-path="usage.html">
|
||
|
||
<a href="usage.html#java">
|
||
|
||
|
||
Java语言
|
||
|
||
</a>
|
||
|
||
|
||
|
||
<ul class="articles">
|
||
|
||
|
||
<li class="chapter " data-level="1.6.6.1" data-path="usage.html">
|
||
|
||
<a href="usage.html#java-stream">
|
||
|
||
|
||
Java流上传
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
|
||
</ul>
|
||
|
||
</li>
|
||
|
||
|
||
</ul>
|
||
|
||
</li>
|
||
|
||
<li class="chapter " data-level="1.7" data-path="breakpoint.html">
|
||
|
||
<a href="breakpoint.html#go">
|
||
|
||
|
||
断点续传"SDK"
|
||
|
||
</a>
|
||
|
||
|
||
|
||
<ul class="articles">
|
||
|
||
|
||
<li class="chapter " data-level="1.7.1" data-path="breakpoint.html">
|
||
|
||
<a href="breakpoint.html#go">
|
||
|
||
|
||
GO
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li class="chapter " data-level="1.7.2" data-path="breakpoint.html">
|
||
|
||
<a href="breakpoint.html#js">
|
||
|
||
|
||
Javascript
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
|
||
</ul>
|
||
|
||
</li>
|
||
|
||
<li class="chapter " data-level="1.8" data-path="api.html">
|
||
|
||
<a href="api.html">
|
||
|
||
|
||
管理API
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li class="chapter active" data-level="1.9" data-path="QA.html">
|
||
|
||
<a href="QA.html">
|
||
|
||
|
||
问题汇总
|
||
|
||
</a>
|
||
|
||
|
||
|
||
<ul class="articles">
|
||
|
||
|
||
<li class="chapter active" data-level="1.9.1" data-path="QA.html">
|
||
|
||
<a href="QA.html">
|
||
|
||
|
||
常见问题
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li class="chapter active" data-level="1.9.2" data-path="QA.html">
|
||
|
||
<a href="QA.html">
|
||
|
||
|
||
维护问题
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
|
||
</ul>
|
||
|
||
</li>
|
||
|
||
<li class="chapter " data-level="1.10" data-path="upgrade.html">
|
||
|
||
<a href="upgrade.html">
|
||
|
||
|
||
更新历史
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
<li class="divider"></li>
|
||
|
||
<li>
|
||
<a href="https://www.gitbook.com" target="blank" class="gitbook-link">
|
||
Published with GitBook
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
|
||
|
||
</nav>
|
||
|
||
|
||
</div>
|
||
|
||
<div class="book-body">
|
||
|
||
<div class="body-inner">
|
||
|
||
|
||
|
||
<div class="book-header" role="navigation">
|
||
|
||
|
||
<!-- Title -->
|
||
<h1>
|
||
<i class="fa fa-circle-o-notch fa-spin"></i>
|
||
<a href="." >问题汇总</a>
|
||
</h1>
|
||
</div>
|
||
|
||
|
||
|
||
|
||
<div class="page-wrapper" tabindex="-1" role="main">
|
||
<div class="page-inner">
|
||
|
||
<div id="book-search-results">
|
||
<div class="search-noresults">
|
||
|
||
<section class="normal markdown-section">
|
||
|
||
<h1 id="最佳实战?">最佳实战?</h1>
|
||
<pre><code>一、如果是海量存储,不要开启文件token认证功能,减少性能开消。
|
||
二、尽量用标准上传,上传后业务保存path,在业务用的时候再并接上域名(方便迁移扩展等)。
|
||
三、如果使用断点续传,上传后一定要用文件id置换成path存储(如何置换看QA/API文档秒传接口),为后面访问减少性能开消。
|
||
四、尽量使用物理服务器部署,因为主要压力或性能来自于IO
|
||
五、线上业务尽量使用nginx+gofastdfs部署架构(均衡算法使用ip_hash),以满足后面的功能扩展性(nginx+lua)。
|
||
六、线上环境最好不要使用容器部署,容器适用于测试和功能验证。
|
||
总结:业务保存的文件的path,减少后期访问路径转换带来开消,文件访问权限由业务来完成,这样性能最好,通用性强(可直接其它web服务器)。
|
||
|
||
重要提醒:如果开启小文件合并功能,后期是无法删除小文件的。
|
||
上传结果说明
|
||
请使用md5,path,scene字段,其它是为了兼容老的线上系统添加的,以后有可能去掉。
|
||
</code></pre><h2 id="配置文件在哪里?">配置文件在哪里?</h2>
|
||
<pre><code>1)go-fastdfs采用自动生成配置文件的方式进行设计,所以要想修改配置必须运行一次,让go-fastdfs帮你生成配置文件
|
||
2)配置文件存放在 conf/cfg.json 下
|
||
3)注意:由于conf/cfg.json 采用json格式,什么格式的错误都会引起go-fastdfs无法启动,所以修改完后最好用json格式工具进行检查。
|
||
</code></pre><h2 id="重要说明?">重要说明?</h2>
|
||
<pre><code>1)go-fastdfs配置项非常多,有些配置甚至还有依赖关系
|
||
使用前最好认真阅读文档,或视频教程。
|
||
2)提问群里不回答文档中已有说明的问题,免得对大家产生影响。
|
||
</code></pre><h2 id="有管理后台么?">有管理后台么?</h2>
|
||
<pre><code>https://github.com/perfree/go-fastdfs-web
|
||
</code></pre><h2 id="断点上传有使用说明么?">断点上传有使用说明么?</h2>
|
||
<pre><code>https://github.com/tus
|
||
</code></pre><h2 id="在微信讨论群中大家都问到go-fastdfs性能怎样?">在微信讨论群中大家都问到go-fastdfs性能怎样?</h2>
|
||
<pre><code>由于问的人太多,在这里统一回答。
|
||
go-fastdfs的文件定位与其它分布式系统不同,它的寻址是直接定位,不经过任何组件,所以可以近似时间复杂度为o(1)[文件路径定位]
|
||
基本没有性能损耗,项目中也附有压测脚本,大家可以自已进行压测,群里就不要太多讨论问题了,人多每次回复同样的问题
|
||
大家也会觉得这群无聊。
|
||
</code></pre><h2 id="已经使用fastdfs存储的文件可以迁移到go-fastdfs下么其它类似?">已经使用fastdfs存储的文件可以迁移到go-fastdfs下么(其它类似)?</h2>
|
||
<pre><code>答案是可以的,你担心的问题是路径改变,go fastdfs为你考虑了这一点
|
||
步骤:
|
||
一、下载最新版的go-fastdfs
|
||
二、将原来的fastdfs文件目录复制到go-fastdfs的 files目录下(如果文件很多,可以逆向过来,将fileserver复制过去,但要保留fileserver的目录结构)
|
||
三、将配置enable_migrate设为true
|
||
注意:迁移过程中会扫描整下files目录下的所有文件,
|
||
速度较慢,迁移完成后请将enable_migrate设为false
|
||
|
||
说明:go-fastdfs的目录是不能变动的,与同步机制相关,很多同学在群里问题,我的files目录能不能自定义,答案是否定的。
|
||
至于能不能用软链接的方式本人没有测试过,可以自行测试。
|
||
</code></pre><h2 id="进程自动退出是怎么办?">进程自动退出是怎么办?</h2>
|
||
<pre><code>进程退出主要是没有放到后台运行 ,放到后后台行要吧使用项目的
|
||
control https://github.com/sjqzhang/go-fastdfs/blob/master/control
|
||
文件进行控制或者使用supervisor等工具
|
||
</code></pre><h2 id="什么是集群,如何用nginx管理多集群?">什么是集群,如何用Nginx管理多集群?</h2>
|
||
<pre><code>1、在go-fastdfs中,一个集群就是一个group。
|
||
2、请参阅部署图
|
||
注意:配置中的 support_group_manage 参数设为true时,所有的url中都自动添加组信息。
|
||
例如:http://10.1.5.9:8080/group/status
|
||
默认:http://10.1.5.9:8080/status
|
||
区别:多了group,对应配置中的 group 参数,这样主要是为了解决一个Nginx反向代理多个group(集群)
|
||
具体请参阅部署图
|
||
</code></pre><h2 id="如何搭建集群?">如何搭建集群?</h2>
|
||
<pre><code>一、先下载已编译的可执行文件(用最新版本)
|
||
二、运行可执行文件(生成配置)
|
||
三、修改配置
|
||
peers:增加对端的http地址
|
||
检查:
|
||
host:自动生成是否正确
|
||
peer_id:集群内是否唯一
|
||
四、重新运行服器
|
||
五、验证服务是否OK
|
||
</code></pre><h2 id="适合海量存储吗?">适合海量存储吗?</h2>
|
||
<pre><code>答案:适合海量存储
|
||
</code></pre><p><img src="data:image/jpeg;base64,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" alt="案例"></p>
|
||
<h2 id="如何上传文件夹?">如何上传文件夹?</h2>
|
||
<pre><code> DIR=log && ls $DIR |xargs -n 1 -I {} curl -s -F path=$DIR -F file=@$DIR/{} http://10.1.50.90:8080/upload
|
||
上面命令的log为要上传的目录,如果代码上传就是简单的循环上传就OK。
|
||
</code></pre><h2 id="如何缩放图片?">如何缩放图片?</h2>
|
||
<pre><code>在下载url中加入width各height参数
|
||
例如:http://127.0.0.1:8080/group1/haystack/5/124,0,27344,.jpg?download=0&width=100&height=100
|
||
特明说明是:如果要等比例缩放,请将width或height设为0
|
||
</code></pre><h2 id="如何在浏览器中直接显示图片?">如何在浏览器中直接显示图片?</h2>
|
||
<pre><code>在下载url中加入download=0参数
|
||
例如:http://127.0.0.1:8080/group1/haystack/5/124,0,27344,.jpg?download=0
|
||
</code></pre><h2 id="如何实现自定义认证上传下载?">如何实现自定义认证上传下载?</h2>
|
||
<pre><code>一、使用1.2.6版本以后的go-fastdfs
|
||
二、设auth_url参数(应用提供)
|
||
三、应用实现验证权限接口(即第二步的url),参数为 auth_toke 返回 ok 表示认证通过,其它为不通过
|
||
四、认证通过后,可以上传或下载
|
||
</code></pre><h2 id="下载无认证是怎么回事?">下载无认证是怎么回事?</h2>
|
||
<pre><code>1.检查配置文件 auth_url 不为空,且必须有效
|
||
2.检查配置文件中的 enable_download_auth:true
|
||
3.在集群以外的机器进行下载(集群内不检查认证)
|
||
</code></pre><h2 id="还需要安装nginx么?">还需要安装nginx么?</h2>
|
||
<pre><code>go-fastdfs本身是一个高性能的web服务器,在开发或测试时,可以不用安装nginx,
|
||
但go-fastdfs的功能单一,如需要缓存或重定向或其它扩展,nginx都有成熟的组件
|
||
所以建议线上还是加一层nginx,再借助nginx+lua解决扩展性问题。
|
||
</code></pre><h2 id="能动态加载配置么?">能动态加载配置么?</h2>
|
||
<pre><code>答案:是可以的,但要更新到最新版本
|
||
步骤:
|
||
1)修改 conf/cfg.json 文件
|
||
2)访问 http://10.1.xx.60:8080/reload
|
||
3) 注意:每个节点都需要进行同样的操作
|
||
</code></pre><h2 id="如何查看集群文件信息?">如何查看集群文件信息?</h2>
|
||
<pre><code>http://10.1.xx.60:8080/stat
|
||
|
||
如果出现文件统计出错怎么办?
|
||
请删除 data目录下的 stat.json文件 重启服务,请系统自动重新计算文件数。
|
||
|
||
或者调用
|
||
http://10.1.xx.60:8080/repair_stat
|
||
</code></pre><h2 id="可靠性怎样,能用于生产环境么?">可靠性怎样,能用于生产环境么?</h2>
|
||
<pre><code>本项目已大规模用于生产环境,如担心不能满足
|
||
可以在使用前对其各项特性进行压力测试,有任何
|
||
问题可以直接提issue
|
||
</code></pre><h2 id="如何后台运行程序?">如何后台运行程序?</h2>
|
||
<pre><code>请使用control 对程序进行后面运行,具体操作如下:
|
||
一、 chmod +x control
|
||
二、 确保control与fileserver在同一个目录
|
||
三、 ./control start|stop|status #对和序进行启动,停止,查看状态等。
|
||
</code></pre><h2 id="能不能在一台机器部置多个服务端?">能不能在一台机器部置多个服务端?</h2>
|
||
<pre><code>不能,在设计之初就已考虑到集群的高可用问题,为了保证集群的真正可用,必须为不同的ip,ip 不能用 127.0.0.1
|
||
错误 "peers": ["http://127.0.0.1:8080","http://127.0.0.1:8081","http://127.0.0.1:8082"]
|
||
正确 "peers": ["http://10.0.0.3:8080","http://10.0.0.4:8080","http://10.0.0.5:8080"]
|
||
</code></pre><h2 id="文件不同步了怎么办?">文件不同步了怎么办?</h2>
|
||
<pre><code>正常情况下,集群会每小时自动同步修复文件。(性能较差,在海量情况下建议关闭自动修复)
|
||
那异常情况下怎么?
|
||
答案:手动同步(最好在低峰执行)
|
||
http://172.16.70.123:7080/sync?date=20190117&force=1 (说明:要在文件多的服务器上执行,相关于推送到别的服务器)
|
||
参数说明:date 表示同步那一天的数据 force 1.表示是否强制同步当天所有(性能差),0.表示只同步失败的文件
|
||
|
||
不同步的情况:
|
||
1) 原来运行N台,现在突然加入一台变成N+1台
|
||
2)原来运行N台,某一台机器出现问题,变成N-1台
|
||
|
||
如果出现多天数据不一致怎么办?能一次同步所有吗?
|
||
答案是可以:(最好在低峰执行)
|
||
http://172.16.70.123:7080/repair?force=1
|
||
</code></pre><h2 id="文件不同步会影响访问吗?">文件不同步会影响访问吗?</h2>
|
||
<pre><code>答案:不会影响,会在访问不到时,自动修复不同步的文件。
|
||
</code></pre><h2 id="如何查看系统状态及说明?">如何查看系统状态及说明?</h2>
|
||
<pre><code>http://172.16.70.123:7080/status
|
||
注意:(Fs.Peers是不带本机的,如果带有可能出问题)
|
||
本机为 Fs.Local
|
||
sts["Fs.ErrorSetSize"] = this.errorset.Cardinality() 这个会导致内存增加
|
||
</code></pre><h2 id="如何编译go192?">如何编译(go1.9.2+)?</h2>
|
||
<pre><code>sh build.sh
|
||
</code></pre><h2 id="如何实现自定义路径上传?">如何实现自定义路径上传?</h2>
|
||
<pre><code>自定义路径上传需在配置中设定如下信息:
|
||
enable_distinct_file:false,
|
||
enable_custom_path:true,
|
||
</code></pre><h2 id="如何压测?">如何压测?</h2>
|
||
<pre><code>步骤:
|
||
一、创建files文件夹
|
||
二、将gen_file.py复制到files文件夹中,通过python gen_file.py 生成大量文件
|
||
三、将benchmark.py放到 files目录外(即与files目录同一级),通过python benchmark.py进行压测(注意对benchmark.py中的ip进行修改)
|
||
先用gen_file.py产生大量文件(注意如果要生成大文件,自已在内容中乘上一个大的数即可)
|
||
例如:
|
||
# -*- coding: utf-8 -*-
|
||
import os
|
||
j=0
|
||
for i in range(0,1000000):
|
||
if i%1000==0:
|
||
j=i
|
||
os.system('mkdir %s'%(i))
|
||
with open('%s/%s.txt'%(j,i),'w+') as f:
|
||
f.write(str(i)*1024)
|
||
接着用benchmark.py进行压测
|
||
也可以多机同时进行压测,所有节点都是可以同时读写的
|
||
</code></pre><h2 id="支持断点下载?">支持断点下载?</h2>
|
||
<pre><code>答案:支持
|
||
curl wget 如何
|
||
wget -c http://10.1.5.9:8080/group1/default/20190128/16/10/2G
|
||
culr -C - http://10.1.5.9:8080/group1/default/20190128/16/10/2G
|
||
</code></pre><h2 id="docker如何部署?">Docker如何部署?</h2>
|
||
<pre><code>步骤:
|
||
方式一、
|
||
一、构建镜像
|
||
docker build . -t fastdfs
|
||
二、运行容器(使用环境变量 GO_FASTDFS_DIR 指向存储目录。)
|
||
docker run --name fastdfs -v /data/fastdfs_data:/data -e GO_FASTDFS_DIR=/data fastdfs
|
||
方式二、
|
||
一、拉取镜像
|
||
docker pull sjqzhang/go-fastdfs
|
||
二、运行容器
|
||
docker run --name fastdfs -v /data/fastdfs_data:/data -e GO_FASTDFS_DIR=/data fastdfs
|
||
</code></pre><h2 id="大文件如何分块上传或断点续传?">大文件如何分块上传或断点续传?</h2>
|
||
<pre><code>一般的分块上传都要客户端支持,而语言的多样性,客户端难以维护,但分块上传的功能又有必要,为此提供一个简单的实现思路。
|
||
方案一、
|
||
借助linux split cat 实现分割与合并,具体查看 split 与 cat 帮助。
|
||
分割: split -b 1M filename #按每个文1M
|
||
合并: cat x* > filename #合并
|
||
方案二、
|
||
借助hjsplit
|
||
http://www.hjsplit.org/
|
||
具体自行实现
|
||
方案三、
|
||
建议用go实现hjsplit分割合并功,这样具有跨平台功能。(未实现,等你来....)
|
||
方案四、
|
||
使用内置的继点续传功能(使用protocol for resumable uploads协议,[详情](https://tus.io/))
|
||
注意:方案四、只能指定一个上传服务器,不支持同时写,并且上传的url有变化
|
||
原上传url: http://10.1.5.9:8080/<group>/upload
|
||
断点上传url: http://10.1.5.9:8080/<group>/big/upload/
|
||
上传完成,再通过秒传接口,获取文件信息
|
||
</code></pre><h2 id="如何秒传文件?">如何秒传文件?</h2>
|
||
<pre><code>通过http get的方式访问上传接口
|
||
http://10.0.5.9:8080/upload?md5=filesum&output=json
|
||
参数说明:
|
||
md5=sum(file) 文件的摘要算法要与文件务器的算法一致(算法支持md5|sha1),如果是断点续传,可以使用文件的id,也就是urlolad后的id
|
||
output=json|text 返回的格式
|
||
</code></pre><h2 id="集群如何规划及如何进行扩容?">集群如何规划及如何进行扩容?</h2>
|
||
<pre><code>建议在前期规划时,尽量采购大容量的机器作为存储服务器,如果要两个副本就用两台组成一个集群,如果要三个副本
|
||
就三台组成一个集群。(注意每台服务器最好配置保持一样,并且使用raid5磁盘阵列)
|
||
|
||
如果提高可用性,只要在现在的集群peers中加入新的机器,再对集群进行修复即可。
|
||
修复办法 http://172.16.70.123:7080/repair?force=1 (建议低峰变更)
|
||
|
||
如何扩容?
|
||
为简单可靠起见,直接搭建一个新集群即可(搭建就是启动./fileserver进程,设置一下peers的IP地址,三五分钟的事)
|
||
issue中chengyuansen同学向我提议使用增加扩容特性,我觉得对代码逻辑及运维都增加复杂度,暂时没有加入这特性。
|
||
</code></pre><h2 id="如何使用软链接进行快速体验">如何使用软链接进行快速体验?</h2>
|
||
<pre><code>1.先运行./fileserver 生成目录及配置文件等
|
||
2.删除刚生成的files目录
|
||
3.对将要进行体验的目录软链接到files目录
|
||
4.启动服务即可进行体检
|
||
</code></pre><h2 id="访问限制问题">访问限制问题</h2>
|
||
<pre><code>出于安全考虑,管理API只能在群集内部调用或者用127.0.0.1调用.
|
||
</code></pre><h2 id="如何查看软件版本">如何查看软件版本</h2>
|
||
<pre><code>从v1.2.9开始支持版本查看
|
||
|
||
命令:./fileserver version
|
||
</code></pre><h2 id="文档找不到怎么办?">文档找不到怎么办?</h2>
|
||
<pre><code>由于历史原因,部分文件还在项目的wiki中
|
||
https://github.com/sjqzhang/go-fastdfs/wiki
|
||
</code></pre><h4 id="捐赠"><a href="https://raw.githubusercontent.com/sjqzhang/go-fastdfs/master/doc/pay.png" target="_blank">捐赠</a></h4>
|
||
|
||
|
||
</section>
|
||
|
||
</div>
|
||
<div class="search-results">
|
||
<div class="has-results">
|
||
|
||
<h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1>
|
||
<ul class="search-results-list"></ul>
|
||
|
||
</div>
|
||
<div class="no-results">
|
||
|
||
<h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1>
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
|
||
|
||
<a href="api.html" class="navigation navigation-prev " aria-label="Previous page: 管理API">
|
||
<i class="fa fa-angle-left"></i>
|
||
</a>
|
||
|
||
|
||
<a href="QA.html" class="navigation navigation-next " aria-label="Next page: 常见问题">
|
||
<i class="fa fa-angle-right"></i>
|
||
</a>
|
||
|
||
|
||
|
||
</div>
|
||
|
||
<script>
|
||
var gitbook = gitbook || [];
|
||
gitbook.push(function() {
|
||
gitbook.page.hasChanged({"page":{"title":"问题汇总","level":"1.9","depth":1,"next":{"title":"常见问题","level":"1.9.1","depth":2,"path":"QA.md","ref":"QA.md","articles":[]},"previous":{"title":"管理API","level":"1.8","depth":1,"path":"api.md","ref":"api.md","articles":[]},"dir":"ltr"},"config":{"gitbook":"*","theme":"default","variables":{},"plugins":[],"pluginsConfig":{"highlight":{},"search":{},"lunr":{"maxIndexSize":1000000,"ignoreSpecialCharacters":false},"sharing":{"facebook":true,"twitter":true,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"fontsettings":{"theme":"white","family":"sans","size":2},"theme-default":{"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"showLevel":false}},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"pdf":{"pageNumbers":true,"fontSize":12,"fontFamily":"Arial","paperSize":"a4","chapterMark":"pagebreak","pageBreaksBefore":"/","margin":{"right":62,"left":62,"top":56,"bottom":56}},"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"}},"file":{"path":"QA.md","mtime":"2021-11-06T14:29:12.382Z","type":"markdown"},"gitbook":{"version":"3.2.3","time":"2021-11-06T14:32:36.598Z"},"basePath":".","book":{"language":""}});
|
||
});
|
||
</script>
|
||
</div>
|
||
|
||
|
||
<script src="gitbook/gitbook.js"></script>
|
||
<script src="gitbook/theme.js"></script>
|
||
|
||
|
||
<script src="gitbook/gitbook-plugin-search/search-engine.js"></script>
|
||
|
||
|
||
|
||
<script src="gitbook/gitbook-plugin-search/search.js"></script>
|
||
|
||
|
||
|
||
<script src="gitbook/gitbook-plugin-lunr/lunr.min.js"></script>
|
||
|
||
|
||
|
||
<script src="gitbook/gitbook-plugin-lunr/search-lunr.js"></script>
|
||
|
||
|
||
|
||
<script src="gitbook/gitbook-plugin-sharing/buttons.js"></script>
|
||
|
||
|
||
|
||
<script src="gitbook/gitbook-plugin-fontsettings/fontsettings.js"></script>
|
||
|
||
|
||
|
||
</body>
|
||
</html>
|
||
|