如何快速上手一款开源软件
最近一篇比较火的文章中提到,techcrunch上有一篇文章,列举了当前最火的开源软件列表
THE BATTERY OPEN-SOURCE SOFTWARE INDEXRankProject NameOverall Project RatingCategorySample of Related Companies1Linux100.00IT OperationsRed Hat, Ubuntu2Git31.10DevOpsGitHub, GitLab3MySQL25.23Data & AnalyticsOracle4Node.js22.75DevOpsNodeSource, Rising Stack5Docker22.61DevOpsDocker6Hadoop16.19Data & AnalyticsCloudera, Hortonworks7Elasticsearch15.72Data & AnalyticsElastic8Spark14.99Data & AnalyticsDatabricks9MongoDB14.68Data & AnalyticsMongoDB10Selenium12.81DevOpsSauce Labs, BrowserStack11NPM12.31DevOpsNPM12Redis11.61Data & AnalyticsRedis Labs13Tomcat11.04IT OperationsNA14Jenkins10.47DevOpsCloudBees15Vagrant8.15IT OperationsHashiCorp16Postgres8.02Data & AnalyticsEnterpriseDB17Gradle7.68DevOpsGradle18Nginx7.57IT OperationsNginx19Ansible7.42IT OperationsAnsible20Kafka7.22Data & AnalyticsConfluent21GitLab6.42DevOpsGitLab22Hbase6.41Data & AnalyticsCloudera, Hortonworks23Chef6.37IT OperationsChef*24TensorFlow5.97Data & AnalyticsGoogle25Cassandra5.74Data & AnalyticsDataStax如此多如火如荼的开源软件,的确给我们开发人员带来了很多福利,很多东西不需要从零开始做了,都会有开源帮你搞定。
但是同时也对开发人员造成了困惑,开源软件层出不穷,一会出一个,不看代码吧,有时候出现了问题搞不定,看了代码吧,一会儿代码又变了,或者出了新的开源软件,代码又得重新看,痛苦无比。
下面分享一下我的基本方法,不一定对谁都管用哦,这里以OpenStack,Hadoop,Kubernetes为例子
一、手动安装起来,一定要手动
当你要开始看一款开源软件的时候,网上会有形形色色的文档,博客,原理讲解,到官方网站上也有大量的文档等着你看,还有源代码等等,信息量实在太大了,当你不动手,只看这些文字的时候,基本是没有什么感觉的,看了也很容易遗忘,过一段时间,有哪些组件,组件之间的相互关系都搞不清楚了。
所以首先要安装起来,当然成熟的开源软件往往有自动化安装的工具,例如OpenStack的DevStack,Hadoop的Ambari,Kubernetes的kubeadm基于容器化的安装等。
但是一开始十分不建议这样做,一方面这让你丧失了详细了解开源软件的配置细节的机会,因为以后你了解原理的时候,会看到相关的信息,如果完全自动化,你将一点感觉都没有,另一方面,在你没有深入了解一个开源软件的时候,很不幸,自动化的安装往往因为环境差异问题不成功,开源软件往往就是这样欺负人,当你熟悉了他的时候,怎么安装都顺利,当你不熟悉他的时候,一步一个坑,你还不容易找到。而且自动化的安装一共做了一百步,错在了哪一步,不熟悉他的你连怎么看错误都不知道,搜索起来都是表面的原因,很可能背后其他的配置,或者网卡,或者iptables,或者systemd等有问题,从表面的报错看不出来,使得你一头雾水,不得不删了环境重新安装,再删除再重新安装,看起来自动化,其实时间可能更长。
所以不要怕麻烦,按照官方的安装文档,一步一步的安装。官方的安装文档的好处是往往会大概讲一下原理,这样会使得你有个全局的了解。这个时候,对你来说,每一步都是一个Linux操作,对Linux的基本操作的debug能力使得你更容易定位执行到了哪一步出来错误,到底是出了什么错误,是否要进行一些官方文档里面没有的,但是你的环境特殊的操作,例如安装依赖软件,配置iptables规则,默认文件路径权限有问题等等。
不要怕麻烦,配置文件一个一个的填写,将来你还是要看文档,弄明白每个配置项是什么意思,当出现了性能瓶颈的时候,还需要调整这里面的参数,而且填写这些配置文件的时候,往往会有一些相应的注释,告诉你更加详细的情况,例如配置范围,影响等等。这里需要强调一点的是,无论你按照哪个安装文档来,请完全按照人家的来,不要在不熟悉的地方耍小聪明,利用自己的已有的常识做一些小的修改,往往的结果是你觉得和人家做的一模一样,结果就是运行不起来。例如文档要求配置密码统一为password,你不知道这串数字到底哪里用了,就乖乖的统一用password,别觉得说密码太简单,我改成一个复杂的吧,结果到时候认证匹配不上,再如文档要求安装的用户名为hduser,就不要用root,你可能觉得root权限更高没有问题,结果很可能后面运行任务报的权限问题就是因为root。
对于OpenStack,原来官方文档不好的时候,陈沙克http://www.chenshake.com/还是写了非常好的安装教程的,着实帮助大家趟了很多的坑,现在官方文档也慢慢完善了起来。
对于Hadoop,官方文档还是有些粗糙,个人觉得《Hadoop + Spark 大数据巨量分析与机器学习整合开发实战》这本书非常不错,一步一步的做,过程非常详细,熟手看着有些啰嗦,但是对于新手很有帮助。
二、使用一下,推荐XXX in Action系列
安装完毕之后,接下来就是先试用一下,尝试几个经典的使用场景,一方面能够验证安装的是否完全正确,一方面可以成为一个开源软件的合格使用者。
一般的开源软件都会有XXX in Action系列的丛书,一般看完了这本书,对这个软件的方方面面的功能的使用都有了一个概况的了解。
例如hadoop有hadoop in action,OpenStack也有openstack in action,Kubernetes也马上会有kubernetes in action了。
当你非常熟练的掌握了开源软件之后,你会发现XXX in action系列里面的东西其实官方文档都有,但是一开始你找不到,也不知道从哪里下手,面对官方文档的茫茫大海,不知道哪里是边界,如何组合成场景使用,这就是XXX in action系列的作用。
三、读文档,读所有的官方文档,记不住,看不懂也要读下来
安装好了,也基本会用了,接下来就是练苦工的时候了,官方文档往往非常的多,但是要了解一个开源软件,必须要把官方文档完全读下来,这里面你会发现一些你已经知道的基本原理,你已经体验过的安装过程,你似乎配置过的参数,也会遇到你不熟悉的使用场景,深入的原理解析等等,但是一定要读下来。
虽然官方文档往往是零散的,不成体系的,可能不是一个作者写的,不同的地方会有出入,但是是最新的,所以熟悉一个开源软件,官方文档是必须的,当以后出现了问题,正常的方式应该是回头去查官方文档,而非查你当时看的那本书,因为书可能会过时。
当第一遍看完所有的官方文档,你会发现脑子都快炸了,信息量实在太大了,没关系,形成一个印象,在大脑中建立一个索引,有问题知道到哪里去查就可以了,另外多看几遍,就会发现老是那些东西,这个时候,就说明你对这个开源软件开始熟悉起来。
很多人不看官方文档,然后就去社区里面这问那问的,是非常不提倡的,这样会永远是一个门外汉。
四、了解核心的原理和算法,推荐XXX the definitive guide系列
每个开源软件都有自己的核心的亮点,在于核心的原理和算法。
当然不了解这些原理和算法,或者大概了解一下也能顺利使用,但是非常可惜,这些原理和算法,才是开源软件的精髓。
很多人抱怨说开源软件层出不穷,看不过来,但是如果能够深入原理的话,还是能够发现很多共性的东西,只不过从新组合了一下,或者做了一个变异,从而适应新的应用场景。
例如你如果本身比较熟悉Linux,网络,存储的原理的话,会发现OpenStack就是一个壳,当你熟悉了OpenStack之后,你会发现容器平台所需要考虑的,也差不多就是这些因素,当你熟悉了Kubernetes了以后,你会发现Swarm, DCOS的概念也是如此的像。
再如从学习Memcached的时候了解了一致性哈希,后来发现swift也用到类似的思想,后来发现Ceph也是使用了类似的思想。
了解核心的原理与算法,推荐the definitive guide系列,例如hadoop有hadoop the definitive guide,kubernetes有著名的黑宝书
五、看一本源码分析的书,会让你的源码阅读之旅事半功倍
了解了核心原理还不够,如果不看代码如何实现的,心里不踏实,而且也没办法为以后的代码实践借鉴,并且运维过程中遇到exception,不熟悉源代码,不知道哪里出错了,也不行。
但是开源软件代码纷繁复杂,一开始看肯定晕,如果市面上已经有了比较好的源码分析的书,将会是很大的帮助。
例如我开始阅读hadoop源代码的时候,对于老版的map-reduce过程比较熟悉了,但是到了map-reduce v2的时候,一读代码,里面的消息机制和状态机一下子就把我干蒙了,幸亏有董西成的《Hadoop技术内幕:深入解析YARN架构设计与实现原理》,看了他的解析,回头再看代码,就清晰多了。
对于kubernetes,权威指南中已经有了代码分析的章节了,另外推荐手机号购买另一本书,容器与容器云,浙大出的,也很不错。
六、开始阅读核心逻辑源代码
不能光看别人进行代码解析,按照别人指点的路,自己深入到代码里面去看,才有感觉,当然一开始阅读代码不要纠结一城一池的得失,而聚焦于核心的逻辑的代码,例如创建一个pod的整个过程,运行一个map-reduce任务的过程等等。
七、编译并Debug源代码
读核心代码还属于纸上谈兵,要想修改,需要自己会编译,通过单元测试,并且能够Debug,这个过程可不轻松,看代码容易编译难,通过单元测试如果有场景也需要花费些时间,然后真正的debug,看核心的流程里面,每个变量是多少,跳到了哪个子类里面去,只有debug了才知道。
八、开发一个插件,或者对组件做少量的修改
接下来可以尝试做一些自己的修改了,首推的方式是看看这个开源软件是否允许开发一些插件,一般设计好的开源软件都会有相应的模式的,里面打上一行日志,或者发送个消息都可以,如果插件做不到,能够找到可做少量修改的地方,重新编译,打包,部署,看看是否符合希望,才是一个开源软件开发者的起始。
九、大量的运维实践经验和面向真实场景的定制开发
前面说了这么多,都是万里长征第一步,也即今天说的上手的环节,如果是运维,仅仅熟悉上面基本的操作是不够的,生产环境会有大量的不可控因素,尤其是集群规模大的更是如此,因而大量的运维经验是实战来的,不能光靠读书。如果是开放,也是这样的,进行少量修改容易,但是一旦面临真实的客户场景,会发现改哪儿都不是,还要考虑扩展和兼容,也是非得真实项目才能练出来的。