使用 MySQL 和 meilisync 同步数据库

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

    本指南将教您如何使用 meilisync 使 Meilisearch 与 MySQL 数据库保持同步。请注意,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。

    配置 MySQL

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

    二进制日志格式

    要将 meilisync 与 MySQL 一起使用,您必须将二进制日志格式设置为 ROW

    使用 --binlog-format 命令行选项启动您的 MySQL 服务器

    mysql --binlog-format=ROW
    

    或者,您可以在 MySQL 服务器控制台中运行以下命令,在运行时设置二进制日志格式

    SET GLOBAL binlog_format = 'ROW';
    

    连接 meilisync 和 MySQL

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

    source:
      type: mysql
      host: 127.0.0.1 # assuming your MySQL server is running on the same machine as `meilisync`
      port: 3306
      database: MYSQL_DATABASE_NAME
      user: MYSQL_USERNAME
      password: MYSQL_PASSWORD
    

    将 MYSQL_DATABASE_NAME、MYSQL_USERNAME 和 MYSQL_PASSWORD 替换为您的数据库名称、具有该数据库的读访问权限的用户以及其凭据。

    配置 meilisync

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

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

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

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

    主键推断

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

    自定义 `meilisync`

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

    运行 `meilisync`

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

    docker compose up
    

    meilisync 应立即开始将你的主 MySQL 数据库与你的 Meilisearch 实例同步。

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

    结论

    恭喜你已成功设置 meilisync

    你可以长期在后台运行该进程,以便主数据库的所有更改都能自动同步,或者你可以中断该进程,只在你再次更新数据库时才运行它。