惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Apple Machine Learning Research
Apple Machine Learning Research
AWS News Blog
AWS News Blog
Google DeepMind News
Google DeepMind News
U
Unit 42
博客园 - 叶小钗
博客园 - 聂微东
GbyAI
GbyAI
Stack Overflow Blog
Stack Overflow Blog
有赞技术团队
有赞技术团队
aimingoo的专栏
aimingoo的专栏
D
DataBreaches.Net
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Jina AI
Jina AI
美团技术团队
The Cloudflare Blog
M
MIT News - Artificial intelligence
Microsoft Azure Blog
Microsoft Azure Blog
I
InfoQ
S
Schneier on Security
C
Check Point Blog
Project Zero
Project Zero
The Hacker News
The Hacker News
Scott Helme
Scott Helme
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Cisco Talos Blog
Cisco Talos Blog
P
Privacy International News Feed
SecWiki News
SecWiki News
Latest news
Latest news
MongoDB | Blog
MongoDB | Blog
S
Secure Thoughts
Google Online Security Blog
Google Online Security Blog
F
Fortinet All Blogs
博客园 - 三生石上(FineUI控件)
H
Help Net Security
TaoSecurity Blog
TaoSecurity Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Last Week in AI
Last Week in AI
P
Privacy & Cybersecurity Law Blog
Forbes - Security
Forbes - Security
G
GRAHAM CLULEY
N
Netflix TechBlog - Medium
L
Lohrmann on Cybersecurity
A
About on SuperTechFans
T
The Exploit Database - CXSecurity.com
C
Cisco Blogs
PCI Perspectives
PCI Perspectives
大猫的无限游戏
大猫的无限游戏
T
Troy Hunt's Blog
H
Hacker News: Front Page
Vercel News
Vercel News

陈少文的网站

巨变与机遇的未来十年 Kubernetes 平台管理软件压力测试方案 使用镜像部署 Hexo 静态页面 终于等到你 - GitHub 镜像仓库服务(ghcr.io) 一起来学 Go --(6)Interface 一起来学 Go --(5)Goroutine 和 Channel 什么是函数式编程 如何在 Kubernetes 集群集成 Kata 柯里化与偏函数 使用 PyGithub 自动创建 Label 软件产品是团队能力的输出 Helm 2 、Helm 3 比较 IoT 变现 Kubernetes 中的 DNS 服务 国内的 Helm 镜像源 Harbor 使用自签证书支持 Https 访问 DevOps 工具链之 Prow 如何使用 kfctl 安装 Kubeflow VS Code 无法下载 Go 插件的工具包 工程师更应具有服务精神 你不知道的 Docker 使用技巧 使用 Docker 运行 Tensorflow 论中国 什么是左移 如何清空 Git 仓库全部历史记录 一禅小和尚 有风吹过厨房 时间的玫瑰 如何在 CentOS 安装 GPU 驱动 开发 Tips(19) 使用 Velero 备份 Kubernetes 集群 Kubernetes Cheat Sheet 开发 Tips(18) 如何构建一个 Java 工程 开发 Tips(17) KubeSpray 安装 Kubernetes 报错 ip in ansible_all_ipv4_addresses 基于 Kubernetes 和 Jenkins 搭建自动化测试系统 在 Kubernetes 上动态创建 Jenkins Slave 使用 Jenkins 进行服务拨测 开发 Tips(16) Kubernetes 签发 Ingress 证书及日常故障运维 Kubernetes 中 Deployment 的基本操作 Kubernetes 中的证书 如何使用 KubeBuilder 开发一个 Operator Kubernetes 1.6.0 安装问题汇总 镜像管理工具 -- Harbor 开发 Tips(15) Docker 如何拉取镜像 开发 Tips(14) 使用 Helm 安装 harbor 开发 Tips(13) 使用 S2I 构建云原生应用 在 Kubernetes 中使用 emptyDir、hostPath、localVolume 开发 Tips(12) 开发 Tips(11) 代码质量分析工具 SonarQube 使用 Kubeadm 安装 Kubernetes 集群 一起来学 Go --(4)常用函数 Kubernetes 中的 Ceph Kubernetes 之 Volumes Kubernetes 之 Labels、Selectors 开发 Tips(10) 开源正在重构商业模式 Kubernetes 之网络 Kubernetes 之 API 使用 Helm 和 Operator 快速部署 Prometheus Kubernetes 复杂有状态应用管理框架 -- Operator Kubernetes 的包管理器 -- Helm 一起来学 Go --(3)Go Modules 如何一步一步地优化博客方案 kubectl 实用指南 Kubernetes 中的基本概念 搭建远程 Kubernetes 开发环境 大公司和小公司的 ToB 思路 开发 Tips(9) Go 入门指南 一起来学 Go --(2)数据与逻辑结构 如何预防 Web 富文本中的 XSS 攻击 django-xss-cleaner 云工作时代 一起来学 Go --(1)背景与特点 SaaS 开发团队的不同阶段 你不知道的 Git 使用技巧 输出既服务 微服务设计 继续奔跑 开发 Tips(8) 从账户安全到二次验证 Django 性能之数据库查询优化 Django 性能之分库分表 敏捷开发之研发流程 打造一致性的团队 开发 Tips(7) Pytest 进阶学习之 Mock PaaS 部署之 buildpack Go 开发配置 领域输出才是 PaaS 的核心竞争力 Pytest 入门学习 开发 Tips(6) 如何使用 Jenkins、Docker、GitLab 搭建 Django 自动化部署流程
DeepSeek 3FS 运维指南
微信公众号 · 2025-03-20 · via 陈少文的网站

