《高性能MySQL》(第3版)中文版

历经差不多一年的时间,总算让《高性能MySQL》(第3版)中文版可以和大家见面了,今天Amazon和China-pub已经开始预售,其他网站这几天也都会开始上架。预计4.10可以正式出阁了。

Amazon预售地址
China-pu预售地址
在线试读 第2章 第3章 第4章

翻译是件苦差事,初稿出来后,大规模审稿两三次,身心俱疲,大量内容在审稿过程中都被重新修改润色。直到上个周末,最后又快速的过了一次,修正了几十处不太满意的小地方。只要没有最终正式交付给出版社,每看一遍都能找出很多可以改进的地方。因此,然后已经交付付印,心中依然怀有忐忑,期望不要有误导人的错误遗留其中。

内容简介

《高性能MySQL(第3版)》是MySQL 领域的经典之作,拥有广泛的影响力。第3 版更新了大量的内容,不但涵盖了最新MySQL 5.5版本的新特性,也讲述了关于固态盘、高可扩展性设计和云计算环境下的数据库相关的新内容,原有的基准测试和性能优化部分也做了大量的扩展和补充。全书共分为16 章和6 个附录,内容涵盖MySQL 架构和历史,基准测试和性能剖析,数据库软硬件性能优化,复制、备份和恢复,高可用与高可扩展性,以及云端的MySQL 和MySQL相关工具等方面的内容。每一章都是相对独立的主题,读者可以有选择性地单独阅读。

本书不但适合数据库管理员(DBA)阅读,也适合开发人员参考学习。不管是数据库新手还是专家,相信都能从本书有所收获。

译者序

  在互联网行业,MySQL 数据库毫无疑问已经是最常用的数据库。LAMP(Linux +Apache + MySQL + PHP)甚至已经成为专有名词,也是很多中小网站建站的首选技术架构。我所在的公司淘宝网,在2003 年非典肆虐期间创立时,选择的就是LAMP 架构,当时MySQL 的版本还是4.0。但是到了2003 年底,由于业务超预期的增长,MySQL 4.0(当时用的还是MyISAM 引擎)的很多缺点在高并发大压力下暴露了出来,于是技术上开始改用商业的Oracle 数据库。随后几年Oracle 加小型机和高端存储的数据库架构支撑了淘宝网业务的爆炸式增长,数据库也从最初的两三个库增长到十几个库,并且每个库的硬件已经逐步升级到顶配,“天花板”很明显地摆在了眼前。于是在2008 年,基于PC 服务器的MySQL 数据库再次成为DBA 团队的选择,这时候MySQL 的稳定版本已经升级到5.0,并且5.1 也已经在开发中,性能和特性相对于2003 年的时候已经有了非常大的提升。淘宝网的数据库架构也逐渐从垂直拆分走向水平拆分,在大规模水平集群的架构设计中,开源的MySQL 受到的关注度越来越高,并且一年多来的实践也证明了MySQL(存储引擎主要使用的是InnoDB)在高压力下的可用性。于是从2009 年开始,后来颇受外界关注的所谓“去IOE”开始实施,经过三年多的架构改造,到2012年整个淘宝网的核心交易系统已经全部运行在基于PC 服务器的MySQL 数据库集群中,全部实例数超过2000 个。今年的“双11”大促中,MySQL 单库经受了最高达6.5 万的QPS,某个拥有32 个节点的核心集群的总QPS 则稳定在86 万以上,并且在整个大促(包括之前三年的“双11”大促)期间,数据库未发生过任何影响大促的重大故障。当然,这个结果,也得益于淘宝网整个应用架构的设计,以及这几年来革命性的闪存设备的迅猛发展。

  2008 年,淘宝DBA 团队准备从Oracle 转向MySQL 的时候,团队中的大多数人对MySQL 的了解都非常之少。当时国内技术圈对MySQL 的讨论也不多见,网上能找到的大多数中文资料基本上关注的还是如何安装,如何配置主备复制等。而MySQL 中文类的书籍,大部分还是和PHP 放在一起,作为PHP 开发中的一环来讲述的。所以当我们发现mysqlperformanceblog.com 这个相当专业的国外博客的时候,无不欣喜莫名。同时也知道了博客的作者们2008 年出版的High Performance MySQL 第二版(中文版于2010 年1 月出版),这本书被很多MySQL DBA 们奉为圭皋,书的三位主要作者Baron Schwartz、Peter Zaitsev 和Vadim Tkachenko 也在MySQL DBA 圈中耳熟能详,他们组建的Percona 公司和Percona Server 分支版本以及XtraDB 存储引擎也逐渐为国内DBA所熟知。2011 年12 月,淘宝网和O’Reilly 在北京联合举办的Velocity China 2011 技术大会上,我们有幸邀请到Percona 公司的华人专家季海东(目前已离职)来介绍MySQL 5.5 InnoDB/XtraDB 的性能优化和诊断方法。在季海东先生的引荐下,我们也和Peter 通过Skype 电话会议有过沟通,介绍了MySQL 在淘宝的应用情况,我们对MySQL 一些特性的需求,以及对MySQL 做的一些patch,并随后保持了密切的邮件联系。有了这些铺垫,我们对于在生产系统中采用Percona Server 5.5 也有了更大的信心,如今已有超过1000个Percona Server 5.5 的实例在线上运行。所以今年上半年电子工业出版社的张春雨(侠少)编辑找到我来翻译本书的第三版的时候,很是激动,一口应承。

  考虑到这么经典的书应该尽快地和读者见面,故此我邀请了团队中的MySQL 专家周振兴(花名:苏普)、彭立勋、翟卫祥(花名:印风)、刘辉(花名:希羽)一起来翻译。其中,我负责前、推荐序和第1、2、3 章,周振兴负责第5、6、7 章,彭立勋负责第4、8、9、14 章,翟卫祥负责第10、11、12、13 章,刘辉负责第15、16 章和附录部分,最后由我负责统稿。所以毫无疑问,这本书是团队合作的结晶。虽然我们满怀激情,但由于都是第一次参与翻译技术书籍,确实对困难有些预估不足,加上下半年为了准备“双11”等各种大促,需要在DBA 团队满负荷的工作间隙挤出个人时间,初稿出来后,由于每个人翻译风格不太一致,几次审稿修订,也让本书的编辑李云静和白涛吃了不少苦头,在此对大家表示深深的感谢,是大家不懈的努力,才使得本书能够顺利地和读者见面。但书中肯定还存在不少问题,也恳请读者不吝指出,欢迎大家和我的新浪微博http://weibo.com/NinGoo 进行互动。

  同时还要感谢本书第二版的译者们,他们娴熟的语言技巧给了我们很多的参考。也要感谢帮助审稿的同事们,包括但并不仅限于张新铭(花名:俊达)、张瑞(花名:张瑞)、吴学章(花名:维西)等,彭立勋甚至还发动了他女朋友加入到审稿工作中,在此一并表示感谢。当然,最后还要感谢我的妻子Lalla,在我占用了大量周末时间的时候能够给予支持,并承担了全部的家务,让我以译书为借口毫无心理负担地偷懒。

   宁海元(花名:江枫)
   2013 年3 月 于余杭

