SeaweedFs分布式文件存储实战

article/2025/10/14 20:39:08

背景:

需求重点:大量小文件,读场景多,磁盘存储有限,要能支持fuse挂载,兼容s3接口

公司最近要进行分布式文件服务的选型,起因是因为公司目前有一些设备上报的文件或者日志性能管理文件需要定时上传到文件系统保存到磁盘中,大多都是一些小文件KB级别不涉及到很大的文件。之前尝试过ceph和juicefs,但是由于我们的需求是需要分布式部署而且文件是存储在磁盘上,ceph方案有些重,但是juicefs文件存储对象为磁盘时只支持单机部署,就想到用juicefs+minio的方案,后来发现一个问题,minio他的分布式场景下会自动启用纠删码模式,而且最少需要四个磁盘。并且EC:N最小情况也是EC:2,为了保证它的高可用,会有一定程度的存储浪费(ps:没想到更好的办法,如果有请评论区指教一下)。

后来查看了seaweedfs,发现它会启用master节点,分布式部署情况下,会选举一个leader而且能实现文件存储的存储调度,而且支持fuse本地挂载和S3接口,话不多说,直接实战一下看看!

官方仓库文档:Wiki - Gitee.com

开始实战

个人理解其实就是分了master和volume,大家在别的帖子稍微看一下就能明白它的一个存储逻辑,这里不再进行赘述。

准备工作:

seaweedfs安装包:Releases · seaweedfs/seaweedfs · GitHub

我对应的机器环境是linux,所以选择linux_amd64.tar进行下载

三台服务器:

xxx.xxx.xxx.1

xxx.xxx.xxx.2

xxx.xxx.xxx.3(实际情况用你自己的机器ip地址就可以)

1.下载压缩包之后分别在三台机器上创建相应的seaweedfs文件目录然后上传压缩包

解压:tar zxvf linux_amd64.tar

解压之后的文件目录:

(注意后续我们的weed命令执行都在这个文件目录下面)

2.创建master和volume文件夹:mkdir -p ./seaweedfs/data ./seaweedfs/volume

3.编写脚本master.sh启动master服务器(记得赋予执行权限chmod +x master.sh)

脚本内容如下:

nohup ./weed master -ip=xxx.xxx.xxx.1 -port=9333 -mdir=./seaweedfs/data -peers=xxx.xxx.xxx.1:9333,xxx.xxx.xxx.2:9333,xxx.xxx.xxx.3:9333 > ./seaweedfs/data/master.log &
nohup ./weed master -ip=xxx.xxx.xxx.2 -port=9333 -mdir=./seaweedfs/data -peers=xxx.xxx.xxx.1:9333,xxx.xxx.xxx.2:9333,xxx.xxx.xxx.3:9333 > ./seaweedfs/data/master.log &
nohup ./weed master -ip=xxx.xxx.xxx.3 -port=9333 -mdir=./seaweedfs/data -peers=xxx.xxx.xxx.1:9333,xxx.xxx.xxx.2:9333,xxx.xxx.xxx.3:9333 > ./seaweedfs/data/master.log &

运行脚本当前目录下输入:./master.sh

查看运行日志 cat master.log 有start Seaweed master 日志就说明master服务器启动成功

(ps: 三台机器分别都要执行上述脚本)

4.配置运行的volume,编写脚本volume.sh启动volume

脚本内容:

nohup ./weed volume -dataCenter dc1 -rack rack1 -dir ./seaweedfs/volume -ip xxx.xxx.xxx.1 -port 9222 -ip.bind xxx.xxx.xxx.1 -max 20 -mserver xxx.xxx.xxx.1:9333,xxx.xxx.xxx.2:9333,xxx.xxx.xxx.3:9333 -publicUrl xxx.xxx.xxx.1:9222 > ./seaweedfs/volume/volume.log &
nohup ./weed volume -dataCenter dc1 -rack rack1 -dir ./seaweedfs/volume -ip xxx.xxx.xxx.2 -port 9222 -ip.bind xxx.xxx.xxx.2 -max 20 -mserver xxx.xxx.xxx.1:9333,xxx.xxx.xxx.2:9333,xxx.xxx.xxx.3:9333 -publicUrl xxx.xxx.xxx.2:9222 > ./seaweedfs/volume/volume.log &
nohup ./weed volume -dataCenter dc1 -rack rack1 -dir ./seaweedfs/volume -ip xxx.xxx.xxx.3 -port 9222 -ip.bind xxx.xxx.xxx.3 -max 20 -mserver xxx.xxx.xxx.1:9333,xxx.xxx.xxx.2:9333,xxx.xxx.xxx.3:9333 -publicUrl xxx.xxx.xxx.3:9222 > ./seaweedfs/volume/volume.log &

