@HUST张友东 work@taobao zyd_com@126.com
分类: 服务器与存储
2013-06-17 09:10:31
的N个server上,产生N个副本,要求保证N个副本不在同一个机架上,首先从server列表里选出N个机架安全的server是可能失败的,成功选取N个server后,写数据请求发到N个server都是有可能失败的,请求发送成功后,N个server的处理请求也是有可能失败的,比如申请不到存储资源等,或是server宕机,这时对请求不会有任何反馈,针对上面每一种失败情况,程序都应该能正常的处理,才能让这个操作正常的执行完毕。
尽早失败(fail early)
对于预期的错误,最好使用assert尽早失败,将问题暴露出来。一个典型的场景是server分配不出内存了,内存耗尽后,可能引发的问题是不可预期的,与其让这些不可预期的问题出现,还不如尽快coredump,起码你能清楚的知道是内存出了问题;一旦程序出现了不符合预期的行为时,都应该尽早的将问题暴露出来,防止这些问题扩散,产生更坏的结果。
为共性的需求编写框架
分布式系统里可能包含很多个模块,而这些模块的总体框架可能非常类似,仅仅是逻辑上的处理不同而已,比如TFS系统里的nameserver、dataserver两个模块,其在网络请求处理上是完全相同的,接收到客户端的请求,根据请求的类型调用不同的接口来响应,针对这样的共性需求,开发了网络服务器框架,把网络交互逻辑抽象出来,使得各个模块只用关注请求处理本身,尽可能减少重复的工作;与服务器对应的还有客户端的处理框架,内部辅助工具的开发框架,有了这些基础设施,能提高开发效率,同时也便于项目的管理和维护。
提供方便的监控接口
程序运行状态的监控是非常重要的,能让我们尽早的发现异常,将可能出现的故障扼杀在摇篮里。程序状态监控可以通过多种方式实现,比如程序定期把自己当前的运行状态记录在日志文件里,或是提供获取运行状态的接口等,甚至有人建议每个服务程序都应该提供提供支持http协议的状态访问接口,采用这种标准方式的好处是支持图形界面的状态管理和监控变得非常容易;总之,目标就是要能友好的了解到程序的运行状态,防范于未然。