本文来自宝宝树运维总监刘秋岐的分享。随着MySQL的不断成熟,逐渐被用于更多大规模的网站和应用了,比如说当前最火的Facebook、淘宝、阿里、兰亭集势、宝宝树这样的大型的网站都在使用MySQL数据库,足见MySQL在稳定可靠性方面,并不会比我们的商业厂商的产品有太多的逊色。本期访谈我们邀请到了宝宝树(全球第一的母婴社区)网站架构运维总监刘秋岐,他对Mysql在互联网多种业务场景下的设计和优化有着丰富经验,只用了短短五年的时间,就从DBA成功转型成了架构运维总监,让我们一起来看看他的成长之路。

访谈(Q1):刘总,您好!短短的五年时间内,您从一名搜狗的DBA转型成了宝宝树的架构运维总监,可能在很多人眼里,尤其是对于毕业生而言,DBA和架构师是他们努力奋斗的梦想所在。能否简单介绍下自己?谈谈毕业这些年来您在工作中的收获和体验。

acmore(A1):首先,我想说的是,不管是在学校学习还是毕业后工作,大家要关注两点,就是——成长和目标,男人要不怕苦和累,时时刻刻关注自己是否有“成长”,这很重要。

先谈一下“目标”

我总觉得我是一名幸运儿,在大学大二的时候,大家都在按部就班,上课做作业的时候,有一位我生命中的贵人告诉我,我要有自己一个毕业的时候的目标。那时候 07年,刚来北京上大学,坐355公交路过搜狐网络大厦的时候,就想毕业要是能去搜狐上班多好,因为听学长说,那里毕业生起薪就是8K。随后我告诉我的那位贵人,我说我要进搜狐,搞IT。

我的这位master给我了几个方向:网站开发、数据库、安全,他让我选。由于大 一在学校搞ACM编程搞的头晕晕的,决定不深入搞开发coding,而当时看数据库的书,觉得数据库很有意思,逻辑层和物理层的东东,整个数据库的逻辑层牵一发动全身,很有意思,就立志要当一位DBA,当时刚好有个大牛DBA叫“牛新庄”,我想我要向他学习。

随后大二就开始各种看数据库书籍,大二下学期又去报了个Oracle培训班考OCP,大三实习(埃森哲、朗讯),大四找工作,一口气拿下百度、搜狗等等的DBA offer。还记得当初的梦想么,于是就去了搜狗,去了搜狐网络大厦,刚好也离母校近,大四搜狗的岁月很快乐。

看着都挺顺利,其实不然。大二大家都在玩的时候,我每周末都要去Oracle培训,每次培训完都要做一遍实验,有时候晚上熄灯了,就到楼道去用笔记本电脑做,没通过就不睡觉。大三埃森哲实习的时候,实习是做埃森哲的Oracle BI的项目,做项目的地点在丰台区,每天早上5点起床,我的室友还在美梦,我要悄悄溜起来,横跨海淀、西城、丰台三个区,晚上下班也较晚,埃森哲项目的辛 苦程度大家应该是知道的。大三为了解决上课和实习的冲突,去求老师,给老师讲我自己的想法,我的初衷,还好我的老师们很理解我,给我开“后门”。

依然记得大四上学期9月底,那天北京天气很好,去签了搜狗的offer,一块儿去签的基本都是清华硕士,回学校路上我给我妈妈电话报了个喜,电话里我回头一想,三年前的目标终于实现了,那时候那个开心得跟初恋的心情一样的,哈哈哈。

再谈“成长”

首先,感谢搜狗,感谢第一份工作。当时我入职搜狗搞数据库当DBA,刚好有个DBA叫尹博学离职去了百度(现在是百度DBA架构师),我接了他的位子,承担起搜狗所有数据库的运维和架构设计。正值搜狗快速成长,我经历了数据库集群从8台成长到300多台一个过程,在这个过程中我扛起了整个DBA Team的KPI,比较痛苦,因为开始的数据库架构就主从,没有更多,连keepalived都没有弄,生怕宕机,生怕由于数据库问题导致页面打不开,影响整个Team的KPI,于是周末去哪里都把笔记本电脑背身上。后来不断改进,去做高可用、分库分表、建立DB Server Buffer Pool,再到后来搞DBProxy。

