冷热数据分离


分表:
    订单表日活订单表每日的增加数目为5万条数据左右,一个月左右订单的数据量就会增加到100万条左右的数据,因此我们通常每个月都会按照月为单位来做分表操作。


冷热分离:
    近三个月的数据存在同一张表里面专门做优化。
    三个月前的数据定时将数据同步到es数据库里面,如果后续需要涉及这块的数据查询,则走es数据库。
    用一个job去维护MySQL和ES之间的数据一致性。


es和mysql数据一致性:
    结合了canal+mysql+rocketmq来进行实现的。
    canal会模拟成一台mysql的slave去接收mysql的master节点返回的binlog信息,然后将这些binlog数据解析成一个json字符串,再投递到mq当中。在rocketmq的接收端会做消息的监听,一旦有接收到消息就会写入到es中。
    在使用canal做日志订阅的时候可以借助一个“缓冲池”角色的帮助。这个缓冲池可以是一些分布式缓存,用于临时接收数据,当全量同步完成之后,进入一个加锁的状态,此时将缓存中的数据也一同刷入到db中,最后释放锁。由于将redis中的数据刷入到磁盘中是个非常迅速的瞬间,因此整个过程可以看作为几乎平滑无感知。
那么你可能也会有所疑惑,mysql表本身已经有初始化数据了,该如何全量将binlog都发送给到canal呢?其实方法有很多种,binlog的产生主要是依靠数据发生变动导致的,假设我们需要同步的表里面包含了update_time字段的话,这里只需要更新下全表的update_time字段为原先值+1 就可以产生出全表的binlog信息了。

猜你喜欢

转载自blog.csdn.net/xx897115293/article/details/108258479