使用 PostgreSQL 和 meilisync 同步数据库

    虽然 Meilisearch 是一个数据库,但不建议将其用作主要数据存储。相反,您应该使用外部数据库存储您的数据,并定期将其与 Meilisearch 同步。

    本指南将教您如何使用 meilisync 使 Meilisearch 与 PostgreSQL 数据库保持同步。请注意,meilisync 仍处于早期开发阶段,尚未准备好投入生产。您在与它交互时可能会遇到问题。

    要求

    安装 meilisync

    meilisync 安装到与您的主要数据库相同的位置。您可以手动进行或使用 Docker

    Docker

    首先,在您的 Docker 项目目录中创建一个 docker-compose.yml 文件。使用文本编辑器打开它并添加以下内容

    services:
      meilisync:
        platform: linux/x86_64
        image: long2ice/meilisync
        volumes:
          - ./config.yml:/meilisync/config.yml
    

    如果您的项目已经有一个 docker-compose.yml,请将 meilisync 设置添加到现有的 services 字段中。

    完成后,打开您的控制台,导航到您的 Docker 项目目录,并运行以下命令

    docker compose pull
    

    几秒钟后,Docker 会通知您已成功拉取 meilisync 的镜像。

    meilisync 连接到 Meilisearch

    安装 meilisync 后,您现在需要将其连接到您的 Meilisearch 实例。

    在您的项目目录中创建一个 config.yml 文件。使用文本编辑器打开它,并根据您是否使用 Docker 添加以下配置选项

    meilisearch:
      api_url: http://host.docker.internal:7700/
      api_key: 'MEILISEARCH_API_KEY'
      insert_size: 1000
      insert_interval: 10
    

    MEILISEARCH_API_KEY 替换为能够创建、更新和删除文档和索引的 API 密钥。将 MEILISEARCH_API_URL 替换为您实例的 API URL。如果您使用的是 Meilisearch Cloud,此 URL 应类似于以下内容:https://ms-4d85L33tC0d3-5041.fra.meilisearch.io

    配置 PostgreSQL

    meilisync 连接到 Meilisearch 后,您需要将其连接到您的 PostgreSQL 数据库。

    启用逻辑复制

    要将 meilisync 与 PostgreSQL 一起使用,您需要启用 wal2json 扩展。

    wal2json 扩展需要 预写日志设置 设置为 logical

    这可以通过将以下行添加到您的 PostgreSQL 服务器的 postgresql.conf 文件中来完成

    wal_level = logical
    #
    # these parameters only need to set in versions 9.4, 9.5 and 9.6
    # default values are ok in version 10 or later
    #
    max_replication_slots = 10
    max_wal_senders = 10
    

    或者,通过在您的 PostgreSQL 服务器控制台中运行以下命令来在运行时设置二进制日志格式

    ALTER SYSTEM SET wal_level = logical;
    

    这将需要服务器配置重新加载才能生效。有关此内容的更多信息,请阅读 ALTER SYSTEM 文档

    连接 meilisync 和 PostgreSQL

    再次打开 meilisyncconfig.yml,并将以下设置追加到文件底部

    source:
      type: postgres
      host: 127.0.0.1 # assuming your PostgreSQL server is running on the same machine as `meilisync`
      port: 5432
      database: POSTGRESQL_DATABASE_NAME
      user: POSTGRESQL_USERNAME
      password: POSTGRESQL_PASSWORD
    

    将 POSTGRESQL_DATABASE_NAME、POSTGRESQL_USERNAME 和 POSTGRESQL_PASSWORD 分别替换为您的数据库名称、具有该数据库读取权限的用户以及其凭据。

    配置 meilisync

    最后一步配置是指定数据库中的哪些表应该同步到哪些 Meilisearch 索引。

    打开 config.yml 并将以下设置追加到文件底部

    sync:
      - table: POSTGRES_TABLE_NAME_1
        index: MEILISEARCH_INDEX_NAME_1
        pk: id # Read the "Primary key inference" section below
        full: true
      - table: POSTGRES_TABLE_NAME_2
        index: MEILISEARCH_INDEX_NAME_2
        full: true
    

    POSTGRES_TABLE_NAME_1MEILISEARCH_INDEX_NAME_1 分别替换为您的表和索引名称。如以上示例所示,您可以同步多个表。

    主键推断

    如果您的表中包含多个名称中包含 id 的列,meilisync 将无法推断出哪个列是主键。在这种情况下,您必须通过在表的配置中添加 pk 字段来手动指定主键。

    自定义 meilisync

    本教程描述了一个相当基本的 meilisync 设置。有关更多自定义选项,请查阅 meilisync 的文档

    运行 meilisync

    配置完成后,再次打开您的命令行提示符并使用 Docker 或手动安装运行 meilisync

    docker compose up
    

    meilisync 应该立即开始将您的主 PostgreSQL 数据库与您的 Meilisearch 实例同步。

    meilisync 完成后,请使用 Meilisearch 的搜索预览进行一些测试搜索,并确认数据已成功同步到您的主数据库和 Meilisearch 之间。

    结论

    恭喜!您已成功设置 meilisync

    您可以将此进程永久运行在后台,这样对主数据库的所有更改都会自动同步,也可以中断此进程,仅在您再次更新数据库时运行。