创业公司发展过程中需要搭建的系统(持续补充)

加入创业公司已有8个多月,亲身经历了公司服务器由两台变成10+台,公司员工从20人不到变成近百人。

最近发现自己的工作重心已经从业务功能开发转移到内部系统开发,短短几天内就撸出几个系统的雏形,系统上线后解决了许多老毛病,所以打算在此记录一下,方便后人。

对于初创公司,可以移步《初创互联网团队如何利用开源技术和云服务快速建立网站》,本文不再讨论。

1.服务器监控

我认为当服务器数量大于5台时,就有必要监控各个服务器的状况,比如cpu使用率、系统负载、网络io情况等等。最开始我使用的是cacti,使用snmp协议来收集数据,在使用过程中发现配置比较复杂,不容易上手,而且当服务器数量比较多时就比较慢(可能是我用的方法不对)。后来改用ganglia,需要在每台服务器上安装agent(gmond),但是配置起来就相对容易,也有很多插件(python模块)可以自定义采集内容。

但仅仅有监控系统是不够的,还需要报警系统,当服务器某个指标出现问题时应该可以用短信或者邮件的方式告知系统管理员。但目前我们尚未顾及这一方面,所以没有建议可以提供,等待补充。

2.配置管理

当服务器数量比较多时,如果要修改一个nginx的配置,在没有配置管理的情况下,需要手动一台台修改,就算只有10台web服务器,这个操作起来也是要累死人的。业内比较流行的是puppet,但是我感觉学习成本比较高,比较重,不太适合目前的情况,于是我找了一个“替代品” (R)?ex (好奇怪的名字),实际上这不是一个配置管理工具,而是批量命令执行的工具,不需要部署agent,只需要在配置里写好帐号密码或者是配好ssh信任即可,它可以执行命令、上传文件、同步文件夹,也支持模板,功能还算比较全面,能够满足目前的需求。

比如要批量修改nginx的配置,只需要在中心服务器有一份nginx配置文件夹,可以通过R(?)ex的同步文件夹功能将中心服务器的nginx配置文件夹同步到所有web服务器的nginx配置文件夹里,然后再执行nginx -s reload即可。

3.集群定时任务管理

当业务稍微复杂一点的时候,系统里会有很多定时任务,有的可能是请求一个url,有的可能是执行一个脚本,这些定时任务分布在不同的服务器上,想要看看各个服务器上有哪些定时任务就比较繁琐,要看看某个定时任务的执行周期是什么也得登录对应的服务器查看。开源的解决方案是CronHub,是个国人参与的项目,但由于是java开发,而我们目前没有java工程师,想要做一些二次开发的话就不太现实。于是就自己撸了一个简单的集群定时任务管理系统,由于尚不成熟暂时没有开源。

4.日志收集

当web服务器比较多时,想要查看某个请求的日志,就需要一台台登录、grep查找,效率极低,因此需要有一个集中存放日志的系统,最好是能够实时收集。比较流行的解决方案是ELK,ElasticSearchLogStashKibana,其中logstash负责收集日志,需要安装到每一台需要收集日志的服务器上,Elasticsearch负责存储日志,kibana负责查询、展现日志数据。但是elasticsearch不能存储单行超过32K的日志,如果单行日志超过32K就不能进入到Elasticsearch中。Elasticsearch提供了丰富的接口,可以通过代码查询日志,集成到其他系统中十分方便。

5.代码部署

当业务规模不大,系统架构简单的情况下,可以选择git/svn的hook,当有新的提交时,就直接执行svn export/git pull命令,将最新代码导出到web目录下。而随着访问量增加、业务变得复杂,如果仍然是提交就直接部署,很容易出现线上bug,回滚起来也不方便。

因此需要有一套代码部署的系统,可以将指定的代码部署到指定服务器的指定目录下。目前没有找到合适的开源方案,自己写了一个简单的redmine插件,配合redmine的版本库功能,可以将一个特定版本部署到线上。

6.对外帐号管理

互联网公司经常会用到各种第三方的服务,例如微信公众号、第三方Oauth登录、支付宝支付等等,一开始的时候都是谁用到就谁注册谁保管。但随着员工人数变多,人员流动频繁,经常会出现某个帐号找不到有密码的人,或者重设密码的时候发现注册邮箱是一个已离职员工的私人邮箱,所以有一套帐号密码管理系统很有必要。

《初创互联网团队如何利用开源技术和云服务快速建立网站》一文中有提到使用meldium来管理帐号密码,但我认为帐号密码作为企业最隐私的部分托管在一个第三方的网站着实不是一个放心的选择,因此还是选择自己搞一套。

简单来说就是每个员工都可以去系统里登记帐号信息,每个帐号信息有一个或者多个管理员,当员工想要知道某个帐号的密码时,需要提交申请,由帐号管理员审核通过之后方可查看密码。这样也可以很容易就查出某个帐号的密码被哪些员工知道,如果员工离职时,可以及时修改对应帐号的密码。

7.单点登录

当企业规模变大,会有越来越多的内部系统,比如某个网站的管理后台,还有上面提到的帐号管理系统,如果每个新员工入职,都要在这些系统里开帐号,那对hr是一个很大的工作量,员工离职时也要一个个系统去注销,而员工如果需要修改密码,就需要一个站点一个站点的改。因此有一个单点登录(sso)系统是很有必要的。

搜索了一圈没找到合适的开源解决方案,业内比较流行的cas却是基于java的,同样由于目前无法二开的原因没有采用。所以就自己简单撸了一个极简的sso系统,用户使用一个密码就能够登录所有后台站点(当然默认都是最低权限,调整权限还是需要在具体后台操作)。

单点登录系统上线之后,新开发的后台都不需要考虑新增用户、用户修改密码等杂七杂八的问题了。

8.站点访问统计

一开始的时候站点统计都是使用百度统计或者cnzz这种公共的统计服务,但这样我们只能查看他们提供的报表,有很多维度的东西都查看不到。我们现在在使用的是piwik,相对来说维度更多,也提供了很多api。最重要的是原始的访问日志在我们自己手里,我们可以根据具体需求查询。

9.内部DNS系统

通常每台服务器都有各自不同的职能,比如有的服务器只提供web服务,有的服务器提供数据库、缓存服务,这时候就需要给服务器命名,比如web01、web02、db01、cache01这样。

最开始服务器不多的时候可以通过配置hosts来解决,但服务器数量多了,每次新增服务器都要修改每台服务器的hosts,相当浪费时间,所以就打算自己搭建一个DNS。业内最流行的DNS服务器应该是bind,但是使用了一段时间后发现学习成本比较高,配置复杂。所以就找了一个简单版本的开源软件MyDns,使用mysql/postgre作为数据库,而且自带了一个简单的web管理后台,只要在web端填一些东西就可以完成域名的配置,对于内部使用完全足够了。

10.服务器权限控制/跳板机/堡垒机

随着开发人员变多,开发人员经常需要登录到服务器上查日志、执行脚本,如果大家都知道服务器的帐号密码,那么员工离职之后就比较麻烦,假如有人做了恶意操作,也没办法查出来是谁做的。

当时在百度的时候有一个门神系统,所有员工使用自己的用户名登录跳板机,再从跳板机登录到有权限的服务器上。

目测要自己搭建一套这样的系统,可以使用Kerberos,但目前还没有精力去搞。

暂时只想到这么多

创业公司发展过程中需要搭建的系统(持续补充)
Share this