php 怎么过滤n,Python爬虫和数据分析需要哪些知识储备?
数据是决策的原材料,高质量的数据价值不菲,如何挖掘原材料成为互联网时代的先驱,掌握信息的源头,就能比别人更快一步。
大数据时代,互联网成为大量信息的载体,机械的复制粘贴不再实用,不仅耗时费力还极易出错,这时爬虫的出现解放了大家的双手,以其高速爬行、定向抓取资源的能力获得了大家的青睐。
爬虫变得越来越流行,不仅因为它能够快速爬取海量的数据,更因为有python这样简单易用的语言使得爬虫能够快速上手。
对于小白来说,爬虫可能是一件非常复杂、技术门槛很高的事情,但掌握正确的方法,在短时间内做到能够爬取主流网站的数据,其实非常容易实现,但建议你从一开始就要有一个具体的目标。
在目标的驱动下,你的学习才会更加精准和高效。那些所有你认为必须的前置知识,都是可以在完成目标的过程中学到的。
基于python爬虫,我们整理了一个完整的学习框架:
筛选和甄别学习哪些知识,在哪里去获取资源是许多初学者共同面临的问题。
接下来,我们将学习框架进行拆解,分别对每个部分进行详细介绍和推荐一些相关资源,告诉你学什么、怎么学、在哪里学。
爬虫简介爬虫是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。
这个定义看起来很生硬,我们换一种更好理解的解释:
我们作为用户获取网络数据的方式是浏览器提交请求->下载网页代码->解析/渲染成页面;而爬虫的方式是模拟浏览器发送请求->下载网页代码->只提取有用的数据->存放于数据库或文件中。
爬虫与我们的区别是,爬虫程序只提取网页代码中对我们有用的数据,并且爬虫抓取速度快,量级大。
随着数据的规模化,爬虫获取数据的高效性能越来越突出,能够做的事情越来越多:
市场分析:电商分析、商圈分析、一二级市场分析等市场监控:电商、新闻、房源监控等商机发现:招投标情报发现、客户资料发掘、企业客户发现等进行爬虫学习,首先要懂得是网页,那些我们肉眼可见的光鲜亮丽的网页是由HTML、css、javascript等网页源码所支撑起来的。
这些源码被浏览器所识别转换成我们看到的网页,这些源码里面必定存在着很多规律,我们的爬虫就能按照这样的规律来爬取需要的信息。
无规矩不成方圆,Robots协议就是爬虫中的规矩,它告诉爬虫和搜索引擎哪些页面可以抓取,哪些不可以抓取。
通常是一个叫作robots.txt的文本文件,放在网站的根目录下。
轻量级爬虫“获取数据——解析数据——存储数据”是爬虫的三部曲,大部分爬虫都是按这样的流程来进行,这其实也是模拟了我们使用浏览器获取网页信息的过程。
1、获取数据
爬虫第一步操作就是模拟浏览器向服务器发送请求,基于python,你不需要了解从数据的实现,HTTP、TCP、IP的网络传输结构,一直到服务器响应和应达的原理,因为python提供了功能齐全的类库来帮我们完成这些请求。
Python自带的标准库urllib2使用的较多,它是python内置的HTTP请求库,如果你只进行基本的爬虫网页抓取,那么urllib2足够用。
Requests的slogen是“Requests is the only Non-GMO HTTP library for Python, safe for humanconsumption”,相对urllib2,requests使用起来确实简洁很多,并且自带json解析器。
如果你需要爬取异步加载的动态网站,可以学习浏览器抓包分析真实请求或者学习Selenium来实现自动化。
对于爬虫来说,在能够爬取到数据地前提下当然是越快越好,显然传统地同步代码不能满足我们对速度地需求。
(ps:据国外数据统计:正常情况下我们请求同一个页面 100次的话,最少也得花费 30秒,但使用异步请求同一个页面 100次的话,只需要要 3秒左右。)
aiohttp是你值得拥有的一个库,aiohttp的异步操作借助于async/await关键字的写法变得更加简洁,架构更加清晰。使用异步请求库进行数据抓取时,会大大提高效率。
你可以根据自己的需求选择合适的请求库,但建议先从python自带的urllib开始,当然,你可以在学习时尝试所有的方式,以便更了解这些库的使用。
推荐请求库资源:
urllib2文档:https://dwz.cn/8hEGdsqDrequests文档 :http://t.cn/8Fq1aXrselenium文档:https://dwz.cn/DlL9j9hfaiohttp文档:https://dwz.cn/hvndbuB42、解析数据
爬虫爬取的是爬取页面指定的部分数据值,而不是整个页面的数据,这时往往需要先进行数据的解析再进行存储。
从web上采集回来的数据的数据类型有很多种,主要有HTML、 javascript、JSON、XML等格式。解析库的使用等价于在HTML中查找需要的信息时时使用正则,能够更加快捷地定位到具体的元素获取相应的信息。Css选择器是一种快速定位元素的方法。Pyqurrey使用lxml解析器进行快速在xml和html文档上操作,它提供了和jQuery类似的语法来解析HTML文档,支持CSS选择器,使用非常方便。
Beautiful Soup是借助网页的结构和属性等特性来解析网页的工具,能自动转换编码。支持Python标准库中的HTML解析器,还支持一些第三方的解析器。
Xpath最初是用来搜寻XML文档的,但是它同样适用于HTML文档的搜索。它提供了超过 100 个内建的函数。这些函数用于字符串值、数值、日期和时间比较、节点和 QName 处理、序列处理、逻辑值等等,并且XQuery和XPointer都构建于XPath基础上。
Re正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。个人认为前端基础比较扎实的,用pyquery是最方便的,beautifulsoup也不错,re速度比较快,但是写正则比较麻烦。当然了,既然用python,肯定还是自己用着方便最好。
推荐解析器资源:
pyquery https://dwz.cn/1EwUKsEGBeautifulsoup http://t.im/ddfvxpath教程 http://t.im/ddg2re文档 http://t.im/ddg63、数据存储
当爬回来的数据量较小时,你可以使用文档的形式来储存,支持TXT、json、csv等格式。但当数据量变大,文档的储存方式就行不通了,所以掌握一种数据库是必须的。
Mysql 作为关系型数据库的代表,拥有较为成熟的体系,成熟度很高,可以很好地去存储一些数据,但在在海量数据处理的时候效率会显著变慢,已然满足不了某些大数据的处理要求。
MongoDB已经流行了很长一段时间,相对于MySQL ,MongoDB可以方便你去存储一些非结构化的数据,比如各种评论的文本,图片的链接等等。你也可以利用PyMongo,更方便地在Python中操作MongoDB。因为这里要用到的数据库知识其实非常简单,主要是数据如何入库、如何进行提取,在需要的时候再学习就行。
Redis是一个不折不扣的内存数据库,Redis 支持的数据结构丰富,包括hash、set、list等。数据全部存在内存,访问速度快,可以存储大量的数据,一般应用于分布式爬虫的数据存储当中。
推荐数据库资源:
mysql文档 https://dev.mysql.com/doc/mongoDB文档 https://docs.mongodb.com/redis文档 https://redis.io/documentation/工程化爬虫掌握前面的技术你就可以实现轻量级的爬虫,一般量级的数据和代码基本没有问题。
但是在面对复杂情况的时候表现不尽人意,此时,强大的爬虫框架就非常有用了。
首先是出身名门的Apache顶级项目Nutch,它提供了我们运行自己的搜索引擎所需的全部工具。支持分布式抓取,并有Hadoop支持,可以进行多机分布抓取,存储和索引。另外很吸引人的一点在于,它提供了一种插件框架,使得其对各种网页内容的解析、各种数据的采集、查询、集群、过滤等功能能够方便的进行扩展。
其次是GitHub上众人star的scrapy,scary是一个功能非常强大的爬虫框架。它不仅能便捷地构建request,还有强大的 selector 能够方便地解析 response,然而它最让人惊喜的还是它超高的性能,让你可以将爬虫工程化、模块化。学会scrapy,你可以自己去搭建一些爬虫框架,你就基本具备爬虫工程师的思维了。
最后Pyspider作为人气飙升的国内大神开发的框架,满足了绝大多数Python爬虫的需求 —— 定向抓取,结构化化解析。它能在浏览器界面上进行脚本的编写,功能的调度和爬取结果的实时查看,后端使用常用的数据库进行爬取结果的存储等。其功能强大到更像一个产品而不是一个框架。这是三个最有代表性的爬虫框架,它们都有远超别人的有点,比如Nutch天生的搜索引擎解决方案、Pyspider产品级的WebUI、Scrapy最灵活的定制化爬取。建议先从最接近爬虫本质的框架scary学起,再去接触人性化的Pyspider,为搜索引擎而生的Nutch。
推荐爬虫框架资源:
Nutch文档 http://nutch.apache.org/scary文档 https://scrapy.org/pyspider文档 http://t.im/ddgj反爬及应对措施爬虫像一只虫子,密密麻麻地爬行到每一个角落获取数据,虫子或许无害,但总是不受欢迎的。因为爬虫技术造成的大量IP访问网站侵占带宽资源、以及用户隐私和知识产权等危害,很多互联网企业都会花大力气进行“反爬虫”。
你的爬虫会遭遇比如被网站封IP、比如各种奇怪的验证码、userAgent访问限制、各种动态加载等等。
常见的反爬虫措施有:
通过Headers反爬虫基于用户行为反爬虫基于动态页面的反爬虫字体反爬.....遇到这些反爬虫的手段,当然还需要一些高级的技巧来应对,控制访问频率尽量保证一次加载页面加载且数据请求最小化,每个页面访问增加时间间隔;
禁止cookie可以防止可能使用cookies识别爬虫的网站来ban掉我们;
根据浏览器正常访问的请求头对爬虫的请求头进行修改,尽可能和浏览器保持一致等等。
往往网站在高效开发和反爬虫之间会偏向前者,这也为爬虫提供了空间,掌握这些应对反爬虫的技巧,绝大部分的网站已经难不到你了。
分布式爬虫爬取基本数据已经没有问题,还能使用框架来面对一写较为复杂的数据,此时,就算遇到反爬,你也掌握了一些反反爬技巧。
你的瓶颈会集中到爬取海量数据的效率,这个时候相信你会很自然地接触到一个很厉害的名字:分布式爬虫。
分布式这个东西,听起来很恐怖,但其实就是利用多线程的原理将多台主机组合起来,共同完成一个爬取任务,需要你掌握 Scrapy +Redis+MQ+Celery这些工具。
Scrapy 前面我们说过了,用于做基本的页面爬取, Redis 则用来存储要爬取的网页队列,也就是任务队列。
scarpy-redis就是用来在scrapy中实现分布式的组件,通过它可以快速实现简单分布式爬虫程序。
由于在高并发环境下,由于来不及同步处理,请求往往会发生堵塞,通过使用消息队列MQ,我们可以异步处理请求,从而缓解系统的压力。
RabbitMQ本身支持很多的协议:AMQP,XMPP, SMTP,STOMP,使的它变的非常重量级,更适合于企业级的开发。
Scrapy-rabbitmq-link是可以让你从RabbitMQ 消息队列中取到URL并且分发给Scrapy spiders的组件。Celery是一个简单、灵活且可靠的,处理大量消息的分布式系统。支持 RabbitMQ、Redis 甚至其他数据库系统作为其消息代理中间件, 在处理异步任务、任务调度、处理定时任务、分布式调度等场景表现良好。
所以分布式爬虫只是听起来有些可怕,也不过如此。当你能够写分布式的爬虫的时候,那么你可以去尝试打造一些基本的爬虫架构了,实现一些更加自动化的数据获取。
推荐分布式资源:
scrapy-redis文档 http://t.im/ddgkscrapy-rabbitmq文档 http://t.im/ddgncelery文档 http://t.im/ddgr你看,通过这条完整的学习路径走下来,爬虫对你来说根本不是问题。
因为爬虫这种技术,既不需要你系统地精通一门语言,也不需要多么高深的数据库技术。
解锁每一个部分的知识点并且有针对性的去学习,走完这一条顺畅的学习之路,你就能掌握python爬虫。
以上便是本文内容,有帮助点赞喜欢支持一下吧。。
如何学习SEO?
SEO需要的技术真的太多了。没接触过和接触过和提升过。所知道的技术真的天差地别。
首先说一下基础的SEO知识把。
入门级SEO需要掌握知识及技术:html css DIV 各种CMS 的运用及修改发现很多SEO连入门级需要的技术知识都掌握不全。
说下技术包含应用场景 HTML这个是应用较多和频繁的。最基本的 TDK meta元标记 og属性 link标签>>注释 A标签 alt标签 H标签 strong标签 nofollow这些都是html技术的支撑里面Css 这个和html是一个包含关系。 比如前提到 H标签 strong 等Css用于定义样式文件 所有样式有关的 比如字体样式 颜色 加粗 H标签定义标题大小的。
很多大概讲的话这些就是和SEO相关的。DIV 这是网站布局里面块 的应用。主要是html里面布局的部分。
CMS运用 这个是重点了。 大部分的SEO 优化的站点使用的是开源的CMS 这里面企业站的话 以织梦和帝国为最。当然还有其他的但是最多的是这二类。这些CMS有很多功能是对于SEO很有好处。看你自己怎么用。能否熟练使用。
进阶级SEO需要掌握知识及技术:数据分析技术 CMS功能开发 JS python定制功能 正则 采集和爬虫数据分析;基本数据分析利用比如EXC表格CMS功能开发 需要 PHP 语言的熟悉 织梦和帝国都是PHP的。如增加文章发布后自动主动推送给百度熊掌号。
可以在网上找到源码你还是的修改和利用。 这里有人会说找程序员,交给程序员解决。没错如果公司有程序员是可以交个他们解决。但是如果我们知道这方面的知识在沟通和写需求的时候描述是否效率会提升包括沟通成本。而不是一点程序思维都没有瞎JB提需求。
JS :基本的了解和应用就可以了。 比如跳转 如何用JS 作出302跳转效果 PC端跳转移动端 代码跳转适配 这里面水很深。黑帽很多东西在JS里面都能找到亮点的特色。404跳转 判断来访跳转。 发现这里面举例跳转比较多。
因为缺少在Seo实战中这个JS效果用的比较多。 而跳转有很多种。打个比方写一个最简单JS跳转效果。当网站页面被克隆时 如何挽回流量?
分析:克隆页面 那么就会包含页面所有的元素 如果我写一个JS 用来判断当前页面url 是否为自己本身的url 实现跳转是否就能把这一部分流量搞回来? 这个代码我就不放放出来了网上很多也很简单。
判断当前url是否包含"XXX" 不包含就跳到'XXX' 如果克隆者并没有过滤掉JS的话。 那么当用户访问克隆页面触发了JS 就会跳转到被克隆的页面 这是不是流量就回来了。
PYthon定制功能 这个就很大了。 比如一些日常的SEO 操作查排名 查收录 查导出url 分析爬虫日志推送不收录url 到百度 等等。。很多具体根据需求。所以作为一个进阶SEO 你需要掌握python 正则 这个应用场景就太多了。
移动适配规则提交 里面就用正则带适配url里面各层级的参数 同时python 里面识别很多都有正则 包括采集里面对于url 识别里面很多正则。采集和爬虫 这个包含正则截取 正则替换 scarpy 等。应用场景里面基本是大数据采集。
大神级SEO需要掌握知识及技术:数据分析模型建立与拓展 PYthon自动化 shell分析 产品模型与需求。
这个就能难说叻。毕竟我也是在学习和进步中。和接触到的大神了解来说发现了一些技术,肯定还有一些隐藏的属性和技能没了解到。数据分析 是一个大的东西。每个SEO大神对于SEO数据分析 都有自己模型和维度。同时在做数据分析的时候会涉及到很多技术。
比如python shell 等 甚至很多我也不了解的技术。python自动化 这个最近5118创始人李昊在最近分享中反复提到这个词。 李昊是技术出身,所以对于SEO 有着关于自动化、程序化、批量化执行执念。把一些SEO实战所需要的一些数���或者功能程序化自动化批量化。
shell 也是用来做数据分析,用来剥离数据分析数据中间可以结合python 用来获得需要的数据和效果。产品模型与需求 做SEO都到大神级别了那么对于做产品或者做一些提升流量需求的产品和需求时也是需要了解和应用的。到了这一步 我估计已经有一大批SEO 哭死在路上。因为可能他们做了好几年可能还是在入门级SEO徘徊。当你和更多大神级SEO交流时候你就会发现技术原理技术思维无处不在。越是学习的越多了解的越多,发现自己懂得越少进步的空间越大。
祝好!希望题主不要被我这一大堆关于SEO技术回答给弄懵逼。一步一步来,一步一个脚印。回头看看 自己的学习进步过程真的太有意义了。
欢迎大佬拍砖指正,欢迎新人交流讨论。欢迎同行和围观群众点赞、收藏、评论。
怎么自学数据分析?
这是一份数据分析师的入门指南,它包含七周的内容,Excel、数据可视化、数据分析思维、数据库、统计学、业务、以及Python。
每一周的内容,都有两到三篇文章细致讲解,帮助新人们快速掌握。这七周的内容刚好涵盖了一位数据分析师需要掌握的基础体系,也是一位新人从零迈入数据大门的知识手册。
第一周:Excel
每一位数据分析师都脱离不开Excel。
它是日常工作中最常用的工具,如果不考虑性能和数据量,它可以应付绝大部分分析工作。虽然现在机器学习满地走,Excel依旧是无可争议的第一工具。
Excel的学习分为两个部分。
掌握各类功能强大的函数,函数是一种负责输入和输出的神秘盒子。把各类数据输入,经过计算和转换输出我们想要的结果。
在SQL,Python以及R中,函数依旧是主角。掌握Excel的函数有助于后续的学习,因为你几乎在编程中能找到名字一样或者相近的函数。
在「数据分析:常见的Excel函数全部涵盖在这里了」中,介绍了常用的Excel函数。
清洗处理类:trim、concatenate、replace、substitute、left/right/mid、len/lenb、find、search、text
关联匹配类:lookup、vlookup、index、match、row、column、offset
逻辑运算类:if、and、or、is系列
计算统计类:sum/sumif/sumifs、sumproduct、count/countif/countifs、max、min、rank、rand/randbetween、averagea、quartile、stdev、substotal、int/round
时间序列类:year、month、weekday、weeknum、day、date、now、today、datedif
搜索能力是掌握Excel的不二窍门,工作中的任何问题都是可以找到答案。
第二部分是Excel中的工具。
在「数据分析:Excel技巧大揭秘」教程,介绍了Excel最具性价比的几个技巧。包括数据透视表、格式转换、数组、条件格式、自定义下拉菜单等。正是这些工具,才让Excel在分析领域经久不衰。
在大数据量的处理上,微软提供了Power系列,它和Excel嵌套,能应付百万级别的数据处理,弥补了Excel的不足。
Excel需要反复练习,实战教程「数据分析:手把手教你Excel实战」,它通过网络上抓取的数据分析师薪资数据作为练习,总结各类函数的使用。
除了上述要点,下面是附加的知识点,铺平数据分析师以后的道路。
了解单元格格式,数据分析师会和各种数据类型打交道,包括各类timestamp,date,string,int,bigint,char,factor,float等。
了解数组,以及相关应用(excel的数组挺难用),Python和R也会涉及到 list,是核心概念之一。
了解函数,深入理解各种参数的作用。它会在学习Python中帮助到你。
了解中文编码,UTF8、GBK、ASCII,这是数据分析师的坑点之一。
第二周:数据可视化
数据分析界有一句经典名言,字不如表,表不如图。
数据可视化是分析的常用技巧之一,不少数据分析师的工作就是通过图表观察和监控数据。首先了解常用的图表:
Excel的图表可以100%绘制上面的图形,但这只是基础。
在「数据可视化:你想知道的经典图表全在这」中介绍了各类数据分析的经典图表,除了趋势图、直方图,还包括桑基图、空间图、热力图等额外的类型。
数据可视化不是图表的美化,而是呈现数据的逻辑之美,是揭示数据的内在关联。了解图表的维度和适用场景,比好看更重要。比如桑吉图就是我一直推崇的图表,它并不知名,但是它能清晰的揭露数据内在状态的变化和流向。案例是用户活跃状态的趋势。
Excel的图表操作很傻瓜化,其依旧能打造出一份功能强大的可视化报表。「数据可视化:教你打造升职加薪的报表」教给大家常用的Excel绘图技巧,包括配色选取,无用元素的剔除、辅助线的设立、复合图表等方法。
Excel图表的创造力是由人决定的,对数据的理解,观察和认知,以及对可视化的应用,这是一条很长的道路。
图表是单一的,当面板上绘制了多张图表,并且互相间有关联,我们常称之为Dashboard仪表盘。
上图就是用分析师薪资数据为数据源绘制的Dashboard,比单元格直观不少。我们常常把绘制这类Dashboard的工具叫做BI。
BI(商业智能)主要有两种用途。一种是利用BI制作自动化报表,数据类工作每天都会接触大量数据,并且需要整理汇总,这是一块很大的工作量。这部分工作完全可以交给BI自动化完成,从数据规整、建模到下载。
另外一种是使用其可视化功能进行分析,它提供比Excel更丰富的交互功能,操作简单,而且美观,如果大家每天作图需要两小时,BI能缩短大半。
在「数据可视化:手把手打造BI」教程中,以微软的PowerBI举例,教大家如何读取数据,规整和清洗数据,绘制图表以及建立Dashboard。最后的成果就是上文列举的分析师案例。
BI还有几个核心概念,包括OLAP,数据的联动,钻取,切片等,都是多维分析的技巧,也是分析的核心方法之一。
后续的进阶可视化,将和编程配合。因为编程能够提供更高效率和灵活的应用。而BI也是技术方向的工具,了解技术知识对应用大有帮助。
第三周:数据分析思维数据分析能力的高低,不以工具和技巧决定,而以分析思维决定。
在一场战争中,士兵装备再好的武装,进行再严苛的训练,若是冲锋的方向错了,那么迎接他们的唯有一败涂地。
分析思维决定一场「数据战争」中的冲锋方向。只有先养成正确的分析思维,才能使用好数据。
既然是思维,它就倾向于思考的方式,Excel函数学会了就是学会,分析则不同。大多数人的思维方式都依赖于生活和经验做出直觉性的判断,以「我觉得我认为」展开,好的数据分析首先要有结构化的思维。
麦肯锡是其中领域的佼佼者,创建了一系列分析框架和思维工具。最典型地莫过于金字塔思维。
这篇文章简述了该思维的应用,「快速掌握麦肯锡的分析思维」。你能学会结构化思考,MECE原则,假设先行,关键驱动等方法论。
除此以外,还有SMART、5W2H、SWOT、4P4C、六顶思考帽等,这些都是不同领域的框架。框架的经典在于,短时间内指导新人如何去思考,它未必是最好的,但一定是性价比最优的。数据分析思维,是分析思维的引申应用。再优秀的思考方式,都需要佐证和证明,数据就是派这个用处的,「不是我觉得,而是数据证明」。
现代管理学之父彼得·德鲁克说过一句很经典的话:如果你不能衡量它,那么你就不能有效增长它。如果把它应用在数据领域,就是:如果你不能用指标描述业务,那么你就无法有效增长它。每一位数据分析师都要有指标体系的概念,报表也好,BI也好,即使机器学习,也是围绕指标体系建立的。
下图就是一个典型的指标体系,描述了用户从关注产品、下载、乃至最后离开的整个环节。每一个环节,都有数据及指标以查询监控。
不同业务背景需要的指标体系不同,但有几个建立指标的通用准则。这篇文章深入介绍了「如何建立数据分析的思维框架」。你将区分什么是好指标、什么是坏指标、比率和比例、指标的结构、指标设立的维度等概念。
数据分析不是一个结果,而是一个过程。几乎所有的分析,最终目的都是增长业务。所以比分析思维更重要的是驱动思维落地,把它转化为成果。
数据分析思维是常年累月养成的习惯,一周时间很难训练出来,但这里有一个缩短时间的日常习惯。以生活中的问题出发做练习。
这家商场的人流量是多少?怎么预估?
上海地区的共享单车投放量是多少?怎么预估?
街边口的水果店,每天的销量和利润是多少?怎么预估?
这些开放性问题起源于咨询公司的训练方法,通过不断地练习,肯定能有效提高分析思维。另外就是刷各种CaseBook。
优秀的数据分析师会拷问别人的数据,而他本身的分析也经得起拷问。
第四周:数据库
Excel很容易遇到瓶颈,随着业务的发展,分析师接触的数据会越来越多。对大部分人的电脑,超过十万条数据,已经会影响性能。何况大数据时代就是不缺数据,这时候就需要学习数据库了。
即使非数据岗位,也有越来越多的产品和运营被要求使用SQL。
很多数据分析师戏称自己是跑SQL的,这间接说明SQL在数据分析中有多核心。从Excel到SQL绝对是处理效率的一大进步。
教程内容以MySQL为主,这是互联网行业的通用标准。其实语法差异不大的。
新手首先应该了解表的概念,表和Excel中的sheet类似。「写给新人的数据库指南」是一篇入门基础文章,包括表、ID索引、以及数据库的安装,数据导入等简单知识。
SQL的应用场景,均是围绕select展开。增删改、约束、索引、数据库范式均可以跳过。新手在「SQL,从入门到熟练」教程会学习到最常见的几个语法,select、where、group by、if、count/sum、having、order by、子查询以及各种常用函数。
数据还是分析师薪资数据,它可以和Excel实战篇结合看,不少原理都是相通的。
想要快速掌握,无非是大量的练习。大家可以在leetcode上做SQL相关的练习题,难度从简单到困难都有。「SQL,从熟练到掌握」教程中将会带领大家去刷一遍。
join对新手是一个很绕的概念,教程会从图例讲解,逐步提高难度。从一开始的join关联,到条件关联、空值匹配关联、子查询关联等。最后完成leetcode中的hard模式。
如果想要更进一步,可以学习row_number,substr,convert,contact等函数。不同数据平台的函数会有差异,例如Presto和phpMyAdmin。再想提高,就去了解Explain优化,了解SQL的工作原理,了解数据类型,了解IO。知道为什么union比or的效率快,这已经和不少程序员并驾齐驱。
第五周:统计学
很多数据分析师并不注重统计学基础。
比如产品的AB测试,如果相关人员不清楚置信度的含义和概念,那么好的效果能意味着好么?如果看待显著性?
比如运营一次活动,若不了解描述统计相关的概念,那么如何判别活动在数据上的效果?可别用平均数。
不了解统计学的数据分析师,往往是一个粗糙的分析师。如果你想要往机器学习发展,那么统计学更是需要掌握的基础。
统计知识会教大家以另一个角度看待数据。如果大家了解过《统计数据会撒谎》,那么就知道很多数据分析的决策并不牢靠。
在第一篇教程「解锁数据分析的正确姿势:描述统计」,会教给大家描述统计中的诸多变量,比如平均数、中位数、众数、分位数、标准差、方差。这些统计标准会让新手分析师从平均数这个不靠谱的泥潭中出来。
箱线图就是描述统计的大成者,好的分析师一定是惯用箱线图的常客。
第二篇「解锁数据分析的正确姿势:描述统计(2)」将会结合可视化,对数据的分布进行一个直观的概念讲解。很多特定的模型都有自有的数据分布图,掌握这些分布图对分析的益处不可同日而语。
直方图和箱线图一样,将会是长久伴随分析师的利器。
统计学的一大主要分支是概率论,概率是度量一件事发生的可能性,它是介于0到1之间的数值。很多事情,都可以用概率论解释,「概率论的入门指南」和「读了本文,你就懂了概率分布」都是对其的讲解。
包括贝叶斯公式、二项概率、泊松概率、正态分布等理论。理论不应用现实,那是无根之木,教程中会以运营活动最常见的抽奖概率为讲解,告诉大家怎么玩。
其实数据分析中,概率应用最广泛和最全面的知识点,就是假设检验,大名鼎鼎的AB测试就是基于它的。俗话说得好,再优秀的产品经理也跑不过一半AB测试。
何为假设检验?假设检验是对预设条件的估计,通过样本数据对假设的真伪进行判断。
产品改版了,用户究竟喜不喜欢?调研的评分下降了,这是用户的评价降低了,还是正常的数据波动呢?这些都是可以做假设检验的。它可以说是两面两篇文章的回顾和应用。
「数据分析必须懂的假设检验」依旧以互联网场景讲解各种统计技巧的应用。假设检验并不难,通过Excel的几个函数就能完成。它的难点在于诸多知识点和业务的结合使用,实际公式不需要掌握的多透彻,了解背后的意义更重要。
统计学是一个很广阔的领域,包括方差分析,时间序列等,都有各自不同的应用。大家若感兴趣,可以去阅读各类教材,没错,教材是学习统计学最优的方式。我这类文章堪堪算入门罢了。
第六周:业务
对于数据分析师来说,业务的了解比数据方法论更重要。举个例子,一家O2O配送公司发现在重庆地区,外卖员的送货效率低于其他城市,导致用户的好评率降低。总部的数据分析师建立了各个指标去分析原因,都没有找出来问题。后来在访谈中发觉,因为重庆是山城,路面高低落差比较夸张,很多外卖人员的小电瓶上不了坡…所以导致送货效率慢。这个案例中,我们只知道送货员的送货水平距离,根本不知道垂直距离。这是数据的局限,也是只会看数据的分析师和接地气分析师的最大差异。业务形态千千万万,数据分析师往往难窥一二。我的公众号业务部分也涉及了不少,大家可以通过这几篇文章了解。
一篇文章读懂活跃数据;深入浅出,用户生命周期的运营;获取新增用户,运营都应该知道的事;运营的商业逻辑:CAC和CLV;从零开始,构建数据化运营体系;读懂用户运营体系:用户分层和分群,这些都是互联网运营相关的内容,或多或少涉及了不少业务方面的概念,数据分析人员可以选择性的挑选部分内容。了解业务的数据分析师在职场发展上会更加顺利。
而在「最用心的运营数据指标解读」中,我尝试总结了几个泛互联网领域的指标和业务模型,它们都是通用的框架。
产品运营模型:以移动端APP为主体,围绕AARRR准则搭建起数据框架。包括Acquisition用户获取、Activation用户活跃、Retention用户留存、Revenue营收、Refer传播,以及细分指标。
市场营销模型:以传统的市场营销方法论为基底,围绕用户的生命周期建立框架。包括用户生命周期,生命周期价值、用户忠诚指数、用户流失指数、用户RFM价值等。
流量模型:从早期的网站分析发展而来,以互联网的流量为核心。包括浏览量曝光率、病毒传播周期、用户分享率、停留时间、退出率跳出率等。
电商和消费模型:以商品的交易、零售、购买搭建而起。包括GMV、客单价、复购率、回购率、退货率、购物篮大小、进销存,也包含SKU、SPU等商品概念。
用户行为模型:通过用户在产品功能上的使用,获得精细的人群维度,以此作为分析模型。包括用户偏好、用户兴趣、用户响应率、用户画像、用户分层,还包含点赞评论浏览收藏等功能的相关指标。
除了上述的几个常见模型,数据分析还有其他分支。比如SEO/SEM,虽然可以归类到流量模型,但它并不简单。比如财务分析,商业的各种成本支出也需要专人负责。
在业务知识外,业务层面的沟通也很重要。业务线足够长的时候,沟通往往成为老大难的问题。
业务学习没有捷径,哪怕掌握了诸多模型,不同行业间的业务壁垒会是分析师们的门槛。金融的各类专有领域知识,电子商务不同产品的特性,这些都会影响到分析报告的质量。
在早期,新人最好选择一到两个领域深入了解其业务,然后以此拓展边界。
第七周:Python/R
第七周是最后的学习环节。
是否具备编程能力,是初级数据分析和高级数据分析的风水岭。数据挖掘、BI、爬虫、可视化报表都需要用到编程。掌握一门优秀的编程语言,可以让数据分析师升职加薪,迎娶白富美。数据分析领域最热门的两大语言是R和Python。R的优点是统计学家编写的,缺点也是统计学家编写。涉及各类统计函数和工具的调用,R无疑有优势。但是大数据量的处理力有不逮,学习曲线比较陡峭。
Python则是万能的胶水语言,适用性强,可以将分析的过程脚本化。Pandas、Numpy、SKLearn等包也是非常丰富。
这里的教程以Python为主。
「开始Python的新手教程」将会教大家搭建数据分析环境,Anaconda是功能强大的数据科学工具。Python建议安装Python3+版本,不要选择Python2了。
Python的语法相当简洁,大家print出第一个hello world顶多半小时。就像在Excel上进行运算一样方便。
「开始Python的数据结构」介绍给大家Python的三类数据结构,列表list,元组tuple,以及字典dict。万变不离其宗,掌握这三种数据结构以及相对应的函数,足够应付80%的分析场景。函数式编程为Python一大特色,Python自身就提供不少丰富的函数。很多都和Excel的函数相通,掌握起来非常迅速。另外还有控制流,for、while、if,通常配合函数组合使用。
「了解和掌握Python的函数」教大家如何自定义函数,丰富的函数虽然能偷懒,但是不少场景下,还是需要自己动手撸一个。
能够调第三方包解决,就使用第三方的函数。如果是一个频繁使用的场景,而第三方依靠不了,就自己编一个函数。如果是临时性的场景,写得粗糙点也无所谓。毕竟分析师的代码能力不要求工程师那么严格,所以Python的学习尽量以应用为主,不用像分析师那么严格。
包、模块和类的概念属于进阶知识,不学也不要紧。
「Python的数据分析: numpy和pandas入门」介绍了数据分析师赖以生存的两个包,numpy和pandas,其他Python知识可以不扎实,这两个最好认真掌握。它是往后很多技能树的前置要求。
array,series,dataframe是numpy和pandas的三个数据结构,掌握它们,便算是入门了。后续的两篇教程都是实战。
「用pandas进行数据分析实战」以分析师的薪资作为实战数据。Excel、BI、SQL,一路走来,大家想必对它无比熟悉,这也是最后一次使用它了。教程通过Pandas的各类功能,绘制出一副词云图。
有哪些好用却不为人知的国产软件?
这几款国产软件太可惜了!全是大厂出品,超好用,还免费,可惜知道的人太少了!各个堪称“神器”
01 滴答音乐一款免费的音乐下载软件,可以下载一切高品质音乐!软件体积只有3M,却功能强大发,是个人用户开发的软件,全免费!
有了滴答音乐,帮你搞定所有音乐下载问题。你只需记住自己想要下载的歌曲名,在滴答音乐中进行搜索,选择后点击下载即可。
十分方便,最重要的是支持多种品质下载。
滴答音乐几乎可以下载所有的音乐,资源十分丰富,且页面无广告,使用简单!简直神奇啊!
不过,可惜的是,这个软件在一些平台上,你可能无法下载,不过不用担心,我给你下载好了安装包。
关注@旁门左道PPT ,点击我的头像,进入主页,点击私信,回复关键词【国产】,即可获取全文所有软件安装包。
02 夸克浏览器一款阿里旗下的超实用,无广告的免费小众手机浏览器。
搜索结果中不会有竞价广告,大多数网站里的广告,都会被过滤。智能拼页的浏览方式,堪称是神器!
打开和加载的速度都特别快。我把夸克,谷歌,百度放在一起,做了一个对比,简直秒杀:
在同一手机同一网络环境下,打开浏览器的时间依次是:夸克<1秒,谷歌2秒,百度9秒(6秒打开+3秒广告)
我比较喜欢它的高速百度网盘下载功能,在浏览器下载设置里直接把下载线程调为64,你就会发现下载速度竟然高达1-5M/S,与几十K/S的龟速比起来,效率是不是高多了:
不说了,谁用谁爱~不过可惜的是,这款良心的小软件,用的人有点少……
03 爱奇艺万能播放器爱奇艺旗下的一款免费本地视频软件,可以播放图片,视频等多种格式文件,支持几乎所有主流视频格式查看,堪称强大!
当然,也因为小众,被很多人忽视,但真的超好用!而且大厂出品,比较稳定!
这款万能播放器,提及特别小,仅有15M,启动速度快,卡顿现象几乎没有,可播放文件的格式十分丰富:支持mp4、mkv、3gp、rmvb等任意视频及音乐播放:
这个播放的格式,可以说真的无敌了!
它的功能还有很多,最让我惊喜的是,借助它可以几乎实现全速百度网盘内容的下载!只需轻松点击界面上百度云图标,登录账号,便可以实现下载,几乎全速:
用了就舍不得放下的视频播放软件!
目前这个软件已经下架了,不过我给你准备好了安装包。
关注@旁门左道PPT,点击我的头像,进入主页,点击私信,回复关键词【国产】即可获取~
04 用药助手这是一款帮你了解医药信息的APP。
这款APP是由丁香医生团队开发,一款专门面向医生、用户等提供医药信息查询的专业查询工具,避免药物食用错误!
软件内包含40000种药品的说明书,帮助你更好地了解生活常用药品的功能;包括5000多个专业的医生给出的用药指南,防止用药错误。
也收录了近万种常见疾病的介绍以及相关治疗信息;
还有比较贴心的药物相互作用指南,这个功能真的很贴心,可以很大程度上帮助我们告别药物用错导致的副作用!
不过呢,这个软件只能作为辅助,用药还是要遵医嘱哦~
05 袋鼠输入百度旗下的一个小众免费APP,一款用手机遥控电脑的神器工具
在电脑和手机端同时下载之后,只要在同一网络下,你就可以使用手机操控电脑,非常方便。
你可以利用它完成文字输入:
直接对着手机讲话就可以自动输入到电脑上~
你还可以把它当作一个电脑的遥控器:
汇报的时候,可以用它遥控PPT播放;
追剧的时候,可以用它遥控视频播放。
最赞的是,你还可以使用【鼠标模式】,可以直接把手机当作无线鼠标使用:
体验非常好,简直是给电脑加了一块触控板。让你再也不用担心忘了带PPT遥控器!
06 妙读阿里旗下出品的一款读书软件,它除了界面简约清晰之外,最大的优点就是让你能充分利用碎片时间,提炼书中内容干货,让你15分钟内以最快速度、便捷的方式读透一本书。
不愧是阿里出品的图书,在妙读精选页面,每一本书推荐都很精致:
在书架板块,有超多的精选书籍,另外,所有的图书都支持听书模式,让你随时随地看书!听书模式的声音还挺自然的:
大厂的东西,还是很优秀的,知识知道的人太少了
07 给未来写封信这是一个非常小众的国产软件,很温情,专属于你自己!给未来的你写封信!
界面做得很精致,有意境。
我个人比较喜欢写信的功能,你可以给未来的自己写一封信,并定义好时间:
想象一下,日后的某一天,你收到了来自自己的信,现在的你,看着当年或哭或笑,或吵或闹的自己,别有一番感触。
软件中,你还能看到不同人的信件,遇见与你相似的一颗灵魂。试着用这款软件去记录你现在的每一刻,邮寄给未来的自己吧!
08 折扇腾讯收购的一款中国风的折扇知识普及软件。
界面太美了,作为一名设计师,我实在是忍不住沉浸其中。
设计美到巅峰是什么样子,大概就是折扇这款软件的样子,每一个页面都能让人欣赏半天。
这是一款科普扇子文化的软件,你可以详细地端详每款扇子。了解关于扇子的知识,除此之外,APP的动画和触感,简直让人心动,太美了!这款软件,你一定要试试!
你可以亲手体验制作扇子的过程,设计出属于自己的扇子!掌握关于扇子的文化!
另外,大家不要忘记领取这些软件的安装包!
关注@旁门左道PPT,点击我的头像,进入主页,点击私信,回复关键词【国产】即可获取~
看到这里,别忘了给我点个赞哦!
Java开发分库分表需要解决的问题及mycat是怎样实现分库分表的?
MySQL的使用场景中,读写分离只是方案中的一部分,想要扩展,势必会用到分库分表,可喜的是Mycat里已经做到了,今天花时间测试了一下,感觉还不错。
关于分库分表
当然自己也理了一下,分库分表的这些内容,如果分成几个策略或者阶段,大概有下面的几种。
最上面的第一种是直接拆表,比如数据库db1下面有test1,test2,test3三个表,通过中间件看到的还是表test,里面的数据做了这样的拆分,能够在一定程度上分解压力,如果细细品来,和分区表的套路有些像。
接下来的几类也是不断完善,把表test拆解到多个库中,多个服务器中,如果做了读写分离,全套的方案这样的拆解改进还是很大的。如此来看,数据库中间件做了很多应用和数据库之间的很多事情,能够流行起来除了技术原因还是有很多其他的因素。
分库分表的测试环境模拟
如果要在一台服务器上测试分库分表,而且要求架构方案要全面,作为技术可行性的一个判定参考,是否可以实现呢。
如果模拟一主两从的架构,模拟服务分布在3台服务器上,这样的方案需要创建9个实例,每个实例上有3个db需要分别拆分。
大体的配置如下:
master1: 端口33091
(m1)slave1: 端口33092
(m1)slave2: 端口33093
master2: 端口33071
(m2)slave1: 端口33072
(m2)slave2: 端口33073
master3: 端口33061
(m3)slave1: 端口33062
(m3)slave2: 端口33063
画个图来说明一下,其中db1,db2,db3下面有若干表,需要做sharding
所以我们需要模拟的就是这个事情。
使用Mycat碰到的几个小问题解惑
使用Mycat的时候碰到了几个小问题,感觉比较有代表性,记录了一下。
问题1:
首先是使用Mycat连接到数据库之后,如果不切换到具体的数据库下,使用[数据库名].[表名]的方式会抛出下面的错误,可见整个过程中,Mycat拦截了SQL信息做了过滤,在转换的时候找不到目标路由。当然实际使用中,规范使用肯定不会有这个问题。
mysql> select * from db1.shard_auto;
ERROR 1064 (HY000): find no Route:select * from db1.shard_auto
问题2:
在配置了sharding策略之后,insert语句抛出了下面的错误,这个是对语法的一个基本的要求。
mysql> insert into shard_mod_long values(1,'aa',date);
ERROR 1064 (HY000): partition table, insert must provide ColumnList
问题3:
如果sharding策略配置有误,很可能出现表访问正常,但是DML会有问题,提示数据冲突了。至于如何配置sharding,下面会讲。
mysql> select * from shard_mod_long;
Empty set (0.00 sec)
mysql> insert into shard_mod_long(ID,name,shard_date) values(1,'aa',current_date);
ERROR 1105 (HY000): Duplicate entry '1' for key 'PRIMARY'
问题4:
如果sharding的配置有误,很可能出现多份冗余数据。
查看执行计划就一目了然,通过data_node可以看到数据指向了多个目标库。
mysql> explain insert into shard_auto(ID,name,shard_date) values(1,'aa',current_date);
+-----------+------------------------------------------------+
| DATA_NODE | SQL |
+-----------+------------------------------------------------+
| pxcNode11 | insert into shard_auto(ID,name,shard_date) values(1,'aa',current_date) |
| pxcNode21 | insert into shard_auto(ID,name,shard_date) values(1,'aa',current_date) |
| pxcNode31 | insert into shard_auto(ID,name,shard_date) values(1,'aa',current_date) |
+-----------+------------------------------------------------+
这种情况如果有一定的需求还是蛮不错的,做sharding可惜了。问题就在于下面的这个table配置。
<table name="shard_auto" primaryKey="ID" type="global" dataNode="pxcNode11,pxcNode21,pxcNode31" rule="auto-sharding-long" />
需要去掉 type="global"的属性,让它sharding。
Mycat里面的sharding策略
Mycat的分片策略很丰富,这个是超出自己的预期的,也是Mycat的一大亮点。
大体分片规则如下,另外还有一些其他分片方式这里不全部列举:
(1)分片枚举:sharding-by-intfile
(2)主键范围:auto-sharding-long
(3)一致性hash:sharding-by-murmur
(4)字符串hash解析:sharding-by-stringhash
(5)按日期(天)分片:sharding-by-date
(6)按单月小时拆分:sharding-by-hour
(7)自然月分片:sharding-by-month
在开始之前,我们要创建下面的表来模拟几个sharding的场景,表名根据需求可以改变。
create table shard_test(ID int primary key, name varchar(20),shard_date date);
主键范围分片
主键范围分片是参考了主键值,按照主键值的分布来分布数据库在不同的库中,我们先在对应的sharding节点上创建同样的表结构。
关于sharding的策略,需要修改rule.xml文件。
常用的sharding策略已经在Mycat里面实现了,如果要自行实现也可以定制。比如下面的规则,是基于主键字段ID来做sharding,分布的算法是rang-long,引用了function rang-long,这个function是在对应的一个Java类中实现的。
<tableRule name="auto-sharding-long">
<rule>
<columns>ID</columns>
<algorithm>rang-long</algorithm>
</rule>
<function name="rang-long"
class="io.mycat.route.function.AutoPartitionByLong">
<property name="mapFile">autopartition-long.txt</property>
当然主键的范围是不固定的,可以根据需求来定制,比如按照一百万为单位,或者1000位单位,文件是 autopartition-long.txt 文件的内容默认如下,模板里是分为了3个分片,如果要定制更多的就需要继续配置了,目前来看这个配置只能够承载15亿的数据量,可以根据需求继续扩展定制。
# range start-end ,data node index
# K=1000,M=10000.
0-500M=0
500M-1000M=1
1000M-1500M=2
插入一些数据来验证一下,我们可以查看执行计划来做基本的验证,配置无误,数据就根据规则流向了指定的数据库下的表里。
mysql> explain insert into shard_auto(ID,name,shard_date) values(1,'aa',current_date);
+-----------+------------------------------------------------+
| DATA_NODE | SQL |
+-----------+------------------------------------------------+
| pxcNode11 | insert into shard_auto(ID,name,shard_date) values(1,'aa',current_date) |
+-----------+------------------------------------------------+
还有一个查看sharding效果的小方法,比如我插入一个极大的值,保证和其他数据不在一个分片上,我们运行查询语句两次,结果会有点变化。
sharing的效果
mysql> select * from shard_auto;
+---------+------+------------+
| ID | name | shard_date |
+---------+------+------------+
| 1 | aa | 2017-09-06 |
| 2 | bb | 2017-09-06 |
| 5000001 | aa | 2017-09-06 |
+---------+------+------------+
3 rows in set (0.00 sec)
稍作停顿,继续运行。
mysql> select * from shard_auto;
+---------+------+------------+
| ID | name | shard_date |
+---------+------+------------+
| 5000001 | aa | 2017-09-06 |
| 1 | aa | 2017-09-06 |
| 2 | bb | 2017-09-06 |
+---------+------+------------+
3 rows in set (0.01 sec)
Hash分片
Hash分片其实企业级应用尤其广泛,我觉得一个原因是通过这种数据路由的方式,得到的数据情况是基本可控的,和业务的关联起来比较直接。很多拆分方法都是根据mod方法来平均分布数据。
sharding的策略在rule.xml里面配置,还是默认的mod-long规则,引用了算法mod-long,这里是根据sharding的节点数来做的,默认是3个。
<tableRule name="mod-long">
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-how many data nodes -->
<property name="count">3</property>
</function>
比如查看两次insert的结果情况。
mysql> explain insert into shard_mod_long(ID,name,shard_date) values(4,'dd',current_date);
+-----------+------------------------------------------------+
| DATA_NODE | SQL |
+-----------+------------------------------------------------+
| pxcNode22 | insert into shard_mod_long(ID,name,shard_date) values(4,'dd',current_date) |
+-----------+------------------------------------------------+
mysql> explain insert into shard_mod_long(ID,name,shard_date) values(5,'ee',current_date);
+-----------+------------------------------------------------+
| DATA_NODE | SQL |
+-----------+------------------------------------------------+
| pxcNode23 | insert into shard_mod_long(ID,name,shard_date) values(5,'ee',current_date) |
+-----------+------------------------------------------------+
可以看到数据还是遵循了节点的规律,平均分布。
至于schema.xml的配置,是整个分库的核心,我索性也给出一个配置来,供参考。
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-定义MyCat的逻辑库 -->
<schema name="db1" checkSQLschema="false" sqlMaxLimit="100" >
<table name="shard_mod_long" primaryKey="ID" type="global" dataNode="pxcNode11,pxcNode21,pxcNode31" rule="mod-long" />
<table name="shard_auto" primaryKey="ID" type="global" dataNode="pxcNode11,pxcNode21,pxcNode31" rule="auto-sharding-long" />
</schema>
<!-定义MyCat的数据节点 -->
<dataNode name="pxcNode11" dataHost="dtHost" database="db1" />
<dataNode name="pxcNode21" dataHost="dtHost2" database="db1" />
<dataNode name="pxcNode31" dataHost="dtHost3" database="db1" />
<!-定义数据主机dtHost,连接到MySQL读写分离集群 ,schema中的每一个dataHost中的host属性值必须唯一-->
<!-dataHost实际上配置就是后台的数据库集群,一个datahost代表一个数据库集群 -->
<!-balance="1",全部的readHost与stand by writeHost参与select语句的负载均衡-->
<!-writeType="0",所有写操作发送到配置的第一个writeHost,这里就是我们的hostmaster,第一个挂了切到还生存的第二个writeHost-->
<dataHost name="dtHost" maxCon="500" minCon="20" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<!--心跳检测 -->
<heartbeat>show slave status</heartbeat>
<!--配置后台数据库的IP地址和端口号,还有账号密码 -->
<writeHost host="hostMaster" url="192.168.163.128:33091" user="mycat_user" password="mycat" />
</dataHost>
<dataHost name="dtHost2" maxCon="500" minCon="20" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<!--心跳检测 -->
<heartbeat>show slave status</heartbeat>
<!--配置后台数据库的IP地址和端口号,还有账号密码 -->
<writeHost host="hostMaster" url="192.168.163.128:33071" user="mycat_user" password="mycat" />
</dataHost>
<dataHost name="dtHost3" maxCon="500" minCon="20" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<!--心跳检测 -->
<heartbeat>show slave status</heartbeat>
<!--配置后台数据库的IP地址和端口号,还有账号密码 -->
<writeHost host="hostMaster" url="192.168.163.128:33061" user="mycat_user" password="mycat" />
</dataHost>
</mycat:schema>
=================================================================================================
用Mycat,学会数据库读写分离、分表分库
php疑难杂症铺 2017-09-13 14:31用Mycat,学会数据库读写分离、分表分库
系统开发中,数据库是非常重要的一个点。除了程序的本身的优化,如:SQL语句优化、代码优化,数据库的处理本身优化也是非常重要的。主从、热备、分表分库等都是系统发展迟早会遇到的技术问题问题。Mycat是一个广受好评的数据库中间件,已经在很多产品上进行使用了。希望通过这篇文章的介绍,能学会Mycat的使用。
安装
Mycat官网:http://www.mycat.io/
可以了解下Mycat的背景和应用情况,这样使用起来比较有信心。
Mycat下载地址:http://dl.mycat.io/
官网有个文档,属于详细的介绍,初次入门,看起来比较花时间。
下载:
建议大家选择 1.6-RELEASE 版本,毕竟是比较稳定的版本。
安装:
根据不同的系统选择不同的版本。包括linux、windows、mac,作者考虑还是非常周全的,当然,也有源码版的。(ps:源码版的下载后,只要配置正确,就可以正常运行调试,这个赞一下。)
Mycat的安装其实只要解压下载的目录就可以了,非常简单。
安装完成后,目录如下:
目录说明binmycat命令,启动、重启、停止等catletcatlet为Mycat的一个扩展功能confMycat 配置信息,重点关注libMycat引用的jar包,Mycat是java开发的logs日志文件,包括Mycat启动的日志和运行的日志。配置
Mycat的配置文件都在conf目录里面,这里介绍几个常用的文件:
文件说明server.xmlMycat的配置文件,设置账号、参数等schema.xmlMycat对应的物理数据库和数据库表的配置rule.xmlMycat分片(分库分表)规则Mycat的架构其实很好理解,Mycat是代理,Mycat后面就是物理数据库。和Web服务器的Nginx类似。对于使用者来说,访问的都是Mycat,不会接触到后端的数据库。
我们现在做一个主从、读写分离,简单分表的示例。结构如下图:
服务器IP说明Mycat192.168.0.2mycat服务器,连接数据库时,连接此服务器database1192.168.0.3物理数据库1,真正存储数据的数据库database2192.168.0.4物理数据库2,真正存储数据的数据库Mycat作为主数据库中间件,肯定是与代码弱关联的,所以代码是不用修改的,使用Mycat后,连接数据库是不变的,默认端口是8066。连接方式和普通数据库一样,如:jdbc:mysql://192.168.0.2:8066/
server.xml
示例
重点关注下面这段,其他默认即可。
参数说明user用户配置节点--name登录的用户名,也就是连接Mycat的用户名--password登录的密码,也就是连接Mycat的密码--schemas数据库名,这里会和schema.xml中的配置关联,多个用逗号分开,例如需要这个用户需要管理两个数据库db1,db2,则配置db1,dbs--privileges配置用户针对表的增删改查的权限,具体见文档吧我这里配置了一个账号test 密码也是test,针对数据库lunch,读写权限都有,没有针对表做任何特殊的权限。
schema.xml
schema.xml是最主要的配置项,首先看我的配置文件。
参数说明schema数据库设置,此数据库为逻辑数据库,name与server.xml中schema对应dataNode分片信息,也就是分库相关配置dataHost物理数据库,真正存储数据的数据库每个节点的属性逐一说明:
schema:
属性说明name逻辑数据库名,与server.xml中的schema对应checkSQLschema数据库前缀相关设置,建议看文档,这里暂时设为folsesqlMaxLimitselect 时默认的limit,避免查询全表table:
属性说明name表名,物理数据库中表名dataNode表存储到哪些节点,多个节点用逗号分隔。节点为下文dataNode设置的nameprimaryKey主键字段名,自动生成主键时需要设置autoIncrement是否自增rule分片规则名,具体规则下文rule详细介绍dataNode
属性说明name节点名,与table中dataNode对应datahost物理数据库名,与datahost中name对应database物理数据库中数据库名dataHost
属性说明name物理数据库名,与dataNode中dataHost对应balance均衡负载的方式writeType写入方式dbType数据库类型heartbeat心跳检测语句,注意语句结尾的分号要加。应用场景
数据库分表分库
配置如下:
我在192.168.0.2、192.168.0.3均有数据库lunch。
lunchmenu、restaurant、userlunch、users这些表都只写入节点dn1,也就是192.168.0.2这个服务,而dictionary写入了dn1、dn2两个节点,也就是192.168.0.2、192.168.0.3这两台服务器。分片的规则为:mod-long。
主要关注rule属性,rule属性的内容来源于rule.xml这个文件,Mycat支持10种分表分库的规则,基本能满足你所需要的要求,这个必须赞一个,其他数据库中间件好像都没有这么多。
table中的rule属性对应的就是rule.xml文件中tableRule的name,具体有哪些分表和分库的实现,建议还是看下文档。我这里选择的mod-long就是将数据平均拆分。因为我后端是两台物理库,所以rule.xml中mod-long对应的function count为2,见下面部分代码:
数据库读写分离
配置如下:
这样的配置与前一个示例配置改动如下:
删除了table分配的规则,以及datanode只有一个
datahost也只有一台,但是writehost总添加了readhost,balance改为1,表示读写分离。
以上配置达到的效果就是102.168.0.2为主库,192.168.0.3为从库。
注意:Mycat主从分离只是在读的时候做了处理,写入数据的时候,只会写入到writehost,需要通过mycat的主从复制将数据复制到readhost,这个问题当时候我纠结了好久,数据写入writehost后,readhost一直没有数据,以为是自己配置的问题,后面才发现Mycat就没有实现主从复制的功能,毕竟数据库本身自带的这个功能才是最高效稳定的。
至于其他的场景,如同时主从和分表分库也是支持的了,只要了解这个实现以后再去修改配置,都是可以实现的。而热备及故障专业官方推荐使用haproxy配合一起使用,大家可以试试。
使用
Mycat的启动也很简单,启动命令在Bin目录:
如果在启动时发现异常,在logs目录中查看日志。
wrapper.log 为程序启动的日志,启动时的问题看这个
mycat.log 为脚本执行时的日志,SQL脚本执行报错后的具体错误内容,查看这个文件。mycat.log是最新的错误日志,历史日志会根据时间生成目录保存。
mycat启动后,执行命令不成功,可能实际上配置有错误,导致后面的命令没有很好的执行。
Mycat带来的最大好处就是使用是完全不用修改原有代码的,在mycat通过命令启动后,你只需要将数据库连接切换到Mycat的地址就可以了。如下面就可以进行连接了:
连接成功后可以执行sql脚本了。
所以,可以直接通过sql管理工具(如:navicat、datagrip)连接,执行脚本。我一直用datagrip来进行日常简单的管理,这个很方便。
Mycat还有一个管理的连接,端口号是9906.
连接后可以根据管理命令查看Mycat的运行情况,当然,喜欢UI管理方式的人,可以安装一个Mycat-Web来进行管理,有兴趣自行搜索。
简而言之,开发中使用Mycat和直接使用Mysql机会没有差别。
常见问题
使用Mycat后总会遇到一些坑,我将自己遇到的一些问题在这里列一下,希望能与大家有共鸣:
Mycat是不是配置以后,就能完全解决分表分库和读写分离问题?
Mycat配合数据库本身的复制功能,可以解决读写分离的问题,但是针对分表分库的问题,不是完美的解决。或者说,至今为止,业界没有完美的解决方案。
分表分库写入能完美解决,但是,不能完美解决主要是联表查询的问题,Mycat支持两个表联表的查询,多余两个表的查询不支持。 其实,很多数据库中间件关于分表分库后查询的问题,都是需要自己实现的,而且节本都不支持联表查询,Mycat已经算做地非常先进了。
分表分库的后联表查询问题,大家通过合理数据库设计来避免。
Mycat支持哪些数据库,其他平台如 .net、PHP能用吗?
官方说了,支持的数据库包括MySQL、SQL Server、Oracle、DB2、PostgreSQL 等主流数据库,很赞。
尽量用Mysql,我试过SQL Server,会有些小问题,因为部分语法有点差异。
Mycat 非JAVA平台如 .net、PHP能用吗?
可以用。这一点MyCat做的也很棒。