• 多存储后端
    • 定义存储后端
    • 资料库映射策略
      • 用户选择
      • 基于角色映射
      • 基于资料库 ID 的映射

    多存储后端

    某些使用场景下,需要 Seafile 服务可以支持多个存储后端,例如:

    • 要将不同的文件类型存储到不同的存储后端。例如,普通文件可以存储到主存储(disks, SSD);文档文件可以存储到 “冷存储”(其他存储系统)。
    • 结合多个存储后端来扩展存储的可扩展性。例如,单独使用一个 NFS 挂载卷时可能会受到大小限制;单独使用一个 S3 后端存储时,当对象数量变得很大时,Ceph RGW 的性能可能会受到很大影响。
      在 Seafile 中,以资料库为单位,将数据分散存储到多个存储后端中。在同一个资料库中的所有数据将被存储到同一个存储后端。每个资料库和存储后端之间的映射关系存储在数据库中。根据使用情况选择不同的映射策略。

    为了使用该功能,您需要:

    • 在 seafile.conf 中定义存储后端。
    • 在 seahub_settings.py 中开启多存储后端功能,并选择一个映射策略。

      定义存储后端

    在 Seafile 中,每一个存储后端都由一个 "storage class" 代表。存储后端由以下信息定义:

    • storage_id:用来定义存储后端的内部 ID 字符串,对用户不可见。例如:'primary storage'。
    • name:用户可见的存储名称。
    • is_default:定义该存储是否是默认的。如果这个存储后端允许用户使用,当用户不选择时,将默认采用该存储后端。
    • commits:该存储后端中,用来存放 commit 对象的存储位置。它可以是任何 Seafile 支持的存储,比如:文件系统、S3 或者 ceph。
    • fs:该存储后端中,用来存放 fs 对象的存储位置。它可以是任何 Seafile 支持的存储,比如:文件系统、S3 或者 ceph。
    • blocks:该存储后端中,用来存放 block 对象的存储位置。它可以是任何 Seafile 支持的存储,比如:文件系统、S3 或者 ceph。
      commit, fs, 和 blocks 能够被存储在不同的存储中。这为定义存储后端提供了最为灵活的方式。

    在 Seafile 6.3 之前的版本中,不支持多个存储后端。您必须明确地启用这个新功能,并使用与以前定义存储后端不同的语法格式定义存储后端。

    首先,你必须在 seafile.conf 中启用这个功能:

    1. [storage]
    2. enable_storage_classes = true
    3. storage_classes_file = /opt/seafile_storage_classes.json
    • enable_storage_classes:设置为 True,开启多存储后端功能;接下来你必须在下一个配置项指定的 JSON 文件中定义出这些存储后端。
    • storage_classes_file:指定包含有存储后端定义的 JSON 文件的位置。
      JSON 文件是一个对象数组。每个对象定义一个存储后端。定义中的字段对应于我们需要为存储后端指定的信息。下面是一个例子:
    1. [
    2. {
    3. "storage_id": "hot_storage",
    4. "name": "Hot Storage",
    5. "is_default": true,
    6. "commits": {"backend": "s3", "bucket": "seafile-commits", "key": "ZjoJ8RPNDqP1vcdD60U4wAHwUQf2oJYqxN27oR09", "key_id": "AKIAIOT3GCU5VGCCL44A"},
    7. "fs": {"backend": "s3", "bucket": "seafile-fs", "key": "ZjoJ8RPNDqP1vcdD60U4wAHwUQf2oJYqxN27oR09", "key_id": "AKIAIOT3GCU5VGCCL44A"},
    8. "blocks": {"backend": "s3", "bucket": "seafile-blocks", "key": "ZjoJ8RPNDqP1vcdD60U4wAHwUQf2oJYqxN27oR09", "key_id": "AKIAIOT3GCU5VGCCL44A"}
    9. },
    10. {
    11. "storage_id": "cold_storage",
    12. "name": "Cold Storage",
    13. "is_default": false,
    14. "fs": {"backend": "fs", "dir": "/storage/seafile/seafile-data"},
    15. "commits": {"backend": "fs", "dir": "/storage/seafile/seafile-data"},
    16. "blocks": {"backend": "fs", "dir": "/storage/seafile/seaflle-data"}
    17. },
    18. {
    19. "storage_id": "swift_storage",
    20. "name": "Swift Storage",
    21. "fs": {"backend": "swift", "tenant": "adminTenant", "user_name": "admin", "password": "openstack", "container": "seafile-commits", "auth_host": "192.168.56.31:5000", "auth_ver": "v2.0"},
    22. "commits": {"backend": "swift", "tenant": "adminTenant", "user_name": "admin", "password": "openstack", "container": "seafile-fs", "auth_host": "192.168.56.31:5000", "auth_ver": "v2.0"},
    23. "blocks": {"backend": "swift", "tenant": "adminTenant", "user_name": "admin", "password": "openstack", "container": "seafile-blocks", "auth_host": "192.168.56.31:5000", "auth_ver": "v2.0", "region": "RegionTwo"}
    24. }
    25. ]

    如上所示:commitsfsblocks 信息的语法格式与 seafile.conf 中定义的 [commit_object_backend], [fs_object_backend][block_backend] 语法格式相似。

    如果你是用文件系统作为 commitsfsblocks 的存储位置,您必须明确地提供"seafile-data"目录的路径。这些对象将会被存储在这个路径下的 storage/commits, storage/fs, storage/blocks 中。

    注意:一般的文件系统,S3 和 Swift 后端是支持的,但 Ceph/RADOS 目前还不支持。

    资料库映射策略

    资料库映射策略决定了资料库使用的存储后端。目前我们为3个不同的用例提供3个策略。资料库的存储后端被创建和存储在一个数据表中。如果之后再更改映射策略各资料库对应的存储后端将不会改变。

    选择映射策略之前,你需要在 seahub_settings.py 开启该功能:

    1. ENABLE_STORAGE_CLASSES = True

    用户选择

    该策略需要用户在创建新资料库的时候选择存储后端。用户可以选择定义在 JSON 文件中的任何一个存储后端。

    如果要使用该策略,需要在 seahub_settings.py 中添加以下配置:

    1. STORAGE_CLASS_MAPPING_POLICY = 'USER_SELECT'

    如果你开启了 STORAGE_CLASSES,但没有在 seahub_settings.py 中明确定义 STORAGE_CLASS_MAPPING_POLIICY,则默认使用“用户选择”策略。

    基于角色映射

    您还可以根据用户的角色配置用户可使用的存储后端。

    seahub_settings.py 中加一个新的配置项 storage_ids 到角色配置段中,给每一个角色分配存储后端。如果给某个角色只分配了一个存储后端,这个角色下的用户将不能选择其他存储后端给资料库使用。否则,如果分配了多个存储后端,用户在创建资料库时可以从中选择一个存储后端。如果没有为角色分配任何存储后端,将使用JSON文件中指定的默认后端。

    这里有一个简单的 seahub_settings.py 中的配置,使用该策略:

    1. ENABLE_STORAGE_CLASSES = True
    2. STORAGE_CLASS_MAPPING_POLICY = 'ROLE_BASED'
    3. ENABLED_ROLE_PERMISSIONS = {
    4. 'default': {
    5. 'can_add_repo': True,
    6. 'can_add_group': True,
    7. 'can_view_org': True,
    8. 'can_use_global_address_book': True,
    9. 'can_generate_share_link': True,
    10. 'can_generate_upload_link': True,
    11. 'can_invite_guest': True,
    12. 'can_connect_with_android_clients': True,
    13. 'can_connect_with_ios_clients': True,
    14. 'can_connect_with_desktop_clients': True,
    15. 'storage_ids': ['old_version_id', 'hot_storage', 'cold_storage', 'a_storage'],
    16. },
    17. 'guest': {
    18. 'can_add_repo': True,
    19. 'can_add_group': False,
    20. 'can_view_org': False,
    21. 'can_use_global_address_book': False,
    22. 'can_generate_share_link': False,
    23. 'can_generate_upload_link': False,
    24. 'can_invite_guest': False,
    25. 'can_connect_with_android_clients': False,
    26. 'can_connect_with_ios_clients': False,
    27. 'can_connect_with_desktop_clients': False,
    28. 'storage_ids': ['hot_storage', 'cold_storage'],
    29. },
    30. }

    基于资料库 ID 的映射

    这个策略根据资料库的ID映射到存储后端。资料库的ID是UUID。这样,系统中的数据就可以在存储后端之间均匀地分配。

    注意,这个策略并不是设计成完整的分布式存储解决方案。它不处理资料库数据在各存储后端之间的自动迁移。如果需要向配置文件添加更多的存储后端,则现有资料库将保留在它们的原始存储中。新的资料库可以在新的存储后端之间分布。您仍然需要在开始时计划系统的总存储容量。

    要使用该策略,先在 seahub_settings.py 中添加以下配置项:

    1. STORAGE_CLASS_MAPPING_POLICY = 'REPO_ID_MAPPING'

    然后可以在 JSON 文件中的存储后端中添加 for_new_library 选项来存储新的资料库:

    1. [
    2. {
    3. "storage_id": "new_backend",
    4. "name": "New store",
    5. "for_new_library": true,
    6. "is_default": false,
    7. "fs": {"backend": "fs", "dir": "/storage/seafile/new-data"},
    8. "commits": {"backend": "fs", "dir": "/storage/seafile/new-data"},
    9. "blocks": {"backend": "fs", "dir": "/storage/seafile/new-data"}
    10. }
    11. ]

    原文: https://manual-cn.seafile.com/deploy_pro/multiple_storage_backends.html