mysql雪崩

故事

小王刚下班回家正准备露一手做2个菜。
手机就收到监控报警,网站打不开报警,mysql IO报警,xx报警
还没等开电脑,公司的人就来电话了
老板:小王啊,网站怎么又打不开了?快点解决啊!损失很大啊!
小王:好的马上处理。
凭借小王丰富的经验,mysql IO都那么高了,肯定是什么sql查询把IO都耗干净了,估计还卡了一堆查询
熟练的用show processlist看了下mysql正在处理的查询,果不其然,这查询队列都长到姥姥家了
苦逼的小心易易的结束了卡的时间很长的SELECT查询,这他妈结束的数据远远跟不上新增加的慢查询的速度呀
应用层程序也来不及改呀
最后小王还是恢复了数据库,可时间已经过去了整整1小时。

事后
老版:这次网站挂了1小时,以后别这样,的解决啊!
小王解释道:网站被恶意爬虫了,爬到了耗IO的sql查询,这个时候业务又是高峰期,导致数据库卡死了。
(大家认为老版会听么,老板只想要结果)

其他公司怎么做的?

  • 数据库中间件处理
  • 缓存机制保证不会让数据库太难受
  • 应用层熔断机制
    等等

纯PHP + MYSQL的项目如何应对数据库雪崩?

  • 数据库中间件处理
    我想绝大用PHP + MYSQL的中小公司是没有MYSQL中间件的,有中间件的可以在数据库中间件处理
    有用Swoole写MYSQL中间件的案例
  • 缓存要顶用
    设计好Redis机制,最小量的请求落在MYSQL上
  • 用MySQL Query Rewrite Plugin 进行SQL语句重写
    MySQL · 5.7新特性 · Query Rewrite Plugin
  • 用pt-kill自动杀掉过长的慢查询
    pt-kill是Percona-Toolkit系列之一,Percona公司出品的工具都没用过,绝对有相见恨晚的感觉。
    pt-kill杀掉慢查询,这算是一个简单粗暴的“熔断方案”,都已经到了让数据库雪崩的阶段,与其业务都不可用,还不如有损服务。
    需要注意的是只结束从库的SELECT慢查询

直接上手,pt-kill常驻进程自动结束SQL慢查询实例

以下实例作用是
* 127.0.0.1这台msyql实例上
* 字符集指定为 utf8
* 查询中有关键字 “SELECT|select” (支持正则)
* mysql帐号是 “业务mysql帐号”
* 查询时间大于60秒
* kill掉查询,不kill mysql连接
* 表示从匹配的结果中选择,类似SQL中的where部分,all是全部的查询
* 10秒检查一次
* 日志记录位置
* 打印日志
* 守护进程的方式运行

常用参数说明

  • host 连接数据库的地址
  • port 连接数据库的端口
  • user 连接数据库的用户名
  • passowrd 连接数据库的密码
  • charset 指定字符集
  • match-command 指定杀死的查询类型
  • match-user 指定杀死的用户名,即杀死该用户的查询
  • match-info 匹配查询的信息
  • busy-time 指定杀死超过多少秒的查询
  • kill 执行kill命令
  • kill-query 与kill匹配查询的连接不同,此选项只会kill查询,而不会杀死连接
  • victims 表示从匹配的结果中选择,类似SQL中的where部分,all是全部的查询
  • interal 每隔多少秒检查一次
  • print 把kill的查询打印出来
  • log 输出日志到文件仅在 daemonize 守护进程的时候
  • daemonize 守护进程(常驻进程)
    更多参考官方pt-kill手册

参考

官方pt-kill手册

本文来自

抱紧我的小鱼干
苏州 | GUI设计师 | UI设计方面的知识经验分享,UI设计师可以关注下,学会了可以涨工资哟!

前言:

在出现问题时,企业往往采用加班等延长劳动时间的方法。但我认为有必要从这个禁锢中解脱出来,把如何提高工作效率作为目标,提高生产力。

(一)信息通货的时代

让我们首先把“信息比金钱更重要”、“我们的知性生产力,取决于信息的运用”这些理念牢记在我们头脑里吧

