From 092207c7a0939c5863fdb0a4ff4b7818a4bd8ba0 Mon Sep 17 00:00:00 2001 From: Xargin Date: Thu, 19 Jul 2018 23:50:30 +0800 Subject: [PATCH] update dse --- ch6-cloud/ch6-02-dist-search-engine.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/ch6-cloud/ch6-02-dist-search-engine.md b/ch6-cloud/ch6-02-dist-search-engine.md index 41aeba3..010844c 100644 --- a/ch6-cloud/ch6-02-dist-search-engine.md +++ b/ch6-cloud/ch6-02-dist-search-engine.md @@ -281,5 +281,26 @@ SQL 的 where 部分就是 boolean expression。我们之前提到过,这种 b ### 通过时间戳进行增量数据同步 +TODO 这里有图 + +这种同步方式与业务强绑定,例如 wms 系统中的出库单,我们并不需要非常实时,稍微有延迟也可以接受,那么我们可以每分钟从 MySQL 的出库单表中,把最近十分钟创建的所有出库单取出,批量存入 es 中,具体的逻辑实际上就是一条 SQL: + +```sql +select * from wms_orders where update_time >= date_sub(now(), interval 10 minute); +``` + +当然,考虑到边界情况,我们可以让这个时间段的数据与前一次的有一些重叠: + +```sql +select * from wms_orders where update_time >= date_sub(now(), interval 11 minute); +``` + +取最近 11 分钟有变动的数据覆盖更新到 es 中。这种方案的缺点显而易见,我们必须要求业务数据严格遵守一定的规范。比如这里的,必须要有 update_time 字段,并且每次创建和更新都要保证该字段有正确的时间值。否则我们的同步逻辑就会丢失数据。 + ### 通过 binlog 进行数据同步 +TODO 这里有图 + +业界使用较多的是阿里开源的 canal,来进行 binlog 解析与同步。把上游数据表的自增主键作为 es 的 document 的 id 进行写入,这样可以保证每次接收到 binlog 时,对应 id 的数据都被覆盖更新为最新。MySQL 的 row 格式的 binlog 会将每条记录的所有字段都提供给下游,所以实际上在向异构数据目标同步数据时,不需要考虑数据是插入还是更新,只要一律按 id 进行覆盖即可。 + +这种模式同样需要业务遵守一条数据表规范,即表中必须有唯一主键 id 来保证我们进入 es 的数据不会发生重复。一旦不遵守该规范,那么就会在同步时导致数据重复。