1
0
mirror of https://github.com/chai2010/advanced-go-programming-book.git synced 2025-05-24 12:32:21 +00:00

update dse

This commit is contained in:
Xargin 2018-07-19 23:50:30 +08:00
parent 4e92134b38
commit 092207c7a0

View File

@ -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 的数据不会发生重复。一旦不遵守该规范,那么就会在同步时导致数据重复。