所以,话虽难听,聪明人盘剥不聪明的人其实也是信息主意的一个方面。为了获得有用的信息,投入一定的精力和金钱是必要的。所以善于对信息进行投资的人会越来越富,而不太懂得投资信息的人会继续受剥削。(比如现在的培训)

我们必须牢牢记住一个最基本的概念,就是拥有信息的人(=聪明人)合法地从没有信息的人(=不聪明的人)那里卷走金钱。(比如中介平台,知乎大V设计大神等)

虽然现在是信息爆炸的时代,但我却认为实际情况是信息尽管如潮水般涌来,却很少有人能真正享受如此多的信息。

通过与他人互换信息,得到的信息质量就高了许多。所以手中掌握信息的人容易聚在一起,于是,信息会越来越集中到这些掌握信息的人手中。(比如行业交流会,创业者交流会等)

Give的5平方:比起一味索取,其实只要你成为信息的提供者,那么你就可以轻松收集到你所需要的信息。因为别人也会主动向我们提供信息。因此为不知如何获取信息而大感烦恼的人,一定要把视角转到如何输出信息上去。(比如发教程,交流经验等)

社会已经进入了信息就意味着通货的时代。如果你想赚钱,你就必须首先收集信息,并对各种信息进行分析、整合,然后再转化为行动。
只要我们掌握了信息管理的窍门,那么看似铺天盖地的大量信息,对我们来说很有可能是一座宝库。这座宝库可以让我们不断去利用,并转换成货币。(比如大数据,个人信息,内容型网站)

(二)关于找出1%最有价值信息的6点建议

  • 1:掌握“框架力”(信息框架)
    这个框架提示我们,当信息进入到我们的大脑时,我们要随时给他们贴上标签,区分他们的类别,并把它们保存到大脑中符合这些信息类别的位置上。(就是把复杂事物按照一定规则分类,便于记忆整理。)

  • 2:利用“潜知力”积累经验
    除了框架力之外,你必须大量积累经验,以应对那些框架无法处理的信息。(积累理论和实际经验)

  • 3:具备“抗失败能力”
    如果一个人只愿意尝试必定成功的事情,那只能说明此人完全没有挑战新事物的决心,他的人生注定是平淡无奇的。(鸡血鸡汤…)
    对于每天必做的重复性工作,就要积极开动脑筋,相处好方法,使今后可以在这些事情上少花功夫。

  • 4:共享“最佳实践”的学问
    可以通过自己实践,和听取别人以往的经验相互补充,得到信息

  • 5:一定要做到扬长避短
    众所周知,一个人如果在某一领域里做的非常出色,那他学习理解其他领域里的东西也会比常人快,因为他在自己的领域里已经掌握了抓住本质的技巧。
    一个人的精力、体力是有限的,因此我们有必要认识自己擅长和不擅长的事情,努力做到不做无用功。

  • 6:不吝惜购书费用、多读好书——网页盛行时代非读书不可
    原因:书是众多的书稿中经过严格挑选和编辑后出版的,所以其内容一定非常有价值。在网上你不知道发布这条信息的是谁,另一方面这些信息也没有精力过评议或确认。
    但是如果你接住了“书”这一媒介,那么因为书经过了很多人之手,所以自然而然你就接触到了许多人的想法、信息和意见。
    我们花二三十块钱,就可以得到作者花费几年甚至几十年才能够完成的信息量。总之,重要的是“大量接触可能的好书”。只有这样,才能得到好书,而这些好书中的信息又会在以后给我们带来几十倍的好处。
    我认为现在几乎所有的信息,尤其是优质信息都是出现在纸面上的。与网页相比,在信息发布出来之前,要经过若干人的手,所以信息的质量较高。且与屏幕上的信息相比,纸面信息更有视觉认知性(包括排版等要素。)
    当然,读书的时候,应该快速通读一遍,看看里面大概写了些什么,然后当机立断,该扔就扔。(比如公众号的文章有些很长,先大致看一下是否有用,有用的话保存下来看)

