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:
parent
fb1083dec5
commit
67b2afd8e2
@ -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 的数据不会发生重复。一旦不遵守该规范,那么就会在同步时导致数据重复。当然,你也可以为每一张需要的表去订制消费者的逻辑,这就不是通用系统讨论的范畴了。
|
||||||
|
Loading…
x
Reference in New Issue
Block a user