基于canal 的 mysql 与 redis/memcached/mongodb 的 nosql 数据实时同步方案 案例,canal client

https://github.com/liukelin/canal_mysql_nosql_sync 下图是最基本的web服务器的结构图。 基于 Canal 的 MySql RabbitMQ Redis/memcached/mongodb 的nosql同步 (多读、nosql延时不严格 需求) 1.mysql主从配置 2.对mysql binlog(row) parser 这一步交给canal 3.MQ对解析后binlog增量数据的推送 4.对MQ数据的消费(接收+数据解析,考虑消费速度,MQ队列的阻塞) 5.数据写入/修改到nosql (redis的主从/hash分片) 6.保证对应关系的简单性:一个mysql表对应一个 redis实例(redis单线程,多实例保证分流不阻塞),关联关系数据交给接口业务 数据:mysql->binlog->MQ->redis(不过期、关闭RDB、AOF保证读写性能) (nosql数据仅用crontab脚本维护) 请求:http->webserver->redis(有数据)->返回数据 (完全避免用户直接读取mysql) ->redis(无数据)->返回空 7.可将它视为一个触发器,binlog为记录触发事件,canal的作用是将事件实时通知出来,并将binlog解析成了所有语言可读的工具。 在事件传输的各个环节 提高…

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

https://www.cnblogs.com/huangxincheng/p/7456397.html 当你的项目数据量上去了之后,通常会遇到两种情况,第一种情况应是最大可能的使用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:\ProgramData\MySQL\MySQL Server 5.7\my.ini。 1 log-bin=mysql-bin #添加这一行就ok…

高CPU业务场景下的任务分发方案Gearman搭建一览

http://www.cnblogs.com/huangxincheng/p/7449722.html Gearman是当年LiveJournal用来做图片resize的,大家也明白图片resize是一个高CPU的操作,如果让web网站去做这个高CPU的功能,有可能会拖垮你的 web应用,那本篇我们来看看gearman是如何解决这个问题的,它的架构图类似下面这样: 从上面这张图,你应该会看到,Gearman是由三个部分组成: 1. Job Server 这个就是Gearman的Job Server,通过它对Client 和 jobwork 进行桥接,是不是想起来了中介者模式。。。 2. Client Gearman提供了Client API 给客户端调用,Client只需要将一个高CPU的业务函数名丢给Job Server,然后等待JobServer的返回执行结果。 3. jobwork Gearman提供了work API 给work客户端进行调用。jobserver会根据后端的work集群的负载情况,分发给一个合适的work去执行,并等待结果。 说到这里,你应该就明白了,本质上它属于那种分布式的RPC调用,而且非常牛逼的地方在于Client 和 Work 可以用不同的语言实现。 一:安装部署 1. 下载地址:https://github.com/gearman/gearmand/releases…

如何大幅提升web前端性能之看tengine在大公司架构实践

http://www.cnblogs.com/huangxincheng/p/7469328.html 在一个项目还是单体架构的时候,所有的js,css,image都会在一个web网站上,看起来并没有什么问题,比如下面这样: 但是当web网站流量起来的时候,这个单体架构必须要进行横向扩展,而在原来的架构中静态资源这羊毛是出在单体架构这头羊身上,所以横向多少 个单体,就有多少个静态资源文件夹,比如下面这样的架构。 那这种架构有什么问题呢? 总的来说会有如下二个问题: 1. 浏览器对单一域名的请求有并发限制。 在同一个域名下,一般来说有js,css,img,media,html等等静态资源,如果资源都挂在同一个域名下,势必会影响页面的加载速度,而且单一域名 下静态资源还会带上同域名下的cookie等本不需要附加的信息。 2. 不方便管理和资源的浪费 为什么这么说呢? 我们知道静态资源一般来说都是很占资源空间的,尤其是用户上传的头像,csv那更是占用web服务器资源,为了应对突发情况, 一般会保持web代码的3个版本的回滚策略,也就是说你需要在web1,web2,web3上同时进行3个静态资源文件夹的copy,相比单独用静态资源服务 器统一管理的文件夹的情况对比,前者的磁盘资源的浪费可想而知。。。所以改正后的架构应该是这样的。 有些同学可能会说,空口无凭,你得找点真实的案例给我看看,为了满足你的胃口,下面我就找下‘携程’ 和 ‘淘宝’站点给你分享一下。 一:携程首页对这二个问题的解决 啥也不想说,通过浏览器随便抓取一个css文件给大家分享一下,详细如下图: 1. css的加载路径 从http://webresource.c-ctrip.com/ResCRMOnline/R5/css/index/private_index.A_v3.css?ts=20170828_pro 中可以看到这和www.ctrip.com 域名根本就不是一个域名,除了有点像,不说话,甚至还有点想笑,所以这种方式的加载对页面的快速呈现有很大的帮助。 2. 对R5的分析 这个R5是什么意思,就是有10个版本,R1-R10,每发布一个新版本,R++,轮回而已,所以你可以将R5 ->…

通过hadoop + hive搭建离线式的分析系统之快速搭建一览

