不同后端数据迁移

Seafile 支持在文件系统、s3、ceph、swift、阿里云oss等存储后端之间互相迁移数据。 在迁移之前,您必须确保 两个 S3 主机都可以正常访问
从版本 11 开始,当您从 S3 迁移到其他存储服务器或从其他存储服务器迁移到 S3 时,您必须使用 V4 身份验证协议。这是因为版本 11 升级到 Boto3 库,当它配置为使用 V2 身份验证协议时,该库无法列出 S3 中的对象。
在不同后端迁移数据需要三个步骤: 1.新建临时 seafile.conf 文件 2.运行迁移脚本 3.替换 seafile.conf
新建临时 seafile.conf 文件
创建一个新的 seafile.conf, 填写目的后端的配置 (需要包含 [block_backend] , [commit_object_backend] , [fs_object_backend] ), 保存到一个目录下, 如 /opt/seafile-data (此目录需要用户具有读取权限)
            
                
                
cp /opt/seafile-data/seafile/conf/seafile.conf /opt/seafile-data/seafile.conf

nano /opt/seafile-data/seafile.conf
例如,要迁移到阿里云后端:
            
                
                
cat > seafile.conf << EOF
[block_backend]
name = oss
key_id = LTAIXX****
key = 4BY7WEN*****
bucket = seafblk
endpoint = oss-cn-shanghai.aliyuncs.com
[commit_object_backend]
name = oss
key_id = LTAIBk*****
key = s6jaAJev******
bucket = seafcomm
endpoint = oss-cn-shanghai.aliyuncs.com
[fs_object_backend]
name = oss
key_id = LTAIr9******
key = K95ajKksD******
bucket = seaffs
endpoint = oss-cn-shanghai.aliyuncs.com
EOF
mv seafile.conf /opt
将配置中的 key, bucket 等信息替换成自己的配置
如果您要迁移到本地文件系统,seafile.conf 临时配置示例如下:
            
                
                
cat > seafile.conf << EOF
[commit_object_backend]
name = fs
# the dir configuration is the new seafile-data path
dir = /var/data_backup
[fs_object_backend]
name = fs
# the dir configuration is the new seafile-data path
dir = /var/data_backup
[block_backend]
name = fs
# the dir configuration is the new seafile-data path
dir = /var/data_backup
EOF
mv seafile.conf /opt
迁移大量数据对象
如果存储中存在数百万个数据对象(尤其是 fs 对象),这时迁移所有对象可能需要花费很长时间,因为将花费超过一半的时间用于检查目标存储中是否存在对象。为此, 自 专业版 7.0.8 起,我们增加了一项功能以加快检查速度。
这要求您在运行迁移脚本之前,设置此环境变量:
            
                
                
export OBJECT_LIST_FILE_PATH=/path/to/object/list/file
这样将会创建出3个对象列表文件: /path/to/object/list/file.commit , /path/to/object/list/file.fs , /path/to/object/list/file.blocks
第一次运行迁移脚本时,目标存储中现有的对象将会被记录到对应的对象列表文件中。 然后,当您第二次运行脚本时,它将从列表文件加载现有对象列表,而不是查询目标。 并且新迁移的对象也将添加到该文件中。 在迁移期间,迁移过程通过检查预加载的对象列表来检查对象是否存在,而不是询问目标,这将大大加快迁移过程。
建议您第一次运行迁移脚本时,在“获取对象列表”阶段中不要中断脚本。 否则,文件中的对象列表将不完整。
另一个加速迁移的技巧是增加迁移脚本中的工作线程数和任务队列大小。 您可以在以下代码中修改 nworker maxsize 变量:
            
                
                
class ThreadPool(object):
def __init__(self, do_work, nworker=20):
self.do_work = do_work
self.nworker = nworker
self.task_queue = Queue.Queue(maxsize = 2000)
可以将工作线程数设置为相对较大的值,因为它们主要用来等待 I/O 操作完成。
运行迁移脚本
由于数据迁移过程不会影响 Seafile 服务的运行,如果在此过程中作原始 S3 数据,则数据可能无法与迁移的数据同步。因此,我们建议您在执行迁移过程之前停止 Seafile 服务。
            
                
                
docker exec -it seafile bash
cd /opt/seafile/seafile-server-latest
./seahub.sh stop
./seafile.sh stop
进入 seafile-server-latest 目录下, 执行 migrate.sh , 参数为新建的 seafile.conf 所在目录,这里为 /opt
            
                
                
docker exec -it seafile bash
cd /opt/seafile/seafile-server-latest
./migrate.sh /opt

#如果您有加密的存储后端,则可以使用此脚本将数据从该后端迁移和解密到新后端。可以在调用脚本时添加 --decrypt 选项,该选项将在读取数据时解密数据,然后将未加密的数据写入新的后端:
./migrate.sh /opt --decrypt

如果迁移过程已完成,则可以看到以下消息:
            
                
                
2025-01-15 05:49:39,408 Start to fetch [commits] object from destination
2025-01-15 05:49:39,422 Start to fetch [fs] object from destination
2025-01-15 05:49:39,442 Start to fetch [blocks] object from destination
2025-01-15 05:49:39,677 [commits] [0] objects exist in destination
2025-01-15 05:49:39,677 Start to migrate [commits] object
2025-01-15 05:49:39,749 [blocks] [0] objects exist in destination
2025-01-15 05:49:39,755 Start to migrate [blocks] object
2025-01-15 05:49:39,752 [fs] [0] objects exist in destination
2025-01-15 05:49:39,762 Start to migrate [fs] object
2025-01-15 05:49:40,602 Complete migrate [commits] object
2025-01-15 05:49:40,626 Complete migrate [blocks] object
2025-01-15 05:49:40,790 Complete migrate [fs] object
Done.
最后需要先停止 seafile 服务,再做一次增量迁移。
替换 seafile.conf
对象迁移完成后, 需要将 seafile.conf 替换成新后端的配置
            
                
                
mv /opt/seafile-data/seafile.conf /opt/seafile-data/seafile/conf/seafile.conf
此时的 seafile.conf 中仅有关于后端的配置, 更多的配置项和配置方法,如 memcache等,可以参考 这篇文档 进行补充。 替换配置文件之后,重启seafile服务,就可以正常访问新后端的数据了。