在Ubuntu上编译安装R

R is a free software environment for statistical computing and graphic.

在Ubuntu上编译安装时有几个小问题,记录在此备查:

1.需要fortran compiler
下载完源码,解压后直接执行

./configure –prefix=/xxx –enable-R-shlib

报错:configure: error: No F77 compiler found
这是因为Ubuntu现在默认没有fortran编译器,需要手工装一个,比如gfortran:

sudo apt-get install gfortran

当然,编译还需要gcc等工具

sudo apt-get install build-essential

2.需要readline
如果系统中没有readline,继续configure还是报错:

configure: error: –with-readline=yes (default) and headers/libs are not available

两个选择,要么使用–with-readline=no去掉对readline的依赖,要么装一个:

sudo apt-get install readline-devel

3. 需要X11的headers/libs
继续configure,继续报错:

configure: error: –with-x=yes (default) and X11 headers/libs are no t available

好吧,缺的东西还真不少,还是两个选择,要么–with-x=no,要么把缺失的依赖补上:

sudo apt-get install libxt-dev

搞定, ./configure && make && make install,收工

$ ./R

R version 2.15.2 (2012-10-26) — “Trick or Treat”
Copyright (C) 2012 The R Foundation for Statistical Computing
ISBN 3-900051-07-0
Platform: x86_64-unknown-linux-gnu (64-bit)

R是自由软件,不带任何担保。
在某些条件下你可以将其自由散布。
用’license()’或’licence()’来看散布的详细条件。

R是个合作计划,有许多人为之做出了贡献.
用’contributors()’来看合作者的详细情况
用’citation()’会告诉你如何在出版物中正确地引用R或R程序包。