读书还有一个窍门,就是不要太仔细研读,也就是说读书不要太贪,不要试图在一本书中找到你想了解的所有东西(可以结合同类型的其他书)。快速的泛读(如果不是工具书的话),只要把书中的内容存储于大脑的潜意识层里,在必要的时候能调取出来就可以了。
读书也不需要专门抽时间精心阅读,利用空闲时间、零散时间进行快速阅读。

不要轻看书籍的作用,好书是极为廉价,但却优质的信息来源。

有声读物也是一种不错的选择。

(三)关于读书投资法的7条建议

  • 1:读书是在和作者进行对话,所以读书时要设想对话的情景。
  • 2:不准备马上读的书也要先买下来,因为不买的话根本不会去读
    我们应该清楚,只有我们还没得到的信息或不寻常的信息,其价值才更高。通过投资购书费和时间,你可以获得让你耳目一新的知识。
    近来越来越少有人去买书了,这正是我们的机会,趁大家不再关注书本的时候,挑战一下大家都不理会的书,以此使自己有别于那些不关心书的人。
    优质信息一般都是有偿信息。我们应该具备这个观点。

(四)关于提高输入能力的建议

  • 1:把笔记本电脑作为“大脑助手”,充分利用

  • ☆ 2:把亲身体验、他人的经验和好书作为3大信息来源,减少对大众传媒的依赖
    应该增加的信息:1:从自己体验得到的东西(自己实际工作或业余练习中)
    2:从他人的体验中得到的东西(大V教程经验)
    3:好书里面的东西

我们必须了解,收集到的信息不一定马上就能用,信息是靠我们平常一点一滴积累起来的。你需要做的事情是尽可能地对收集到的信息贴上标签或索引,以便今后提取,这就够了。像这样每天保持一份好奇心,每天坚持对信息进行理性分类,就一定会有意外的收获。
因为我们人的时间都是有限的,自己的亲身体验也是有限的。所以为了提高信息收集的效率,我们需要然给别人告诉自己他们的亲身体验,并把他们的体验转换成自己的体验。
于是,如何把优秀的人吸引到自己的身边,如何和他们交朋友并建立起定期交换信息的关系能力成了尤为重要的问题。而最简单的方法就是让自己成为信息源,并以此吸引他人。(自己出教程,由此吸引其他有能力的人,不是一味索取)
也就是说,如果你有信息愿意和别人共享,那么对方会从你身上感受到你的魅力。只要你具备了这样一种魅力,优秀的人才自然而然会走近你身边。信息的有点事无论和多少人一起共享,它的量是不会减少的。所以只要主动和他人互换各自的信息,绝对是双赢的事情。

  • 3:睡眠是投资,多运动,睡好觉
    为什么说睡觉重要,是因为我们的大脑会在我们睡眠期间把白天输入到大脑的零零碎碎的信息整理一遍,因此一定要牢记睡眠即投资这个观点。

(五)关于提高输出能力的建议

如果你收集了大量的信息,却无法进行输出,那么这个信息既不能和只是的流通联系起来,也不能发挥价值,更不能和收入挂钩。(比如说看了很多教程,就需要通过自己的语言去解说,这些知识才能变成自己的)

  • 1:我在孩子9岁前,比起培养他们掌握计算能力,更重点培养他们掌握扎实的的语言能力。通过语言对话,把含混不清的事实说出来的能力是学习一切知识的基础

  • 2:当你得到一个信息的时候,首先要找出它的本质是什么,把信息简化。然后把经过简化的信息分别放到响应的层次中,于是你会掌握这个信息会怎样的展开。最后还有给整个信息类设定一个框架进行再构建。
    如何对一个信息进行分解,使其具备再现性,并实现重构是输出技术中最重要的一点。

对于麦肯锡的人来说,没有遵循金字塔原理(对事物结构分类)和MECE(没有遗漏和重复)写出来的文章就好比“与外行人闲聊”,没有任何用处。一般他们说话时会一边思考,开口就是“我有三点想说”。

  • 3:出书后,人生的舞台就会发生改变
    一旦有了影响力之后,以下几个方面就会发生改变:
    1:别人会主动和自己建立人脉关系
    2:别人会把工作送上门来
    3:别人会把信息送上门来
    4:通过这些变化,在很多事情上的机会会大大增加
    如果你想出书,就要把增强实力作为头等大事来做。