三台机器分别运行脚本./volume.sh,查看volume.log,start成功就表示启用成功

好了到目前位置我们已经完成了master服务器和卷服务器volume的启动,访问一下ip地址+端口号9333,就可以看到服务器:

上图中就是我三台机器的ip地址以及volume的大小,刚部署完成,你们的volumes和volume Ids都是0是正常的,因为还没有上传文件,所以master不会分配fid,不要担心。而且,三台服务器,已经有它自己的选举模式,选出了其中一台作为leader

接下来我们尝试进行文件的上传下载删除:

大概原理就是你先请求master服务器,master服务器给你分配fid和url地址,你再根据分配给你的fid和url地址进行文件操作

获取文件上传fid和url地址:

上传文件:(接口地址用上面获取到的fid和url)

 

同理下载文件删除文件,上述接口地址不变,只需要把调用方式改为GET/DELETE,因为它提供的是标准的restful接口。

FUSE挂载

正如我前面需求提到的,我们可能需要将文件系统挂载到本地目录,这样的话,我们的文件上传之后就能再挂载目录中查看了,非常方便,话不多说上手操作

seaweedfs挂载需要先启动一个挂载服务器filer,还是在我们的seaweedfs目录下进行:

执行命令:

开启filter服务器
nohup ./weed -v=3 filer -port=8888 -master=xxx.xxx.xxx.1:9333 >> filer.log &
另外两台机器也执行上述命令,seaweedfs默认的文件服务器端口号是8888

然后使用mount命令进行挂载

nohup ./weed mount -filer=xxx.xxx.xxx.1:8888 -dir=/mount -filer.path=/  >> wefsmount.log &

另外两台机器也执行一样的命令

上述的-dir=/mount 这个mount就是我自己创建的本地目录,当然你自己可以随意指定

启用完成之后查看日志cat wefsmount.log 

访问一下filer服务:

访问成功,我们可以在这上面进行文件的上传下载

S3网关

接下来就该提到S3,之前对这个概念一直很模糊,也不知道文件系统服务支持S3到底讲的是什么,后来发现,其实S3就是一套标准的接口访问协议,具体可以参考一下S3的API文档,那么seaweedfs怎么去启用S3呢?

很简单只需要一条命令:./weed s3

也可以用./weed s3 -h 去查看他的一些s3命令,默认情况下启动,端口号是8333,而且任何的key都是可以访问的。

网关启用之后我们就可以直接用S3接口进行文件操作啦!!!

值得一提的是,如果你是跟我一样的物理机,本地使用代理进行远程访问,开启S3之后,远程物理机默认的转发接口是localhost:8333就会导致你只能物理机本身访问,不支持对外开放,这个也有解决办法,在我们的启动命令上加一个ip.bind 绑定到你的物理机ip,就可以远程访问了。

//开启S3网关
./weed s3 -ip.bind=xxx.xxx.xxx.1

试一下效果:

 ok,大功告成,可以访问!

上述就是我初学分布式文件系统的一些经验,趟了很多坑,因为很多人实际场景去操作的时候都会遇到不同的问题,官方文档又是全英文,也是废了不少劲,收获不少。

第一次写文章,可能有些写的不清楚的地方,有什么问题,欢迎评论区交流!

 

 

 

 


http://chatgpt.dhexx.cn/article/NbwMjmme.shtml

相关文章

SEA~~

抹平One-Stage与Two-Stage目标检测之间的差距 ,重新讨论了单阶段和两阶段的检测器蒸馏任务 在这讨论了单阶段和两阶段的检测器蒸馏任务,并提出了一个简单而有效的语义感知框架来填补它们之间的空白。作者通过设计类别Anchor来生成每个类别的代表性模式,…

SeaweedFS容器部署(seaweed部署、seaweedfs部署)(文件块chunks概念)(master节点与volume节点通信原理)(seaweed上传seaweed下载)

官网链接:https://github.com/seaweedfs 文章目录 seaweed简介seaweedfs文件块概念(chunks)分布式部署时master节点与volume节点通信原理seaweed容器部署方法单个节点部署部署方法(mastervolum)(mastervolu…

seaweedfs服务启动参数及翻译(seaweed参数、seaweed命令、weed参数、weed命令)(在单个容器同时启动master、volume、filer服务)

文章目录 weed命令翻译weed server命令翻译 weed filer命令 docker容器运行示例(docker run命令)以下是一个在单个容器启动master、volume、filer服务的示例 weed server 容器debug 版本:3.47从官方镜像docker容器里扒下来的,只扒…

Paramiko: Python使用paramiko连接主机报错“Authentication timeout”

