如何快速上手一款开源软件

以下内容已屏蔽图片优化访问速度
最近一篇比较火的文章中提到,techcrunch上有一篇文章,列举了当前最火的开源软件列表


[IMG]BATTERY OPEN-SOURCE SOFTWARE INDEX
Rank
Project Name
Overall Project Rating
Category
Sample of Related Companies
1
Linux
100.00
IT Operations
Red Hat, Ubuntu
2
Git
31.10
DevOps
GitHub, GitLab
3
MySQL
25.23
Data & Analytics
Oracle
4
Node.js
22.75
DevOps
NodeSource, Rising Stack
5
Docker
22.61
DevOps
Docker
6
Hadoop
16.19
Data & Analytics
Cloudera, Hortonworks
7
Elasticsearch
15.72
Data & Analytics
Elastic
8
Spark
14.99
Data & Analytics
Databricks
9
MongoDB
14.68
Data & Analytics
MongoDB
10
Selenium
12.81
DevOps
Sauce Labs, BrowserStack
11
NPM
12.31
DevOps
NPM
12
Redis
11.61
Data & Analytics
Redis Labs
13
Tomcat
11.04
IT Operations
NA
14
Jenkins
10.47
DevOps
CloudBees
15
Vagrant
8.15
IT Operations
HashiCorp
16
Postgres
8.02
Data & Analytics
EnterpriseDB
17
Gradle
7.68
DevOps
Gradle
18
Nginx
7.57
IT Operations
Nginx
19
Ansible
7.42
IT Operations
Ansible
20
Kafka
7.22
Data & Analytics
Confluent
21
GitLab
6.42
DevOps
GitLab
22
Hbase
6.41
Data & Analytics
Cloudera, Hortonworks
23
Chef
6.37
IT Operations
Chef*
24
TensorFlow
5.97
Data & Analytics
Google
25
Cassandra
5.74
Data & Analytics
DataStax


如此多如火如荼的开源软件,的确给我们开发人员带来了很多福利,很多东西不需要从零开始做了,都会有开源帮你搞定。



但是同时也对开发人员造成了困惑,开源软件层出不穷,一会出一个,不看代码吧,有时候出现了问题搞不定,看了代码吧,一会儿代码又变了,或者出了新的开源软件,代码又得重新看,痛苦无比。


下面分享一下我的基本方法,不一定对谁都管用哦,这里以OpenStack,Hadoop,Kubernetes为例子


一、手动安装起来,一定要手动


当你要开始看一款开源软件的时候,网上会有形形色色的文档,博客,原理讲解,到官方网站上也有大量的文档等着你看,还有源代码等等,信息量实在太大了,当你不动手,只看这些文字的时候,基本是没有什么感觉的,看了也很容易遗忘,过一段时间,有哪些组件,组件之间的相互关系都搞不清楚了。


所以首先要安装起来,当然成熟的开源软件往往有自动化安装的工具,例如OpenStack的DevStack,Hadoop的Ambari,Kubernetes的kubeadm基于容器化的安装等。


但是一开始十分不建议这样做,一方面这让你丧失了详细了解开源软件的配置细节的机会,因为以后你了解原理的时候,会看到相关的信息,如果完全自动化,你将一点感觉都没有,另一方面,在你没有深入了解一个开源软件的时候,很不幸,自动化的安装往往因为环境差异问题不成功,开源软件往往就是这样欺负人,当你熟悉了他的时候,怎么安装都顺利,当你不熟悉他的时候,一步一个坑,你还不容易找到。而且自动化的安装一共做了一百步,错在了哪一步,不熟悉他的你连怎么看错误都不知道,搜索起来都是表面的原因,很可能背后其他的配置,或者网卡,或者iptables,或者systemd等有问题,从表面的报错看不出来,使得你一头雾水,不得不删了环境重新安装,再删除再重新安装,看起来自动化,其实时间可能更长。


