各式各样的ARM板家庭DockerSwarm集群 SeaweedFS编辑
因为正在构建一个集群,所以我会留下这个备忘录。在这篇文章中,我将介绍如何在家用ARM开发板上安装SeaweedFS。
家庭群集系列
-
- 第1弾: ハードウェア編
-
- 第2弾: Portainer編
-
- 第3弾: Ceph編(失敗)
- 第4弾: SeaweedFS編
关于SeaweedFS的内容
这是一个使用多个存储创建分布式对象存储的Go软件,类似于软件RAID。它支持许多功能,例如S3、文件系统、FUSE挂载、WebDAV、Hadoop兼容文件系统和WebUI等等。该软件从2014年左右开始开发,显然支持Docker和ARM。它是一个单一二进制文件,所以可以使用相同的Docker镜像,只需更改传递的命令就可以建立每个服务器。根据README的说明,它的架构与GlusterFS和Ceph几乎相同,但更专注于小文件,并力求高速和简洁。
为什么不使用Ceph?
Ceph是我之前尝试安装过的,但安装过程相当复杂,而且在中途遇到了困难(好像没有适用于ARMv7/ARM64的Docker镜像),所以我放弃了。再加上一位已安装的朋友告诉我,它的要求规格相当高,可能树莓派有点吃力。
为什么要使用SeaweedFS?
在Reddit上的一个关于在树莓派上组建Docker Swarm并使用分布式存储的推荐帖子中,我看到了SeaweedFS开发者推广的评论,觉得很有兴趣,便决定尝试一下。而且由于在Qiita上没有介绍SeaweedFS的文章,所以我会增加一些资料来供正在考虑使用的人参考。
海藻文件系统术语
https://github.com/chrislusf/seaweedfs/wiki/Components
SeaweedFS的组成非常简单,没有太复杂的规范。我们将按照不同项目来介绍可以在SeaweedFS中运行的服务器。
复制
冗余备份/复制是指通过对相同数据进行冗余处理,以提高可靠性的术语。
音量
据SeaweedFS的描述,它将大量的小文件保存在一个名为”卷”的单位中,这个”卷”实际上是由多个小文件合并而成的一个大文件。默认情况下,当主节点启动时,会配置8个30GB的卷。复制和TTL的设置都是以卷为单位进行的。
收藏
在SeaweedFS中,Volumes的集合被称为Collection。当使用S3兼容的API创建存储桶时,会同时创建一个Collection。这使得存储桶的删除和管理变得更加简单。尽管它是一个Collection,但复制和TTL设置仍然应针对每个Volume进行。由于在创建Collection时会预先准备Volumes,若容量不足,建议减小Volumes的大小。
海藻分布文件系统的各种服务器
只要有最低限的master和volume,就可以通过CUI进行文件的读写。实际上,由于经常需要从CUI以外的方式进行访问,所以需要根据所需的方法准备额外的服务器。每个服务器只需要传递参数,就可以在一个容器中同时处理多个服务器,但是由于后期维护困难,不建议这样做。
师傅
按照名字来说,如果没有这个东西,整个集群就无法使用。如果要准备多台主服务器,为了产生多数派意见,必须准备奇数台。
音量
将多个文件整理为一个文件卷的概念来进行读写操作。复制是在卷的单位进行的。
筛选者 zhě)
如果你想要通过HTTP API来进行文件的POST/PUT/GET/DELETE等操作,可以使用这个功能。这主要用于希望将其作为一种常规文件系统来访问的情况下,是必需的。由于性能较慢,所以建议仅在确实需要时使用。
S3.
如果想要使用S3互换的API,可以使用它。
WebDAV
如果想要启用能够挂载WebDav的功能,可以进行激活。由于似乎没有认证功能,所以个人觉得实际上并不太需要使用它。
山
如果想在Linux或者OSX上进行FUSE挂载,可以使用这个选项。如果想在Windows上使用,可以通过挂载的Linux上的Samba来进行读写(若文件过大可能会在中途出现brokenpipe错误)。
Cron作业
如果有多个音量服务器,则似乎可以运行修复复制的命令,每隔一定时间运行一次。(命令被写入Dockerfile中进行执行)
導入SeaweedFS
在这个系统中使用的术语和快速入门指南确实有,但实际部署的配置示例不多,这让我有点困惑。在这里,我们的目标是实现一个配置,其中有3台主服务器,3台卷服务器,3台文件服务器,3台S3服务器,6台挂载服务器和1台cronjob服务器。
使用DockerSwarm的方式(失败)。
如何启动
根据README.md文件,如果下载seaweed-compose.yml并执行docker-compose up命令,则可以运行最小配置。
需要构建和推送一个多架构构建,在”DockerHub”的栏中提到了ARM,所以我以为ARM镜像已经上传了,但实际上并没有。看来每个人都必须自己进行构建。
将ARM构建并推送到Registry
我使用了TreeScale来上传镜像,因为我不确定以后是否会继续进行维护,所以我不太愿意将镜像公开在仓库中。(之前的文章中已经介绍了构建命令的设定,这里省略)
git clone https://github.com/chrislusf/seaweedfs
cd seaweedfs/docker
docker buildx build --pull --push --platform linux/amd64,linux/arm64,linux/arm/v7 . -t repo.treescale.com/ユーザー名/seaweedfs:latest
尝试在DockerSwarm的定义文件中运行(失败)
尽管我尝试了多种配置,但无论如何,filer容器与master容器之间的通信都无法正常工作,会出现gRPC错误。例如,当只有一个volume、一个master和一个filer时,在docker-compose内是可以运行的,但是如果尝试使用swarm来配置一个master、一个filer和三个volumes,就会出现gRPC错误。以下是我尝试的备忘录(如果有人知道解决方案,请告诉我!)。
版本:’3′
服务:
master:
image:repo.treescale.com / dosugamea / seaweedfs:latest#Master服务
ports:
– 9333:9333
– 19333:19333
command:“master -ip = master”
deploy:
replicas:3
resources:
limits:
memory:100M
placement:
max_replicas_per_node:1
constraints:
– node.labels.seaweed == true
volume:
image:repo.treescale.com / dosugamea / seaweedfs:latest#卷服务
ports:
– 8080:8080
– 18080:18080
– 9325:9325
command:’volume -mserver =“master:9333” -port = 8080 -metricsPort = 9325′
deploy:
replicas:3
resources:
limits:
memory:1000M
placement:
max_replicas_per_node:1
constraints:
– node.labels.seaweed == true
filer:
image:repo.treescale.com / dosugamea / seaweedfs:latest#filer服务
ports:
– 8888:8888
– 18888:18888
– 9326:9326
command:’filer -master =“master:9333” -metricsPort = 9326′
tty:true
stdin_open:true
depends_on:
– master
– volume
deploy:
replicas:3
resources:
limits:
memory:1000M
placement:
max_replicas_per_node:1
constraints:
– node.labels.seaweed == true
cronjob:
image:repo.treescale.com / dosugamea / seaweedfs:latest#cronjob
command:’cronjob’
environment:
#每隔2分钟运行一次重新复制作业
CRON_SCHEDULE:’*/2 * * * * *’ #默认:’*/5 * * * * *’
WEED_MASTER:master:9333#默认:localhost:9333
depends_on:
– master
– volume
deploy:
replicas:1
resources:
limits:
memory:300M
placement:
max_replicas_per_node:1
constraints:
– node.labels.seaweed == true
s3:
image:repo.treescale.com / dosugamea / seaweedfs:latest#S3服务
ports:
– 8333:8333
– 9327:9327
command:’s3 -filer =“filer:8888” -metricsPort = 9327′
depends_on:
– master
– volume
– filer
deploy:
replicas:3
placement:
max_replicas_per_node:1
constraints:
– node.labels.seaweed == true
version: ‘3’
services:
master:
image: repo.treescale.com/dosugamea/seaweedfs:latest # 使用远程镜像
ports:
– 9333:9333
– 19333:19333
command: “master -ip.bind=’0.0.0.0′ -ip=master”
volume:
image: repo.treescale.com/dosugamea/seaweedfs:latest # 使用远程镜像
ports:
– 8080:8080
– 18080:18080
command: ‘volume -ip.bind=”0.0.0.0″ -mserver=”master:9333″ -port=8080’
depends_on:
– master
filer:
image: repo.treescale.com/dosugamea/seaweedfs:latest # 使用远程镜像
ports:
– 8888:8888
– 18888:18888
command: ‘filer -ip.bind=”0.0.0.0″ -master=”master:9333″‘
tty: true
stdin_open: true
depends_on:
– master
– volume
版本:’3′
服务:
master1:
image:repo.treescale.com/dosugamea/seaweedfs:latest#使用远程镜像
ports:
– 9333:9333#HTTP端点(仪表板)
– 19333:19333#gRPC端点
command:“master -ip = master1 -port = 9333 -master.peers = master1:9333,master2:9333,master3:9333 -mdir = / data -defaultReplication = 020 -volumeSizeLimitMB = 2048”
volumes:
– / mnt / hdd2 / seaweedfs / master1:/ data
deploy:
replicas:1
资源:
限制:
内存:256M
安置:
约束:
– node.labels.seaweed-master1 == true
master2:
image:repo.treescale.com/dosugamea/seaweedfs:latest#使用远程镜像
ports:
– 9334:9333#HTTP端点(仪表板)
– 19334:19333#gRPC端点
command:“master -ip = master2 -port = 9333 -master.peers = master1:9333,master2:9333,master3:9333 -mdir = / data -defaultReplication = 020 -volumeSizeLimitMB = 2048”
volumes:
– / mnt / hdd2 / seaweedfs / master2:/ data
deploy:
replicas:1
资源:
限制:
内存:256M
安置:
约束:
– node.labels.seaweed-master2 == true
master3:
image:repo.treescale.com/dosugamea/seaweedfs:latest#使用远程镜像
ports:
– 9335:9333#HTTP端点(仪表板)
– 19335:19333#gRPC端点
command:“master -ip = master3 -port = 9333 -master.peers = master1:9333,master2:9333,master3:9333 -mdir = / data -defaultReplication = 020 -volumeSizeLimitMB = 2048”
volumes:
– / mnt / hdd2 / seaweedfs / master3:/ data
deploy:
replicas:1
资源:
限制:
内存:256M
安置:
约束:
– node.labels.seaweed-master3 == true
volume:
image:repo.treescale.com/dosugamea/seaweedfs:latest#使用远程镜像
ports:
– 8081:8080#HTTP端点
– 18080:18080#gRPC端点
– 9325:9325#指标端点
command:’volume -mserver =“ master1:9333,master2:9333,master3:9333”-fileSizeLimitMB = 16384 -concurrentUploadLimitMB = 16384 -max = 100 -minFreeSpace = 10 -port = 8080 -metricsPort = 9325 -index = leveldb -dir = ./data -dataCenter = home -disk = hdd ‘
depends_on:
– master1
– master2
– master3
volumes:
– / mnt / hdd2 / seaweedfs / volume:/ data
deploy:
replicas:3
资源:
限制:
内存:1024M
安置:
约束:
– node.labels.seaweed == true
filer1:
image:repo.treescale.com/dosugamea/seaweedfs:latest#使用远程镜像
ports:
– 8888:8888#HTTP端点
– 18888:18888#gRPC端点
– 9326:9326#指标端点
command:’filer -master =“ master1:9333,master2:9333,master3:9333”-peers =“ filer1:8888,filer2:8888,filer3:8888”-metricsPort = 9326′
tty:true
stdin_open:true
depends_on:
– master1
– master2
– master3
– volume
deploy:
replicas:1
资源:
限制:
内存:1024M
安置:
约束:
– node.labels.seaweed1 == true
filer2:
image:repo.treescale.com/dosugamea/seaweedfs:latest#使用远程镜像
ports:
– 8889:8888#HTTP端点
– 18889:18888#gRPC端点
– 9327:9326#指标端点
command:’filer -master =“ master1:9333,master2:9333,master3:9333”-peers =“ filer1:8888,filer2:8888,filer3:8888”-metricsPort = 9326′
tty:true
stdin_open:true
depends_on:
– master1
– master2
– master3
– volume
deploy:
replicas:1
资源:
限制:
内存:1024M
安置:
约束:
– node.labels.seaweed2 == true
filer3:
image:repo.treescale.com/dosugamea/seaweedfs:latest#使用远程镜像
ports:
– 8890:8888#HTTP端点
– 18890:18888#gRPC端点
– 9328:9326#指标端点
command:’filer -master =“ master1:9333,master2:9333,master3:9333”-peers =“ filer1:8888,filer2:8888,filer3:8888”-metricsPort = 9326′
tty:true
stdin_open:true
depends_on:
– master1
– master2
– master3
– volume
deploy:
replicas:1
资源:
限制:
内存:1024M
安置:
约束:
– node.labels.seaweed3 == true
s3:
image:repo.treescale.com/dosugamea/seaweedfs:latest#使用远程镜像
ports:
– 8333:8333#HTTP端点
– 9350:9327#指标端点
command:’s3 -filer =“ filer1:8888,filer2:8888,filer3:8888”-metricsPort = 9327′
depends_on:
– master1
– master2
– master3
– volume
– filer1
– filer2
– filer3
deploy:
replicas:3
资源:
限制:
内存:1024M
安置:
约束:
– node.labels.seaweed == true
mount:
image:repo.treescale.com/dosugamea/seaweedfs:latest#使用远程镜像
command:’mount -filer =“ filer1:8888,filer2:8888,filer3:8888”-dirAutoCreate -dir = / mnt / seaweedfs -cacheCapacityMB = 100-concurrentWriters = 64′
depends_on:
– master1
– master2
– master3
– volume
– filer1
– filer2
– filer3
volumes:
– / mnt / seaweedfs:/ mnt / seaweedfs
deploy:
replicas:global
资源:
限制:
内存:256M
安置:
约束:
– node.labels.seaweed == true
cronjob:
image:repo.treescale.com/dosugamea/seaweedfs:latest#使用远程镜像
command:’cronjob’
环境:
#每2分钟运行一次重新复制
CRON_SCHEDULE:’*/2 * * * * *’#默认:’*/5 * * * *
version: ‘3.8’
services:
master:
image: repo.treescale.com/dosugamea/seaweedfs:latest # 使用遠程映像
command: “master -mdir=/data -volumeSizeLimitMB=2048”
networks:
– weed
volumes:
– /mnt/hdd2/master1:/data
deploy:
mode: replicated
replicas: 1
resources:
limits:
memory: 256M
placement:
constraints:
– node.labels.seaweed-master1 == true
volume:
image: repo.treescale.com/dosugamea/seaweedfs:latest # 使用遠程映像
command: ‘volume -mserver=master:9333 -fileSizeLimitMB=16384 -concurrentUploadLimitMB=16384 -max=100 -minFreeSpace=10 -dataCenter=home -rack=jet -metricsPort=9325 -dir=./data’
depends_on:
– master
networks:
– weed
volumes:
– /mnt/hdd2/volume:/data
deploy:
replicas: 1
resources:
limits:
memory: 1024M
placement:
constraints:
– node.labels.seaweed1 == true
volume2:
image: repo.treescale.com/dosugamea/seaweedfs:latest # 使用遠程映像
command: ‘volume -mserver=master:9333 -fileSizeLimitMB=16384 -concurrentUploadLimitMB=16384 -max=100 -minFreeSpace=10 -dataCenter=home -rack=pie -metricsPort=9325 -dir=./data’
depends_on:
– master
networks:
– weed
volumes:
– /mnt/hdd2/volume:/data
deploy:
replicas: 1
resources:
limits:
memory: 1024M
placement:
constraints:
– node.labels.seaweed2 == true
volume3:
image: repo.treescale.com/dosugamea/seaweedfs:latest # 使用遠程映像
command: ‘volume -mserver=master:9333 -fileSizeLimitMB=16384 -concurrentUploadLimitMB=16384 -max=100 -minFreeSpace=10 -dataCenter=home -rack=rock -metricsPort=9325 -dir=./data’
depends_on:
– master
networks:
– weed
volumes:
– /mnt/hdd2/volume:/data
deploy:
replicas: 1
resources:
limits:
memory: 1024M
placement:
constraints:
– node.labels.seaweed3 == true
filer:
image: repo.treescale.com/dosugamea/seaweedfs:latest # 使用遠程映像
ports:
– “8888:8888/tcp”
command: ‘filer -master=master:9333 -metricsPort=9326’
depends_on:
– master
– volume
networks:
– weed
deploy:
mode: replicated
replicas: 1
resources:
limits:
memory: 1024M
placement:
constraints:
– node.labels.seaweed-master1 == true
s3:
image: repo.treescale.com/dosugamea/seaweedfs:latest # 使用遠程映像
ports:
– 8333:8333 # HTTP端口
– 9350:9327 # 指標端口
command: ‘s3 -filer=”filer:8888″ -metricsPort=9327’
depends_on:
– master
– volume
– filer
networks:
– weed
deploy:
mode: replicated
replicas: 3
resources:
limits:
memory: 1024M
placement:
constraints:
– node.labels.seaweed == true
cronjob:
image: repo.treescale.com/dosugamea/seaweedfs:latest # 使用遠程映像
command: ‘cronjob’
environment:
# 每2分鐘執行重新複製
CRON_SCHEDULE: ‘*/2 * * * * *’ # 默認值: ‘*/5 * * * * *’
WEED_MASTER: master:9333 # 默認值: localhost:9333
depends_on:
– master
– volume
– filer
networks:
– weed
deploy:
mode: replicated
replicas: 1
resources:
limits:
memory: 300M
placement:
constraints:
– node.labels.seaweed-master1 == true
prometheus:
image: prom/prometheus:v2.28.1
ports:
– 9999:9090
volumes:
– /mnt/hdd2/prometheus:/etc/prometheus
command: –web.enable-lifecycle –config.file=/etc/prometheus/prometheus.yml
depends_on:
– s3
networks:
– weed
deploy:
mode: replicated
replicas: 1
resources:
limits:
memory: 256M
placement:
constraints:
– node.labels.seaweed-master1 == true
networks:
weed:
attachable: true
driver: overlay
不使用Docker的方法(直接设置服务)
与在Docker上进行操作不同的是,在局域网内(只要进行了设置),可以成功连接而不会发生rpc错误。
在注意事项中,提到在 weed server 命令中,可以将 master/filer/volume 全部定义为一个服务。但是,由于无法指定 volume 的存储位置(只能指定 idx 文件的存储位置,导致 dat/vif 文件会存储在 /tmp 目录中导致内存不足),因此建议将服务分开。
前提
有三个节点,分别为 192.168.0.11、192.168.0.12 和 192.168.0.13。设置每个节点的 maseter 端口为 9333,filer 端口为 8888,volume 端口为 7070,s3 端口为 8333。每个节点都连接有相同容量的硬盘,并将其分为两个分区,其中一半用于 /mnt/hdd2 专门供 SeaweedFS 使用。在每个节点上进行挂载,并将其挂载到 /mnt/seaweedfs。创建专用的 SeaweedFS 用户和组,并使其生效。
下载并解压执行文件。
在Github的Releases中,有提供已构建的二进制文件进行分发,因此需要下载它。与Docker容器不同,这个二进制文件也包含了ARM构建版本。虽然可能可以放在任何地方,但我们此次将其放置在了现有教程中的/usr/local/bin目录下。
wget https://github.com/chrislusf/seaweedfs/releases/download/2.59/linux_arm64.tar.gz
tar xzvf linux_arm64.tar.gz
sudo mv weed /usr/local/bin
wget https://github.com/chrislusf/seaweedfs/releases/download/2.59/linux_arm.tar.gz
tar xzvf linux_arm.tar.gz
sudo mv weed /usr/local/bin
如果将服务分开的话,可以采取以下方法1。
由于逐个写出会变得非常冗长,所以我进行了折叠。
# 创建执行组
sudo groupadd seaweed
# 创建名为seaweed的用户,无主文件夹,以seaweed为主组
sudo useradd seaweed -M -g seaweed
创建所需文件夹
# 用于Master服务
sudo mkdir /mnt/hdd2/master
# 用于Volume服务
sudo mkdir /mnt/hdd2/volume
# 用于S3服务
sudo mkdir /mnt/hdd2/buckets
# 用于Filer服务
sudo mkdir /mnt/hdd2/filerldb2
# 用于Mount服务
sudo mkdir /mnt/seaweedfs
更改文件夹所有者
# 将整个HDD的所有者更改为seaweed用户
sudo chown seaweed:seaweed /mnt/hdd2 -R
[Unit]
描述= SeaweedFS主节点
在网络目标之后
[Service]
类型=简单
用户=seaweed
组=seaweed
启动命令=/usr/local/bin/weed master -mdir=”/mnt/hdd2/master” -ip=192.168.0.11 -peers=”192.168.0.11:9333,192.168.0.12:9333,192.168.0.13:9333″ -volumeSizeLimitMB=2048 -defaultReplication=020 -port=9333
工作目录=/usr/local/bin/
Syslog标识符=seaweedfs-master
[Install]
所需目标=多用户目标
[Unit]
描述=SeaweedFS卷
在network.target之后
[Service]
类型=simple
用户=seaweed
组=seaweed
启动命令=/usr/local/bin/weed volume -ip=192.168.0.11 -mserver=”192.168.0.11:9333,192.168.0.12:9333,192.168.0.13:9333″ -fileSizeLimitMB=16384 -concurrentUploadLimitMB=16384 -max=100 -minFreeSpace=10 -port=7070 -metricsPort=9325 -index=leveldb -dir=”/mnt/hdd2/volume” -dataCenter=home -rack=rock -disk=hdd -publicUrl=192.168.0.11
工作目录=/usr/local/bin/
Syslog标识符=seaweedfs-volume
[Install]
WantedBy=multi-user.target
[Unit]
描述=SeaweedFS Filer
在 network.target 后启动
[Service]
类型=simple
用户=seaweed
群组=seaweed
执行命令=/usr/local/bin/weed filer -ip=192.168.0.11 -master=”192.168.0.11:9333,192.168.0.12:9333,192.168.0.13:9333″ -peers=”192.168.0.11:8888,192.168.0.12:8888,192.168.0.13:8888″ -port=8888 -metricsPort=9326
工作目录=/usr/local/bin/
Syslog 标识=seaweedfs-filer
[Install]
WantedBy=multi-user.target
[Unit]
描述=SeaweedFS S3
在=network.target之后
[Service]
类型=简单
用户=seaweed
群组=seaweed
启动命令=/usr/local/bin/weed s3 -port=8333 -filer=”192.168.0.11:8888,192.168.0.12:8888,192.168.0.13:8888″ -config=s3.json -metricsPort=9327
工作目录=/usr/local/bin/
系统日志标识符=seaweedfs-s3
[Install]
所需依赖=multi-user.target
[Unit]
描述=SeaweedFS 挂载
在=network.target 之后
[Service]
类型=simple
用户=root
群组=root
执行启动=/usr/local/bin/weed mount -filer=”192.168.0.11:8888,192.168.0.12:8888,192.168.0.13:8888″ -dir=”/mnt/seaweedfs”
工作目录=/usr/local/bin/
Syslog标识符=seaweedfs-mount
[Install]
所需目标=multi-user.target
# 用于SeaweedFS filer存储的示例TOML配置文件
# 可与”weed filer”或”weed server -filer”一起使用
# 将此文件放置在以下位置之一,按降序优先级
# ./filer.toml
# $HOME/.seaweedfs/filer.toml
# /etc/seaweedfs/filer.toml
####################################################
# 可定制的filer服务器选项
####################################################
[filer.options]
# 使用HTTP DELETE时,默认情况下filer会检查文件夹是否为空。
# 递归删除将删除所有子文件夹和文件,类似于”rm -Rf”
recursive_delete = false
# 在此文件夹下的目录将自动创建一个单独的存储桶
buckets_folder = “/mnt/hdd2/buckets”
####################################################
# 下列是filer存储选项
####################################################
[leveldb2]
# 本地硬盘上,主要用于简单的单机设置,可伸缩性较好
# 比以前的leveldb更快,推荐使用
enabled = true
# 存储文件的目录(请自行更改)
dir = “/mnt/hdd2/filerldb2” # 存储level db文件的目录
[leveldb3]
# 类似于leveldb2。
# 每个存储桶都有自己的元数据存储
enabled = false
dir = “./filerldb3” # 存储level db文件的目录
[rocksdb]
# 本地硬盘上,类似于leveldb
# 由于它使用C包装器,您需要自行安装rocksdb并构建它
enabled = false
dir = “./filerrdb” # 存储rocksdb文件的目录
[sqlite]
# 本地硬盘上,类似于leveldb
enabled = false
dbFile = “./filer.db” # sqlite数据库文件
[mysql] # 或者memsql,tidb
# CREATE TABLE IF NOT EXISTS filemeta (
# dirhash BIGINT COMMENT ‘目录字段的MD5哈希值的前64位’,
# name VARCHAR(1000) BINARY COMMENT ‘目录或文件名’,
# directory TEXT COMMENT ‘父目录的完整路径’,
# meta LONGBLOB,
# PRIMARY KEY (dirhash, name)
# ) DEFAULT CHARSET=utf8;
enabled = false
hostname = “localhost”
port = 3306
username = “root”
password = “”
database = “” # 创建或使用现有数据库
connection_max_idle = 2
connection_max_open = 100
connection_max_lifetime_seconds = 0
interpolateParams = false
# 如果插入/更新失败,可以禁用upsert或更改更新查询语法以匹配您的关系型数据库语法:
enableUpsert = true
upsertQuery = “””INSERT INTO ` + “`%s`” + ` (dirhash,name,directory,meta) VALUES(?,?,?,?) ON DUPLICATE KEY UPDATE meta = VALUES(meta)”””
[mysql2] # 或者memsql,tidb
enabled = false
createTable = “””
CREATE TABLE IF NOT EXISTS ` + “`%s`” + ` (
dirhash BIGINT,
name VARCHAR(1000) BINARY,
directory TEXT,
meta LONGBLOB,
PRIMARY KEY (dirhash, name)
) DEFAULT CHARSET=utf8;
“””
hostname = “localhost”
port = 3306
username = “root”
password = “”
database = “” # 创建或使用现有数据库
connection_max_idle = 2
connection_max_open = 100
connection_max_lifetime_seconds = 0
interpolateParams = false
# 如果插入/更新失败,可以禁用upsert或更改更新查询语法以匹配您的关系型数据库语法:
enableUpsert = true
upsertQuery = “””INSERT INTO ` + “`%s`” + ` (dirhash,name,directory,meta) VALUES(?,?,?,?) ON DUPLICATE KEY UPDATE meta = VALUES(meta)”””
[postgres] # 或者cockroachdb,YugabyteDB
# CREATE TABLE IF NOT EXISTS filemeta (
# dirhash BIGINT,
# name VARCHAR(65535),
# directory VARCHAR(65535),
# meta bytea,
# PRIMARY KEY (dirhash, name)
# );
enabled = false
hostname = “localhost”
port = 5432
username = “postgres”
password = “”
database = “postgres” # 创建或使用现有数据库
schema = “”
sslmode = “disable”
connection_max_idle = 100
connection_max_open = 100
connection_max_lifetime_seconds = 0
# 如果插入/更新失败,可以禁用upsert或更改更新查询语法以匹配您的关系型数据库语法:
enableUpsert = true
upsertQuery = “””INSERT INTO “%[1]s” (dirhash,name,directory,meta) VALUES($1,$2,$3,$4) ON CONFLICT (dirhash,name) DO UPDATE SET meta = EXCLUDED.meta WHERE “%[1]s”.meta != EXCLUDED.meta”””
[postgres2]
enabled = false
createTable = “””
CREATE TABLE IF NOT EXISTS “%s” (
dirhash BIGINT,
name VARCHAR(65535),
directory VARCHAR(65535),
meta bytea,
PRIMARY KEY (dirhash, name)
);
“””
hostname = “localhost”
port = 5432
username = “postgres”
password = “”
database = “postgres” # 创建或使用现有数据库
schema = “”
sslmode = “disable”
connection_max_idle = 100
connection_max_open = 100
connection_max_lifetime_seconds = 0
# 如果插入/更新失败,可以禁用upsert或更改更新查询语法以匹配您的关系型数据库语法:
enableUpsert = true
upsertQuery = “””INSERT INTO “%[1]s” (dirhash,name,directory,meta) VALUES($1,$2,$3,$4) ON CONFLICT (dirhash,name) DO UPDATE SET meta = EXCLUDED.meta WHERE “%[1]s”.meta != EXCLUDED.meta”””
[cassandra]
# CREATE TABLE filemeta (
# directory varchar,
# name varchar,
# meta blob,
# PRIMARY KEY (directory, name)
# ) WITH CLUSTERING ORDER BY (name ASC);
enabled = false
keyspace = “seaweedfs”
hosts = [
“localhost:9042”,
]
username = “”
password = “”
# 这会改变数据布局。只能添加新的目录。删除/更新将导致数据丢失。
superLargeDirectories = []
# 本地到该filer的数据中心名称,作为主机选择的备选项。
localDC = “”
[hbase]
enabled = false
zkquorum = “”
table = “seaweedfs”
[redis2]
enabled = false
address = “localhost:6379”
password = “”
database = 0
# 这会改变数据布局。只能添加新的目录。删除/更新将导致数据丢失。
superLargeDirectories = []
[redis_cluster2]
enabled = false
addresses = [
“localhost:30001”,
“localhost:30002”,
“localhost:30003”,
“localhost:30004”,
“localhost:30005”,
“localhost:30006”,
]
password = “”
# 允许从从服务器或主服务器进行读取,但所有写入仍然将转到主服务器
readOnly = false
# 自动使用最近的Redis服务器进行读取
routeByLatency = false
# 这会改变数据布局。只能添加新的目录。删除/更新将导致数据丢失。
superLargeDirectories = []
[etcd]
enabled = false
servers = “localhost:2379”
timeout = “3s”
[mongodb]
enabled = false
uri = “mongodb://localhost:27017”
option_pool_size = 0
database = “seaweedfs”
[elastic7]
enabled = false
servers = [
“http://localhost1:9200”,
“http://localhost2:9200”,
“http://localhost3:9200”,
]
username = “”
password = “”
sniff_enabled = false
healthcheck_enabled = false
# 增加该值是推荐的,确保Elastic中的值大于或等于此处的值
index.max_result_window = 10000
##########################
##########################
# 添加特定路径的filer存储:
#
# 1. 在存储类型后添加一个名称,以点号”.”分隔。例如cassandra.tmp
# 2. 添加一个位置配置。例如location = “/tmp/”
# 3. 复制并自定义所有其他配置。
# 如果使用相同的存储类型,则确保它们不相同!
# 4. 将enabled设置为true
#
# 下面的代码仅仅使用redis作为示例
##########################
[redis2.tmp]
enabled = false
location = “/tmp/”
address = “localhost:6379”
password = “”
database = 1
{
“identities”: [
{
“name”: “匿名”,
“actions”: [
“只读”
]
},
{
“name”: “管理员用户”,
“credentials”: [
{
“accessKey”: “某个访问密钥1”,
“secretKey”: “某个秘密密钥1”
}
],
“actions”: [
“管理”,
“只读”,
“列出”,
“打标签”,
“写入”
]
},
{
“name”: “普通用户”,
“credentials”: [
{
“accessKey”: “某个访问密钥3”,
“secretKey”: “某个秘密密钥3”
}
],
“actions”: [
“只读”,
“列出”,
“打标签”,
“写入”
]
}
]
}
sudo systemctl daemon-reload
sudo systemctl enable seaweed-master
sudo systemctl enable seaweed-volume
sudo systemctl enable seaweed-filer
sudo systemctl enable seaweed-s3
sudo systemctl enable seaweed-mount
sudo systemctl start seaweed-master
sudo systemctl start seaweed-volume
sudo systemctl start seaweed-filer
sudo systemctl start seaweed-s3
sudo systemctl start seaweed-mount
如果不将服务分开的话(将其保存在tmp中)
[Unit]
Description=SeaweedFS
After=network.target
[Service]
Type=simple
User=root
Group=root
ExecStart=/usr/local/bin/weed server -dataCenter=home -rack=rock -master -master.dir=/mnt/hdd2/master -master.peers="192.168.0.11:9333,192.168.0.12:9333,192.168.0.13:9333" -master.volumeSizeLimitMB=2048 -master.defaultReplication=020 -master.port=9333 -volume -volume.dir.idx=/mnt/hdd2/volume -volume.port=8080 -volume.max=100 -volume.minFreeSpace=10 -volume.fileSizeLimitMB=16384 -volume.concurrentUploadLimitMB=16384 -volume.disk=hdd -volume.publicUrl=192.168.0.11 -filer -filer.peers="192.168.0.11:8888,192.168.0.12:8888,192.168.0.13:8888" -filer.port=8888 -s3 -s3.port=8333 -metricsPort=9326
WorkingDirectory=/usr/local/bin/
SyslogIdentifier=seaweedfs-master
[Install]
WantedBy=multi-user.target
离开后的感受
我曾经尝试在DockerSwarm上运行,但最终无法成功,直到能够运行花了大约两个星期…与Ceph和GlusterFS相比,关于DockerSwarm的信息几乎没有,所以如果以后发生任何问题,我感到很害怕。安装并不容易,感觉有点棘手。(实际上,现在想使用DockerSwarm可能不是个好主意)
以下提供一个中文的同义句:
请参考
在Ubuntu 20.04上设置SeaweedFS分布式对象存储集群