(六)关于保证知性化的5点建议

  • 1:远离不良习惯
    一旦精神或身体有了疲惫的感觉,那么信息的输入就无法畅通,随之效率就会下降。而在信息输出时,对体力和时间要求更高,因此身心的安定必不可少。

  • 2:养成有效利用零散时间的习惯,有效利用每一分钟

  • 3:睡眠不足的话,学到的东西也就无法记牢。

  • 4:注意力能否持久取决于一个人体力的好坏。我们思考一个问题直至得出结论,这一过程中体力必不可少。抱怨自己不能长时间集中注意力的人可以测试一下自己的体力

  • 5:什么是有益于大脑的饮食习惯呢?最重要的一点是“不暴饮暴食”,养成控制卡路里摄入量的习惯

重要的是努力获取好信息,并以此为基础,一点一点改进我们的行为方式。

(七)助你能力提升10倍的人脉技巧

在建立人脉关系网时,正确的做法是不要考虑是否有回报,你只要专注于向他人提供信息就可以了。建立人脉关系的前提是毫不吝惜地公开自己的知识和简介,以便向他人提供参考。实际上,通过自己思想出来的东西,才是自己的财富,才是通货。
人脉的根本就是增加“自身”的魅力,这才是最好的人脉技术。

【尾声】

成功取决于“知识事实比例稳定率”
大脑中的箱子装得越满,越容易找出隐藏在深处的本质。
把亲身体验、他人的经验和好书作为3大信息来源,减少对大众传媒的依赖。
输出并不容易,与输入相比,对注意力和体力的要求更高,大约是3倍左右。

需求来源,需要用PHP解析HTML提取我想要的数据

用PHP写网站爬虫的时候,需要把爬取的网页进行解析,提取里面想要的数据,这个过程叫做网页HTML中数据结构化。
很多人应该知道用phpQuery像JQuery一样的语法进行网页处理,抽取想要的数据。
但是在复杂一些的场景phpQuery并不能很好的完成工作,说简单点就是复杂场景不好用。
有没有更好的方式呢,我们看看商业爬虫软件是怎么做的。

他山之石,商业爬虫怎么做的

市面上商业爬虫怎么做HTML解析抽取数据的

看看市面上商业爬虫怎么做HTML解析结构化数据字段抽取
通过观察市面上商业爬虫工具GooSeeker、神箭手、八爪鱼,可以知道他们都用一个叫做XPath表达式的方式提取需要的字段数据。
那么可以判断使用XPath对HTML解析进行数据定位提取就是通行最佳的方式之一。

PHP中的XPath支持

XPath表达式可以查找HTML节点或元素,是一种路径表达语言。
那么需要先学习下XPath的基础,花个1-2小时入门,XPath就是页面数据提取能力的最佳内功之一,这个时间值得花。
既然用XPath提取页面数据是通行的方式,那么PHP中支持XPath的扩展包是什么呢?
为了帮大家节约时间,Symfony DomCrawler 就是PHP中最佳XPath包之一,直接用他吧,Symfony出品质量可是有目共睹,PHP热门框架laravel都用Symfony的包。
Symfony DomCrawler官方文档介绍的实例有限,建议有需要的情况下把代码读下,更能熟知新用法。

撸起袖子干,用DomCrawler做XPath HTML页面解析结构化数据抽取

基本思路

在Chrome浏览器中安装”XPath Helper”插件(XPath Helper怎么使用见参考资料)
打开需要解析的网站页面编写和测试XPath表达式
在PHP代码用DomCrawler使用上XPath表达式抽取想要的字段数据

实例演示

解析《神偷奶爸3》页面的的电影介绍信息
在Chrome中用编写测试XPath表达式

xpath helper使用


在项目下用composer安装guzzlehttp/guzzle(http client)、symfony/dom-crawler(Symfony DomCrawler)

