在现代应用开发中,将关系型数据库(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 那边反应有多快。

  1. 向 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');
    
  2. 去 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 团队致力于构建更好的数据基础设施工具。关注我们的旅程,我们让实时数据同步变得简单、可靠,并且让每个开发者都能使用。

Logo

一站式 AI 云服务平台

更多推荐