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

add es sync diagram

This commit is contained in:
Xargin 2018-07-21 19:40:43 +08:00
parent fb1083dec5
commit 67b2afd8e2

View File

@ -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 这种同步方式与业务强绑定,例如 wms 系统中的出库单,我们并不需要非常实时,稍微有延迟也可以接受,那么我们可以每分钟从 MySQL 的出库单表中,把最近十分钟创建的所有出库单取出,批量存入 es 中,具体的逻辑实际上就是一条 SQL
@ -299,8 +317,56 @@ select * from wms_orders where update_time >= date_sub(now(), interval 11 minute
### 通过 binlog 进行数据同步 ### 通过 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 的数据不会发生重复。一旦不遵守该规范,那么就会在同步时导致数据重复。当然,你也可以为每一张需要的表去订制消费者的逻辑,这就不是通用系统讨论的范畴了。