下面直接上代码,在代码中用注释做说明
php Douban.php

执行结果

经验

网页上数据是动态变化的,没获取到的字段需要用try catch进行异常处理,这样程序就不会崩溃
XPath表达式孰能生巧基本能应付绝大多数的需求
某些数据如果用XPath表达式也不好取,或者取出来的数据还需要加工的,用正则表达式处理,用preg_match_all进行抽取,用preg_replace进行替换
用strip_tags()函数去除HTML、XML以及PHP的标签,加参数可以保留标签去除,如处理文章内容strip_tags($str, "<p><img><strong>"),后留后面参数中的标签
一些常用的正则表达式

参考资料

官方文档The DomCrawler Component
八爪鱼的了解XPath常用术语和表达式解析 十分钟轻松入门
gooseeker的xpath基础知识培训
神箭手的常用的辅助开发工具
XPath Helper:chrome爬虫网页解析工具 Chrome插件图文教程
在PHP中,您如何解析和处理HTML/XML?

扩展阅读

关于反爬虫,看这一篇就够了
最好的语言PHP + 最好的前端测试框架Selenium = 最好的爬虫(上)

隐藏nginx、openresty版本号

隐藏nginx、openresty的版本号有什么用?
假设一个场景,nginx被爆出0.9-1.5的版本被爆出一个0day漏洞,
攻击者会先大量扫描匹配的nginx版本,然后实施攻击。
如果事先隐藏了会降低第一时间被攻击的风险

在 http {} 中间配置增加

在http头中从原来的
Server: nginx/1.0.15 变为 Server: nginx
Server: openresty/1.11.2.3 变为 Server: openresty

nginx 日志格式化完整增强版

本完整增强版主要解决了后端执行时间的记录、哪台后端处理的、日志集中化后日志来自于哪台服务器ip、cdn传过来的客户端ip等扩展等问题。

在默认的nginx日志上,扩展增加了http头中代理服务器ip($http_x_forwarded_for)、
http头中cdn保存的客户端用户真实IP($http_x_real_ip)、服务端ip($server_addr)、http头中host主机($host)、
请求时间($request_time)、后端返回时间($upstream_response_time)、后端地址($upstream_addr)、
URI($uri)、ISO 8601标准时间($time_iso8601)

nginx日志滚动切割

繁忙的nginx服务器每天都会产生大量的web日志,所以每天需要切割。
每天切割的日志需要保留一段时间,更老的日志需要删除,专业叫法叫做日志滚动类似于视频监控,
所需要保留一定时间的日志还需要删除更老的日志。

很多人喜欢手动用bash shell去写nginx的日志切割滚动配合定时计划任务执行执行。
其实用系统自带的logrotate更好。
新建文件

写入

elastic stack elk日志系统

采集的日志需要格式化格式,要么在采集端做,要么在入库elasticsearch的时候做。
在nginx中直接配置输出的日志就是json格式,可以减少格式化日志的cpu开销
在日志采集端,用filebeat、或者logstash作为日志采集工具可以不做任务的格式化处理,
仅仅采集json格式的文本即可。

apache ab

yum install apr-util

webench

wget http://blog.zyan.cc/soft/linux/webbench/webbench-1.5.tar.gz
tar zxvf webbench-1.5.tar.gz
cd webbench-1.5
make && make install

wrk

Modern HTTP benchmarking tool
https://github.com/wg/wrk

Gatling

Async Scala-Akka-Netty based Load Test Tool http://gatling.io
https://github.com/gatling/gatling

sniper

A powerful & high-performance http load tester
https://github.com/btfak/sniper

hey

HTTP load generator, ApacheBench (ab) replacement, formerly known as rakyll/boom
https://github.com/rakyll/hey

Siege

Siege is an http load tester and benchmarking utility
https://github.com/JoeDog/siege

http_load

http_load runs multiple http fetches in parallel, to test the throughput of a web server.
http://www.acme.com/software/http_load/

vegeta

HTTP load testing tool and library. It’s over 9000!
https://github.com/tsenart/vegeta/

