5分钟搞定!MySQL/PostgreSQL 到 Elasticsearch 的实时同步
在现代应用开发中,将关系型数据库(MySQL/PostgreSQL)的数据实时同步到 Elasticsearch 以提供强大的全文搜索能力,是一个非常经典的需求。
但通常,实现这一目标并不轻松:
- Logstash?配置繁琐,资源占用高。
- Kafka + Debezium?架构太重,维护成本高。
- 手写同步代码?容易出现数据不一致,难以处理断点续传。
今天,我要带大家体验 ElasticRelay —— 一个基于 Go 语言编写的现代化 CDC(Change Data Capture)网关。它主打零代码、高性能、易部署,能让你在 5 分钟内搭建起一条稳定、高效的实时同步链路。
不管你是想做全文检索、实时大屏,还是数据异构,这篇文章都将带你从零开始,快速上手。
🛠️ 准备工作
在开始之前,确保你的电脑上已经准备好了以下环境:
- Docker & Docker Compose: 我们用它来一键拉起数据库和 ES 环境。
- Go (1.25+): 用于编译 ElasticRelay(当然,生产环境直接下载二进制即可)。
- Git: 拉取代码。
准备好了吗?让我们开始计时!⏱️
第一步:获取代码与环境 (0:00 - 1:00)
首先,把代码克隆下来。我们为了方便演示,直接使用项目自带的 Docker 环境。
git clone https://github.com/yogoosoft/ElasticRelay.git
cd ElasticRelay
项目贴心地准备了一个 docker-compose.yml,里面预置了 MySQL (8.0) 和 PostgreSQL (15)。
💡 小提示:默认配置中 Elasticsearch 是注释掉的。如果你本地没有 ES,请打开 docker-compose.yml,把第 111-132 行的注释取消掉。
启动基础设施:
docker-compose up -d
随着容器的启动,你现在已经拥有了:
- 📦 MySQL: 端口 3306
- 📦 PostgreSQL: 端口 5432
- 🔍 Elasticsearch: 端口 9200
第二步:极速构建 (1:00 - 2:00)
ElasticRelay 是用 Go 写的,编译速度非常快。
# 赋予脚本执行权限
chmod +x scripts/build.sh
# 一键构建
./scripts/build.sh
稍等片刻,绿色的成功提示亮起,你的 bin/ 目录下就出现了一个名为 elasticrelay 的二进制文件。这就是我们的主角。
第三步:配置“魔法” (2:00 - 3:30)
ElasticRelay 的强大之处在于其简洁的配置。我们不需要写任何代码,只需要告诉它:“源在哪里”、“去哪里”、“同步哪些表”。
在 config 目录下新建一个 quickstart_config.json:
{
"version": "3.0",
"data_sources": [
{
"id": "mysql-local",
"type": "mysql",
"host": "localhost",
"port": 3306,
"user": "elasticrelay_user",
"password": "elasticrelay_pass",
"database": "elasticrelay",
"server_id": 100,
"table_filters": ["users"]
}
],
"sinks": [
{
"id": "es-local",
"type": "elasticsearch",
"addresses": ["http://localhost:9200"],
"options": {
"index_prefix": "elasticrelay"
}
}
],
"jobs": [
{
"id": "demo-sync-job",
"source_id": "mysql-local",
"sink_id": "es-local",
"enabled": true,
"options": {
"initial_sync": true
}
}
],
"global": {
"log_level": "info",
"grpc_port": 50051
}
}
配置解读:
- data_sources: 定义了 MySQL 连接,我们只监听
users表。 - sinks: 定义了 Elasticsearch 连接,索引前缀设为
elasticrelay(所以最终索引名会自动变为elasticrelay-users)。 - jobs: 把源和目标连起来,
initial_sync: true表示启动时先做一次全量同步,然后自动切换到增量同步。
💡 PostgreSQL 用户请看这里:想同步 PG?只需把
type改为postgresql,端口5432,用户密码改为postgres/postgres即可。ElasticRelay 会自动适配 PG 的逻辑复制协议!
第四步:见证奇迹 (3:30 - 4:00)
激动人心的时刻到了,启动服务!
./bin/elasticrelay -config config/quickstart_config.json
当你看到控制台输出 INFO: Starting job [demo-sync-job] 时,同步引擎就已经在高速运转了。
第五步:实战验证 (4:00 - 5:00)
光说不练假把式,我们来往 MySQL 里插几条数据,看看 ES 那边反应有多快。
-
向 MySQL 写入数据:
# 连入 MySQL 容器 docker exec -it elasticrelay-mysql mysql -u elasticrelay_user -pelasticrelay_pass elasticrelay在 MySQL 命令行中执行:
-- 建表 CREATE TABLE IF NOT EXISTS users ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255), email VARCHAR(255), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 插入数据 INSERT INTO users (name, email) VALUES ('Geek Zhang', 'zhang@geek.com'); INSERT INTO users (name, email) VALUES ('Coder Li', 'li@code.com'); -
去 Elasticsearch 查收:
打开另一个终端,直接 curl 一下:
curl -X GET "http://localhost:9200/elasticrelay-users/_search?pretty"Boom! 💥 你会立刻看到刚才插入的数据已经躺在 ES 里了:
{ "hits": { "hits": [ { "_source": { "id": 1, "name": "Geek Zhang", "email": "zhang@geek.com", ... } } ] } }
🎉 总结
看,不需要复杂的架构,不需要编写一行同步代码,仅仅 5 分钟,我们就实现了一个生产级的数据库到搜索引擎的实时同步闭环。
ElasticRelay 还在幕后为你做了很多事情:
- 断点续传:重启服务不会丢失数据。
- 自动建索引:不需要手动去 ES 创建 Mapping。
- 并行处理:大表同步也能飞快。
想要试用 ElasticRelay? 查看我们的 GitHub 仓库 或阅读我们的 入门指南。
有问题? 加入我们的 社区讨论 或在 Twitter 上联系我们。
ElasticRelay 团队致力于构建更好的数据基础设施工具。关注我们的旅程,我们让实时数据同步变得简单、可靠,并且让每个开发者都能使用。
更多推荐



所有评论(0)