背景:
项目的数据库是一主一从。但是从库不能给应用使用,是数据库 team 备份容灾用的。这一点挺奇怪的,也不能申请多的从库。所以应用只能连接一个主库。
解决方法:
为了减轻数据库的压力,我们将数据库的所有业务表都冗余到了 ES ( ES 是集群),哪怕是走主键查询,也走 ES 。我最开始不建议这样子做,但是因为前面的背景,我也没有什么好的 idea
为了解决写的问题。我们用了 2 套解决方案:
1. 代码双写
在应用代码里面进行双写,一个事务内:先写 db -> 后写 es(包括 flush)。flush 是为了让其他端能及时读取到,虽然这样做比较消耗性能。目前以我们的体量跑起来没什么问题
2. flink CDC
读取数据库的 binlog ,然后 flink CDC 及时同步到 ES (包含所有业务表)。这个方案解决的核心问题是我们有连表查询的需求,在 ES 里面做了 2 张业务大宽表。附带方便:
数据初始化数据到 ES ;
方便手动刷数据库数据后就自动同步到 ES ;
如果代码里面对双写有遗漏,也可以及时弥补数据的不一致
注意我们是 2 套方案都用了
我的疑惑:
1. 双写采用了 2 套方案。flush 会立刻往 ES 所有节点写,这样做是不是非常不合适?而且已经有代码双写(方案 1)的前提下,flink CDC 除了解决宽表的问题,其他的单表同步是不是多余的,浪费性能?
2. 在目前的条件下(数据库只能一主供应用使用),这样的解决方案是否是最优的?或者说有其他更好的方案么?
PS: 我们的项目是 ToB 的,整体没有电商流量那么大
项目的数据库是一主一从。但是从库不能给应用使用,是数据库 team 备份容灾用的。这一点挺奇怪的,也不能申请多的从库。所以应用只能连接一个主库。
解决方法:
为了减轻数据库的压力,我们将数据库的所有业务表都冗余到了 ES ( ES 是集群),哪怕是走主键查询,也走 ES 。我最开始不建议这样子做,但是因为前面的背景,我也没有什么好的 idea
为了解决写的问题。我们用了 2 套解决方案:
1. 代码双写
在应用代码里面进行双写,一个事务内:先写 db -> 后写 es(包括 flush)。flush 是为了让其他端能及时读取到,虽然这样做比较消耗性能。目前以我们的体量跑起来没什么问题
2. flink CDC
读取数据库的 binlog ,然后 flink CDC 及时同步到 ES (包含所有业务表)。这个方案解决的核心问题是我们有连表查询的需求,在 ES 里面做了 2 张业务大宽表。附带方便:
数据初始化数据到 ES ;
方便手动刷数据库数据后就自动同步到 ES ;
如果代码里面对双写有遗漏,也可以及时弥补数据的不一致
注意我们是 2 套方案都用了
我的疑惑:
1. 双写采用了 2 套方案。flush 会立刻往 ES 所有节点写,这样做是不是非常不合适?而且已经有代码双写(方案 1)的前提下,flink CDC 除了解决宽表的问题,其他的单表同步是不是多余的,浪费性能?
2. 在目前的条件下(数据库只能一主供应用使用),这样的解决方案是否是最优的?或者说有其他更好的方案么?
PS: 我们的项目是 ToB 的,整体没有电商流量那么大