有一天,运维部高级总监告诉我,要时刻关注“成长”。我觉得他说得很对,“成 长”很痛苦。上学跟工作是完全不一样的,实习时候的心态和责任跟上班更是很不一样的。DBA是个综合素质要求比较高的职位,首先Mysql很简单,很多东 西都需要DBA自己去补充。其次DBA要做的一些事情需要开发配合,那你推动一个改进和上线让开发去实施,开发为什么相信你的方案是靠谱的,开发为你多做 了些事儿对人家又能有哪些好处,所以整个工作过程很锻炼人,一年过去,我思考我的成长——技术进步很多,又一年过去,回头再看,心态已经跟毕业时候远远不同了——懂得了聆听,懂得了巧妙的推动,懂得了技术怎么结合实践,懂得了如何斡旋,怎样做好优化,既能节省时间金钱,又能省运维成本。

有时候我想,搜狗DBA阶段,我完全可以只做好数据库管理员就好,没必要去立项搞数据库的白盒监控、细粒度指标(结合阈值),也完全可以不去搞slowlog挖掘平台什么的,但是我却一直主动去想,怎么才能提高数据库的高可用性,让response time变得更短。提到“成长”,如果今天做的只是重复昨天的,何谈“成长”。后来去了兰亭搞电商也是为了更多的成长,毕竟电商对数据库技术要求更高更锻炼人,再后来去了宝宝树搞架构设计,也是为了更快更好的成长。

最后,回到开头,我们要有“目标”,我们要时刻关注“成长”。

访谈(Q2):作为最流行的开源数据库软件之一,MySQL数据库软件广为人知了,被甲骨文收购二度易主后,MySQL命运能否被改写?到底是拥抱IOE还是力挺"去IOE"呢?

acmore(A2):MySQL被Oracle收购后,我个人觉得MySQL变得越来越好了。且Oracle也一直秉承着MySQL的开源思想,未有任何MySQL商业化趋势,我觉得还是很赞的。MySQL5.5之后性能大有提升,对事务性支持更好,总体上Oracle是推进了MySQL的发展。

关于去IOE的问题,我觉得还是要具体问题具体对待,不能“一锤子买卖”。在互联网行业,非电商类应用,事务性要求不是非常严格的完全可以使用Mysql,既给老板省了钱,Mysql对大数据量的扩展又比Oracle轻量化,使用Mysql何乐而不为。但是金融系统,比如银行的存取款交易,Mysql虽然支持事务,但是在事务的日志记录以及回滚、审计方面都没有Oracle更加完善,在主从复制方面更是没有Oracle的三种安全的复制模式可供选择,所以某些系统上,使用Mysql远不如Oracle让人放心,所以还必须使用Oracle。最终,必须使用IOE的地方是让IOE更好的去“扬长”,而可以去IOE的地方是让IOE更好的去“避短”。

访谈(Q3):宝宝树作为互联网行业的领军母婴类电商网站,它的网站架构到底是怎样的?对于月均几百万的用户访问量,如何保障网站不宕机?作为宝宝树网站架构运维总监,您能否从数据库、服务器、中间件、负载均衡等角度为我们分享下宝宝树的网站架构。

acmore(A3):我们宝宝树的网站架构分模块的,有主站系统、广告系统、日志系统、邮件系统、分布式图片系统等。基本还是基于linux+apache/nginx+memcache/redis+php的实现,数据库有Mysql和Mariadb,有使用蓝汛和网宿的CDN。各个子系统的输入都是来自nginx的数据分发,输出都是将数据持久化到数据库里。

在保障网站不宕机方面,我们使每个功能模块都是高可用的。首先前端接入是硬件的互备的负载均衡设备,然后是互备的nginx做反向代理,再下来分登陆和非登录的访问,访问还是apache+nginx,也都是集群化,保证单台或者几台宕机都是对静态数据的访问高可用的,动态访问高可用是靠分布式的memcache缓存集群+Mysql高可用集群实现的,Mysql高可用使用了haproxy和lvs,读写分离(写使用keepalived,读使用lvs下挂mysqlserver),然后能异步减少网站load的都异步到消息队列里,消息队列也是高可用的,所有模块都是高可用的,这样网站就是高可用的,不怕宕机的。

访谈(Q4):每天有超过30万张家庭照片上传至宝宝树,累积存储达2.1亿张,这些云端照片记录了宝宝成长的每一个精彩瞬间,辣妈们还可以通过语音发帖写日记、如此海量的数据背后到底用到了哪些存储技术?

