开发了一个实时同步数据库到meilisearch的工具

前言 在我的个人项目中很多地方都使用到了 meilisearch,之前也写了一篇博客介绍了一下 meilisearch 的使用,可以参考一下:MeiliSearch,一个轻量级搜索引擎。 之前的话就简单粗暴地其了一个定时任务,每隔一段时间就从数据库中同步一次数据到 meilisearch,这样的话就会有一些问题: 数据不实时。 每次都是全量同步,效率很低。 所以希望能有一个能实时增量同步数据库,类似 MySQL 的,到 meilisearch 的工具。在 GitHub 上搜了一圈,发现没有什么好用的,于是打算自己写一个。 项目地址 https://github.com/long2ice/meilisync, 命令行版本。 https://github.com/long2ice/meilisync-admin,在命令行版本的基础上,增加了一个 web 管理界面,可以动态添加同步任务,查看同步状态等。 预览 技术栈 前端:React + daisyui 后端:FastAPI + TortoiseORM + MySQL 架构 目前支持三种数据库: MySQL,使用 binlog 来实现。 PostgreSQL,使用 logical replication 来实现。 MongoDB,使用 change stream 来实现。 最初的版本只是实现了命令行的功能,通过加载配置文件,然后启动一个进程,然后通过 binlog 类似的技术来实现实时地增量同步。 更进一步 命令行版本可以满足基本的需求,但是还是有一些不足的地方: 修改配置需要重启。 无法动态添加同步任务。 只支持单实例。 于是在命令行版本的基础上,增加了一个 web 管理界面,可以动态添加同步任务,查看同步状态,以及增加了登录功能。 遇到的问题 遇到错误如实例连不上,重启进程之类的会丢失数据。 全量刷新数据的实时不能影响线上业务。 MySQL binlog 连接长时间后丢失。 以及一些其他的问题。

July 29, 2023

MeiliSearch,一个轻量级搜索引擎

起因 很早之前就知道了这个开源搜索引擎,也一直想用在实际项目中,但是一直没有机会。最近终于有机会可以用上了,这里简单记录一下接入流程。 选型 搜索引擎的选型有很多方案,最常见的就是 ES,但是 ES 确实太重了,对于小项目来说不仅增加的硬件成本,也增加了运维成本,对于个人开发者来说确实不太合适。另外一个就是使用关系型数据库自带的全文检索功能,比如 MySQL 和 PostgreSQL 等,都有对应的功能,但是对于性能,中文分词等支持来说确实不太好。所以对于中小型项目来说,MeiliSearch确实是一个不错的选择。 简介 MeiliSearch是一个使用 Rust 开发的项目,目前 github 上有27.7KStar 了,也是 Rust 语言 Star 最多的几个项目之一了,介于 Rust 语言最近越来越流行,很多 Rust 项目都有了越来越多的关注。看官方博客,https://blog.meilisearch.com/meilisearch-raised-5meu-seed-fundraising/,最近还得到了 500 万美元的融资,不得不感慨开源项目的出来也许就是先慢慢做大,然后寻求融资,好的项目总是会被慧眼识珠。另外,官方好像还在招聘远程开发,不过好像得熟练使用 Rust,地址在这里:https://jobs.lever.co/meili。 部署 MeiliSearch的部署非常简单,也没有什么其他的组件,使用 docker 可以很容易的部署起来。官方也提供了很多种部署方式:https://docs.meilisearch.com/learn/getting_started/quick_start.html#setup-and-installation,包括部署脚本、docker、homebrew 等等。 这里的话就使用docker-compose来进行部署。 version: "3" services: meilisearch: image: getmeili/meilisearch network_mode: host restart: always volumes: - ./data:/meili_data 然后直接运行:docker-compose up -d,然后就成功地运行起来了。 使用 WEB 界面 当MeiliSearch运行起来后,默认会在7700端口暴露 http 接口,后续所有的访问,包括新增数据、搜索数据等都是通过这个 http 接口。另外启动之后,官方还自带了一个 web 界面,不过这个界面只是用来测试的,在生产环境会被关闭掉。然后你可以在这个界面试用MeiliSearch强大的搜索功能。 SDK 当然在实际项目中,通常会用 SDK 来使用对应的一些功能。官方也提供了很多语言的 SDK,包括 Python、PHP、Java、Go 等等流行语言。对应的地址在这里:https://docs.meilisearch.com/learn/getting_started/quick_start.html#add-documents。 增加文档 增加文档可以通过调用对应的接口,这里以 Python 为例: ...

July 3, 2022