存储管理
数据类型
服务端系统在运行中产生的数据有三种类型,分别为系统数据、文件数据、系统备份,存储路径配置在config.json文件中,多数情况下,只需要配置这三种类型的存储路径即可,如下表:
| 名称 | 配置文件字段 | 描述 |
|---|---|---|
| 系统数据 | service.ydisk.path.data | 系统运行过程中产生的结构化数据库文件,需高速固态硬盘,可以有良好的性能。 |
| 文件数据 | service.oss.build.nodes.paths | 系统中管理的企业文件数据 |
| 系统备份 | service.ydisk.path.backup | 系统数据备份 |
系统数据
系统数据包含MySQL、Redis、ElasticSearch三个服 务的结构化数据,默认是作为子目录存储在系统数据路径中,根据生产经验,每存储1TB的企业文件需要消耗大约1GB的系统数据空间。如果有特殊需要也可以单独配置这三个路径(不推荐),在config.json文件的字段对应如下表:
| 名称 | 配置文件字段 |
|---|---|
| MySQL数据 | service.db.build.data |
| Redis数据 | service.redis.build.data |
| ElasticSearch数据 | service.es.build.data |
文件数据
文件数据,是系统中管理的企业文件数据,为了数据存储安全,默认有2个存储节点服务(对应2个存储路径),所有数据都在不同的存储节点中分别存储1份数据,共2份数据,这样的数据冗余方式可以在一个存储节点故障时,保证数据不丢失。存储节点由主节点和卷节点组成,主节点在存储文件数据的同时提供标准的S3服务,卷节点则只提供存储服务,类似于Windows系统中的扩展分区。
当存储服务或整个服务器发生一些事件后,文件数据的持久性情况如下:
| 事件类型 | 文件数据保存 | |
|---|---|---|
| 存储服务正常关闭 | 是 | |
| 存储服务异常结束 | 是 | |
| 服务器正常关机 | 是 | |
| 服务器异常断电 | 可能丢失刚上传完成的文件数据 |
系统备份
系统备份,包含所有系统数据的备份,防止存储设备损坏造成的系统数据丢失。
文件存储扩容
当服务器文件存储空间不足时,需要对存储空间进行扩容,可以通过添加存储路径和添加存储节点两种方式进行扩容。
增加存储路径
添加存储路径是最简单的存储扩容方式,需要扩容的存储节点数量必须大于或等于数据冗余份数。
例如:系统当前数据冗余模式是2份数据,则需要为任意至少2个存储节点分别添加存储路径,这是因为在2份数据冗余模式下,数据需要同时写入到2个不同的存储节点中。
- Windows
- Linux
在 运维管理->系统维护-> 存储管理 中选择指定的存储节点,然后在存储节点中添加新路径即可。
目前还没有实现自动化的配置方法,需要手动编辑config.json文件,在service.oss.build.nodes 找到存储节点配置,类似如下配置:
"nodes": [
{
"type": "master",
"paths": [
{
"path": "/opt/ydisks/oss/node-1",
"status": "used"
}
]
},
{
"type": "volume",
"paths": [
{
"path": "/opt/ydisks/oss/node-2",
"status": "used"
}
]
}
]
在nodes节点中的是每个存储节点配置信息,可以在其中的 paths节点中添加存储路径,例如为以上实例中的2个存储节点分别添加一个存储路径后的配置是:
"nodes": [
{
"type": "master",
"paths": [
{
"path": "/opt/ydisks/oss/node-1",
"status": "used"
},
{
"path": "/opt/ydisks/oss/node-1-ex",
"status": "used"
}
]
},
{
"type": "volume",
"paths": [
{
"path": "/opt/ydisks/oss/node-2",
"status": "used"
},
{
"path": "/opt/ydisks/oss/node-2-ex",
"status": "used"
}
]
}
]
修改后,需要使配置生效。
删除存储路径
当删除一个存储路径时,存储节点服务需重新平衡数据,以将删除的路径中的数据恢复到其他路径中,重现实现数据的冗余。通常存储节点会每8小时自动平衡一次数据,但如果是删除存储路径,应该在删除后立即执行数据平衡。
如果文件存储路径中 没有数据,可以直接在配置文件config.json中删除存储节点对应的路径,然后使配置生效,不需要平衡数据。
如果文件存储路径中有数据,则不能直接删除,否则可能丢失文件数据,为了数据安全,每次只能在一个存储节点中删除路径,然后立即平衡数据,不能同时在多个存储节点中删除路径,这样可能会因为无法平衡数据而造成数据丢失。
删除前要先确认删除后当前存储节点的剩余空间大于已删除路径中的空间,以保证删除后数据重新平衡到其他路径时有足够的写入空间,如果剩余空间不足,需要先添加一个新存储路径使剩余空间足够,然后再删除原存储路径,路径删除后需要立即重新平衡数据。
系统存储扩容
修改系统存储路径
如果系统存储路径空间不足,会造成系统不能正常启动运行,可以通过修改系统存储路径,实现将数据迁移到更大空间的存储路径中。
以下操作中,我们将修改前的路径称为原路径,修改后的路径称为目标路径。
具体操作是:
- 系统管 理员登录,进入运维管理->系统维护->计划任务,执行系统备份,等待完成。
- 确认
目标路径的剩余空间大于原路径的已使用空间,否则会造成数据转移时目标路径空间不足。 - 关闭服务端。Windows直接在托盘菜单中关闭,Linux执行命令:
sudo /opt/ydisks/ydisk.py --stop。 - 将
原路径下的所有文件复制到目标路径。 - 参考配置文件说明(Windows / Linux ),在
service.ydisk.path.data字段中将原路径修改为目标路径,修改后需要使配置生效。 - 服务端启动完成后,登录网盘系统,如果原有文件存在并上传下载正常则操作完成。
修改备份路径
可以通过修改配置文件config.json,直接修改备份 路径。
以下操作中,我们将修改前的路径称为原路径,修改后的路径称为目标路径。
具体操作是:
- 系统管理员登录,进入运维管理->基础设置->系统维护->存储管理,查看存储路径的已使用空间,新的备份路径剩余空间应大于现有备份路径的已使用空间,否则可能会造成备份空间不足 。
- 关闭服务端。Windows直接在托盘菜单中关闭,Linux执行命令:
sudo /opt/ydisks/ydisk.py --stop。 - 将
原路径下的所有文件复制到目标路径。 - 参考配置文件说明(Windows / Linux ),在
service.ydisk.path.backup字段中将原路径修改为目标路径,修改后需要使配置生效。 - 系统管理员登录,进入运维管理->基础设置->系统维护->存储管理,查看备份路径状态。
重新平衡数据
重新平衡数据,可以删除不需要的冗余数据以及让数据更均衡的分散到各个存储节点。
- Windows
- Linux
在开始菜单搜索“PowerShell”,点开或右键“以管理员身份运行”,打开PowerShell并执行如下命令:
$path = Join-Path $env:YDISK_SERVER_HOME 'etc\config.json'
$REPL = (Get-Content -Raw $path | ConvertFrom-Json).service.oss.build.replication
Write-Host "当前 replication: $REPL"
@"
lock
volume.configure.replication -collectionPattern "*" -replication "$REPL"
volume.balance -apply
volume.fix.replication -apply
unlock
"@ | & "$env:YDISK_SERVER_HOME\bin\yoss\yoss2.exe" shell --master localhost:2031
执行如下命令:
# 1) 在宿主机读取 replication 数 值
REPL=$(grep -Po '"replication"\s*:\s*"\K[0-9]+' /opt/ydisks/config.json)
echo "当前 replication: $REPL"
# 2) 把命令通过 STDIN 喂给容器内的 weed shell
# 如 master 端口不是默认 9333,请加 -master 参数
sudo docker exec -i ydisk-oss-node-1 weed shell <<EOF
lock
volume.configure.replication -collectionPattern "*" -replication "$REPL"
volume.balance -apply
volume.fix.replication -apply
unlock
EOF
调整数据冗余
为了数据存储安全,系统安装时默认2份数据冗余,对于一些特殊场景,比如存储系统已用磁盘阵列进行数据保护的情况则不必再进行数据冗余,可以使用1份数据即可。
如果需要调整数据冗余数可以通过修改系统配置文件的方式实现,参考配置文件说明(Windows / Linux ),在service.oss.build.replication字段中修改值(如下表),修改后需要使配置生效。
| replication值 | 描述 |
|---|---|
| 000 | 1份数据,需要至少1个存储节点。 |
| 001 | 2份数据,需要至少2个存储节点,数据在2个节点上复制。 |
| 002 | 3份数据,需要至少3个存储节点,数据在3个节点上复制。 |
配置生效后,需重新平衡数据。
纠删码分片丢失后数据恢复
在一些特殊情况下,纠删码对卷文件的编码过程中会失败,我们可以通过以下方法恢复卷数据。
确认故障卷
日志中如果出现如下错误,很可能就是卷的分片丢失了:
- 错误现象一
- 错误现象二
- 错误现象三
I0806 09:56:43.396371 master_server.go:473 error: ec encode batch 1/40 for volumes [2548 2627 2180 2668 2186 2359 2170 2244 2582 2152]: re-balance ec shards for collection(s) [ydiskstore]: copy 99.[4] 80.80.83.112:8084 => 80.80.83.112:8088 : rpc error: code = Unknown desc = VolumeEcShardsCopy volume 99: VolumeEcShardsCopy volume 99: source .ecx is 0 bytes
I0806 11:44:31.645058 master_server.go:473 error: copy 99.[2] 80.80.83.112:8088 => 80.80.83.112:8081 : rpc error: code = Unknown desc = VolumeEcShardsCopy volume 99: failed to copy /cpzl/sdc1/ydiskstore_99.ecx file: receiving /cpzl/sdc1/ydiskstore_99.ecx: rpc error: code = Unknown desc = CopyFile not found ec volume id 99
I0806 13:54:48.255739 master_server.go:473 error: ec encode batch 1/40 for volumes [2111 2550 2501 2230 2405 2632 2235 2368 2536 2305]: re-balance ec shards for collection(s) [ydiskstore]: copy 99.[2] 80.80.83.112:8088 => 80.80.83.112:8081 : rpc error: code = Unknown desc = VolumeEcShardsCopy volume 99: failed to copy /cpzl/sdc1/ydiskstore_99.ecx file: receiving /cpzl/sdc1/ydiskstore_99.ecx: rpc error: code = Unknown desc = CopyFile not found ec volume id 99
上面的错误日志中,99.[N] 表示卷 ID 与分片 ID,例如 99.[4] 表示卷 99 的分片 4。出错的分片 ID 即日志中 99.[N] 方括号 [N] 内的数字:错误现象一对应分片 4,错误现象二、三对应分片 2(分片编号范围 0-13),出现该错误说明对应编号的分片丢失或异常。
volume.list 命令用于查看卷的分片信息,命令中的卷 ID 从上方日志中获取(如 99.[N] 中的 99)。使用该命令查看对应卷的分片信息进行确认,如果 EC 分片少于 14 个(从 0-13),说明分片缺失。
后面的命令就以 卷ID=99 为例,执行命令:
- Windows
- Linux
在开始菜单搜索"PowerShell",点开或右键"以管理员身份运行",打开 PowerShell 并执行如下命令:
@"
volume.list -volumeId 99
"@ | & "$env:YDISK_SERVER_HOME\bin\yoss\yoss2.exe" shell --master localhost:2031
在终端中执行如下命令(如 master 端口不是默认 9333,请加 -master 参数):
sudo docker exec -i ydisk-oss-node-1 weed shell <<EOF
volume.list -volumeId 99
EOF
恢复分片
恢复分片的前提是,该卷至少有 10 个可用的分片,如果满足条件,可以进行数据卷恢复。执行命令如下:
- Windows
- Linux
在开始菜单搜索"PowerShell",点开或右键"以管理员身份运行",打开 PowerShell 并执行如下命令:
@"
lock
ec.rebuild -volumeIds=99 -apply
unlock
"@ | & "$env:YDISK_SERVER_HOME\bin\yoss\yoss2.exe" shell --master localhost:2031
在终端中执行如下命令(如 master 端口不是默认 9333,请加 -master 参数):
sudo docker exec -i ydisk-oss-node-1 weed shell <<EOF
lock
ec.rebuild -volumeIds=99 -apply
unlock
EOF
解码再重新编码
这步操作主要目的是校验数据卷正常,执行命令如下:
- Windows
- Linux
在开始菜单搜索"PowerShell",点开或右键"以管理员身份运行",打开 PowerShell 并执行如下命令:
@"
lock
ec.decode -collection=ydiskstore -volumeId=99
ec.rebuild -volumeIds=99 -apply
unlock
"@ | & "$env:YDISK_SERVER_HOME\bin\yoss\yoss2.exe" shell --master localhost:2031
在终端中执行如下命令(如 master 端口不是默认 9333,请加 -master 参数):
sudo docker exec -i ydisk-oss-node-1 weed shell <<EOF
lock
ec.decode -collection=ydiskstore -volumeId=99
ec.rebuild -volumeIds=99 -apply
unlock
EOF
纠删码垃圾文件清理
此操作存在数据丢失风险,如无必要,请勿操作。
纠删码编码过程中,如果因为异常原因中断,可能会有垃圾文件未被清理,导致空间被占用。可以通过如下步骤,检查卷是否存在可以清理的垃圾文件:
- 确认为 EC 卷,且 EC 分片文件充足:通过
volume.list -volumeId <卷ID>命令能够列出指定卷的 EC 编码分片(执行命令参考确认故障卷)。 - 分片数量 ≥ 10 个,最好是 0-13,共 14 个分片都存在。
- 磁盘上存在残留文件,且残留文件的修改时间已超过 2 天:volume 节点的存储目录下存在
ydiskstore_<id>.dat或ydiskstore_<id>.idx。 - 如果以上条件都满足,则可以清理第 3 步中找到的
ydiskstore_<id>.dat和ydiskstore_<id>.idx文件。