记录一些 DeepSeek 3FS 的运维操作,持续更新中。

1. 基本概念及注意事项

  • Chain

一个 Chain 是由若干个 Target 组成,每个 Target 是一个存储的副本。在全部提交就绪的情况下,一个 Chain 的所有 Target 都是一致的。

一个 Chain 上的 Target 不能在同一个节点上。

Chain 就是存储的空间,写文件是会被分配到一个 Chain 上,读文件也是从一个 Chain 上读取。

  • Target

一个 Target 是一个数据副本,Target 分布在一组节点上。

Target 有三种 Role:HEAD、MIDDLE、TAIL。HEAD 是最新的数据,TAIL 是最旧的数据,MIDDLE 同步 HEAD 的数据,TAIL 同步 MIDDLE 的数据。

Target 被 remove 之后,磁盘空间也会被释放。

  • ChainTable

ChainTable 记录着一组 Chain ID,代表着存储系统能用的 Chain。Chain 在没有加入 ChainTable 之前,是不会被用来存储数据的。

  • 参数约束
1
2
3
链的数量 >= 磁盘数量 * 存储目标数 / 副本数
链的数量 >= 条带化宽度
磁盘数量 >= 副本数
  • 提交配置

MGMTD、META、STORAGE、FUSE 节点的配置都需要提交,才能正常工作。

  • Storage 节点的数据要谨慎处理

启动带有数据的 Storage 节点时,目录中的 Target 会被重新注册到集群中。这时的 Target 处于 TAIL 状态,会同步 MIDDLE 的数据,容易发生数据的紊乱。

最好不要带数据启动 Storage 节点,直接让 3FS 重建数据。

  • 操作要慢一点

3FS 组件的状态同步需要一点时间,操作要慢一点,等待状态同步完成。

  • 命令是幂等的

一条命令可以重复执行,不会有危害。有时状态同步不及时,可以重复执行命令。

2. 条带化参数怎么设置

在初始化集群时,有一个 init-cluster 的操作,里面有一个非常重要的参数 strip size,即条带化的宽度。

条带化技术就是将数据分割为若干个数据块,分布在不同的 Chain 上,以提高并行读写的性能。条带化的宽度就是被分割的数据块的数量。

条带化的宽度太大会增加元数据管理的复杂度,数据重建恢复的时间也会变长。一般来说,设置为 16 就够了。

如果磁盘太少,可能会限制条带化参数的设置。最好先不要进行 init-cluster 操作,在生成 chainTable 之后,上传之前,执行命令:

1
cat output/generated_chains.csv
1
2
3
4
ChainId,TargetId,TargetId,TargetId
900100001,100100100101,100100200101,100100400101
900100002,100100200102,100100300101,100100500101
...

查看有多少个 chain-id,条带化参数不能大于 Chain 的数量。

3. 重置、初始化集群

  • 进入 fdbcli 清空元数据
1
2
writemode on
clearrange "" \xFF

之后,节点会下线,全部节点的 ConfigVersion 重置为 0。

  • 重启全部 Storage 节点

需要重启全部的 Storage 节点,顺便清理一下挂载的存储目录。