所以不要怕麻烦,按照官方的安装文档,一步一步的安装。官方的安装文档的好处是往往会大概讲一下原理,这样会使得你有个全局的了解。这个时候,对你来说,每一步都是一个Linux操作,对Linux的基本操作的debug能力使得你更容易定位执行到了哪一步出来错误,到底是出了什么错误,是否要进行一些官方文档里面没有的,但是你的环境特殊的操作,例如安装依赖软件,配置iptables规则,默认文件路径权限有问题等等。


不要怕麻烦,配置文件一个一个的填写,将来你还是要看文档,弄明白每个配置项是什么意思,当出现了性能瓶颈的时候,还需要调整这里面的参数,而且填写这些配置文件的时候,往往会有一些相应的注释,告诉你更加详细的情况,例如配置范围,影响等等。这里需要强调一点的是,无论你按照哪个安装文档来,请完全按照人家的来,不要在不熟悉的地方耍小聪明,利用自己的已有的常识做一些小的修改,往往的结果是你觉得和人家做的一模一样,结果就是运行不起来。例如文档要求配置密码统一为password,你不知道这串数字到底哪里用了,就乖乖的统一用password,别觉得说密码太简单,我改成一个复杂的吧,结果到时候认证匹配不上,再如文档要求安装的用户名为hduser,就不要用root,你可能觉得root权限更高没有问题,结果很可能后面运行任务报的权限问题就是因为root。


对于OpenStack,原来官方文档不好的时候,陈沙克[IMG]+ Spark 大数据巨量分析与机器学习整合开发实战》这本书非常不错,一步一步的做,过程非常详细,熟手看着有些啰嗦,但是对于新手很有帮助。


对于Kubernetes,绝对推荐这个[IMG]in Action系列



安装完毕之后,接下来就是先试用一下,尝试几个经典的使用场景,一方面能够验证安装的是否完全正确,一方面可以成为一个开源软件的合格使用者。


一般的开源软件都会有XXX in Action系列的丛书,一般看完了这本书,对这个软件的方方面面的功能的使用都有了一个概况的了解。


例如hadoop有hadoop in action,OpenStack也有openstack in action,Kubernetes也马上会有kubernetes in action了。


当你非常熟练的掌握了开源软件之后,你会发现XXX in action系列里面的东西其实官方文档都有,但是一开始你找不到,也不知道从哪里下手,面对官方文档的茫茫大海,不知道哪里是边界,如何组合成场景使用,这就是XXX in action系列的作用。


[IMG]


[IMG]


[IMG]


三、读文档,读所有的官方文档,记不住,看不懂也要读下来


安装好了,也基本会用了,接下来就是练苦工的时候了,官方文档往往非常的多,但是要了解一个开源软件,必须要把官方文档完全读下来,这里面你会发现一些你已经知道的基本原理,你已经体验过的安装过程,你似乎配置过的参数,也会遇到你不熟悉的使用场景,深入的原理解析等等,但是一定要读下来。


虽然官方文档往往是零散的,不成体系的,可能不是一个作者写的,不同的地方会有出入,但是是最新的,所以熟悉一个开源软件,官方文档是必须的,当以后出现了问题,正常的方式应该是回头去查官方文档,而非查你当时看的那本书,因为书可能会过时。


当第一遍看完所有的官方文档,你会发现脑子都快炸了,信息量实在太大了,没关系,形成一个印象,在大脑中建立一个索引,有问题知道到哪里去查就可以了,另外多看几遍,就会发现老是那些东西,这个时候,就说明你对这个开源软件开始熟悉起来。


很多人不看官方文档,然后就去社区里面这问那问的,是非常不提倡的,这样会永远是一个门外汉。


四、了解核心的原理和算法,推荐XXX the definitive guide系列


每个开源软件都有自己的核心的亮点,在于核心的原理和算法。


当然不了解这些原理和算法,或者大概了解一下也能顺利使用,但是非常可惜,这些原理和算法,才是开源软件的精髓。


很多人抱怨说开源软件层出不穷,看不过来,但是如果能够深入原理的话,还是能够发现很多共性的东西,只不过从新组合了一下,或者做了一个变异,从而适应新的应用场景。


