1.架构师职责
分布式存储系统架构师的工作不仅在于整体架构设计,还需要考虑清楚关键实现组节,做到即使只有自己一人也可以把系统做出来,只是需要花费更多的时间而已。
架构师的主要工作包括:
1)权衡架构,从多种设计方案中选择一种与当前团队能力最为匹配的方案。架构设计的难点在于权衡,架构师需要能够在理解业务和业界其他方案的前提下提出通合自已公司的架构。这样的架构既能很好地满足业务需求,复杂度也在开发团队的掌控范围之内。另外,制定系统技术发展略线图,提前做好规划。
2)模块划分、接口设计、代码规范制定。系统如何分层,模块如何划分以及每个模块的职责,模块的接口、客户端接口,这些问题都应该在设计阶段考虑消楚。而不是遗留到编码阶段。另外,确保整个团队的编码风格一致。
3)思考清楚关键实现细节并写入设计文档。架构师需要在设计阶段和团队成员讨论清楚关键数据结构、算法,并将这些内容文档化。如果架构师都不清楚关键实现细节,那么,团队成员往往更不清楚,最终的结果就是实现的系统带有不确定性。如果分布式存储系统存在多处缺陷,那么.系统集成测试或者试运行的时候一定会出现进程Core Dump、数据不正确等问题。这些问题在分布式以及多线程环境下非常难以定位。如果引发这些错误的原因比较低级,团队成员将无法从解决错误的过程中收获成就感,团队士气下降,甚至形成恶性循环。
4)提前预知团队成员的问题并给予指导。划分模块以及安排工作时需要考虑团队成员的能力,给每个成员安排适当超出其当前能力的任务,并给予一的指导,例如,帮助其完善设计方案,建议其参考业界的某个方案等。
总而言之,每个问题总会有多种技术方案,架构师要有能力在整体上从稳定性、性能及工程复杂度明确一种设计方案,面且思考清楚实现细节,切忌模棱两可。分布式存储系统的挑战不在于存储理论,而在于如何做出稳定运行且能够逐步进化的系统。
2.设计原则
大规模分布式存储系统有一些可以参考的设计准则:
1)容错。服务器可能宕机,网络交换机可能发生故障,服务器时钟可能出错,磁位存储介质可能损坏等。设计分布式存储系统需要考虑这些因素,将他们看成系统运行过程中必然发生的“正常情况”。这些错误发生时,要求系统能够自动处理,而不是要求人工干预。
2)自动化。人总是会犯错的,加上互联网公司往往要求运维人员在凌晨执行系统升级等操作,因此,运堆人员操作失误的概率远远高于机器故障的概率。很多设计方案是无法做到自动化的,例如MySQL数据库主备之间异步复制。如果主机出现故障,那么有两种选择:一种选择是强制切换到备机,可能丢失最后一部分更新事务;另外一种选择是停写服务。显然,这两种选择都无法让人接受,因此,只能在主机出现故障时报警。运维人员介人根据实际情况采取不同的措施。另一方面,如果主备之间实现强同步,那么,当主机出现故障时,只需要简单地将服务切换到备机即可,很容易实现自动化。当集群规模较小时,是否自动化没有太大的分别;然而,随着集群规模越来越大,自动化的优势也会变得越来越明显。
3)保持兼容。分布式存储面临的需求比较多样,系统最初设计,尤其是用户接口设计时需要考虑到后续升级问题。如果没有兼容性问题,用户很乐意升级到最新版本。这样,团队可以集中精力开发最新版本,而不是将精力分散到优化老版本性能或者修复老版本的Bug上。