我之前的seafile的数据都存于服务器本地磁盘,现在想迁移到对象存储上面来。我看了官方的教程,好像是需要停服务。因为数据比较多,迁移时间会很长。但是我不想业务中断,看能不能设置多存储后端,一个资料库一个资料库迁移(迁移过程中资料库不进行任何操作)。不知道这个方法是否可行,或者官方有更好的解决方案。万分感谢
您好!如果有条件,推荐您在执行数据迁移之前进行数据备份。
您提到的这种使用“多存储后端”进行逐个资料库迁移的方法是非常可行的,而且这正是官方提供的一种可以在不中断整体服务的情况下进行平滑迁移的最佳解决方案。
通过配置多存储后端,你可以让新老存储共存,并通过官方提供的脚本将资料库一个一个地从本地磁盘迁移到对象存储中。在迁移某个具体资料库时,只有该资料库会短暂受到影响,而不会导致整个 Seafile 服务停止,其他未在迁移中的资料库均可正常进行读写操作。
具体的操作步骤如下:
1. 开启并配置多存储后端
你需要先在配置文件中开启多存储特性,并定义好本地和对象存储两个后端。
- 修改
seafile.conf:开启存储类:[storage] enable_storage_classes = true storage_classes_file = /opt/seafile/conf/seafile_storage_classes.json - 修改
seahub_settings.py:开启多存储后端,并选择基于资料库 ID 映射的策略:ENABLE_STORAGE_CLASSES = True STORAGE_CLASS_MAPPING_POLICY = 'REPO_ID_MAPPING' - 修改
.env(仅限 13.0及以上版本):
增加SEAF_SERVER_STORAGE_TYPE=multiple
2. 定义存储后端 JSON 文件
在 seafile_storage_classes.json 文件中,定义你原来的本地存储(作为默认存储)和新的对象存储。比如:
[
{
"storage_id": "old_local_storage",
"name": "Local Storage",
"is_default": true,
"fs": {"backend": "fs", "dir": "/opt/seafile/seafile-data"},
"commits": {"backend": "fs", "dir": "/opt/seafile/seafile-data"},
"blocks": {"backend": "fs", "dir": "/opt/seafile/seafile-data"}
},
{
"storage_id": "new_oss_storage",
"name": "OSS Storage",
"is_default": false,
"for_new_library": true,
"fs": {"backend": "s3", "bucket": "...", "key": "...", ...},
"commits": {"backend": "s3", ...},
"blocks": {"backend": "s3", ...}
}
]
(这里的 for_new_library: true 可以让新建的资料库直接使用对象存储,具体的 backend 填法请根据你的对象存储类型配置 s3 或 oss 参数)
3. 逐个迁移资料库数据
配置好并重启服务后,就可以使用官方自带的 migrate-repo.sh 脚本在不停机的情况下迁移具体资料库了。
命令格式如下:
./migrate-repo.sh [repo_id] origin_storage_id destination_storage_id
例如:
./migrate-repo.sh 你的资料库ID old_local_storage new_oss_storage
强烈建议:利用 OBJECT_LIST_FILE_PATH 环境变量记录迁移进度
如果你有的资料库非常大,迁移时间极长,可以指定一个临时前缀来保存进度:
export OBJECT_LIST_FILE_PATH=/opt/seafile/migration_test
./migrate-repo.sh 你的资料库ID old_local_storage new_oss_storage
这不仅能在中断时跳过已迁移的对象,而且在彻底迁移完以后,你可以使用 ./remove-objs.sh [repo_id] old_local_storage 安全地清理掉本地磁盘上的旧数据释放空间。
4. 完成全量迁移后的收尾
当你把所有的历史资料库全部平滑迁移到对象存储后,为了防止再有新数据写到旧存储中,可以直接在 json 配置中将原有的本地存储的 for_new_library 选项设置为 false(或者直接禁用),并保证所有的未来数据都走新的对象存储。
感谢您提供的方案。我还有一个疑问,就是如果资料库比较多,一个个迁移会比较麻烦。这个不知道能不能以用户为单位迁移资料库,如果这样可以的话,就会方便很多。
您好,目前官方并没有支持以用户为单位进行迁移数据库的官方工具或者脚本,您可以尝试自行编写脚本,思路可以是从数据库中提取对应用户名下的所有资料库,之后再批量一键迁移。
请您在执行操作前尽量全量备份数据避免数据丢失。