http://www.cnblogs.com/huangxincheng/p/7895019.html   最近有个需求,需要整合所有店铺的数据做一个离线式分析系统,曾经都是按照店铺分库分表来给各自商家通过highchart多维度展示自家的店铺经营 状况,我们知道这是一个以店铺为维度的切分,非常适合目前的在线业务,这回老板提需求了,曾经也是一位数据分析师,sql自然就溜溜的,所以就来了 一个以买家维度展示用户画像,从而更好的做数据推送和用户行为分析,因为是离线式分析,目前还没研究spark,impala,drill了。 一:搭建hadoop集群 hadoop的搭建是一个比较繁琐的过程,采用3台Centos,废话不过多,一图胜千言。。。 二: 基础配置 1. 关闭防火墙 # systemctl stop firewalld.service #关闭防火墙 # systemctl disable firewalld.service #禁止开机启动 # firewall-cmd --state #查看防火墙状态 not running # 2. 配置SSH免登录 不管在开启还是关闭hadoop的时候,hadoop内部都要通过ssh进行通讯,所以需要配置一个ssh公钥免登陆,做法就是将一个centos的公钥copy到另一…

【源码】canal和otter的高可靠性分析

一般来说,我们对于数据库最主要的要求就是:数据不丢。不管是主从复制,还是使用类似otter+canal这样的数据库同步方案,我们最基本的需求是,在数据不丢失的前提下,尽可能的保证系统的高可用,也就是在某个节点挂掉,或者数据库发生主从切换等情况下,我们的数据同步系统依然能够发挥它的作用–数据同步。本文讨论的场景是数据库发生主从切换,本文将从源码的角度,来看看otter和canal是如何保证高可用和高可靠的。 一、EventParser 通过阅读文档和源码,我们可以知道,对于一个canal server,基础的框架包括以下几个部分:MetaManager、EventParser、EventSink和EventStore。其中EventParser的作用就是发送dump命令,从mysql数据库获取binlog文件。发送dump命令,可以指定时间戳或者position,从指定的时间或者位置开始dump。我们来看看过程: 首先是CanalServer启动。otter默认使用的是内置版的canal server,所以我们主要看CanalServerWithEmbedded这个类。来看下他的启动过程: public void start(final String destination) { final CanalInstance canalInstance = canalInstances.get(destination); if (!canalInstance.isStart()) { try { MDC.put("destination", destination); canalInstance.start();//启动实例 logger.info("start CanalInstances successfully", destination); }…

Canal使用小结

之前公司存在mysql数据同步mongo的需求,可以有多种实现方式,比如硬编码,发送消息等。公司选择的是Canal中间件,最近有空来研究下他的使用方式,对于mysql数据变更监听有需求的应用场景都可以使用它。 参考:https://yq.aliyun.com/articles/14570 Canal介绍 基于mysql数据库binlog的增量订阅&消费 canal源码地址:https://github.com/alibaba/canal 下载安装server 先去https://github.com/alibaba/canal/releases下载最新版本的canal.deployer,解压后配置conf/example/instance.properties文件为自己的配置主要为数据库的ip端口和连接的用户和密码。这里创建一个repication权限的用户。 CREATE USER canal IDENTIFIED BY 'canal'; GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%'; -- GRANT ALL PRIVILEGES ON *.* TO…

搭建zookeeper集群

Zookeeper环境搭建 前期准备: 由于Zookeeper需要先安装java 机器: 三台测试机器 192.168.1.31 192.168.1.32 192.168.1.33 上传zookeeper的压缩包 三个节点都解压到usr/local下 # tar zxvf zookeeper-3.4.5.tar.gz -C /usr/local 1 三台节点都重命名 zookeeper-3.4.5 为zookeeper # mv zookeeper-3.4.5/ zookeeper 1 修改环境变量 path末尾增加一个zookeeper的bin目录 # zookeeper export…

fluentd+mongodb构建分布式日志收集系统

转自:http://blog.csdn.net/T1DMzks/article/details/78916749 目录(?) 一 mongodb单机安装 1 下载解压并安装 2 配置环境变量 二 fluentd安装 1 调整安装的Linux环境 2 在线或离线安装fluentd 3 运行fluentd服务 4 配置fluentd文件 5 重启fluentd然后查看fluentd的状态 6 fluent-plugin-mongo 插件安装 7 安装完后重启fluentd 8 测试 三扩展 1 fluentd安装过程问题解决…

Proxmox VE

Proxmox VE是一个系统,专门用作管理虚拟机 http://pve.proxmox.com/wiki/Downloads https://pve.proxmox.com/wiki/Category:HOWTO 安装 iso安装,就像安装ubuntu系统 1,install 2, 接下来是一个协议,选择我同意,然后下一步。 3, 填写root密码和管理员的联络邮箱 4, 填写主机名和本机网络,IP信息 (!!主机名开头不能相同,在做集群的时候会加不进去节点) 例:master.pev worker01.pev worker02.pev 系统启动后,系统会用第一个.之前作为主机名,如果相同,可能会发生冲突导致加不到集群节点 5, 安装完成reboot 访问: https://192.168.20.15:8006 到达登陆页面,使用root和密码登陆,可选择中文 也可以採用文字模式的 ssh 登入 proxmox 主機、 以 debian…