acmore(A4):首先我们确实用户的上传量很大很大,我们的数据库数据也很大。

数据持久化这里主要分两种,一种是int、char类型数据持久化到数据库集群,一种是图片类型数据持久化到分布式图片存储集群。

我们数据库分功能拆过库,有主站的论坛帖子库,有用户库,有宝宝树孕育app的数据库,有宝宝树时光app的数据库,分库根据业务耦合度来分,这样区分很清楚,减低了调用的逻辑复杂性。用户访问热门帖子可以直接从memcache中取到数据,不会给数据库集群施加压力,用户发帖是写到数据库的,为了提升数据库响应速度,我们数据库使用了大内存+ssd存储介质,使用了xfs文件系统(nobarriar),使用了raid卡和raid技术。

用户上传的图片是存储到我们分布式的图片存储中的,每台分布式图片server存储25T的图片数据,每个图片在分布式图片系统中会有3份的冗余,数据库中只记录用户图片在分布式图片系统中的路径。

访谈(Q5):在苹果iOS8上线当天,因为可以安装第三方输入法,备受期待的搜狗手机输入法仅用7小时就荣登苹果App Store中国区免费榜第一名,搜狗输入法可谓是人气扶摇直上。您曾经负责过搜狗输入法的数据库设计与运维,能否和我们分享下3亿多用户数据背后的数据库技术?

acmore(A5):搜狗输入法的数据库真的相当庞大,我们是做了分库分表的,存储到64台数据库上。这个数据库集群的关键在于分表那一环上,主要是用户表的分表,最后还是选择使用用户id去分表,对用户id做了MD5值,因为用户id是varchar,做完md5后也是一个varchar,这个varchar每位都是0—F的字母中任意一个,那么当时按照这个串的第一位就能分16张表,首字母为0的为一张表,首字母为A的为一张表,这样0—F能分16张表。后来随着业务增长,发现16张表搞不定了,于是按照第二位字母再分,这下一共分了16x16=256张表(00,01...10,11...F0,F1...),均放到了64台数据库里,这64台数据库32主,32从,保证了高可用。

访谈(Q6):随着双十一的到来,时下最火的淘宝、兰亭集序等电商网站成为了备受瞩目的焦点,为啥这些电商网站都选择采用MySQL数据库?

acmore(A6):电商网站的系统中很关键的一步是订单系统,一个下订单的操作一定是数据库的一个事物,这个事物里涉及到所买东西的减库存,订单完成回写到用户订单表等,这些都要遵循事物的ACID属性,所以必须使用支持事务的数据库,主流的支持事务的数据库就是Oracle、SQLServer、Mysql。这其中SQLServer多用于WindowsServer环境下,而互联网行业多放在Linux环境下,又加之Oracle是收费的,Mysql是免费的,所以电商网站大都采用Mysql数据库。

其实最早淘宝也是全用Oracle的,但是Oracle的license太贵了,于是淘宝把不那么“贵重”的库变成了Mysql去弄,因为Mysql也是关系型数据库,也支持事务,再到后来淘宝的DBA team越来越强大,他们可以给Mysql打patch,改源码,于是他们把商品库、仓储物流、订单都换成了Mysql,因为Mysql是开源的,免费的,所以Mysql数据库可以大大节省IT成本开销。

访谈(Q7):对很多屌丝而言,足不出户,逛逛电商网站就能轻松淘到自己想要的商品,只要输入商品名称,很快就能看到对应的商品列表,从查询到购买,整个订单过程很流畅,这些网站的后端是否用到了数据库集群?请结合您的项目经验为我们分享下您在数据库集群方面的设计经验。

acmore(A7):后端肯定使用了数据库集群。数据库集群设计的结果首先要做到高可用,其次做到高性能。高可用的数据库集群技术主要有Mysql主从复制,基于Mysql主从复制的访问ip的keepalived技术。mysql请求也是一个tcp请求,也可以使用基于tcp请求分发的haproxy或者lvs高可用技术。

高性能方面要做好对软件和硬件的优化,软件层面:

(1)、Mysql的参数调优,根据数据安全性要求合理设置

innodb_flush_log_at_trx_commit,设置innodb_write_io_threads提升写入性能,设置innodb_flush_method=O_DIRECT,设置innodb_old_blocks_time=1000等等