用’demo()’来看一些示范程序,用’help()’来阅读在线帮助文件,或
用’help.start()’通过HTML浏览器来看帮助文件。
用’q()’退出R.

偷懒的话,也可以直接安装编译好的包了,版本可能不是最新而已:

sudo apt-get install r-base

参考:http://rwiki.sciviews.org/doku.php?id=getting-started:installation:debian

时光荏苒,五年陈酿

2012.9.20,本来想说这一天没什么特别的,翻了一下万年历,居然还是国际爱牙日。上周体检的报告还没出来,但现场的结论是除了牙结石,其他都还好,去年体检的血压偏高/轻度脂肪肝/耳耵聍等问题,今年都消失了,看来要找个时间去尝试下洗牙,争取明年的体检结果能更健康点。

好吧,其实我是想说,这一天,终于成为了阿里巴巴五年陈。从进入淘宝的第一天,一年香,三年醇,五年陈的说法就一直萦绕在耳边。还记得一年香的时候礼物是一个印着小蚂蚁的杯子,貌似当年的蚂蚁已经进化成了如今的淘公仔,蚂蚁标记已经从各种地方慢慢消失。其实当年经常唱响的一首小蚂蚁大淘宝的歌依然还在记忆深处吟唱,那时候的淘宝真的非常草根,而今这种感觉可能随着时间感觉已经冲淡了不少。那时候的淘宝DBA团队,兵少而精,数据库都跑在高富帅的IOE(IBM小型机/Oracle数据库/EMC存储)上,现在回首整个就是一青葱岁月,但第一年的收获真的非常大,也经历过至今想起来还浑身冒冷汗的故障

在阿里有一种说法,经过三年的酿造以后,才是真正的阿里人。或许只有真正到了三年才能体会的这句话背后的意义。互联网是一个快速变化的行业,互联网的公司和团队,能保持三年的稳定就相当不容易了。所以在阿里呆上三年,大部分人可能都会碰到团队的变化,即使团队稳定,也会壮大许多了。经历过风雨,心态上才能真正的成熟。而我的三年醇记忆中最深的,则是淘宝和阿里妈妈的整合(2009.9.4)。在淘宝DBA团队按照舒适的节奏成长了两年,终于迎来了最大的一次变化,成立了大淘宝技术保障部,顶头老板换人了,同时也把还在稳步推进MySQL线上应用的团队节奏突然提高到了集团战略级的地位,也就是现在外面闹得沸沸扬扬的所谓“去IOE”。虽然这个事情有很多的争议,但从淘宝的发展历程来说,这个事情一定会发生,只是节奏的快慢而已。到2009年的时候,淘宝的数据库基本完成了垂直拆分,商品,交易,用户,店铺,评价,收藏,物流等核心业务都已经运行在单独的数据库,这得益于前台应用的服务化,每个数据库前面基本都有了自己的服务中心,其他业务则通过服务器中心和数据库交互,相当于在数据库前面加了一层业务中间层,这不但帮助数据库顺利完成了垂直化拆分,也为后面的水平拆分打下了基础。淘宝应用的服务化是个有着非常长远眼光的决策,直到今天,淘宝交易平台的主要架构依然受益于此。而这个服务化的实现,@毕玄 搞的HSF绝对功不可没。可能从今天很多架构师们的眼光来看,觉得有一些不便和缺点,但如果能真正的去理解当时淘宝的现状和业界技术的发展,相信不但能理解HSF的架构选择,也能够给HSF后续的发展做一些改进的建议。

翻了一下blog,发现最早一篇关于MySQL的文章是2008.3.14,非常简单,只是了解了下InnoDB引擎的一些参数,其实也差不多是这个时候,淘宝DBA团队开始研究引入MySQL作为Oracle数据库之外的另外一种选择,还记得第一个线上用MySQL的应用是淘宝画报(这个应用今年6月份已经下线,进化成了顽图)。当时对于使用MySQL在一些开发团队中还是有一些阻力的,还记得曾经有人问过,DBA都是做Oracle的,MySQL出了问题你们能搞定么?所以当时面向全国到处招有经验的MySQL DBA,也面试了不少,但是最后因为各种原因都没有进来,后来倒是一来二往都比较熟悉了,现在idata技术沙龙有很多朋友的支持,其中就有不少当年认识的朋友,哈哈。既然招不到MySQL高手,只好自己培养新生力量,于是,2008年应届生@陶方 成为第一个专职MySQL DBA,2009年应届生@苏普 也很快成为了主要力量,而老牌的Oracle DBA们也在迅速的转型,2009年的时候MySQL数据库已经初具规模了。另外,从2007年起就开始和当时的架构团队@菲青,@华黎 畅想的数据中间层TDDL终于也逐渐靠谱起来,虽然还没有真正成熟(在我的定义里,TDDL直到动态数据源稳定应用以后,才算是挠到痒处,当然,成熟不等于就完美了,直到今天还有值得改进的地方,尤其是对于DBA的运维简化方面),有了前面说的服务化,还有数据中间层,以及一年多MySQL线上运行的经验,才有了“去IOE”的基础,而“去IOE”的需要,除了成本节约,更重要的,是垂直拆分做到尽头以后,业务压力还是爆炸式增长带来的水平拆分的需要,以及淘宝整体对于开源的拥抱和投入。

