From 67b2afd8e276753a351b75f85ed052f24ec0f97e Mon Sep 17 00:00:00 2001 From: Xargin Date: Sat, 21 Jul 2018 19:40:43 +0800 Subject: [PATCH] add es sync diagram --- ch6-cloud/ch6-02-dist-search-engine.md | 74 ++++++++++++++++++++++++-- 1 file changed, 70 insertions(+), 4 deletions(-) diff --git a/ch6-cloud/ch6-02-dist-search-engine.md b/ch6-cloud/ch6-02-dist-search-engine.md index 010844c..54ddeef 100644 --- a/ch6-cloud/ch6-02-dist-search-engine.md +++ b/ch6-cloud/ch6-02-dist-search-engine.md @@ -281,7 +281,25 @@ SQL 的 where 部分就是 boolean expression。我们之前提到过,这种 b ### 通过时间戳进行增量数据同步 -TODO 这里有图 +``` + ┌────────────────────────┐ ┌────────────────────────┐ + │ move 10 min data to es │ │ move 10 min data to es │ + └────────────────────────┘ └────────────────────────┘ + + │ │ ┌───────────────┐ +───────────────┼────────────────┬──────────────┴─────────────┬──────────────▶ │ time passes │ + │ ┌───────┐ │ │ └───────────────┘ + │◀──┤ 10min ├───▶│ ┌────────────────────────┐ + │ └───────┘ │ │ move 10 min data to es │ + │ └────────────────────────┘ + │ + │ + │ + │ + ┌────────────────────────┐ + │ move 10 min data to es │ + └────────────────────────┘ +``` 这种同步方式与业务强绑定,例如 wms 系统中的出库单,我们并不需要非常实时,稍微有延迟也可以接受,那么我们可以每分钟从 MySQL 的出库单表中,把最近十分钟创建的所有出库单取出,批量存入 es 中,具体的逻辑实际上就是一条 SQL: @@ -299,8 +317,56 @@ select * from wms_orders where update_time >= date_sub(now(), interval 11 minute ### 通过 binlog 进行数据同步 -TODO 这里有图 +``` + ┌────────────────────────┐ + │ MySQL master │ + └────────────────────────┘ + │ + │ + │ + │ + │ + │ + ▼ + ┌───────────────────┐ + │ row format binlog │ + └───────────────────┘ + │ + │ + │ + ┌───────────────┴──────────────┐ + │ │ + │ │ + ▼ ▼ +┌────────────────────────┐ ┌─────────────────┐ +│ MySQL slave │ │ canal │ +└────────────────────────┘ └─────────────────┘ + │ + ┌─────────┴──────────┐ + │ parsed binlog │ + └─────────┬──────────┘ + │ + ▼ + ┌────────────────┐ + │ kafka │─────┐ + └────────────────┘ │ + │ + │ + │ + │ + ┌───────────┴──────┐ + │ kafka consumer │ + └───────────┬──────┘ + │ + │ + │ + │ ┌────────────────┐ + └─────▶│ elasticsearch │ + └────────────────┘ +``` -业界使用较多的是阿里开源的 canal,来进行 binlog 解析与同步。把上游数据表的自增主键作为 es 的 document 的 id 进行写入,这样可以保证每次接收到 binlog 时,对应 id 的数据都被覆盖更新为最新。MySQL 的 row 格式的 binlog 会将每条记录的所有字段都提供给下游,所以实际上在向异构数据目标同步数据时,不需要考虑数据是插入还是更新,只要一律按 id 进行覆盖即可。 +业界使用较多的是阿里开源的 canal,来进行 binlog 解析与同步。canal 会伪装成 MySQL 的从库,然后解析好行格式的 binlog,再以更容易解析的格式(例如 json) 发送到消息队列。 -这种模式同样需要业务遵守一条数据表规范,即表中必须有唯一主键 id 来保证我们进入 es 的数据不会发生重复。一旦不遵守该规范,那么就会在同步时导致数据重复。 +由下游的 kafka 消费者负责把上游数据表的自增主键作为 es 的 document 的 id 进行写入,这样可以保证每次接收到 binlog 时,对应 id 的数据都被覆盖更新为最新。MySQL 的 row 格式的 binlog 会将每条记录的所有字段都提供给下游,所以实际上在向异构数据目标同步数据时,不需要考虑数据是插入还是更新,只要一律按 id 进行覆盖即可。 + +这种模式同样需要业务遵守一条数据表规范,即表中必须有唯一主键 id 来保证我们进入 es 的数据不会发生重复。一旦不遵守该规范,那么就会在同步时导致数据重复。当然,你也可以为每一张需要的表去订制消费者的逻辑,这就不是通用系统讨论的范畴了。