MySQL数据迁移工具的设计与实现
一、背景MySQL作为最流行的关系型数据库产品之一,当数据规模增大遭遇性能瓶颈时,最容易想到的解决方案就是分库分表。无论是进行水平拆分还是垂直拆分,第一步必然需要数据迁移与同步。由此可以衍生出一系列数据迁移过程中的需求:1.原本一张表迁移到单库多表(或多库多表),这是最基本的需求;2.原本单库多表(或多库多表)迁移到新的多库多表(因表设计不合理、数据规模增大等原因导致需要再次分库分表)3.新表与旧表的表结构可能不一致,如:类型表更(自增主键id由int改为bigint)、字段数量不一致(删减、增加)、字段名称变更等4.字段映射,如:旧表中的多个字段映射为新表的一个字段,或旧表中的一个字段映射为新表的多个字段5.增量数据的实时同步,以及当涉及表结构转换时增量部分(binlog)如何方便地实现同样的转换6.如何支持垂直拆分的数据迁移7.MySQL到NewSQL的迁移(如:TiDB、CockroachDB)8.异构数据源的实时迁移,如:MySQL到HBase、MongoDB(关于异构数据源的实时同步设计不在本文内容范围,
CSS 雪碧图应用
全景图web播放器样式要改,只拿到了一个雪碧图(前端一般,之前根本没用过雪碧图好吗o(╯□╰)o),一搜其实也挺简单的,这里简单介绍一下,先来看我们的图其实要想实现这种CSS抠图,只需要用到一个属性:background-position。但是使用之前可以先来理解一下下面的东西,div可以理解成一个矩形框,它的左上角是顶点,背景图片的顶点也是左上角,div加载背景图时,会把两个顶点重合,顶点的坐标是(0,0)。设置一下div的宽、高,让它和小图的宽、高一样就可以了!再来看看background-position属性,它有两个参数,分别是水平方向移动的像素、竖直方向移动的像素,都用负数表示。大图不动,div移动,也只能是向右、向下移动,只要记住这两个方向移动的像素都用负数表示就行了!因此,只要找到小图相对于大图左上角顶点的水平移动像素、竖直移动像素就可以了。小菜也不用什么专业工具,用截图就很方便,从大图左上角顶点开始截,到小图顶点那停下来,一看像素就差不多了,然后再调试调试,基本就搞定,来看一下我的实现
玩转npmscript自动化构建 支持ES6 支持POSTCSS
步骤3npmrundev这时会弹出浏览器默认index之后node会监控src下的所有文件包括jscsshtmljs文件夹下的js会自动通过babel转换成dist文件夹里的jslib文件夹默认是放一些js库不会通过babel转换只是复制到dist里的libcss文件夹里的css会自动通过postcss压缩并自动添加前缀进dist里的css文件夹另外你在src新建html文件都会受到监听都会复制进dist里的PS备注添加删除修改src里的文件一定要确保在开着npmrundev的监控下是不是很叼~这是1.0后续会继续的完善一下写的有点匆忙package.json{"name":"npm","version":"1.0.0","description":"","main":"index.js","scripts":{"css":"postcss-w./src/css/*.css-d./dist/css","http":"lite-server-c./http_conf
集中式日志分析平台
介绍为什么要分析日志.传统的Web开发中,日志可能并不被重视,只有应用出现问题后,才会适时性的去看一眼。而且日志的储存方式也很简单,直接写入一个文本文件或者扔到数据库中就了事了。这样对于单机应用来说没有什么不可以的,可是当系统架构分布式后,官网、论坛、社交、交易等各个大大小小的子系统越来越多,再加上操作系统、应用服务、业务逻辑等等,日志的管理与查看就越发的麻烦,面对大量的日志数据而且又是分布在各个不同的机器甚至不同的机房,如果我们还是按照传统的方式登录到某一台机器上去查看日志,然后再汇总起来,再做个跨机房的排序,那这样感觉就太糟糕了。所以一套集中式的实时日志分析平台就显得非常重要了,而一套日志分析平台至少要包括一下几个特点:收集,可以收集不同来源的日志,包括Web日志,请求日志,本地机器,跨机房机器等存储,稳定的存储日志信息并索引起来分析,支持各种层面的分析,而且可以以UI展示出来警告,根据日志内容进行不同错误级别的报警ELK协议栈其实市面上的日志分析产品很多,简单的Rsyslog,商业化的Splunk,开源的
程序员自学编程的5种方法,哪些基本工具必须掌握?
编程是报酬相当丰厚的行业,有不少的小伙伴对于编程是相当的感兴趣。如果你有仔细观察程序员身边的女朋友,一般都很漂亮,她们比较欣赏程序员的才华和有钱任性。程序员自学编程的5种方法,哪些基本工具必须掌握?如果刚毕业还很年轻,对编程感兴趣,不妨参考w3cschool分享的编程自学方法:0、做好心里准备编程之路是痛并快乐的旅程。程序员高薪,但也要踩很多坑,经历不少的挫折,如果你已经做好心理准备,天塌下来也要坚持下去。1、认认真真敲代码编程没有捷径,只有勤奋努力,你才能在编程领域有一片自己的新天地。比如你在w3cschool网站上学习PHP语言,学习PHP数组、PHP运算符、PHP函数等,有大量的编程实例,你可以通过这个实例依样画葫芦,老老实实敲一遍代码,运行代码,整个w3cschool官方的PHP课程代码敲一遍下来,至少已经掌握了绝大部分的PHP编程。程序员自学编程的5种方法,哪些基本工具必须掌握?如果是在零碎的时间,使用w3cschoolapp照样可以像游戏一样学习编程。程序员自学编程的5种方法,哪些基本工具
从美团程序员的灾难,看美团外卖自动化运维体系建设
12月7日中午,有网友发微博称,外卖订单付款出现延迟,部分用户付款后系统仍提示尚未付款;团购页面内容也无法正常显示。美团服务器出现大面积崩溃。这是一个上了热搜,并让大家吃不上午饭的Bug。饭点时间,遇到这种事情,也真的糟心了!而且,这种情况还不是个例,在微博上一搜,反映美团外卖这种情况的还真不少。并且有人看到显示支付不成功,连续尝试付款了好多次,但是钱出去了,却既没有下成单,也没有退款。想找美团外卖的客服咨询情况,但是却一直联系不上,无论是网上客服还是电话客服。不过,12:16分美团微博回复:订单问题已修复,订单问题已修复,订单问题已修复。12:28分APP仍然处于宕机状态。下午12:43分,美团在微博上回应:经紧急修复后,现已陆续恢复,重复支付的订单会原路退回,系统故障期间未完成服务的订单,用户可以无责取消退款。随后,部分重复下单的网友已经获得了退款和美团的致歉红包。此次事故对美团的工程师们来说,简直是年度灾难,很可能直接导致美团的程序员们错失丰厚年终奖的机
DataWorks 数据集成与开发实践
摘要:摘要:在2017杭州云栖大会阿里云数加DataWorks专场上,阿里云产品专家代俊峰(花名:普阳)为大家分享了如何借助阿里云数加DataWorks工具进行数据集成和开发,分享了如何借助DataWorks实现从数据处理手工作坊到数据加工工厂的跨越转变。摘要:在2017杭州云栖大会阿里云数加DataWorks专场上,阿里云产品专家代俊峰(花名:普阳)为大家分享了如何借助阿里云数加DataWorks工具进行数据集成和开发,分享了如何借助DataWorks实现从数据处理手工作坊到数据加工工厂的跨越转变。本文内容根据嘉宾演讲视频以及PPT整理而成。从整体的角度来看,数据的开发主要包括以下五个环节:1.总体架构2.数据集成3.数据建模4.数据开发5.运维调度一、总体架构其实DataWorks在2009年9月份的时候就已经开始研发了,当时还是基于Hadoop的体系进行研发的。谈到为什么要研发DataWorks这样的一个工具,其实是因为在没有DataWorks工具的时候,很多数据的开发工作是非常痛苦的
微服务架构的优势与不足
摘要:微处理架构——处理复杂事物许多公司,比如Amazon、eBay和NetFlix,通过采用微处理结构模式解决了上述问题。其思路不是开发一个巨大的单体式的应用,而是将应用分解为小的、互相连接的微服务。微服务正在博客、社交媒体讨论组和会议演讲中获得越来越多的关注,在Gartner的2014HypeCycle上它的排名非常靠前。同时,软件社区中也有不少持怀疑论者,认为微服务不是什么新东西。Naysayers认为这就是SOA架构的重新包装。然而,尽管存在着不同的争论,微服务架构模式却正在为敏捷部署以及复杂企业应用实施提供巨大的帮助。首先我们看看为什么要使用微服务。开发单体式应用假设你正准备开发一款与Uber和Hailo竞争的出租车调度软件,经过初步会议和需求分析,你可能会手动或者使用基于Rails、SpringBoot、Play或者Maven的生成器开始这个新项目,它的六边形架构是模块化的,架构图如下:应用核心是业务逻辑,由定义服务、域对象和事件的模块完成。围绕着核心的是与外界打交道的适配器。适配器包括数据库访
微服务-API熔断原理
伴随微服务,出现了很多新鲜的名词,其实剥去外衣并没有那么高大上。今天要谈到的,叫做”熔断”,一个典型的开源实现是Hystrix(JAVA实现)。背景一个分布式系统中,服务间互相调用错综复杂,假设某个基础服务宕机,那么就会导致若干上游调用方出现访问超时,进而引起上游重试,导致宕机的基础服务遭受到数倍的流量放大,更加无法恢复服务。这种恶劣的情况并不会就此结束,上游因为调用基础服务超时而变慢,导致上游的上游超时…异常向上蔓延,最终导致整个分布式系统”雪崩”。“熔断”就是为了避免”雪崩”而生的,它的思路是在调用方增加一种”避让”机制,当下游出现异常时能够停止(熔断)对下游的继续请求,当等待一段时间后缓慢放行部分的调用流量,并当这部分流量依旧正常的情况下,彻底解除”熔断”状态。听起来,流程不算复杂吧?整个流程图如下,看不懂没关系,继续往下阅读吧。健康统计判断下游正常的前提是统计最近一段时间内,下游的调用成功率,因此需要一个健康统计模块,记录最近N秒内的总请求数,成功请求数,失败请求数,是由业务调用后将结果打点到健康统计模块中。
2018年薪资最高的15个技术岗
行政人员,管理人员,移动开发人员和头衔中拥有“架构师”一词的人员都处于IT行业薪资水平的前列。随着经济的蓬勃发展,企业IT方面的预算和薪资不断增加。来自Spiceworks最新的2018年IT行业报告显示,87%的公司预计他们明年的技术预算将增大或保持不变。平均而言,企业预计技术预算将增长19%。此外,93%的企业正在计划增加IT员工数量或保持原有员工数量水平。由于对IT人才的需求如此旺盛,许多技术专业人士的薪资都在提升。但哪个岗位能赚得最多呢?人力资源公司RobertHalf已经更新了2018年技术和IT薪资指南,预测了2018年薪水最高的15大科技工作。1.首席信息官(ChiefInformationOfficer)IT组织图顶部的人通常获得最高的报酬,这并不让人吃惊。对于2018年,RobertHalf预测,首席信息官(CIO)的薪酬范围从第25百分位数的170,500美元到第95百分位数的287,000美元,中位数的薪酬将在202,500美元左右。相比之下,RobertHalf报道的2017年的CI
Mysql实现企业级数据库主从复制架构实战
场景公司规模已经形成,用户数据已成为公司的核心命脉,一次老王一不小心把数据库文件删除,通过mysqldump备份策略恢复用了两个小时,在这两小时中,公司业务中断,损失100万,老王做出深刻反省,公司也因此对于数据库的性能和可靠性提出更高要求。要求对数据库进行改造,使其承载力进行提升,故障修复时间减少,有没有能实现的方案呢?数据库常遇到的问题一、性能问题1、向上拓展scaleup:针对单台服务器,提高服务器的硬件性能,比如:内存,cpu等,个体本身容易达到极限2、向外拓展scaleout:多台服务器形成集群,共同完成一件事情二、可用性问题1、数据库服务中断2、误操作数据损坏3、硬件故障4、数据库升级测试遭遇bug5、黑客攻击数据库高可用技术说明高可用架构对于互联网服务基本是标配,无论是应用服务还是数据库服务都需要做到高可用。虽然互联网服务号称7*24小时不间断服务,但多多少少有一些时候服务不可用,比如某些时候网页打不开,百度不能搜索或者无法发微博,发微信等。一般而言,衡量高可用做到什么程度可
Webpack3.0小案例躺坑资源处理、服务器启动和打包优化
webpack3.0小案例系列,抛砖引玉,希望大家多提意见,一起学习:webpack3.0小案例webpack初体验Webpack3.0小案例躺坑css处理与ES6编译前两节文章我们手把手搭建了一个基于webpack的前端开发工程环境,并讲解了一些常用插件及loader的基本用法,包括代码分割、模板读取、文件清理、ES6编译及css处理等等,这篇文章我继续在前两篇的基础上,继续探讨:图片处理,包括file-loader、url-loader、image-webpack-loader的用法,file-loader和url-loader的区别等。服务端启动webpack-dev-server,包括手动搭建测试服务端以及运用webpack建立webpackServer和一些注意事项等。webpack打包优化,包括代码压缩,公共代码提取等配置。image图片处理webpack对图片的处理常用的有url-loader、file-loader、image-webpack-loader,各个加载器都在打包过程中有着自己的功能职责,在探讨
node.js创建子进程
node本身为单进程,并使用驱动模式处理并发,为了解决单进程在多核cpu上的资源浪费,node提供了cluster和child_process模块来创建多个子进程。每个子进程总带有三个流对象:child.stdin、child.stdout、child.stderr。他们可能会共享父进程的stdio流。这里我们先介绍利用child_process模块中exec、spawn、fork三个方法对子进程的操作。建立node-childProcess文件,在其中创建node-childPro.js文件。其中就一行代码如下:console.log("进程"+process.argv[2]+"执行。");//换成下面的查看process.argv//console.log("进程"+process.argv+"执行。");exec()方法在node-childProcess文件中新建node-childPro-exec.js文件,其中代码如下:constfs=require('fs');constchild_pro
基于laravel5.5和vue2开发的个人博客
本项目使用PHP框架Laravel5.5进行开发。系统后台使用了Vuejs+Element-UI实现完全的前后端分离。项目地址:http://phpjourney.xin(正在备案,暂时可通过http://47.94.11.137访问)GitHub地址:https://github.com/Johnson19900110/phpJourney功能特性分类管理标签管理文章管理评论管理支持markdown语法部署/安装需要在系统上安装了基本的PHP运行环境、PHP包管理工具composer、Nodejs进行前端资源打包npm。克隆源代码gitclonehttps://github.com/Johnson19900110/phpJourney安装php拓展包依赖composerinstall生成配置文件cp.env.example.env然后根据自己的配置信息去配置文件生成keyphpartisankey:generate数据库迁移phpartisanmigrate数据库填充phpartisand
修复WebSocket认证泄漏用户信息漏洞
背景在对子公司送检的APP渗透测试中,经过反编译后,发现APP在连接websocket服务器接收消息时使用用户名,密码的形式进行认证。并且将明文的用户名,密码信息写在APP代码中。如下图所示修复建议ws协议认证建议通过生成token的机制验证,如:@EnableWebSocketMessageBrokerpublicclassWSContrallerextendsAbstractWebSocketMessageBrokerConfigurer{@OverridepublicvoidregisterStompEndpoints(StompEndpointRegistryregistry){registry.addEndpoint("/endPoint").addInterceptors(newHandshakeInterceptor(){@OverridepublicvoidafterHandshake(ServerHttpRequestrequest,ServerHttpResponseresponse,W
将ZIP文件添加到程序集资源文件然后在运行时解压文件
今天做安装打包程序研究,之前同事将很多零散的文件发布成一个安装文件夹给用户,这样体验不好,我希望将所有文件打包成一个.net程序,运行此程序的时候自解压然后执行后续的安装步骤。解决过程:1,将所有零散文件使用WinRAR工具,打包成一个ZIP格式文件,比如SetupRes.zip2,新建一个控制台或者WinForms程序项目作为“打包项目”;3,将SetupRes.zip文件放到打包程序项目的根目录下面,选择此文件,属性-》嵌入的资源;4,添加如下代码:classProgram{staticvoidMain(string[]args){//解压嵌入式资源示例stringcurrNamespace="ConsoleApp1";stringfileName="SetupRes.zip";stringresourceName=string.Format("{0}.{1}",currNamespace,fileName);Streamso=Assembly.GetEntryAssembly()
C#Winform设计的通用标签设计器
技术看点PropertyGrid的使用自定义控件的使用对象序列化成XMLGDI+Windows驱动打印前言是的,一不小心把公司名称透露了。索性帮公司打一下广告。公司(上海易溯信息科技)是中国奶制品行业追溯生产管理方面的龙头。最近也是准备把业务拓展到东南亚地区,筹备走出国门。由于老系统的Windows驱动打印部分出现打印速度不够快,绘图精度不高,标签设计器简陋等问题。于是开始了重构,当然只是参考老程序的实现方式,程序是重新实现的。程序是用很零散的空闲时间写的,效果还需要在项目中实际运用,进行检验。设计由于一发现不熟悉的技术点就上网搜索,其实大部分技术难题都是搜索解决的。这里就不申明版权问题了,“如有雷同,纯属意外!”。哈哈运行时读取模板数据,模板里标签的元素的设计设计时可视化自定义控件的设计类图编码实现1)PropertyGrid的使用代码都来自网络,主要就是属性名使用中文。使用英文对实施的电器工程师来说不太友好。publicdelegatevoidPropertyChanged(objectValu
青否云 — 小程序待办事项
wxapp-demo青否云小程序demo下载地址:https://github.com/qingful/wxapp-demo官网http://cloud.qingful.com演示https://qingful.github.io/jquery-demo/index.html账号:13253522080密码:mmmmmm使用登录青否云创建应用数据设置。创建数据表。创建数据表user,引擎和校对默认即可。点击显示结构,添加字段phone,类型选择bigint,长度值为11,其余默认。添加字段password,类型选择text,其余默认。创建数据表todos,引擎和校对默认即可。点击显示结构,添加字段content,类型选择text,其余默认。添加字段user_id,类型选择int,其余默认。添加字段status,类型选择int,其余默认。权限设置。创建密钥,名称Authorization,密钥随便设置。创建分组,分别创建public和home分组。组权限,创建home的组权
引用类型和值类型,以及引用传递和值传递
那么执行的结果呢?amount的数量并没有发生变化。为什么没有变呢?这是最入门的知识,通常的解释是:amount是int类型,int是值类型,所以当它作为参数时,传递给方法的是它的一个副本(复制品),因此方法中改变的是它的副本的值,amount本身并没有改变。OK,这完全没有问题。而且,如果想改变的值,就需要加ref关键字,如下所示:staticvoidAddTV(refintamount){amount++;Console.WriteLine("方法中,amount="+amount);}大家自己跑一下,看看结果有什么不一样。这叫做参数的引用传递。这是最基础的知识,非常清晰。好的,接着,C#是面向对象的语言嘛,我们要引入一个对象。publicclassHouse{publicintTVAmount{get;set;}}然后,我们把House对象作为参数传递,值传递,不带ref的。如下所示:staticvoidAddTV(Househouse){house.
vue-loader 源码解析系列之 selector
笔者系vue-loader贡献者之一(#16)前言vue-loader源码解析系列之一,阅读该文章之前,请大家首先参考大纲vue-loader源码解析系列之整体分析selector做了什么constpath=require('path')constparse=require('./parser')constloaderUtils=require('loader-utils')module.exports=function(content){//略constquery=loaderUtils.getOptions(this)||{}//略constparts=parse(content,filename,this.sourceMap,sourceRoot,query.bustCache)letpart=parts[query.type]//略this.callback(null,part.content,part