1
nerdctl restart 3fs_storage
  • 查看全部节点
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
/opt/3fs/bin/admin_cli --cfg /opt/3fs/etc/admin_cli.toml list-nodes

Id    Type     Status               Hostname      Pid  Tags  LastHeartbeatTime    ConfigVersion  ReleaseVersion
3     MGMTD    PRIMARY_MGMTD        8c05a1fbdf97  16   []    N/A                  0(UPTODATE)    250228-dev-1-999999-8c9883c2
1     MGMTD    HEARTBEAT_CONNECTED  58ca52320c3b  16   []    2025-03-19 02:20:58  0(UPTODATE)    250228-dev-1-999999-8c9883c2
2     MGMTD    HEARTBEAT_CONNECTED  391173a5a978  16   []    2025-03-19 02:20:59  0(UPTODATE)    250228-dev-1-999999-8c9883c2
101   META     HEARTBEAT_CONNECTED  b3fea43900e6  193  []    2025-03-19 02:21:04  0              250228-dev-1-999999-8c9883c2
102   META     HEARTBEAT_CONNECTED  fcebcb6ca5c3  186  []    2025-03-19 02:21:06  0              250228-dev-1-999999-8c9883c2
103   META     HEARTBEAT_CONNECTED  fea159ba0bd6  186  []    2025-03-19 02:21:00  0              250228-dev-1-999999-8c9883c2
1001  STORAGE  HEARTBEAT_CONNECTED  919404e2891f  187  []    2025-03-19 02:21:06  8(UPTODATE)    250228-dev-1-999999-8c9883c2
1002  STORAGE  HEARTBEAT_CONNECTED  e19b012d073c  179  []    2025-03-19 02:21:05  8(UPTODATE)    250228-dev-1-999999-8c9883c2
1003  STORAGE  HEARTBEAT_CONNECTED  fd2423d5e695  179  []    2025-03-19 02:21:05  8(UPTODATE)    250228-dev-1-999999-8c9883c2
1004  STORAGE  HEARTBEAT_CONNECTED  e8b6fbb9a774  178  []    2025-03-19 02:21:07  8(UPTODATE)    250228-dev-1-999999-8c9883c2
1005  STORAGE  HEARTBEAT_CONNECTED  19db0bc40648  172  []    2025-03-19 02:21:08  8(UPTODATE)    250228-dev-1-999999-8c9883c2

此时 MGMTD、META 的配置还没有提交,在初始化集群操作之后,需要再次重启 MGMTD、META 节点。

  • 计算 data placement
1
2
python3 /opt/3fs/deploy/data_placement/src/model/data_placement.py \
   -ql -relax -type CR --num_nodes 5 --replication_factor 3 --min_targets_per_disk 6
1
2025-03-19 10:02:29.157 | SUCCESS  | __main__:run:148 - saved solution to: output/DataPlacementModel-v_5-b_10-r_6-k_3-λ_2-lb_1-ub_1
  • 生成 chainTable
1
2
3
4
5
python3 /opt/3fs/deploy/data_placement/src/setup/gen_chain_table.py \
   --chain_table_type CR --node_id_begin 1001 --node_id_end 1005 \
   --num_disks_per_node 1 --num_targets_per_disk 6 \
   --target_id_prefix 1 --chain_id_prefix 9 \
   --incidence_matrix_path output/DataPlacementModel-v_5-b_10-r_6-k_3-λ_2-lb_1-ub_1/incidence_matrix.pickle
  • 查看 Chains 数量
1
cat output/generated_chains.csv

一共有 10 个 Chain

  • 初始化集群
1
/opt/3fs/bin/admin_cli -cfg /opt/3fs/etc/admin_cli.toml "init-cluster --mgmtd /opt/3fs/etc/mgmtd_main.toml 1 1048576 10"
  • 重启 MGMTD、META 节点
1
2
nerdctl restart 3fs_mgmtd
nerdctl restart 3fs_meta

此时,全部节点已经就绪。

  • 创建 Target
1
/opt/3fs/bin/admin_cli --cfg /opt/3fs/etc/admin_cli.toml < output/create_target_cmd.txt
  • 创建用户
1
/opt/3fs/bin/admin_cli -cfg /opt/3fs/etc/admin_cli.toml "user-add --root --admin 0 root"
1
Token              AACJgD5Y8QCi6ce42wDfTDcr(Expired at N/A)

保存一下 Token,后续的操作都需要用到。

  • 上传 chainTable
