zoukankan      html  css  js  c++  java
  • 缓存一致性和跨服务器查询的数据异构解决方案canal

    转载: 缓存一致性和跨服务器查询的数据异构解决方案canal

    缓存一致性和跨服务器查询的数据异构解决方案canal

    当你的项目数据量上去了之后,通常会遇到两种情况,第一种情况应是最大可能的使用cache来对抗上层的高并发,第二种情况同样也是需要使用分库

    分表对抗上层的高并发。。。逼逼逼起来容易,做起来并不那么乐观,由此引入的问题,不见得你有好的解决方案,下面就具体分享下。

    一:尽可能的使用Cache

    比如在我们的千人千面系统中,会针对商品,订单等维度为某一个商家店铺自动化建立大约400个数据模型,然后买家在淘宝下订单之后,淘宝会将订单推

    送过来,订单会在400个模型中兜一圈,从而推送更贴切符合该买家行为习惯的短信和邮件,这是一个真实的业务场景,为了应对高并发,这些模型自然都是缓

    存在Cache中,模型都是从db中灌到redis的,那如果有新的模型进来了,我如何通知redis进行缓存更新呢???通常的做法就是在添加模型的时候,顺便更新

    redis。。。对吧,如下图:

     
     

    说的简单,web开发的程序员会说,麻蛋的,我管你什么业务,更新你妹啊。。。我把自己的手头代码写好就可以了,我要高内聚,所以你必须碰一鼻子灰。

    除了一鼻子灰之后,也许你还会遇到更新database成功,再更新redis的时候失败,可人家不管,而且错误日志还是别人的日志系统里面,所以你很难甚至

    无法保证这个db和cache的缓存一致性,那这个时候能不能换个思路,我直接写个程序订阅database的binlog,从binlog中分析出模型数据的CURD操作,根

    据这些CURD的实际情况更新Redis的缓存数据,第一个可以实现和web的解耦,第二个实现了高度的缓存一致性,所以新的架构是这样的。

     
     

    上面这张图,相信大家都能看得懂,重点就是这个处理binlog程序,从binlog中分析出CURD从而更新Redis,其实这个binlog程序就是本篇所说的canal。。。

    一个伪装成mysql的slave,不断的通过dump命令从mysql中盗出binlog日志,从而完美的实现了这个需求。

    二:数据异构

    本篇开头也说到了,数据量大了之后,必然会存在分库分表,甚至database都要分散到多台服务器上,现在的电商项目,都是业务赶着技术跑。。。

    谁也不知道下一个业务会是一个怎样的奇葩,所以必然会导致你要做一些跨服务器join查询,你以为自己很聪明,其实DBA早就把跨服务器查询的函数给你

    关掉了,求爹爹拜奶奶都不会给你开的,除非你杀一个DBA祭天,不过如果你的业务真的很重要,可能DBA会给你做数据异构,所谓的数据异构,那就是

    将需要join查询的多表按照某一个维度又聚合在一个DB中。让你去查询。。。。。

     

    那如果用canal来订阅binlog,就可以改造成下面这种架构。

     
     

    三:搭建一览

    好了,canal的应用场景给大家也介绍到了,最主要是理解这种思想,人家搞不定的东西,你的价值就出来了。

    1. 开启mysql的binlog功能

    开启binlog,并且将binlog的格式改为Row,这样就可以获取到CURD的二进制内容,windows上的路径为:C:Program FilesMySQLMySQL Server 5.7

    my.ini。

     
     
     

    2. 验证binlog是否开启

    使用命令验证,并且开启binlog的过期时间为30天,默认情况下binlog是不过期的,这就导致你的磁盘可能会爆满,直到挂掉。

     
     
     

    3. 给canal服务器分配一个mysql的账号权限,方便canal去偷binlog日志。

     

    4. 下载canal

    github的地址: https://github.com/alibaba/canal/releases

     

    5. 然后就是各种解压的命令

     
     

    6. canal 和 instance 配置文件

    canal的模式是这样的,一个canal里面可能会有多个instance,也就说一个instance可以监控一个mysql实例,多个instance也就可以对应多台服务器

    的mysql实例。也就是一个canal就可以监控分库分表下的多机器mysql。

    《1》 canal.properties

    它是全局性的canal服务器配置,具体如下,这里面的参数涉及到方方面面。

     
     
     
     
     
     
     
     

    由于是全局性的配置,所以上面三处标红的地方要注意一下:

    canal.port= 11111       当前canal的服务器端口号

    canal.destinations= example     当前默认开启了一个名为example的instance实例,如果想开多个instance,用","逗号隔开就可以了。。。

    canal.instance.filter.regex = .*..*   mysql实例下的所有db的所有表都在监控范围内。

    《2》 instance.properties

    这个就是具体的某个instances实例的配置,未涉及到的配置都会从canal.properties上继承。

     
     

    上面标红的地方注意下就好了,去偷binlog的时候,需要知道的mysql地址和用户名,密码。

    7. 开启canal

    大家要记得把/canal/bin 目录配置到 /etc/profile 的 Path中,方便快速开启,通过下图你会看到11111端口已经在centos上开启了。

     
     
     

    8. Java Client 代码

    canal driver 需要在maven仓库中获取一下:https://www.mvnrepository.com/artifact/com.alibaba.otter/canal.client/1.0.24,不过依赖还是蛮多的。

     
     
     
     

    9. 启动java代码进行验证

    下面的代码对table的CURD都做了一个基本的判断,看看是不是能够智能感知,然后可以根据实际情况进行redis的更新操作。。。

     
     
     
     
     
     
     
     
     
     
     
     

    <1> Update操作

     
     

    <2> Insert操作

     
     

    <3> Delete 操作

     

    从结果中看,没毛病,有图有真相,好了,本篇就说到这里,对于开发的你,肯定是有帮助的~~~



    作者:meng_philip123
    链接:https://www.jianshu.com/p/d30bb7b716cd
    來源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
  • 相关阅读:
    241. Different Ways to Add Parentheses java solutions
    89. Gray Code java solutions
    367. Valid Perfect Square java solutions
    46. Permutations java solutions
    116. Populating Next Right Pointers in Each Node java solutions
    153. Find Minimum in Rotated Sorted Array java solutions
    判断两颗树是否相同
    求二叉树叶子节点的个数
    求二叉树第k层的结点个数
    将二叉排序树转换成排序的双向链表
  • 原文地址:https://www.cnblogs.com/DreamRecorder/p/9243032.html
Copyright © 2011-2022 走看看