(2)、文件系统推荐使用xfs,挂载时候设置挂载属性noatime,nodiratime,nobarrier (nobarrier 是避免操作系统的cache)

(3)、关闭 numa=off

硬件层面:

(1)、数据库永远是大内存的好,电商128G内存最低,争取256G内存;

(2)、数据盘可以使用ssd,想要更快可以考虑PCIE-Flash,他们的对比我把图贴出来(见下图),可以数据放在SSD盘上,日志放在普通磁盘上:

访谈(Q8):从您本人的经历来讲,从搜狗、兰亭集势、到宝宝树,您在成长的过程中有哪些收获?这些互联网企业的文化有何不同?

acmore(A8):搜狗主要业务还是搜狗搜索(输入法带动浏览器往搜索导流量),兰亭主要是对外B2C电商,宝宝树主要是母婴论坛社区+移动app,搜狗是我人生第一家全职单位,在搜狗我收获了高级DBA的技术技能,也收获了较少的管理技能,搜狗的企业文化很好,有一种geek精神,技术氛围很好。兰亭主要做对外B2C电商,最早做婚纱和礼服的品类,后来做了miniinthebox站扩充了很多其他品类,在兰亭收获了电商的数据生产消费模型,收获了怎么依赖数据库去建设好电商的仓库/物流/订单/上新等系统,兰亭有一种航海文化,比较有挑战,电商对数据要求很严格,所以电商的数据要频繁的校对,就算数据库已经完全没问题了,对账程序还得每天跑,确保万无一失。宝宝树是一家有爱的企业,首先它做母婴,这是一份很有爱心的事业,然后还是处于创业阶段,母婴这块儿目前宝宝树是最大 的,竞争对手也很多,所以宝宝树也很拼的,app一版发完又一般,母婴电商也是刚做不久目前已经超过母婴电商萌芽宝贝了,在移动互联网的时代,宝宝树要做的还有更多,这对我的挑战也很大,也很锻炼人。

访谈(Q9):很多关于IT男的传说在江湖流行甚广,但真实生活中的IT男究竟是像神一样存在,还是不过芸芸众生呢?很多IT屌丝男用生命在追赶,“朝九晚五”变成了“朝九晚无”。作为一名IT精英男,您的生活与工作中是否也在上演这样的故事?

acmore(A9):哪里有神一样的存在,哈哈,也得吃饭睡觉呀,但是IT男更多的是去解决产品的需求,解决系统的问题,所以牛的IT男或者geek在解决问题方面确实有神存在一样的感觉(请参见tk教主)。

IT 工作加班是必不可少的,这也是这个行业的特色吧,不可避免,尤其是互联网,想想中国互联网也就20年不到,却已经可以频繁去美国上市,跟美国互联网看齐,说明IT互联网的伙伴们还是很拼的,所以加班是家常便饭,但是再累也需要思考提升工作效率,效率上去了,时间就腾出来了,就有时间更好的休息和娱乐生活 了,这才是一个好的正反馈系统。上班时间较长必不可免,为了不影响生活质量,我一般充分利用好碎片时间,也会积极去抽时间健身,总之,我觉得时间就这些, 规划好执行好就ok了,life is always a tradeoff,自己权衡好就好。


=>更多文章请参考:《中国互联网业务研发体系架构指南》https://blog.csdn.net/Ture010Love/article/details/104381157

=>更多行业权威架构案例、领域标准及技术趋势请关注微信公众号 '软件真理与光':