1
/opt/3fs/bin/admin_cli --cfg /opt/3fs/etc/admin_cli.toml "upload-chains output/generated_chains.csv"
1
/opt/3fs/bin/admin_cli --cfg /opt/3fs/etc/admin_cli.toml "upload-chain-table --desc stage 1 output/generated_chain_table.csv"

4. 查看使用存储的客户端

1
2
3
4
/opt/3fs/bin/admin_cli --cfg /opt/3fs/etc/admin_cli.toml list-clients

ClientId                              ClientStart          SessionStart         LastExtend           ConfigVersion  Hostname                      Description                         Tags  ReleaseVersion
a938c253-1030-4138-b618-0e11113a4876  2025-03-14 08:04:26  2025-03-14 08:04:26  2025-03-18 03:39:39  336            927bb7bb3396                  fuse: 927bb7bb3396                  []    250228-dev-1-999999-8c9883c2

5. 重建一个存储节点

在原来的机器上,就地重建存储节点,通常用于存储目录变更、磁盘更换等情况。

  • 删除存储节点的数据
  • 重启存储节点
1
nerdctl restart 3fs_storage
  • 查看 Target
1
2
3
4
5
6
7
8
/opt/3fs/bin/admin_cli --cfg /opt/3fs/etc/admin_cli.toml  list-targets | grep 1001001

100100100101  900100001  TAIL    OFFLINE      OFFLINE     1001    0          1342177280
100100100105  900100008  TAIL    OFFLINE      OFFLINE     1001    0          4027580416
100100100104  900100005  TAIL    OFFLINE      OFFLINE     1001    0          4027580416
100100100106  900100010  TAIL    OFFLINE      OFFLINE     1001    0          4026531840
100100100102  900100003  TAIL    OFFLINE      OFFLINE     1001    0          4026531840
100100100103  900100004  TAIL    OFFLINE      OFFLINE     1001    0          4027580416
  • 创建 Target
1
2
3
4
5
6
7
8
echo "
create-target --node-id 1001 --disk-index 0 --target-id 100100100101 --chain-id 900100001  --use-new-chunk-engine
create-target --node-id 1001 --disk-index 0 --target-id 100100100105 --chain-id 900100008  --use-new-chunk-engine
create-target --node-id 1001 --disk-index 0 --target-id 100100100104 --chain-id 900100005  --use-new-chunk-engine
create-target --node-id 1001 --disk-index 0 --target-id 100100100106 --chain-id 900100010  --use-new-chunk-engine
create-target --node-id 1001 --disk-index 0 --target-id 100100100102 --chain-id 900100003  --use-new-chunk-engine
create-target --node-id 1001 --disk-index 0 --target-id 100100100103 --chain-id 900100004  --use-new-chunk-engine
" > create_target_cmd.txt
1
/opt/3fs/bin/admin_cli --cfg /opt/3fs/etc/admin_cli.toml < create_target_cmd.txt
  • 等待节点上的 Target 重建完成
1
2
3
/opt/3fs/bin/admin_cli --cfg /opt/3fs/etc/admin_cli.toml  list-targets

100100500101  900100002  TAIL    SYNCING      ONLINE      1005    0          1342177280

SYNCING 的 Target,表示正在进行数据重建,需要等待其完成。

6. 替换一个存储节点

换一个新的存储节点,node-id 也发生变化。

  • 删除旧节点的 Target
1
2
3
4
5
6
7
8
/opt/3fs/bin/admin_cli --cfg /opt/3fs/etc/admin_cli.toml list-targets |grep 1004

100100400101  900100001  MIDDLE  SERVING      UPTODATE    1004    0          4026531840
100100400105  900100008  MIDDLE  SERVING      UPTODATE    1004    0          1342177280
100100400104  900100007  MIDDLE  SERVING      UPTODATE    1004    0          4026531840
100100400102  900100005  HEAD    SERVING      UPTODATE    1004    0          4026531840
100100400106  900100009  MIDDLE  SERVING      UPTODATE    1004    0          4026531840
100100400103  900100006  TAIL    SERVING      UPTODATE    1004    0          4026531840
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
echo "
offline-target --node-id 1004 --target-id 100100400101
update-chain --mode remove 900100001 100100400101
remove-target --node-id 1004 --target-id 100100400101

offline-target --node-id 1004 --target-id 100100400105
update-chain --mode remove 900100008 100100400105
remove-target --node-id 1004 --target-id 100100400105