问题描述: 在用Python Paramiko库去连接主机时 始终无法连接,exception输出错误仅有 Authentication timeout connection paramiko.SSHClient()connection.set_missing_host_key_policy(paramiko.AutoAddPolicy())try:connection.connect(hostname192.1…

安装paramiko模块

使用Python实现自动化运维巡检网络设备,需要使用到paramiko模块 下载过程: 进入至CMD命令提示符 win r 跳转出 " 运行 " 窗口 打开内输入" cmd " 进入命令提示符 安装paramiko模块 cmd输入:pip install paramiko PS&…

python-paramiko安装

paramiko 安装坑比较多 测试环境: python3.7.9 win10 安装步骤: pip install pep517 pip install cryptography pip install paramiko

Python paramiko 模块详解与SSH主要功能模拟

我们知道,通过SSH服务可以远程连接到Linux服务器,查看上面的日志状态,批量配置远程服务器,文件上传,文件下载等,Python的paramiko模块同样实现了这一功能。 首先我们需要安装这一模块,pycharm环…

paramiko的安装

import paramiko 出错 直接通过下列代码即可,无需安装VS之类的 pip install paramiko 再上一步安装了paramiko之后,若您安装了pycharm ,博主安装的是pycharm 2018 community版则可通过File --> setting -->下列方式 步骤1&#xf…

Python模块之paramiko

Paramiko paramiko模块,基于SSH用于连接远程服务器并执行相关操作。 一、安装 1 pip3 install paramiko 二、使用 SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: 1 import paramiko2 3 # 创建SSH对象4 ssh paramiko.SSHCli…

python之paramiko模块

paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。 由于使用的是python这样的能够跨平台运行…

Python--paramiko

Paramiko paramiko模块,基于SSH用于连接远程服务器并执行相关操作。 一、安装 1 pip3 install paramiko 二、使用 SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: import paramiko# 创建SSH对象 ssh paramiko.SSHClient() # 允…

Python笔记之paramiko模块安装和使用示例

一、paramiko模块简介 paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,基于linux中的ssh服务 。paramiko是第三方模块,需要我们单独安装。通过paramiko模块,我们可以利用python代码程序实现对…

【Python-自动化】paramiko模块

文章目录 运维自动化Python一、模块介绍二、模块应用1.使用paramiko模块,通过ssh协议连接服务器2.解决首次连接known_hosts问题3、执行命令exec_command方法扩展:使用try异常捕获 4、多台服务器执行命令5、从服务器上传下载文件--SFTPClient方法6、多台服…

HttpClient和HtmlUnit的比较总结以及使用技巧(一)

大家在做爬虫、网页采集、通过网页自动写入数据时基本上都接触过这两个组件(权且称之为组件吧),网上入门资料已经很多了,我想从实际的应用角度谈谈我对于这两个组件的看法,并记录在博客中,以便日后翻阅&…

htmlUnit的读取js渲染的页面

htmlUnit的读取js渲染的页面 我这边有个这么的需求,要求前端每次上版本的时候,有一个版本号。然后后端去爬前端,比较禅道的版本发布计划,如果发布计划和生产上的版本号不一致,就告警。 这个跟后端的jar包&#xff0c…

HtmlUnit

HtmlUnit是什么?看下介绍: A java GUI-Less browser, which allows high-level manipulation of web pages, such as filling forms and clicking links; just getPage(url), find a hyperlink, click() and you have all the HTML, JavaScript, and A…

HtmlUnit使用

htmlunit 是一款开源的java 页面分析工具,读取页面后,可以有效的使用htmlunit分析页面上的内容。项目可以模拟浏览器运行,被誉为java浏览器的开源实现。是一个没有界面的浏览器,运行速度迅速。是junit的扩展之一,它采用…

【转】 HtmlUnit简介

HtmlUnit简介: 引自 http://www.javaeye.com/topic/166702 HtmlUnit 是 JUnit 的扩展测试框架之一。HtmlUnit 将返回文档模拟成 HTML,这样您便可以直接处理这些文档了。HtmlUnit 使用例如 table、form 等标识符将测试文档作为 HTML 来处理。它同样需要遵…

HtmlUnit(Java) - 快速入门学习 - 无界面浏览器

文章目录 1. 概述2. 注意2.0 js解析问题2.1 关闭HtmlUnit日志 3. 使用3.1 抓取IT之家周榜内容 - 单页面3.2 抓取IT之家周榜第九篇文章的内容 - 双页面3.3 模拟用户操作 - (这个功能个人感觉非常非常的鸡肋,只能用于非常简单的JS,但是一般网站…

【零基础】快速入门爬虫框架HtmlUnit

迅速的HtmlUnit htmlunit是一款开源的web页面分析工具,理论上来说htmlunit应用于网页的自动化测试,但是相对来说更多人使用它来进行小型爬虫的快速开发。使用htmlunit进行爬虫开发不仅是其运行速度快,更重要的是此框架上手更为容易&#xff0…