t50

mixed packet injector tool
https://github.com/fredericopissarra/t50

GoReplay

GoReplay is an open-source tool for capturing and replaying live HTTP traffic into a test environment in order to continuously test your system with real data. It can be used to increase confidence in code deployments, configuration changes and infrastructure changes.
https://goreplay.org
https://github.com/buger/goreplay

tcpcopy

An online request replication tool, also a tcp stream replay tool, fit for real testing, performance testing, stability testing, stress testing, load testing, smoke testing, etc
https://github.com/session-replay-tools/tcpcopy

gryphon

Gryphon是由网易自主研发的能够模拟千万级别并发用户的一个软件,目的是能够用较少的资源来模拟出大量并发用户,并且能够更加真实地进行压力测试, 以解决网络消息推送服务方面的压力测试的问题和传统压力测试的问题。Gryphon分为两个程序,一个运行gryphon,用来模拟用户,一个是 intercept,用来截获响应包信息给gryphon。Gryphon模拟用户的本质是用一个连接来模拟一个用户,所以有多少个连接,就有多少个用户,而用户的素材则取自于pcap抓包文件。值得注意的是,Gryphon架构类似于tcpcopy,也可以采用传统使用方式和高级使用方式。
https://github.com/wslfa/gryphon

locust.io

An open source load testing tool.
Define user behaviour with Python code, and swarm your system with millions of simultaneous users.
http://locust.io/

Jmeter

Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域。
http://jmeter.apache.org/

需求

当前php-fpm进程是不是不够了,一通命令一打,也只能看当前情况。
熟话说无监控无度量就无诊断。
市面上有成熟的php-fpm status状态采集,展示工具那就是elasti stack全家桶
目标采集分析php-fpm status 状态数据

选型

Elastic公司全家桶之Beats(PHP-FPM Module@Metricbeat) + Elasticsearch + Kibana

Metricbeat 是 Beats 的一个采集组件
PHP-FPM Module 是 Metricbeat 的一个采集模块

整体的数据流方式

方式1 : Beats (Metricbeat )>Elasticsearch>Kibana
方式2: Beats (Metricbeat )>Logstash>[直连,redis队列,Kafka队列]>Elasticsearch>Kibana

先讲方式1

配置php-fpm

php-fpm.conf

[www] [u] 是独立的php-fpm pool 进程池,每个池子的pm.status_path是需要单独设置的

测试配置文件是否正确

重启php-fpm

配置nginx

phpfpm.conf

只给本地访问,这里监听的是localhost,也可用nginx allow deny的方式

测试配置文件是否正确

重启nginx

用curl测试php-fpm status状态是否可以获取

配置Metricbeat

Metricbeat Reference [5.3] » Modules » PHP-FPM Module

/etc/metricbeat/metricbeat.yml

测试配置文件是否正确

给metricbeat创建Elasticsearch的Index Template
Loading the Index Template in Elasticsearch

给metricbeat创建Kibana Dashboards
Loading Sample Kibana Dashboards

metricbeat中phpfpm模块,没有elastic官方的 Sample Kibana Dashboard
所以需要分析什么数据的自己在Kibana中自己创建visualize然后做成Dashboard

启动metricbeat

配置Kibana

Management / Kibana / Indices > Add New
Index name or pattern 填写 “metricbeat-*”
Time-field name 选 “@timestamp”
Alt text

分享我做的 metricbeat phpfpm kibana dashboard (不完整)
export.json

补充logstash采集数据(方式2)

配置Metricbeat

/etc/metricbeat/metricbeat.yml

output输出到logstash的input tcp 5044上
input输入参考上面方式1 Metricbeat 的配置方法

配置logstash2.x

Logstash Reference [2.4] » Input plugins » beats

/etc/logstash/conf.d/beats.conf

input输入tcp 5044 监听本机
output输出,根据自己环境来

测试配置文件是否正确

启动logstash

提示

  • 使用测试配置文件的功能测试配置文件是否书写正确
  • 使用tail -f 日志的方式查错
  • 注意tcp监听的安全问题,别暴露到公网IP上