offline-target --node-id 1004 --target-id 100100400104
update-chain --mode remove 900100007 100100400104
remove-target --node-id 1004 --target-id 100100400104

offline-target --node-id 1004 --target-id 100100400102
update-chain --mode remove 900100005 100100400102
remove-target --node-id 1004 --target-id 100100400102

offline-target --node-id 1004 --target-id 100100400106
update-chain --mode remove 900100009 100100400106
remove-target --node-id 1004 --target-id 100100400106

offline-target --node-id 1004 --target-id 100100400103
update-chain --mode remove 900100006 100100400103
remove-target --node-id 1004 --target-id 100100400103
" > remove_target_cmd.txt
1
/opt/3fs/bin/admin_cli --cfg /opt/3fs/etc/admin_cli.toml < remove_target_cmd.txt
  • 删除下线的 Target
1
2
3
4
5

- 停掉旧的存储节点

```bash
nerdctl rm 3fs_storage -f

其状态会变为 HEARTBEAT_FAILED,Target 处于 OFFLINE 状态。

  • 启动相同 ID 的新存储节点

将新节点的 node-id 设置为 1006。这里尝试过将新节点的 node-id 与之前的保持一致,但是并不能重建,即使 hostname 相同也不想,可能是还有其他的唯一标识符。

  • 创建 Target 加入 Chain
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
echo "
create-target --node-id 1006 --disk-index 0 --target-id 100100400101 --chain-id 900100001  --use-new-chunk-engine
update-chain --mode add 900100001 100100400101

create-target --node-id 1006 --disk-index 0 --target-id 100100400105 --chain-id 900100008  --use-new-chunk-engine
update-chain --mode add 900100008 100100400105

create-target --node-id 1006 --disk-index 0 --target-id 100100400104 --chain-id 900100007  --use-new-chunk-engine
update-chain --mode add 900100007 100100400104

create-target --node-id 1006 --disk-index 0 --target-id 100100400102 --chain-id 900100005  --use-new-chunk-engine
update-chain --mode add 900100005 100100400102

create-target --node-id 1006 --disk-index 0 --target-id 100100400106 --chain-id 900100009  --use-new-chunk-engine
update-chain --mode add 900100009 100100400106

create-target --node-id 1006 --disk-index 0 --target-id 100100400103 --chain-id 900100006  --use-new-chunk-engine
update-chain --mode add 900100006 100100400103
" > create_target_cmd.txt
1
/opt/3fs/bin/admin_cli --cfg /opt/3fs/etc/admin_cli.toml < create_target_cmd.txt

此时会触发 Target 的数据重建,等待 Target 的状态变为 SERVING

7. 扩容一个存储节点

这里需要提前规划,总的 Target 数量应该是总的存储数量的整数倍。这里从 5 个节点扩容到 6 个节点,总得 Target 数量是 30 个,扩容之前每个节点上有 6 个 Target,扩容之后每个节点上有 5 个 Target。

  • 新起一个存储节点

node-id 为 1006。新的节点加入后,每个节点上应该有 5 个 Target。下面我们需要找 5 个 Target,然后将其分配到新的节点上。

  • 筛选出需要迁移的 Target
1
/opt/3fs/bin/admin_cli --cfg /opt/3fs/etc/admin_cli.toml list-targets

可以借助 LLM 找到需要迁移的 Target,列出其中的 5 行数据,要求来自不同的 Chain,分别来自不同的节点,按照原始格式输出数据即可

1
2
3
4
5
100100100101  900100001  HEAD    SERVING      UPTODATE    1001    0          1342177280
100100200102  900100002  HEAD    SERVING      UPTODATE    1002    0          1342177280
100100300105  900100009  HEAD    SERVING      UPTODATE    1003    0          1342177280
100100400105  900100008  TAIL    SERVING      UPTODATE    1004    0          1342177280
100100500106  900100010  TAIL    SERVING      UPTODATE    1005    0          1342177280
  • 移除这些 Target
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
echo "
offline-target --node-id 1001 --target-id 100100100101
update-chain --mode remove 900100001 100100100101
remove-target --node-id 1001 --target-id 100100100101

offline-target --node-id 1002 --target-id 100100200102
update-chain --mode remove 900100002 100100200102
remove-target --node-id 1002 --target-id 100100200102

offline-target --node-id 1003 --target-id 100100300105
update-chain --mode remove 900100009 100100300105
remove-target --node-id 1003 --target-id 100100300105

offline-target --node-id 1004 --target-id 100100400105
update-chain --mode remove 900100008 100100400105
remove-target --node-id 1004 --target-id 100100400105

offline-target --node-id 1005 --target-id 100100500106
update-chain --mode remove 900100010 100100500106
remove-target --node-id 1005 --target-id 100100500106
" > offline_target_cmd.txt
1
/opt/3fs/bin/admin_cli --cfg /opt/3fs/etc/admin_cli.toml < offline_target_cmd.txt
  • 添加新的 Target 并加入 Chain
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
echo "
create-target --node-id 1006 --disk-index 0 --target-id 100100100101 --chain-id 900100001  --use-new-chunk-engine
update-chain --mode add 900100001 100100100101

create-target --node-id 1006 --disk-index 0 --target-id 100100200102 --chain-id 900100002  --use-new-chunk-engine
update-chain --mode add 900100002 100100200102

create-target --node-id 1006 --disk-index 0 --target-id 100100300105 --chain-id 900100009  --use-new-chunk-engine
update-chain --mode add 900100009 100100300105

create-target --node-id 1006 --disk-index 0 --target-id 100100400105 --chain-id 900100008  --use-new-chunk-engine
update-chain --mode add 900100008 100100400105

create-target --node-id 1006 --disk-index 0 --target-id 100100500106 --chain-id 900100010  --use-new-chunk-engine
update-chain --mode add 900100010 100100500106
" > create_target_cmd.txt
1
/opt/3fs/bin/admin_cli --cfg /opt/3fs/etc/admin_cli.toml < create_target_cmd.txt

此时,新节点马上就会开始进行数据重建,可以通过 list-targets 查看状态。

8. 下线一个存储节点

这里准备下线 1001 节点,然后将其迁移到其他节点上。

  • 过滤出需要重建的 Target
1
2
3
4
5
6
7
8
/opt/3fs/bin/admin_cli --cfg /opt/3fs/etc/admin_cli.toml list-targets |grep 1001001

100100100101  900100001  MIDDLE  SERVING      UPTODATE    1001    0          5369757696
100100100105  900100008  MIDDLE  SERVING      UPTODATE    1001    0          2684354560
100100100104  900100005  MIDDLE  SERVING      UPTODATE    1001    0          5369757696
100100100106  900100010  MIDDLE  SERVING      UPTODATE    1001    0          2684354560
100100100102  900100003  TAIL    SERVING      UPTODATE    1001    0          5368709120
100100100103  900100004  TAIL    SYNCING      ONLINE      1001    0          3121610752
  • 移除旧的 Target
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
echo "
offline-target --node-id 1001 --target-id 100100100101
update-chain --mode remove 900100001 100100100101
remove-target --node-id 1001 --target-id 100100100101

offline-target --node-id 1001 --target-id 100100100105
update-chain --mode remove 900100008 100100100105
remove-target --node-id 1001 --target-id 100100100105

offline-target --node-id 1001 --target-id 100100100104
update-chain --mode remove 900100005 100100100104
remove-target --node-id 1001 --target-id 100100100104

offline-target --node-id 1001 --target-id 100100100106
update-chain --mode remove 900100010 100100100106
remove-target --node-id 1001 --target-id 100100100106

offline-target --node-id 1001 --target-id 100100100102
update-chain --mode remove 900100003 100100100102
remove-target --node-id 1001 --target-id 100100100102

offline-target --node-id 1001 --target-id 100100100103
update-chain --mode remove 900100004 100100100103
remove-target --node-id 1001 --target-id 100100100103
" > remove_target_cmd.txt
1
/opt/3fs/bin/admin_cli --cfg /opt/3fs/etc/admin_cli.toml < remove_target_cmd.txt
  • 规划 Target 的分布

这里又需要借助 LLM 来规划 Target 的分布。

/opt/3fs/bin/admin_cli --cfg /opt/3fs/etc/admin_cli.toml list-targets 的输出结果和提示词 将节点 1001 上的全部 Target 迁移到其他节点上,需要保障属于同一个 Chain 的 Target 不在同一个节点上,输出迁移后 Target Chain 与新节点的对应关系 一起输入到 LLM 中。得到分布结果:

TargetChainRoleNew Node
100100100101900100001MIDDLE1003
100100100105900100008MIDDLE1002
100100100104900100005MIDDLE1004
100100100106900100010MIDDLE1004
100100100102900100003TAIL1005
100100100103900100004TAIL1006
  • 将 Target 均匀分布到其他节点上
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
echo "
create-target --node-id 1003 --disk-index 0 --target-id 100100100101 --chain-id 900100001  --use-new-chunk-engine
update-chain --mode add 900100001 100100100101

create-target --node-id 1002 --disk-index 0 --target-id 100100100105 --chain-id 900100008  --use-new-chunk-engine
update-chain --mode add 900100008 100100100105

create-target --node-id 1004 --disk-index 0 --target-id 100100100104 --chain-id 900100005  --use-new-chunk-engine
update-chain --mode add 900100005 100100100104

create-target --node-id 1004 --disk-index 0 --target-id 100100100106 --chain-id 900100010  --use-new-chunk-engine
update-chain --mode add 900100010 100100100106

create-target --node-id 1005 --disk-index 0 --target-id 100100100102 --chain-id 900100003  --use-new-chunk-engine
update-chain --mode add 900100003 100100100102

create-target --node-id 1006 --disk-index 0 --target-id 100100100103 --chain-id 900100004  --use-new-chunk-engine
update-chain --mode add 900100004 100100100103
" > create_target_cmd.txt
1
/opt/3fs/bin/admin_cli --cfg /opt/3fs/etc/admin_cli.toml < create_target_cmd.txt

等待 Target 的状态从 SYNCING 变为 SERVING

  • 下线节点
1
nerdctl rm 3fs_storage -f

此时 Storage 节点的状态会变为 HEARTBEAT_FAILED

1
1001  STORAGE  HEARTBEAT_FAILED     919404e2891f  190  []    2025-03-20 03:13:57  7(UPTODATE)    250228-dev-1-999999-8c9883c2
  • 列表中删除节点
1
/opt/3fs/bin/admin_cli --cfg /opt/3fs/etc/admin_cli.toml unregister-node 1001 STORAGE

只有节点处于异常状态,才能够下线节点。

9. 添加 Chain

添加 Chain 能够增加 Target 数量,将 Target 放在新的节点上也可以达到扩容的目的。

9.1 添加新的 Chain

  • 导出 Chain
1
/opt/3fs/bin/admin_cli --cfg /opt/3fs/etc/admin_cli.toml dump-chains dump-for-add-nodes
  • 查看 Chain
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
vim dump-for-add-nodes.3

ChainId,TargetId,TargetId,TargetId
900100001,100100200101,100100100101,100100400101
900100002,100100300101,100100500101,100100200102
900100008,100100100105,100100300104,100100400105
900100007,100100200106,100100500104,100100400104
900100005,100100100104,100100500103,100100400102
900100010,100100100106,100100300106,100100500106
900100009,100100500105,100100300105,100100400106
900100003,100100100102,100100200103,100100300102
900100004,100100100103,100100200104,100100500102
900100006,100100200105,100100300103,100100400103

增加新的 Chain,要保证 Chain 上的 Target 数量是一致的。

1
2
990100001,190000000001,190000000002,190000000003
...

可以加很多条 Chain,但如果想要使用这些 Chain 也意味着需要更多的存储节点,因为相同 Chain 上的 Target 不能在同一个节点上。

  • 上传 Chain
1
/opt/3fs/bin/admin_cli --cfg /opt/3fs/etc/admin_cli.toml "upload-chains dump-for-add-nodes.3"
  • 查看 Target
1
2
3
4
5
/opt/3fs/bin/admin_cli --cfg /opt/3fs/etc/admin_cli.toml  list-targets

190000000001   990100001  HEAD    SERVING      OFFLINE     N/A     N/A        0
190000000002   990100001  MIDDLE  SERVING      OFFLINE     N/A     N/A        0
190000000003   990100001  TAIL    SERVING      OFFLINE     N/A     N/A        0

此时有新的 Target 等待放置到节点上。

9.2 添加新的 Target

  • 添加新的节点

这里以加入的新节点为 1009 为例,只分配部分 Target。

  • 分配 Target
1
2
3
4
5
echo "
create-target --node-id 1003 --disk-index 0 --target-id 190000000001 --chain-id 990100001  --use-new-chunk-engine
create-target --node-id 1004 --disk-index 0 --target-id 190000000002 --chain-id 990100001  --use-new-chunk-engine
create-target --node-id 1002 --disk-index 0 --target-id 190000000003 --chain-id 990100001  --use-new-chunk-engine
" > create_target_cmd.txt
1
/opt/3fs/bin/admin_cli --cfg /opt/3fs/etc/admin_cli.toml < create_target_cmd.txt
  • 查看 Target
1
2
3
4
5
/opt/3fs/bin/admin_cli --cfg /opt/3fs/etc/admin_cli.toml  list-targets |grep 1900

190000000003  990100001  HEAD    SERVING      UPTODATE    1002    0          0
190000000001  990100001  MIDDLE  SERVING      UPTODATE    1003    0          0
190000000002  990100001  TAIL    SYNCING      ONLINE      1004    0          0

此时,存储还不能使用这个 Chain,需要将其加入到 ChainTable 中。

9.3 添加新的 ChainTable

  • 导出 ChainTable
1
/opt/3fs/bin/admin_cli --cfg /opt/3fs/etc/admin_cli.toml dump-chain-table 1 ./dump-chainTable
  • 查看 ChainTable
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
vim dump-chainTable

ChainId
900100001
900100002
900100003
900100004
900100005
900100006
900100007
900100008
900100009
900100010

新增 Chain 的 ChainId

  • 上传 ChainTable
1
/opt/3fs/bin/admin_cli --cfg /opt/3fs/etc/admin_cli.toml "upload-chain-table --desc stage 1 ./dump-chainTable"
  • remove Target

1200000000001 920100001 HEAD SERVING UPTODATE 1001 0 0

1
2
3
echo "
create-target --node-id 1001 --disk-index 0 --target-id 1200000000006 --chain-id 920100002  --use-new-chunk-engine
" > remove_chain_cmd.txt
1
/opt/3fs/bin/admin_cli --cfg /opt/3fs/etc/admin_cli.toml < remove_chain_cmd.txt

10. LASTSRV 状态的 Target

  • LASTSRV

这种状态通常是 Target 提前加入了存储中,导致的异常状态。

1
2
3
120000000004   930100002  HEAD    LASTSRV      OFFLINE     N/A     N/A        0
120000000005   930100002  MIDDLE  OFFLINE      OFFLINE     N/A     N/A        0
120000000006   930100002  TAIL    OFFLINE      OFFLINE     N/A     N/A        0
  • 分配 OFFLINE 状态的 Target
1
2
3
echo "
create-target --node-id 1001 --disk-index 0 --target-id 120000000005 --chain-id 930100002  --use-new-chunk-engine
" > create_target_cmd.txt
1
/opt/3fs/bin/admin_cli --cfg /opt/3fs/etc/admin_cli.toml < create_target_cmd.txt
  • 轮转 Chain 上的 Target
1
/opt/3fs/bin/admin_cli --cfg /opt/3fs/etc/admin_cli.toml rotate-lastsrv 930100002
  • 查看 Target
1
2
3
120000000005   930100002  HEAD    SERVING      ONLINE      1001    0          0
120000000006   930100002  MIDDLE  OFFLINE      OFFLINE     N/A     N/A        0
120000000004   930100002  TAIL    OFFLINE      OFFLINE     N/A     N/A        0

此时,Chains 中 HEAD 的状态已经变为 SERVING。

11. 重建一个 Target

适用于 Target 状态异常,比如大小与其他 Target 不一致等情况。

  • 查看 Target
1
/opt/3fs/bin/admin_cli --cfg /opt/3fs/etc/admin_cli.toml  list-targets |grep 100100200102
1
100100200102  900100002  TAIL    SYNCING      ONLINE      1002    0          3911188480
  • 删除 Target
1
2
3
4
5
echo "
offline-target --node-id 1002 --target-id 100100200102
update-chain --mode remove 900100002 100100200102
remove-target --node-id 1002 --target-id 100100200102
" > offline_target_cmd.txt
1
/opt/3fs/bin/admin_cli --cfg /opt/3fs/etc/admin_cli.toml < offline_target_cmd.txt
  • 重新创建 Target
1
2
3
4
echo "
create-target --node-id 1002 --disk-index 0 --target-id 100100200102 --chain-id 900100002  --use-new-chunk-engine
update-chain --mode add 900100002 100100200102
" > create_target_cmd.txt
1
/opt/3fs/bin/admin_cli --cfg /opt/3fs/etc/admin_cli.toml < create_target_cmd.txt