到今年,“去IOE”整体上已经接近尾声,核心数据库系统已经全部跑在MySQL上,而且去年做为动作最大,压力最重的一年,同时还做到了线上数据库无P1级故障的100%可用(P2故障也只有1起),DBA团队和各兄弟团队一起付出了120%的努力,这绝对是值得骄傲的一件事情。有人说DBA不会写代码,算不得什么有技术含量的工作,这是把技术做了一个狭隘的定义。技术是要为业务目标服务的,运维,尤其是追求高可用性的运维,技术含量绝对不比写代码低,这只有真正的去做才能体会,隔岸观火指手画脚永远是容易的。当然,DBA不会写代码绝对也不是一件值得炫耀的事情。DBA团队必须要会写代码,尤其是运维上规模数据库的DBA团队,不会写代码,之后可能只能累死。作为公共服务部门,人数不可能随着业务开发人数的增长或者机器数据的增长而等比例扩充。为了应对机器的增长,需要运维规划化和自动化;为了应对开发人数的猛增,需要想办法做到平台化和自助化。而这些,都需要有有运维开发的能力。

进入到第五个年头,一直都在淘宝DBA团队,一起成长,一起战斗,在这里留下了太多的回忆,但天下没有不散的筵席。2012.6.1,经过一段时间的思考和纠结,这一次是创造变化,主动转岗到了一淘无线技术团队,放下了DBA的标签,到开发团队从头再来。还记得给@后羿 和@振飞 的转岗申请邮件是4.20发的,那天离五年陈刚好还有五个月。有一丝不舍,也有一点遗憾,没有在DBA团队站完五年的最后一般岗,但既然要迎接新的挑战,早一点进入前线也是值得付出这些代价的。加入无线近四个月来,五年前刚加入淘宝时的激情又开始回来,新的团队,新的同事,依然像五年前的淘宝一样,带着草根的气质,喜欢这种简单快乐。

时光荏苒,五年陈酿。依然在阿里,依然在战斗。上面只是记忆中留下的一鳞半爪,胡乱的从脑海中钻了出来,在这一刻,只有感动,无须感言。

Linux上eclipse本地跑web应用绑定80端口的问题

因为要在本地跑一个web application,使用eclipse的HSF Jetty插件绑定80端口不成功,8080端口则没有问题:

2012-09-17 11:36:43.470:WARN::failed SelectChannelConnector@0.0.0.0:80: java.net.SocketException: 权限不够
2012-09-17 11:36:43.473:WARN::failed Server@327ac9a7: java.net.SocketException: 权限不够
java.net.SocketException: 权限不够

1. 猜想有其他进程已经占用了80端口

$ sudo netstat -anpt | grep LISTEN

结果80端口是available的

2. Linux的问题?

好吧,想起来了,Linux下只有root用户才能绑定使用1024以下的端口。尝试用sudo eclipse启动IDE,然后编译,发现maven的本地库有些问题,偷个懒把原用户的本地库复制一份后正常

$cd /home/ningoo/.m2
$cp -r * /root/.m2

3. iptables神器

虽然sudo大法有效,感觉还是不太爽。于是神器iptables出场,设置将80端口转发到8080端口,这样eclipse中的jetty插件还是可以绑定在8080端口,/etc/hosts绑定本地到日常的域名也可以通过80端口自动转发,方便。

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
iptables -t nat -A OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j REDIRECT --to-ports 8080

如果不需要转发了,通过以下命令清除设置

iptables -t nat -F PREROUTING
iptables -t nat -F OUTPUT

如果要保存iptables设置以便重启后生效,可以参考这里