2. 核心概念
在构建搜索索引与业务数据库的数据同步方案之前,必须清晰理解四个核心概念:业务数据库(MySQL / PostgreSQL)、搜索引擎(Elasticsearch)、索引与文档、以及CDC(Change Data Capture)。这些概念构成了整个同步方案的技术基石。
2.1 业务数据库:MySQL 与 PostgreSQL
业务数据库是系统的数据源,负责存储用户、订单、商品等核心业务数据。在同步方案中,业务数据库承担“写端”角色,所有数据变更(增、删、改)首先发生在业务数据库。
| 特性 | MySQL | PostgreSQL |
|---|---|---|
| 事务支持 | ACID(InnoDB) | ACID(原生) |
| 复制机制 | 基于 Binlog(二进制日志) | 基于 WAL(预写式日志) |
| CDC 支持 | Binlog 解析(Row 模式) | 逻辑复制 / pgoutput 插件 |
| 常见场景 | 电商、CMS、OLTP | 金融、GIS、复杂查询 |
关键点:无论是 MySQL 还是 PostgreSQL,其底层日志(Binlog / WAL)都是 CDC 技术的核心数据源。同步方案必须依赖这些日志实现低延迟、无侵入的数据捕获。
2.2 搜索引擎:Elasticsearch
Elasticsearch 是一个基于 Lucene 的分布式搜索与分析引擎。在同步方案中,它承担“读端”角色,提供全文搜索、模糊匹配、聚合分析等能力。业务数据库的数据经过同步后,最终写入 Elasticsearch 的索引中。
- 近实时搜索:数据写入后通常在 1 秒内可被搜索到。
- 分布式架构:索引分片(Shard)分布在多个节点,支持水平扩展。
- RESTful API:通过 HTTP 接口进行索引、搜索、管理操作。
- 倒排索引:核心数据结构,支持高效全文检索。
2.3 索引与文档
在 Elasticsearch 中,索引(Index) 是文档的集合,类似于关系数据库中的“表”;文档(Document) 是索引中的基本数据单元,类似于关系数据库中的“行”。
| 关系数据库概念 | Elasticsearch 概念 | 说明 |
|---|---|---|
| 数据库(Database) | 集群(Cluster) | 物理存储边界 |
| 表(Table) | 索引(Index) | 文档的逻辑容器 |
| 行(Row) | 文档(Document) | JSON 格式的数据实体 |
| 列(Column) | 字段(Field) | 文档中的属性 |
| 主键(Primary Key) | _id | 文档唯一标识 |
| 索引(Index) | 倒排索引(Inverted Index) | 搜索加速结构 |
映射关系:同步方案的核心任务就是将业务数据库中的“行”转换为 Elasticsearch 中的“文档”,并保持字段映射(Mapping)的一致性。例如,MySQL 的
varchar 类型通常映射为 ES 的 text 或 keyword 类型。
2.4 CDC(Change Data Capture)概念
CDC(变更数据捕获)是一种捕获数据库数据变更的技术,能够实时捕获插入、更新、删除操作,并将变更事件传递给下游系统。CDC 是同步方案中数据流动的引擎。
2.4.1 CDC 的两种主流实现方式
- 基于日志的 CDC(Log-based CDC):直接读取数据库的事务日志(MySQL Binlog / PostgreSQL WAL),无侵入、低延迟,是生产环境的首选。
- 基于轮询的 CDC(Polling-based CDC):通过定时查询业务表中的时间戳或版本号字段来发现变更,侵入性强、延迟较高,仅适用于低并发场景。
避坑提示:基于轮询的 CDC 在高并发写入场景下容易产生“漏数据”或“重复数据”问题,且对业务表有额外字段要求。在 Kubernetes 集群下的生产同步方案中,强烈推荐使用基于日志的 CDC。
2.4.2 CDC 在同步方案中的位置
CDC 组件(如 Debezium、Canal、Maxwell)部署在业务数据库与 Elasticsearch 之间,扮演数据管道角色:
- CDC 组件连接到业务数据库,实时读取 Binlog / WAL。
- 解析变更事件,生成结构化的 JSON 消息(包含操作类型、旧数据、新数据)。
- 将消息发送到消息队列(Kafka / Pulsar)或直接写入 Elasticsearch。
- 下游消费者(如 Logstash、自定义同步服务)根据消息更新 ES 索引。
2.5 同步方案中的核心数据流
将上述概念串联起来,形成完整的同步数据流:
- 写入:业务应用向 MySQL / PostgreSQL 写入数据。
- 捕获:CDC 组件实时捕获 Binlog / WAL 中的变更事件。
- 传输:变更事件通过消息队列(Kafka)进行缓冲和分发。
- 转换:同步服务将关系行数据转换为 Elasticsearch 文档格式。
- 索引:文档写入 Elasticsearch 索引,更新倒排索引。
- 搜索:用户通过搜索 API 查询 Elasticsearch,获取最新数据。
2.6 概念总结
| 概念 | 角色 | 关键技术点 |
|---|---|---|
| 业务数据库 | 数据源(写端) | Binlog / WAL 日志、事务 ACID |
| Elasticsearch | 搜索端(读端) | 倒排索引、分片、近实时搜索 |
| 索引与文档 | 数据模型 | Mapping 映射、JSON 文档结构 |
| CDC | 数据管道 | 日志解析、变更事件、无侵入捕获 |
核心认知:同步方案的本质是将业务数据库的“行变更”实时转化为 Elasticsearch 的“文档变更”。CDC 是连接两者的桥梁,而索引与文档是数据在两端的不同表现形式。理解这些概念,是后续设计同步架构、选型组件、处理数据一致性问题的前提。