《沉淀》是云栖社区展示专家风采的人物栏目。它呈现每个专家独一无二的人生经历、认识和感悟的同时,也能帮助你沉淀技术,收获对技术和人生的判断。我们的想法是:“若你想精进为一个很厉害的人,不妨细细品味这些技术牛人背后的沉淀。”如果你想了解这些云栖专家更多分享时,请点击云栖专家频道,当然我们也欢迎你往前走一步,成为我们的云栖专家(https://yq.aliyun.com/expert),与技术大牛一起“煮酒论英雄”。
杨钊,花名石沫,阿里云SQL Server数据库专家。在数据库设计、开发与规范,数据高可用与容灾,数据库的优化,数据库的自动化和智能化方向积累大量的经验,处理过超大群集和超高并发场景的业务。
作为一个重度的数据库领域相关的爱好者和实践者,他已经在这个行业长达十年,“连我自己都难以置信会在这个领域坚持这么长时间。”他谈到。
回忆起入行,“偶然有一天在报纸上看到一家从事电子商务的外企在招聘数据库相关的职位,也没多想,并且也不知道数据库相关工作要做什么,就懵懂投递了一份简历,经过面试后,就干上了数据库。”在外人看来,这样的选择或许显得很草率,但在执著的杨钊眼中,却是深耕的开始。
“无论干什么工作,只要坚持深耕下去,都会做的很好、很深入,也只有这样才会有竞争力。”在采访中,杨钊说。
在Newegg,杨钊从零开始,不仅学到全面的知识,也把数据库技术应用做得非常好;而在凡客则是一种升华,“数据库高可用性、高扩展和容灾的方案做的非常好。”他说这是凡客那几年最大的收获。后来他加入阿里云,从事SQL Server产品建设和服务工作。
回顾过去,他感慨良多。“这些经历,锻炼了我的各种技能和思考方法,尤其是各种高强度压力。”这种压力抗住了,就是一种财富,他解释到:“安逸的环境是锻炼不出来过硬的实力和意志的,人的本性容易懒惰。拥有熟练的技能和抗压能力,往后的工作就相对较顺利,路自然就宽了。”
他在SQL Server技术上也有不少认识和思考。他认为,优秀的SQL Server设计,应该先从数据库的部署上着手,然后再回到数据库设计本身。
除了这些,他也谈了SQL Server开发中常见问题、健康检查与性能方面的心得,以及开发SQL Server的一些经历。
更为具体的内容,请查看以下完整采访:
云栖社区:请介绍你以及所从事的工作。
杨钊:大家好,我叫杨钊,在阿里巴巴的花名叫石沫。我是一个重度的数据库领域相关的爱好者和实践者。在数据库领域主要从事SQL Server的相关工作,拥有10年的使用经验,有时候我自己都难以置信这么长的时间,依然还在这个领域坚持。前几年时间在互联网行业摸爬打滚,在数据库设计、开发与规范,数据高可用与容灾,数据库的优化,数据库的自动化和智能化方向积累大量的经验,处理过超大群集和超高并发场景的业务。
最近两年,在云计算领域工作,接触到各种各样的用户和需求,与我们在传统行业工作体会不一样,最大感受是简化繁琐的部署和后续的维护工作,以自动化与智能化为目标,将数据库技术提升为一种优质的服务,为客户创造价值。同时也解放传统数据库从业者的繁琐工作,让他们更集中在数据库最核心的技术部分,更加方便和有效管理数据库的数据。
云栖社区:你是什么时候和数据库结缘的?众多数据库中,你为什么选择SQL Server?
杨钊:先讲一段小经历,在我们找工作那个时间段,正是高考扩招后的第一年,我们那拨人经常会说,什么事都会赶上了,好的坏的。因此毕业找工作相对比较难,这对于有历史感的同学可能会比较深有体会。
毕业前的一个冬天,正是找工作的时间,偶然有一天在报纸上看到一家从事电子商务的外企在招聘数据库相关的职位,也没多想,并且也不知道数据库相关工作要做什么,就懵懂投递了一份简历,经过面试后,就干上了数据库,这么一干就好多年。至于选择SQL Server,实际也是没有刻意去选择,就是当时公司需要,因此结缘,我想无论干什么工作,只要坚持深耕下去,都会做的很好、很深入,也只有这样才会有竞争力。
云栖社区:在来到阿里之前,你一共有几段工作经历?这些经历,给你带来哪些收获?
杨钊:我是个相对安稳的人,按照我们最朴素的说法是不会经常选择流动。因此工作这么多年,也没有呆几个公司,在阿里巴巴之前,只有两段工作经历。
第一段工作经历在Newegg,美资企业,做3C类的电子商务。在早期,比某东还知名,现在好多同事都聊起当时第一台电脑就在上面买的。当然我们的主要工作在应对国外,而不是国内,这么一待,就在这家公司接近6年,是不是很忠诚?在Newegg,基本上是从0开始,学到了最基本、最全面和很实用的数据库技术。在数据库技术应用这块做得非常好,特别是在大规模环境下保持稳定高效的运行。虽然短短几个字,但这可不是一件简单的事,要做的事情非常多,就像我们的双11一样,如何保持稳定,需要先进的技术来保障,所以在这家公司基本上将数据库领域的各种知识都玩得较好。
第二阶段,是为了升华。2012年有一家公司非常出彩,没错,就是凡客,在业务最火爆的时候加入到这家公司,因此挑战也蛮大的,业务量也非常的大。最大的收获——我想还是数据库高可用性、高扩展和容灾的方案做的非常好,因此也算是一份较大的收获。
这两段经历,锻炼了我的各种技能和思考方法,同时在互联网行业够感受到来自各种高强度的压力。这种压力抗住了,就是一种财富,安逸的环境是锻炼不出来过硬的实力和意志的,人的本性容易懒惰。拥有熟练的技能和抗压能力,往后的工作就相对较顺利,路自然就宽了。
云栖社区:就你来看SQL Server开发中有哪些常见的问题?
杨钊:这类常见的问题我想各个同学遇到的不一样,但在我的工作经历中,从各个开发或者数据库设计的同学的实践中,可以看出有一个问题比较突出的——数据库设计的基本规范。
比如,有个核心表和子表,是业务的主线,但是设计时不断增加列,这样导致后来一个核心表有上百列,导致问题严重。首先数据量会非常大,复杂查询代价非常的高,会不断增加索引解决性能问题,后期维护很困难,不易于扩展和处理。
我想这个问题的根本就是设计问题,反范式过度,同时主表和从表的列的类型不对齐,也是不一样,导致在表与表之间连接时,有一个巨大的性能消耗,当然,对全局的性能影响深刻,范围广。有个例子,一个客户服务的系统突然CPU很高,开发同学一直找不到原因,经过DBA分析后,发现是一个参数传入的类型不一致导致,更改成一致后,立刻就正常了,这不是大的技术问题,而是需要深刻理解数据库内部运行的原理,这类问题往往容易忽略,不容易发现,老司机的话就很快看到痛点。
另外,很多开发同学在设计与开发过程中,大多用看似最简单的方式去完成功能,但简单的方式不一定就是最佳的办法,比如,有同学用惯性思维使用函数和OR条件,SQL语句确实简单容易理解,但性能就差了,这类问题是非常突出的,特别是经验不足的开发同学会遇到很多这类问题。
云栖社区:你认为优秀的SQL Server设计应该包含哪些要素?
杨钊:我想应该从数据库的部署开始来看,良好的基础架构会给后面的工作带来便利。首先应该规划好适当的硬件资源,数据库的高可用和容灾(比如你是热备还是分布式数据库、你的备份系统是否完备),安全问题是数据库最重要的一环,绝大多数不能将数据库在没有任何安全防护之下直接暴露在外网,首先应该选择在私网,这是基本常识,我看到国内很多ISP厂商有类似的问题,非常严重。
再回到数据库设计本身,首先要遵守基本的数据库设计理论,现代关系数据库比较成熟,再往前看就是NOSQL的范畴。设计过程中,需要关注性能、容量、可扩展与可维护,你选择任何一列的类型和长度都会对数据库产生较大的影响,实际上,很多用户在公司初始或者系统开始设计时,都会出现问题,改造会带来较大麻烦。当数据库设计没有问题,还需要及时监控和跟踪到数据库性能或者健康状态的情况,这就是我常说的自动化与智能化运维的一个重要方向,让数据库运行得可控可靠。数据永远在变化,系统性能就会变化,我们遇到很多用户会问,应用程序没有变化,为啥性能变差了,这就是问题所在。
云栖社区:SQL Server上云之路,有没有遇到什么令你难忘的事和困难?都是如何解决的?
杨钊:阿里云提供了几种解决方案,有数据库官方的,也有我们自己开发的,工具很强大很好用,但是某些客户的某些场景是无法满足的,这个时候我们就犯难了,因为我们的数据库服务不仅是一个数据库系统软件了,还是一种完全的解决方案,不能只看数据库系统软件,还有控制链路,安全防护等组件,如何将用户数据以最小的代价迁移到云上,是用户的最原始的需求,特别是金融客户。
国内国外大多数云服务商都不会提供类似的工具,我们在这方面还走在业界的前面。当用户数据量巨大,要求在指定的时间完成时就很不容易,我们就需要人工介入去帮助完成,而这种介入是耗时又耗力的工作,关键还不能出现差错。面对这类问题,通常我们会与客户进行有效的多次沟通,制定合理的操作方案,不断地准备、预演和测试,优化各个细节,直到达到我们的要求。其次,用户在上云后,性能问题可能会有较大的变化,有些客户会感觉反差很大,这类问题通常有几个原因,原来的数据库环境和现在的环境硬件资源差异大,精简了太多资源,再次,可能是以前数据库优化不够到位,解决这类问题不是特别难,通常我们会提供数据库专家服务,无论是通过弹性资源,还是深度优化,都是可以解决的,保持数据库的稳定运行。
云栖社区:为了应对用户众多的使用场景,你在稳定性方面做了哪些改进?
杨钊:我们的SQL Server数据库是基于微软的SQL Server提供的云服务,因此,在很多方面都需要提供更加稳定的功能,但是作为云服务,很多资源方面的调度就要求控制得很好,比如如何弹性升降级,比如数据库的操作。在限制资源时,也会遇到一些麻烦,比如内存,连接数,CPU的资源隔离,用户购买多少我们就只分配购买的资源,这些方面都需要做得很好,我们在这些方面都会下功夫去保障的。再次,SQL Server本身在某些场景下,在主备之间会出现一些BUG,我们也会想办法去自动化实现修复,保障用户的业务不收任何影响。同时,我们在监控方面也做了很多细致的工作,用户也可以通过这些报警及时得到数据库的状况,让用户随时掌握实例的运行情况。这些都是从稳定性方面去考虑和解决的。
云栖社区:RDS SQL Server功能问题一直备受限制,但开放功能势必会影响稳定性,你是如何在功能性上与稳定性上进行平衡的?
杨钊:SQL Server作为闭源的商业数据库,在稳定性和可用性方面给用户带来无与伦比的体验,但在以云计算为场景的情况下,传统的数据库使用方法不断被挑战,因为我们不仅是提供一种数据库产品,更是提供一种数据库服务,服务必然提供很多增值的东西。
用户的使用场景很多,但产品又需要在稳定性方面做妥协,这种妥协实际是对用户的权限限制。因此我主要工作将是解决产品的稳定性和产品功能的开放,在稳定性方面,主要是产品的性能问题和可用性方面,比如连接限制带来的性能,比如主备的自动化管理,比如自动化的监控与报警。
功能方面,主要增强了数据库的安全和权限开放,权限是用户使用数据库的主要痛点,很多功能都被限制,因此解除这些限制对用户很必要,但解除势必给产品带来稳定性的负面效应,因此基于SQL SERVER的接口,深度控制权限与稳定性的平衡,开放了用户诟病的功能问题,为用户的使用提供了极大的方便, 在SQL Server 2012版本上,可以使用到更加多的功能,我在云栖社区有篇文章,专门讲这个问题,请参看《RDS for SQL Server 2012 权限限制的提升与改善》。
云栖社区:从某种意义上来说,传统的数据库可能仅仅是一款产品,而到了云计算时代,它也更是一种服务,在服务上你都做了哪些东西?
杨钊:与传统的数据库相比较,我们首先要去购买硬件,评估硬件,然后再设计架构,考虑是否需要高可用性,考虑需要是否需要异地容灾,接着再去安装部署数据库,创建监控,创建数据库的性能监控……等等,一系列的繁琐的基础的并且重复的工作烦扰着数据库管理员。
而云计算中,我们把数据库定义为一种服务,从硬件层面到高可用性容灾,再到部署,都是自动化、多任务化、流程化进行,所有有效的监控报警与性能监测都是有稳定的系统来保障的。是人都会犯错,而合理的高可用系统可以得到最大的保障,人控制机器的运算逻辑,机器来管理我们的工作,因此始终能够提供持续稳定的服务。我们提供像水电煤一样的东西,买多少用多少,不再需要做一些基础的工作。从成本和价值方面更加有利于用户。
云栖社区:在SQL Server健康检查与性能方面,你是否有自己的一些心得?
杨钊:SQL Server健康检查与性能方面,是每个数据库管理员最重要的工作之一,我是这样来思考这个问题的:
首先,健康检查和性能监控是日常的例行工作,每时每刻都需要进行,我们不能等到数据库出现问题的时候再去查找原因。绝大多数问题,都是需要有现场才可以找到原因的,那么首先我们就应该保留足够多的现场,比如我们的数据库的性能计数器是需要采集,当时的执行SQL也是需要记录下来的,这在解决突发问题是比较有用的。
性能方面,我想大家最喜欢的是每天分析TOP 10的SQL,当然如何分析是个大问题,需要学习掌握数据库的基础知识,这个可以不断积累,重要的是保持耐心,能够静下心来,细致地做诊断分析工作。没有特殊途径的,在某些领域必须要踏踏实实去做。
云栖社区:在致力于更优秀的数据库服务上,SQL Server还将怎么做?
杨钊:在长期与客户深度接触中,理解客户的躁动和愤怒,倾听客户的心声,为他们解决面临的问题,与客户建立起信任与友好的关系,为客户创造最大的价值。同时将客户的诉求转化为产品需求,并逐渐积累需求建立起专家系统,通过自动化和智能化,为千百万用户迅速准确解决问题。
在产品方面,提供更丰富的产品,比如读写分离,比如尽快提供SQL Server 2014,SQL Server 2016等产品,充分利用新特性来帮助用户完成需求。
云栖社区:也请你总结下:相比其他类型数据库,云上的SQL Server有哪些优势?
杨钊:这是一个很尴尬,也很难来回答的问题,阿里云数据库提供了多种数据库服务,比如关系型数据库方面,有MySQL、SQL Server、PostgreSQL。我在很多场合都被问到,我每次回复也很简单,开源的数据库成本低,使用灵活,用户自己可以把玩,但是必须有足够的控制力,自己玩的话很容易被玩坏,阿里云提供的开源数据库有顶尖的人才来保障的,因此可以保持持续稳定的服务。
而商业数据库相对稳定一些,只是成本会高一点。每个公司或者业务,根据自己的场景选择,适合自己的业务数据库,才是最好的。没有必要去争个输赢,我不会参与这类问题的讨论(具体优势,可以查看官网>>>点此进入)。
云栖社区:你平常比较喜欢“常反思失败与成功,常学习和研究战术战略。能否深入谈谈?
杨钊:这个也算我们平时的一些感受和爱好,对工作,对生活也是这样,简单的事情可能失败,复杂的事情反而成功,这里面其实不是技术性问题,而是态度上的问题。
我觉得很多事情,只要有目标和计划,并且愿意付出,都会成功的,我们常常讲的理想,目标,行动就是这个意思。平时我个人喜欢看古代历史正剧(非宫斗剧)和二战相关影视剧,研究历史给我们很多启示录,反思战争给人类带来的灾难,反思如何避免悲剧的发生,同时也领略将领的打法,如何获得胜利,感触很多,通过这些历史事件,不仅可以看到人类发展史,更要看到历史是多么残酷的,进而要感恩太平盛世,好好工作,开心生活,借用《士兵突击》一句话,“做有意义的事,好好活”,无愧人生。
相关阅读:
杨钊此前所做的视频干货分享:《SQL Server优化案例分享》