5年从DBA到运维架构总监 — 做对了什么的更多相关文章

  1. 15-MySQL DBA笔记-运维管理

    第15章 运维管理 随着各种技术的快速发展,现今的DBA可以比以前的DBA维护多得多的数据库实例.DBA已经越来越像一个资源的管理者,而不是简单的操作步骤执行人.本章将为读者介绍规模化运维之道.首先, ...

  2. 运维架构服务监控Open-Falcon

    一. 介绍 监控系统是整个运维环节,乃至整个产品生命周期中最重要的一环,事前及时预警发现故障,事后提供翔实的数据用于追查定位问题.监控系统作为一个成熟的运维产品,业界有很多开源的实现可供选择.当公司刚 ...

  3. linux运维架构师职业规划

    1.假如你从来未接触过Linux的话,首先要做的就找一本指导书来学习.现在公认的Linux的入门书籍是“鸟哥的私房菜”,讲的很全面,鸟哥的私房菜一共分为两部,一部是基础篇,一部是服务器篇.“鸟哥的私房 ...

  4. 转-4年!我对OpenStack运维架构的总结

    4年!我对OpenStack运维架构的总结 原创: 徐超 云技术之家 今天 前言 应“云技术社区”北极熊之邀,写点东西.思来想去云计算范畴实在广泛,自然就聊点最近话题异常火热,让广大云计算从业者爱之深 ...

  5. 7.学完linux系统运维到底可以做什么?

    linux运维到底可以做什么?(略有改动原文.排版) 运维,很容易从字面理解为运营.维护. 很多朋友认为,在互联网公司中linux系统运维的工作就是安装系统,部署服务.处理紧急故障,为公司里的开发人员 ...

  6. 14-MySQL DBA笔记-运维技巧和常见问题处理

    第14章 运维技巧和常见问题处理 DBA的成长,离不开对各种问题的处理.本章将为读者介绍一些运维技巧和常见问题的处理方法.我们需要意识到,别人的经验代替不了自己的经验,所以,多实践.多处理问题,最终会 ...

  7. 对OpenStack运维架构的总结(转)

    这里,仅从技术角度出发,谈谈OpenStack云平台在部署.架构和运维实施等方面的感想. 缘起,在2014年大二首次接触到OpenStack,当时国内外资料远没有当前这么丰富,为安装一个OpenSta ...

  8. Linux运维到底是做什么的?在开始学习之前,你必须了解这些!

    首先祝贺你选择学习Linux,你可能即将踏上Linux的工作之旅,出发之前,让我带你来看一看关于Linux和Linux运维的一切. Linux因其高效率.易于裁剪.应用广等优势,成为了当今中高端服务器 ...

  9. MGR 架构 ~ DBA相关运维管理

    一 简介:简述DBA相关管理MGR工作 二 监控 1 采用proxysql相关创造的view视图作为监控指标 三 备份 1 利用xtrabackup在读节点进行备份 2 设置binlog保留日期 四  ...

随机推荐

  1. Android Studio build不显示Generate signed apk问题

    如果是刚装的AS,那么新建一个项目,进入项目后,会发现build选项卡缺了一些选项,同时底部sync在转圈圈,其实是AS在自动下载gradle,也许还在下载build-tools,我等了11分钟才结束 ...

  2. 使用内存映射文件MMF实现大数据量导出时的内存优化

    前言 导出功能几乎是所有应用系统必不可少功能,今天我们来谈一谈,如何使用内存映射文件MMF进行内存优化,本文重点介绍使用方法,相关原理可以参考文末的连接 实现 我们以单次导出一个excel举例(csv ...

  3. python检查是否是闰年

    检查的依据: 闰年可以被4整除不能被100整除,或者可以被400整除. year = int(input("请输入年份:")) if year % 4 == 0 and year ...

  4. python关系(比较)运算符

    关系运算符 就是 比较运算符 a.对象的值进行比较 数字间的比较运算符连着使用: 数字与True.False的比较True 表示 1 , False 表示 0 数字与字符串的比较(不能比较) 字符串间 ...

  5. .net Core 使用IHttpClientFactory请求

            导读:本文已添加在晨曦微服务之旅,现在自己在尝试微服务架构,一边学边做项目快速的进入状态.当然在学习的过程中会将自己学到的知识进行分享. 一.为什么不用HttpClient       ...

  6. codeforces 上的找两人的幸运天

    Bob and Alice are often participating in various programming competitions. Like many competitive pro ...

  7. 定时器之Quart.net(1)

    第一步:Install-Package Quartz namespace ProjectEdb { class Program { static void Main(string[] args) { ...

  8. border-radius属性失效了Ծ‸Ծ

    .btn-circle { width: 30px; height: 30px; text-align: center; padding: 4px ; font-size: 16px; font-we ...

  9. 【转】oracle条件子句执行顺序

    Oracle WHERE条件执行顺序:ORACLE采用自下而上的顺序解析WHERE子句 1.据此那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾例如:SELECT … FROM EMP E ...

  10. Java入门 - 语言基础 - 15.StringBuffer

    原文地址:http://www.work100.net/training/java-stringbuffer.html 更多教程:光束云 - 免费课程 StringBuffer 序号 文内章节 视频 ...