11.4.4 系统实现
分布式存储系统实现的关键在于可控性,包括代码复杂度、服务器资源、代码质量等。开发基础系统时,一个优秀工程师发挥的作用会超过10个平庸的工程师,常见的团队组建方式是有经验的优秀工程师加上有潜质的工程师,这些有潜质的工程师往往是优秀的应届生,能够在开发过程中迅速成长起来。
1.重视服务器代码资源管理
内存,线程池,socket连接等都是服务器资源,设计的时候就需要确定资源的分配和使用。比如,对于内存使用,设计的时候需要计算好服务器的服务能力,常驻内存及临时内存的大小,系统能够自动发现内存使用异常。一般来说,可以设计一个全局的内存池,管理内存分配和释放,并监控每个模块的内存使用情况。线程池一般在服务器程序启动时静态创建,运行过程中不允许动态创建线程。
2.做好代码审核
代码中的一些bug,比如多线程bug,异常情况处理bug,后期发现并修复的成本很高。我们经历过系统的数据规模达到10TB才会出现bug的情况,这样的bug需要系统持续运行接近48小时,并且我们分析了大量的调试日志才发现了问题所在。前期的代码审核很重要,我们没有必要担心代码审核带来的时间浪费,因为编码时间在整个项目周期中只占很少一部分。
代码审核的难点在于执行,花时间理解其他人的代码看起来没什么“技术含量”。OceanBase团队采取的措施是“师兄责任制”。每个进入团队的同学会安排一个师兄,师兄最主要的工作就是审核师弟的代码和设计细节。另外,每个师兄只带一个师弟,要求把工作做细,避免形式主义。
3.重视测试
分布式存储系统开发有一个经验:如果一个系统或者一个模块设计时没有想好怎么测试,说明设计方案还没有想清楚。比如开发一个基于Paxos协议的分布式锁服务,只有想好了怎么测试,才可以开始开发,否则所做的工作都将是无用功。系统服务的数据规模越大,开发人员调试和测试人员测试的时间就越长。项目进展到后期需要依靠测试人员推动,测试人员的素质直接决定项目成败。
另外,系统质量保证不只是测试人员的事情,开发人员也需要通过代码审核、单元测试、小规模代码集成测试等方式保证系统质量。