想了解一下分布式数据库教程,有没有大神有相关材料的分享一下,谢谢

如何在大学里成为IT技术大神?
总是有同学问我怎么学很多技术,好奇如何成为所谓的大神。
事实上,这篇文章是结合我的一些经历,讲述应该怎么学习技术,并不是要讲怎么成为大神。没有所谓的成功学,只有充满智慧的思考,脚踏实地的实干,和越来越近的理想,还有机遇和运气。
之所以用这个标题,无非是吸引更多人、尤其是很多对成为大神抱有不切实际的幻想的人来看。希望读者能从中得到一些东西,没有浪费看这篇文的时间。这篇文章也只是我的看法,并不是什么真理,请不要不假思索就随便相信其中的观点。
主流价值观
价值观是个挺玄乎的词,三年前大一的时候,我对这个词毫无概念,但是现在慢慢理解了。所谓价值感,就是一个人对各种事物价值的评价。有的人认为钱是最重要的,一辈子追逐金钱,大部分人并不赞同。有的人认为开心是最重要的,却又有各种困惑。
价值观本身并没有谁对谁错,存在即为合理。但是我们还是会评价一个人的好坏,而我们评价的依据就是主流价值观。主流价值观认为,人应该做对自己对社会有利的事,至少对他人无害,这一点也确实值得赞同。主流价值观也常常认为,人应该有所作为,而很多人甚至极端的认为,所有的人都应该有远大的理想抱负,不少家长认为考上大学最重要,考不上大学甚至都没脸见人。
对于这点我并不赞同,我觉得最重要的是做自己想做的、对他人无害的事,如果恰好也是社会需要的,那就最好不过了,如果不是,那也并没有什么不对的。
有些同学爱玩游戏,并且为玩游戏付出巨大精力,废寝忘食,刻苦学习各种技能,甚至不惜省吃俭用,拿钱买设备买装备。很多人会不由自主的认为这样的人做法不对,典型的堕落象征。而有的人非常专注的学习技术知识,最后成了学弟学妹心中的大神。
同样是废寝忘食,同样是专注认真,为何差距如此之大。原因很简单,毕业了玩游戏的人往往不能保研、不能出国,也找不到好工作,大神却能拿各种公司Offer。这里的区别在于社会需求,当今互联网社会,需要很多软硬件工程师人才,大神自然吃香。
事实上一些互联网公司也需要职业玩家进行游戏测试,但是需要的数量很少,于是玩游戏的人很难成为职业玩家。同样的道理,还有很多喜欢打球、唱歌等的同学,家里却很难支持他们去发展自己的爱好,因为社会不需要那么多职业球员和歌手,导致他们很可能会失败,面临毕业即失业、没有工作的困境。
环境造就人才
有句话说&穷人家里出人才&,以前我也比较相信这句话的,后来却慢慢不信了。
在中国,科研水平不如国外,并非中国人比外国人笨,这一点很显然。何况中国人多,总有比爱因斯坦聪明的人。这里当然有很多因素,其中经济因素是比较重要的一点。常常看新闻中提到国家要增加科研资金投入,说明增加资金通常对科研发展是有利的。
一个热爱数学的穷人,愿意不吃饭省钱买书看,后来成了著名数学家,这是最经典的穷人家里出人才的证据。但是试想,如果这个人再穷一点,每天都吃不饱,饿的发晕,他还能做数学家吗?再试想,这个人家里比较有钱有地位,从小就能接触各种书、甚至有机会和指明数学家交流,这个人很可能会成为更有名的数学家。
有人会说,我的分析太极端了,确实有点极端。穷人家庭可以出数学家,这一点可以接受,也确实有。但是穷人家里会出天才硬件工程师吗?我觉得很难。数学的学习条件很简单,有一些书,就可以学的很深入,但是有些东西的学习条件却高很多。
一个从小家里很穷的人,没有机会接触电脑(当然不一定是穷,也可能因为家里担心影响学习等等),即使他是潜在的天才程序员,也没有机会去学习;这样当他开始有机会时,和条件更好的人相比,至少是落下了一大截。当然他有机会以更快的速度去学习,能有这样的机会,他已经是个很幸运的人了。
环境造就人才,跟上面所说社会需求也是有关的,因为社会需求会直接影响你的学习环境,导致很多爱好音乐等知识的人没有得到很好的发展机会。
在大学这样的环境下,除了课程以外,还有个很大的一个宝藏,就是各种学习资源。我们可以接触到各种优秀的同学,可以不花钱去图书馆借阅各种图书,在西电,图书馆还花不少钱买了万方数据库等的免费使用权,方便学生老师学习使用,而各种竞赛等活动提供的经费和实验室,更是为我们提供了难得的学习条件。
以我做电赛为例,在电赛期间我接触到了各种仪器,其中很多都非常昂贵,例如频谱仪、网络分析仪(据称是通院的&镇院之宝&,其他院没有),也使用了很多价格很高的器件。普通电阻看似很便宜只要几分钱一个,但是精度万分之一的0.01欧电阻,一个却需要十几块;常见的通用运放,一片只要几毛钱,但是做电赛期间用到的一些高增益、高精度运放等芯片,一片却需要50块;由三个精密电阻构成的衰减器,工作频率上限6GHz,不大的一个器件需要上百;做一个并不复杂的高频电路就有可能花费上千的费用。一般学生自己很难承担这么高的费用,而有机会参加竞赛,就能获得这些难得的学习资源。这里也说明,专门做硬件真心烧钱,门槛相对比较高。
为自己投资
平时很多时候我也会自己花钱购买一些东西去学习。大学期间,我花费了几千块钱用来购买书籍和学习器材(主要是硬件器件),很多人听说了很吃惊,顿时认为我是高富帅。实际上我只想说我是生源地贷款来上学的o(╯□╰)o。但是我的钱没有白花,我学到了很多东西。
毕业了,我找到比较满意的工作,不出一个月,就能收回成本。这样高的投资回报率恐怕任何形式的创业都望尘莫及。
穷人总想着省钱,而聪明人宁可借钱去投资,然后有机会成为有钱人。而投资自己,无论如何都是不会错的。
学会取舍这一点应该不必多说,大家都知道&捡了芝麻丢了西瓜&的俗语,如果不懂取舍,终将一事无成。有的人什么都想要,都想做好,最后往往什么都没做好。
风险和回报
大四了,我决定去找工作暂时不上研。不少人劝我上研,其中有些觉得上研很好而且我有机会争取保研,也有的人觉得我可以先争取一个保研名额,然后去找工作,万一没找好还给自己留了一条后路。
但是我的想法很明确,从大三下学期确定下来,就没有想过要上研,也花费了大量精力和家里人说明我的想法。不得不说,这么做是有风险的,前段时间我有有些担忧,甚至有那么几个时刻都开始有点怀疑甚至后悔了,是不是我做的确实太过分了,万一找不到满意的工作确实很坑。
不过我的运气很好,人品很好,找到了还算满意的工作。相信三年之后,我的处境一定会比上研刚毕业的情况好。
大家都知道房地产很赚钱,但是高收益往往都伴随着高风险。前面也说了懂得取舍,是否愿意冒风险,是否能对自己、对事物有个准确的把握,是否敢于承担风险造成的后果,最终每个人的选择都不同。
做一件比较困难的事,往往需要动力。动力有两种:奖励与惩罚。
成绩好的同学能拿奖学金,则是奖励,没考好的同学挂科要补考,则是惩罚。兴趣是很重要的一种奖励形式的动力,因为能获得满足感。很显然,我们都更希望能有奖励形式的动力,而不是惩罚。
如何能坚持学习技术,就我个人而言,最重要的原因是很感兴趣。
兴趣是最好的老师,有了兴趣就能废寝忘食的去学,就能在学习中获得无尽的动力之源。
上进心也是很重要的一种动力,真正没有上进心的人不存在,但是人的上进心强弱不同。
上进心很强的人,容易争强好胜,争强好胜并不能简单地评价为缺点,合理利用的情况下,它能给你提供无比强大的动力,反倒成为一个优秀的人最大的优点。
一个人最基本的生理需要,是活着,或者说是存在。
最基本的心理需要,就是存在感。人很多时候做事,都是为了表现自己证明自己,能力受到别人的肯定和赞许,必然满满的存在感。存在感是一个人持久的动力之源。
认真专注与努力
每个成功的人,都有一个共同的特点,就是认真和努力,大神也是一样,不多说人人都懂。
只是想提醒一下一些同学,不要再抱有投机取巧的幻想。
提问的智慧
我们总会有不了解的东西,恰好身边又有人很了解。这时有些人就不假思索开始提问了。我曾经回答过相当多的技术问题。
提问最大的忌讳,就是问题描述不清。如果你问医生,不舒服怎么办,医生会问你哪不舒服,吃了什么等等问题,然后给你量体温等等,逐步判断问题。但是请不要忘了,解决病人的问题是医生的工作职责,并且最后你通常是要付费的。而你在网上或者其他途径问身边的人问题时,你应该明白,别人给你提供帮助是无偿的。
尤其是大神会很忙,别人的时间比你的时间可能更珍贵,你去问别人问题,三言两语问题描述不清,别人为什么要像医生一样耐心的询问,然后帮你呢?
常常看到一些人问一些很简单的问题,什么色环电阻怎么识别、三极管三个脚怎么看,对于大一刚入学的同学,我完全可以理解。但是,如果很久之后,你还是这样去问,恐怕就不太好了。大家都应该知道百度百科,搜索一下色环电阻,马上就能出来详细的配图解释,比别人简单用文字来回答好懂很多也权威很多。
有人可能会说,我认识很多非常热心的人,对我特别照顾,关系很好,我总可以随便问吧。首先明确一点,如果你所有的知识都是别人告诉你的,你永远不能超越告诉你这些知识的人,你永远是不如人的。
其次,对于有些简单知识,别人可以给你说一说,但是对于一个很复杂的问题呢?即使那个人很想帮你,但是这个问题太深入了,三言两语根本所不清,这个时候你打算怎么办呢?我就不多说了。
还有的人,明明是请教别人,却表现的像是别人义务帮他一样。不会说谢谢可能是性格太内敛,相对还好一点,但是应该学会这一点。有的人问别人问题还不耐烦不断地催促、语气很强硬、嫌别人回答的不好等等表现,我只想说,这种人我还是少招惹。
提问还有个很常见的让回答者比较反感的问题。有的人很认真的花了很长时间做了一个东西,比如很复杂的电路,或者很长的程序,然后发现不工作。检查了一下没找到问题,就直接复制出全部代码给别人一发,然后表现的极其可怜的样子,跪求大神帮忙。我不好批评这种人,其中确实有很多很认真的。
提问者往往认为,对于大神来说,这点代码岂不是一眼就能看出问题来么?但是我要说的是,这种检查故障的问题,往往比你写程序、做电路要难很多,我给你做一个同样功能的东西往往都比这简单。尤其是电路,很多时候根本就不是网上聊一聊就能愉快的解决问题的。如果事情都那么简单,社会就不是现在这样的了。
遇到这种问题怎么办呢?我认为还是应该独立解决问题。至于如何解决问题,这就是一个很复杂的课题了,也是很考验智商的,锻炼的好机会。很多时候我解决一个问题并不一定能马上想到,可能睡觉的时候突然有了灵感然后想明白,可能绝望的看网上的资料突然就想明白了。甚至还有做梦的时候想明白问题的例子,例如化学史上苯环的发现。
解决程序和电路故障有种最常见和有效的方法是,分模块实现、分模块检查。一个大的系统,分成了一个个的小模块,每个模块相对简单很多,分别实现并检查每个模块,每个模块都没有问题了,整个系统基本上也就没有问题了。
这里并不是说,不应该向别人提问。讨论技术问题有两种,一种是纯粹的提问和解答,另一种是共同探讨。后者对双方的进步都会有促进作用,值得鼓励。而前者,提问者就应该掌握好提问的方法,并且应该及时的表示感谢。
更多提问相关的问题,可以参考网上的文档《提问的智慧》。
自主学习是一个很久以前就开始被强调的东西。人的本性都是充满好奇心,渴望了解一个未知事物的。就整个人类社会而言,自古就不断的探索宇宙,这就是好奇心的表现,如果把全人类看做一个整体,人类的终极目标,或许就是要找到宇宙的真理,找到无尽的知识,满足人类无止境的好奇心。
好奇心的驱使下,一个人应该是会主动去学习的。但是由于种种原因,尤其是国内从小就进行的老师满堂灌的,很多人早已丧失了对知识的渴望。到了大学我们没有了中学那么多的束缚,虽然大学的环境也远没有想象的那么美好,但是至少我们能抽出很多课外时间。学习自己感兴趣的东西,需要自主学习能力。
一个人最重要的东西有两点,学习能力和思维方式,这是我的看法,并且在看书时意外发现和知乎上的一位网友的想法惊人的一致。我能在大学期间学很多东西,同时保证基本的学习成绩,很大程度上得益于我的学习能力。
考前花几天时间看看书、刷刷题,考试也就过去了。至于那些课程到底重要不重要呢?我的回答是:很重要。但是课程知识并不等同于考试做题技能。我承认我的理论知识尤其是数学欠缺很多,虽然短期来说,工作中做的工程方面的东西对理论并没有很高的要求,但是这些知识对我认识很多问题是有帮助的,有机会也会去弥补。
有的人喜欢看视频教程,但是我并不建议看视频教程。视频教程往往并不能很好的让人掌握知识,并且很多视频教程也很不正规。关键还有一点,视屏教程多数情况下是第三方制作的,而不是官方推出的学习资料。
你可能需要研究一些最新的技术,这个时候唯一能参考的就是官方给出的资料,根本就找不到视屏教程。有视频教程的东西估计也都是入门的很基础的技术,深入一点的技术往往都没有视屏教程。
这里也顺便强调一下英语的重要性。很多芯片手册什么的官方资料,就只有英文版,适应英文资料,是很有必要的。你可能觉得英文资料好难懂,实际上技术类的英文资料,除了专业词汇之外,都很好理解,专业词汇可以用词典翻译。之所以觉得不懂,往往并非英语的问题,而是因为不了解那些专业词汇。没学过电学的人不懂Voltage,告诉他电压,他一样不懂。我想,学了这么多年的英语,也不甘心就只为了一个四六级考试吧?
前面所说的提问的智慧,已经指出了,很多问题尽量独立解决,反复思考实在不明白才去请教别人,这样才能锻炼学习能力。有种说法,内向的人更容易成功,从学习能力的角度来看,内向的人更倾向于自己解决问题,所以学习能力得到的锻炼更多,促使其更容易获得成功吧。
对于信心的把握,是一个很深刻的问题。信心的本质,可以理解成是一个人在处理一件事之前,对自己能否处理好所做的一种估计。准确的估计问题的难度和自己在那方面的能力,是很困难的。
估计自己的能力方面,很多人不敢相信自己的潜力,也有的人过分自信。而对于事情的难度的估计,人们总是会高估或者低估问题的难度。就技术学习来讲,我就见过两种比较典型的人,一种人严重缺乏自信,做什么都是说我不会,我真的不会,怎么办;另一种人则是过分自信,眼高手低,什么都觉得简单,到自己做的时候,什么也做不好。
正确估计自身能力,这个是受一个人自身经历影响的。如何正确的估计事情的难度呢?其实思路很简单,我们只需要对这件事进行一些基本的研究,就能大大提高准确率。
小马过河的故事大家都知道,小马问了那么多人,河水的深浅如何,却得出各种不同的回答。而只有自己试了才知道,河水对于他来说,既不深也不浅。有的人在网上花费几天时间去问别人安卓开发难不难,却没想过自己找篇入门教程去了解下安卓开发。有这几天的时间估计都已经入门了,难不难也能判断出个大概了。
俗话说&谦虚使人进步&,看似简单的一句话,却是相当的深刻。
真的如此简单,谦虚使人进步,骄傲使人落后吗?又是什么原理呢?骄傲的人很明显是过分自信,谦虚的人呢?这里有几个词语,自卑,谦虚,骄傲,自负,狂妄。这几个词语可以认为是反映了一个人不同的自信心。
对于一个没什么本事但是很狂妄的人,我们可能会反感;但是在美国大片中的英雄,很有能力,也很狂妄,我们感觉出来的却是霸气,满满的正能量。人在不同的方面,表现的信心不同,一个人可以既自信又自卑。把事情做好的人往往有一点自负,但是又能在关键的时候把握好信心,正确对待问题。
所以自负往往并不是简单的贬义词,有时确是提高自信心的好方法。开源操作系统Linux的创始人Linus有一句经典名言:My name is Linus, and I am your God.这句话相当的狂妄,但是Linus的对社会的贡献确实巨大。我们用的安卓系统,无数台为我们提供各种网络服务的服务器,都在运行基于Linux的操作系统。
我在去年参加电赛选拔准备笔试时,认识到大部分人都是大三的而我是大二的,差了很多课程,尤其是模电听说很难。但是我没有因为丧失信心直接放弃,也没有因为过度自信而毫无准备,而是在感觉有点心虚的情况下,很认真的准备,最后取得了很好的成绩,顺利通过了选拔。
在这个过程中,我没有毫无意义的询问别人电赛到底难不难,而是通过网上去找历届题,看书并做了很多笔记,还做了几套模电期末试题,很认真的去准备(算是我大学四年学习学校课程最认真的时候),比较准确的认识了自己和面临的问题。
总体来说就是要准确把握问题,多去了解问题、多做准备,而不是空谈一切浪费时间。
生活的意义
生活的意义,这真的是个很高大上的哲学问题。
有个很有名的数学家叫布尔,他很大的一个成就是发明了布尔代数。然而在那个年代,布尔代数并没有受到人们的重视,欧洲大陆著名的数学家蔑视地称它为没有数学意义的、哲学上稀奇古怪的东西。布尔在他的杰作《思维规律》出版后不久就去世了。直到后来,计算机被发明的年代,布尔代数的巨大价值才充分得以体现,数字计算机就是用二进制来处理数据的,布尔代数就是其最基本的原理。
还是说Linus,最初创造Linux的时候,完全是出于感兴趣,想做出一个属于自己的操作系统。得益于他强大的编程能力,和深入钻研的精神,很快他的操作系统内核就实现了。他把自己的操作系统源代码发到网上,又获得了很多人的支持,全世界的程序员共同对他的系统进行完善,成了今天使用很多的Linux(不过对于非技术领域的人来说,这个东西估计很陌生)。网上有篇文章《Linus,一生只为寻找欢笑》就讲述了这样一段历史,讲述了Linus的人生。
著名画家梵高,生前作品一文不值,穷困潦倒。梵高说:&在大多数人的眼中我是什么呢?一个无用的人,一个反常与讨厌的人,一个没有社会地位、而且永远也不会有社会地位的人。好极了,即使这是事实,我也要以我的作品来表明,这样一个反常的人,这样一个毫不足取的人的内心是怎样的。这是我的雄心,它的主要基础是爱而不是恨,是冷静而不是热情,我时常陷入极大的痛苦,这是事实。但是我的内心仍然是安静的,是纯粹的和谐与音乐。在最寒碜的小屋里,在最肮脏的角落里,我发现了图画。&直到逝世后,梵高的作品才被公众所承认,这不得不说是个很大的悲剧。
联系我们的生活,有学习很好并且真心喜欢学习的学神,有整天泡实验室、写代码焊电路的大神,有各种各样的牛人,他们所做的,其实很简单,就是坚持做自己想做的事。前面介绍的布尔、Linus、梵高,他们所做的,也就是坚持做自己想做的事,即使看不到意义。他们所坚持的东西,或许有一天,就会成为人类社会的宝藏。
但是这是很理想的状况了。我想,在一个终极理想的社会里,最重要的一点是,人人都能做最喜欢的事而不用考虑生计问题。在这样的社会中,人才能最大化的施展自己的才能,才能专注的做好每一件事,最终使得整个社会发展的更好。
而在现实社会中,尤其是中国这样人很多、生活压力巨大、社会保障制度尚不健全的国家,我们不得不考虑很多现实问题。于是又回到了前面的问题,大神和游戏等各方面的高手没有什么本质不同,只是社会需求的不同罢了。
我所认为的生活的意义,前面其实已经说了。在我的价值观看来,最重要的是做自己想做的、对他人无害的事,如果恰好也是社会需要的,那就最好不过了。而我是个很幸运的人,我所想做的,和社会需求能很好的吻合;我能做自己想做的,又不用担心太多现实问题;想取得一些成绩,我要付出的代价会小很多。有了这种幸运的条件,我只要学会多思考多努力,自然就能做的比较好了。
我在大学刚开始的时候,根本没想过我要怎么找工作,没想过我一定要做一个所谓的大神,我只是很简单的,认真做自己喜欢的事情,仅此而已。
当然如果没有这么幸运,也无需太悲观。每个人的兴趣并非天生的不可改变的,也是可以后期培养的。就我而言,我从小就有了很明确的兴趣,因此大学期间,强烈的兴趣为我的学习提供了巨大的动力来源。选定一个自己感兴趣,至少不反感的方向,并脚踏实地的坚持去做,一定能取得自己满意的成绩。
内容来源:jzj1993的专栏
原文链接:http://www.codeceo.com/article/how-to-be-it-leader-in-school.html
小编精心为大家挑选了近日最受欢迎的几篇热文&&&
(关注订阅号dbaplus,回复以下数字,即可获取相应文章)
回复011,看邹德裕《数据库运维工具化:一切从&简&,只为DBA更轻松》。
回复012,看马育义《Oracle内核系列3-揭秘ASM磁盘头信息》。
回复013,看吕海波《去不去O,谁说了算?》;
回复014,看杨德胜《Oracle故障日志采集&神助攻&&TFA工具详解》;
回复015,看郭耀龙《假事务之名,深入研究UNDO与REDO》;
回复016,看陈能技《基于Docker的开发模式驱动持续集成落地实施》;
回复017,看朱贤文《数据库与存储系统》;
回复018,看卢钧轶《揭秘Facebook数据库备份策略》;
回复019,看杨建荣《看似简单的dual,其实深藏玄机》;
回复020,看黎君原《扒一扒Oracle数据库迁移中的各种坑》。
数据连接未来
DBAplus社群:数据连接未来!围绕数据库、大数据、PaaS云,行业大咖、技术干货,每天精品原创文章推送、每周线上技术分享、每月线下技术沙龙,受众20万+,成为运维圈专注围绕“数据”的学习交流和专业社群!
原创投稿 | 推广合作 | 媒体合作 | 资源对接 联系人:林禹廷 电话: QQ:
扫码关注加入各城市微群分布式MySQL数据库TDSQL架构分析
发表于 08:43|
来源程序员电子刊|
作者雷海林
摘要:腾讯计费平台部为了解决基于内存的NoSQL解决方案HOLD平台在应对多种业务接入时的不足,结合团队在MySQL领域多年应用和优化经验,最终在MySQL存储引擎基础上,打造一套分布式SQL系统TDSQL。本文是对该系统架构分析。
腾讯计费平台部托管着公司90%以上的虚拟账户,如QB、Q点、包月服务、游戏的二级账户等,为了保证能顺畅支撑公司各大业务的实时在线交易,并且在各种灾难场景下数据是一致并且可用的,对系统的可用性、一致性切换要求非常高,因此计费团队历来都非常重视高一致性存储系统的建设。到目前为止,计费高一致性存储层的解决方案大致经过了3个阶段,本文将分享最新的基于MySQL的分布式解决方案。随着业务的发展,基于内存的NoSQL解决方案HOLD平台在高峰期一天支撑3000亿读写,证明了分布式Cache的巨大价值;但随着各种业务的接入,NoSQL方案的不足也逐步显现出来了,如下所示。适用的业务场景比较有限,仅提供get/set操作,有不少业务场景希望能通过记录中的其他字段做索引来查询,比如流水类业务。不是所有的数据都是热点,一台64GB内存机器提供的有效内存空间大概在50GB左右,而采用Fusion卡的机型容量一般在1TB以上,对比起来,如果所有数据放入分布式Cache明显是一种极大的浪费,最合理的当然是热点在HOLD,冷数据采用基于磁盘的存储。计费平台部多年来在支付领域有了相当多的技术积累,HOLD作为NoSQL系统功能有限,因此建造一套更加强大通用的高一致性存储系统将整个支付领域的实时数据(重点是账户数据、用户订单数据,以及海量的流水数据)统一管理起来非常有价值。基于上面的分析,结合我们在MySQL领域多年的应用和优化经验,最终决定在MySQL存储引擎基础之上,打造一套分布式的SQL系统。保持原来的MySQL协议,这样以前访问MySQL系统的C++、Java各类系统都不需要修改,DBA能继续保持原来大部分使用习惯。自动的跨IDC容灾切换,同时保证数据一致性,对于提交成功的事务保证一笔不丢,达到银行级对容灾的要求。灵活的容量伸缩机制,对业务透明,解决MySQL本身扩容不灵活的问题。重点支持OLTP类型的在线业务。整体架构针对上面的需求,TDSQL最终的结构如图1所示(与当前大部分中心化的分布式系统类似)。图1 TDSQL架构系统由三个模块组成:Scheduler、Agent、网关,三个模块的交互都是通过ZooKeeper完成,极大简化了各个节点之间的通信机制,相对于第二代HOLD的开发简单了很多。Scheduler作为集群的管理调度中心,主要功能包括:管理set,提供创建、删除set、set内节点替换等工作;所有的DDL操作统一下发和调度;监控set内各个节点的存活状态,当set内主节点故障,发起高一致性主备切换流程;监控各个set的CPU、磁盘容量、各个表的资源消耗情况,必要的时候自动发起扩容流程;Scheduler自身的容灾通过ZooKeqzer的选举机制完成,保证中心控制节点无单点。Agent模块负责监控本机MySQL实例的运行情况,主要功能包括:用短连接的方式周期性访问本机的MySQL实例,检测是否可读、可写,若发生异常,会将异常信息上报到ZooKeeper,最终会由上面描述的Scheduler模块检测到这个异常情况,从而发起容灾切换;检测主备复制的执行情况,会定期上报主备复制的延时和延迟的事务数,若发生了主备切换,自动向新主机重建主备,因此MySQL的主备不需要DBA干预,对于新增的实例会自动采用xtrabackup通过主机自动重建数据;检测MySQL实例的CPU利用率和各个表的请求量、数据量、CPU利用率,上报到ZooKeeper,ZooKeeper通过全局的资源情况抉择如何扩容、缩容;监控是否有下发到自身的扩容任务,如有则会执行扩容流程(下面会有描述);监控是否要发生容灾切换,并按计划执行主备切换流程。网关基于MySQL Proxy开发,在网络层、连接管理、SQL解析、路由等方面做了大量优化,主要特点和功能如下:解析SQL,将识别出的DDL语句直接存到ZooKeeper,让Keeper来统一调度;Watch ZooKeeper的路由信息,拉取最新的路由表保存到本地文件和内存;将SQL请求路由到对应的set,支持读写分离;对接入的IP、用户名、密码进行鉴权;记录完整的SQL执行信息,与秒级监控平台对接完成实时的SQL请求的时耗,成功率等指标监控分析;对count、distinct、sum、avg、max、min、order by、group by等聚合类SQL一般需要访问后端的多个set,网关会分析结果并做合并再返回,暂不支持跨set join和分布式事务;网关无状态,既支持与业务部署到一起,也可以独立部署(可通过TGW或者LVS做容灾)。自动扩容机制目前,针对MySQL的扩容,一般有下面两种策略。垂直扩容。一般通过升级硬件来实现,比如更换更好的CPU,将传统的sas盘换成FusionIO卡这类,然后针对新硬件调整好参数,在硬件结构变化比较大的时候,性能甚至能达到上十倍的提升。但垂直扩容有比较大的局限,就是这种模式随着业务的突增还是比较容易达到瓶颈,特别是面对互联网海量用户的时候,所以在互联网应用场景下,一般仅将垂直扩容当做一个辅助的手段。水平扩容。常用的有2种方法,一是不同的库或者表部署到不同的实例,二是一张表需要根据某个字段拆分到不同的字表中(数据分片),这种策略在互联网系统中非常常见,很多系统会将这2种水平扩容的方法结合起来使用;通过上述2种扩容方法的比较,为了应对海量扩展的需求,应该是重点选用水平扩容的方法。但水平扩容的实现一般对业务是有感知的,比如采用什么规则来拆表,拆开的表放到哪些节点,如果某个子表还有瓶颈应该怎么扩容,扩容是否还需要业务配合等等这些事情如果全部交给业务会比较繁琐,因此这些需求应该尽量全部交给TDSQL自身来完成,对业务完全透明。分表逻辑在TDSQL中,每个表(逻辑表)可能会拆分成多个子表(建表的时候通过在建表语句中嵌入注释的方式提供一个shard字段名,最多会拆分出1W个子表),每个子表在MySQL上都是一个真实的物理表,这里称为一个shard,因此一张表的数据可能会按这样的方式分布在多个Set中,如图2所示图2 TDSQL的逻辑表每个SQL请求到达网关之后,网关会做词法和语法解析,重点会解析出shard字段,如果带了shard字段就可以直接查询路由表并发送到某个具体的set中。计费的OLTP类业务99%的请求都会带上shard字段;如果某笔请求没有shard字段,查询路由之后会将请求发送到所有的shard对应的set中,并对所有返回的结果做一些聚合运算。扩容流程上面描述了shard的方式,但是这样的shard结构不是固定不变的,当Scheduler检测到某个set,某个表的CPU、磁盘超过阈值之后就会启动扩容流程。这里描述下具体的扩容流程。扩容过程中一般都要尽量避免影响业务,目前来看存在2种比较成熟的策略。策略1先切后搬:先修改路由,将需要迁走的数据的请求直接发送到新set,在新set交易过程中如发现本地的数据不存在,则去原set拉取数据,然后再通过一些离线的策略将要迁移的数据全量再搬迁一次,HOID平台就是采用这样的策略。策略2先搬后切:让请求继续在原set交易,扩容程序首先记录一个binlog位置点,并将源set中符合迁移条件的数据全部迁移出去,最后再将搬迁过程中新增的binlog追完,最后修改路由规则,将请求发送到新set。综合来看,策略1最大的优点是假如是因为压力大做的迁移,可能很快就能将部分请求发送新set了,实现对原set的压力分担;策略2实现上在最后的追路由阶段需要更多的精细化控制,实现会稍微复杂点,但策略2有个非常大的好处就是扩容过程中回滚非常方便,如有异常直接干掉扩容任务即可。对于TDSQL这类数据库业务系统来说,策略1实现会非常麻烦,因为请求到达新set之后可能需要去源set拉取数据,这个需要对MySQL本身进行修改;另外假如一个批量更新的update操作,可能要往新老set都发送一次请求,比较复杂,所以最终选择了策略2。策略2会有更大的通用性,开发模式基本上可以统一到所有类似的系统。下面描述采用策略2具体的扩容流程。假如要将Set1中的t_shard_1的数据迁移一半到Set4中的t_shard_4()。图3 策略2的扩容流程Scheduler首先在Set4中创建好表t_shard_4。后将扩容任务下发到Set1中的agent模块,agent检测到扩容任务之后会采用mysqldump+where条件的方式将t_shard_1中shard号段为的记录导出来并通过管道用并行的方式插入到Set4(不会在本地存文件,避免引起过多的IO),用mysqldump导出镜像的时候会有一个binlog位置。从mysqldump记录的binlog位置开始读取binlog并插入到到Set4,追到所有binlog文件末尾的时候(这需要一个循环,每次循环记录从开始追binlog截止到追到文件结尾消耗的时间,必须保证追单次循环要在几秒之内完成,避免遗留的binlog太多导致最后一次追binlog消耗太多的时间,从而影响业务过久),对原来的表t_shard_1重命名t_shard_5,此时针对这个表不会再有新请求,若还有请求过来都会失败,然后再追一次binlog到文件结尾(因为上面的循环保证了追binlog不会太耗时间了,所以此次会快速完成),然后上报状态到ZooKeeper,表明扩容任务完成。Scheduler收到扩容完成的信息之后会修改路由表,最后由网关拉取到新路由完成整体的扩容;从表重命名开始到网关拉取到新路由,这段时间这个原始shard不可用,从我们测试结果来看这个不可用的时间是200毫秒左右;如果某个网关异常,拉取不到新路由,继续访问老表t_shard_1会一直失败,这样就可以保证数据的一致性。容灾机制对于TDSQL来说,我们希望容灾做到自动切换,自动恢复,主备一致性(保证业务提交的事务在切换过程不丢失),跨IDC容灾。【MySQL异步复制】在MySQL发展的早期,就提供了异步复制的技术,只要写的压力不是特别大,在网络条件较好的情况下,发生主备切换基本上能将影响控制到秒级别,因此吸引了很多开发者的关注和使用。但这套方案提供的一致性保证,对于计费或者金融行业是不够的。图4是异步复制的大致流程,很显然主机提交了binlog就会返回给业务成功,没有保证binlog同步到了备机,这样在切换的瞬间很有可能丢失这部分事务。图4 异步复制【MySQL半同步复制】到了MySQL 5.5版本的时候,Google提供了一个半同步半异步的插件,确保必须收到一个备机的应答才让事务在主机中提交;当备机应答超时的情况下,强同步就会自动退化成异步模式(这也是半同步半异步名字的由来)。图5 半同步复制这套方案相对异步复制,在数据的可靠性方面确实好很多,在主机本身故障的情况下,基本能保证不丢失事务(因为最后一个事务,至少有一个备机上存在),但一旦退化成异步复制就回到过去了。TDSQL没直接采用这套方案,是因为:在主备跨IDC(ping延迟2-3毫秒)时性能非常很低。【Cluster方案】除了上面的方案外,开源社区还有三个Cluster解决方案,分别是Oracle的NDB引擎、Percona XtraDB Cluster和MariaDB Galera Cluster,从公开资料的性能对比上来看,后2者在性能和系统灵活性等方面都强于NDB(同时采用NDB意味着也放弃了InnoDB引擎,NDB主要是基于全内存的,并且需要高速网络环境支持,所以不考虑了);Percona XtraDB Cluster和MariaDB Galera Cluster强同步机制的底层都是采用Galera这套强同步的架构。MariaDB Galera Cluster具有如下非常吸引人的特性:MariaDB Galera Cluster 是一套在MySQL InnoDB存储引擎上面实现multi-master及数据实时同步的系统架构,业务层面无需做读写分离工作,数据库读写压力都能按照既定的规则分发到各个节点上去;同步复制Synchronous replication:保证节点间数据一致性;Active-active multi-master拓扑逻辑:多主的拓扑结构,可以认为没有备机的概念;可对集群中任一节点进行数据读写:假如一个set有3个节点,则3个节点可以同时读写,上次完全不用关心主备切换和读写分离;自动成员控制,故障节点自动从集群中移除;自动节点加入;真正并行的复制,基于行级:同一个表可以在集群中任何节点更新,支持不带where条件,但一次更新的记录条数有限制;每个节点都包含完整的数据副本。目前来看,Galera是一套相当完美的方案。但是,在跨IDC的性能测试中,其性能下降比较大,另外,实现方案也比较复杂,目前对它的代码理解还不够透彻,所以暂时没有在计费领域大范围推广使用。但我相信这个方向是对的,有吸引力的,随着后续Galera越来越完善,我们对它研究得越透彻,也许有一天会采用这套方案。【性能测试和分析】上面的三种复制模式对比测试,数据如图6所示。图6 三种复制模式的对比从图6的数据可以看出,半同步和Galera模式对性能的损耗还是非常大的,Galera的毛刺尤其严重,所以在跨IDC环境下还不是适合计费这样对延迟要求非常低的场景。为什么性能损耗会这么严重呢?这个看明白MySQL的网络模型就清楚了。外界可查的MySQL最早的公开版本应该是1996年的3.1.1.1版本,这么多年来,网络模型基本上变化不大,与Apache有点类似,有点区别的是MySQL采用的是每个连接一个线程的模型,这套模型最大的好处就是开发特别简单,线程内部都是同步调用,只要不访问外部接口,支撑每秒几百上千的请求量也基本够用,因为大部分情况下IO是瓶颈。不过随着当前硬件的发展,尤其是SSD、FusionIO的出现,IOPS从200+/s进化到几十万甚至百万次/s,IO基本上不再是瓶颈,若再采用这套模型并采用阻塞的方式调用延迟较大的外部接口,则CPU都会阻塞在等网络应答上了,性能自然上不去。不过在MySQL5.6企业版和MariaDB、Percona中都引入了线程池,使得网络模型灵活了很多,图7是简化后的对比模型。图7 简化的对比模型TDSQL采用的强同步方案从上面的分析可知,半同步半异步是比较轻量级的高一致性容灾方案,但受限于已有的同步网络模型,CPU利用不起来。我们如果在线程池基础之上做一些修改,参考半同步的思路就可以实现一个高性能的强同步方案。目前的做法是采用与Linux内核处理中断的思路:将上面线程池模型的第三个环节(执行SQL的逻辑)拆成两个部分:上半部分:任务执行到写binlog为止,然后将会话保存到session中,接着执行下一轮循环去处理其他请求了,这样就避免让线程阻塞等待应答了;然后:MySQL自身负责主备同步的dump线程会将binlog立即发送出去,备机的IO线程收到binlog并写入到relay log之后,再通过UDP给主机一个应答;在主机上,开一组线程来处理应答,收到应答之后找到对应的会话,执行下半部分的commit,send应答,绑定到epoll等操作。绑定到epoll之后这个连接又可以被其他线程检测到并执行了。改造后性能提升明显,如图8所示。图8 改造后的性能数据高可用性保障机制除上述强同步机制外,TDSQL还做了以下增强,以提升数据的可用性。推荐一个set最少配置3个跨IDC的节点,可以按业务的要求对备机开放查询服务。支持灵活增加节点,比如觉得3个节点还不够,可以非常方便地增加节点。TDSQL会自动完成数据的全量和增量复制,此处主要依赖Xtrabackup实现物理复制,性能测试数据表明:一个小时大概可以拷贝500GB数据到新节点。那么对于Z3(1.1TB盘,一般最多用800GB左右),新加入的节点大概1.5个小时左右就有了全量数据,此功能也可以用在坏盘等情况下替换节点的时候使用,非常方便。细心的同学可能会发现上面的强同步还有点小缺陷:比如主机用kill -9杀掉,那么可能写了binlog但没有来得及发送到远端,此时当然也不会返回给业务成功,备机上不存在这笔数据,但主机起来之后会多出来这笔事务。我们的做法是对新增的事务根据row格式的binlog做闪回,当然回退不了的比如drop table之类的,就直接提醒运维手工确认是否清除数据库,然后会由Xtrabakcup机制自动从新的备机全量拉取数据重构。节点的监控通过跨IDC部署的ZooKeeper来保证,并且主备切换由一套自动化的严格流程来保证。接下来的方向当将高一致性容灾、高可用性、自动容量伸缩做实后,随着业务的接入,集群的规模会越来越大,TDSQL必将会更加依赖实时的资源调度、隔离框架,因此有必要研究如何将TDSQL与Docker结合起来。如前所述,Galera集群是个非常好的发展方向,我们会持续研究并实践。目前大部分MySQL还在使用单个连接单线程模型,线程池也刚起步,以后随着大家对性能要求越来越高,这块也许可以继续突破,比如结合线程池+协程也许是个很好的方向,如果真能引入协程,也许为MySQL增加调用外部接口的结构会灵活很多。TDSQL将数据拆是拆的彻底了,但作为完整的分布式数据库、合也需要考虑,比如跨库少量记录的join,规模受限的分布式事务等,目前的做法是数据按小时入TDW,在TDW上做OLAP分析。作者简介:雷海林,2007年加入腾讯,10年以上的Linux后台Server开发经验,目前主要从事分布式Cache、实时大数据处理引擎、分布式MySQL(TDSQL)设计和开发工作。本文选自程序员电子版2015年6月A刊,该期更多文章请查看。2000年创刊至今所有文章目录请查看。欢迎(含iPad版、Android版、PDF版)。
推荐阅读相关主题:
CSDN官方微信
扫描二维码,向CSDN吐槽
微信号:CSDNnews
相关热门文章

我要回帖

更多关于 什么是分布式数据库 的文章

 

随机推荐