例如你如果本身比较熟悉Linux,网络,存储的原理的话,会发现OpenStack就是一个壳,当你熟悉了OpenStack之后,你会发现容器平台所需要考虑的,也差不多就是这些因素,当你熟悉了Kubernetes了以后,你会发现Swarm, DCOS的概念也是如此的像。


通过下面这一系列文章,可以看到OpenStack,Kubernetes,Mesos那些可以相互借鉴的核心原理
支撑大规模公有云的Kubernetes改进与优化 (1)

支撑大规模公有云的Kubernetes改进与优化 (2)

支撑大规模公有云的Kubernetes改进与优化 (3)



再如从学习Memcached的时候了解了一致性哈希,后来发现swift也用到类似的思想,后来发现Ceph也是使用了类似的思想。


了解核心的原理与算法,推荐the definitive guide系列,例如hadoop有hadoop the definitive guide,kubernetes有著名的黑宝书


[IMG]


[IMG]


五、看一本源码分析的书,会让你的源码阅读之旅事半功倍


了解了核心原理还不够,如果不看代码如何实现的,心里不踏实,而且也没办法为以后的代码实践借鉴,并且运维过程中遇到exception,不熟悉源代码,不知道哪里出错了,也不行。


但是开源软件代码纷繁复杂,一开始看肯定晕,如果市面上已经有了比较好的源码分析的书,将会是很大的帮助。


例如我开始阅读hadoop源代码的时候,对于老版的map-reduce过程比较熟悉了,但是到了map-reduce v2的时候,一读代码,里面的消息机制和状态机一下子就把我干蒙了,幸亏有董西成的《Hadoop技术内幕:深入解析YARN架构设计与实现原理》,看了他的解析,回头再看代码,就清晰多了。


对于kubernetes,权威指南中已经有了代码分析的章节了,另外推荐另一本书,容器与容器云,浙大出的,也很不错。



[IMG]


六、开始阅读核心逻辑源代码


不能光看别人进行代码解析,按照别人指点的路,自己深入到代码里面去看,才有感觉,当然一开始阅读代码不要纠结一城一池的得失,而聚焦于核心的逻辑的代码,例如创建一个pod的整个过程,运行一个map-reduce任务的过程等等。


七、编译并Debug源代码


读核心代码还属于纸上谈兵,要想修改,需要自己会编译,通过单元测试,并且能够Debug,这个过程可不轻松,看代码容易编译难,通过单元测试如果有场景也需要花费些时间,然后真正的debug,看核心的流程里面,每个变量是多少,跳到了哪个子类里面去,只有debug了才知道。


八、开发一个插件,或者对组件做少量的修改


接下来可以尝试做一些自己的修改了,首推的方式是看看这个开源软件是否允许开发一些插件,一般设计好的开源软件都会有相应的模式的,里面打上一行日志,或者发送个消息都可以,如果插件做不到,能够找到可做少量修改的地方,重新编译,打包,部署,看看是否符合希望,才是一个开源软件开发者的起始。



九、大量的运维实践经验和面向真实场景的定制开发


前面说了这么多,都是万里长征第一步,也即今天说的上手的环节,如果是运维,仅仅熟悉上面基本的操作是不够的,生产环境会有大量的不可控因素,尤其是集群规模大的更是如此,因而大量的运维经验是实战来的,不能光靠读书。如果是开放,也是这样的,进行少量修改容易,但是一旦面临真实的客户场景,会发现改哪儿都不是,还要考虑扩展和兼容,也是非得真实项目才能练出来的。
年底评优:人性的斗牛场 漫画科普5G到底是个什么玩意儿? 金错刀《爆品战略》渠道合作伙伴招募令! 这个戒烟帝国有多壕?年终奖人均900万,却害惨了全球烟民 Systemd曝3漏洞,绝大部分Linux发行版易受攻击
好看吗?
总执行时间0.07425808906555176,文章查询时间0.0478978157043457,分类查询时间0.009726524353027344,其他脚本0.00029921531677246094,模板渲染0.01633453369140625