孙立:你是如何在架构层面,提高开发人员开发效率的?比如通过合理的分层,不同层安排不同能力的开发人员。
孙朝晖:首先孙立老师已经谈到了这个问题的两个核心,第一是合理的分层,第二是让不同能力层次的队伍有机组合。
孙立:要变更数据库结构,有什么经验可以分享?
孙朝晖:这个问题是互联网行业的通用难题,数据量大,数据结构变更的代价太大,对于这个问题,我想从四个方面进行介绍。
孙立:如何搭建更加有效的测试环境?测试环境和线上环境毕竟不可能完全一样。
孙朝晖:我想分成两个方面来回应。
功能测试环境组建的另外一个要点是关注网络结构的等价性,通过虚拟机系统增加与现网等价的网络拓扑结构。尤其是在交换设备和域名系统上尽可能保持一致,因为有很多问题是由于物理部署结构引起的,从开发的角度很难发现,只有通过一个相对完整的功能测试环境方可发现这一类问题。
需要解决的主要问题是容量规划这项工作,由于线上与线下服务器的硬件类型和规格不一致,网络拓扑结构也不同,也无法完全模拟线上环境。所以我们一般采用的方法是,对服务器进行角色类型划分,同一种角色的服务器在性能测试环境下必须有统一类型的服务器对应,有对应的确定性物理配置,在性能环境测试后,首先安排预上线测试环境,通过七层交换或者应用程序本身的流量复制,把线上的服务压力导流到预上线环境,进行小规模再测试,得出单机的性能数据与性能测试环境的对比,并根据单机的性能测算对比,做出线上的容量规划。按照容量规划进行系统实施后,根据实际的测试数据再调整,有可能因容量估计过高,服务器能力有冗余,需将服务器标记为空闲,留待后续部署使用。
孙立:你如何看待NoSQL的?
孙朝晖:我们在建设Feed中心时经过了对NoSQL的充分测试,比较了多种NoSQL技术方案,包括Cassendra、MongoDB、Redis和MySQL HandlerSocket,最终我们采用了MySQL HanlderSocket作为我们的NoSQL解决方案。
NoSQL对SNS类的应用场景来说还是很实用且必要的。因为我们要求的Write throughput很大,数据结构简单,仅需要弱一致性,所以在这种场景下使用NoSQL还是比较合适的。
但对于目前主流NoSQL产品推崇的自动分区等高端功能特性,我们经过测试和权衡还是觉得很难用到实际场景下。一方面是这种自动化分区管理功能使得系统自身的复杂性太高,部署和监控复杂;另一方面是NoSQL产品缺乏专用的备份工具,系统出现单点故障后,恢复的代价太高,给运维造成了很大的压力。
我们最终选择实用MySQL HanlderSocket作为NoSQL解决方案的原因是此方案能够利用MySQL数据库本身的全部分布式特性和管理特性,系统可控性更强,对于运维、数据老化处理、性能调整等方面都有成熟的方向。
对于NoSQL本身的发展和应用方向目前我个人还不是看得很清楚,例如几乎全能的Redis出现,大家会如何使用?在我们的技术体系内使用Redis作为内存缓存,替代了Memcached,没有启用持久化功能。
我个人认为,采用NoSQL技术还是需要经过充分评估的,尤其是与物理架构设计师和运维部门充分沟通,平衡开发和运维的整体工作压力。另外使用之前尽量充分阅读源代码,具备自我技术支持能力后再投入使用。
孙立:你如何看待横向扩展(Scale Out)和纵向扩展(Scale Up)?
孙朝晖:我个人认为,Scale Out是互联网服务的必由之路,分布式技术是互联网服务不可或缺的技术能力。但随着服务器规模的不断扩大,运维的压力会越来越大,到了一定系统规模,必须回归到提升单机QPS能力的方向上来。但是我觉得这里的提升单机QPS不是简单的ScaleUp,而是一个综合优化的过程,比如下面这些实例。
孙立:大型网站往往会将多种语言进行融合使用,关于这方面,你有什么经验分享?
孙朝晖:这是一个互联网行业遇到的通用问题,由于互联网行业采用开源软件比较多,往往由于开源软件的引入,引入了一些非本服务体系内的主流开发语言,比如Scala、Erlang等。这个问题我有两点想说。
第一,在我们的技术体系内,我是比较倾向于减少开发语言使用的。我们每个层次采用的技术都比较确定,Web采用PHP,中间采用Java,基础通信部分采用C语言开发,个人认为引入太多的开发语言和技术,会对技术团队成长和线上业务的可维护性带来很大的问题。
第二,虽然我们的开发技术较少,但仍然有异构平台之间的通信问题。在我们的业务中,还有一部分是用Windows平台C#技术开发的。为了解决异构通信的问题,我们自主研发了基于ProtocolBuffer序列化协议和TCP的RPC通信协议,分别使用C#、Java、C(包括PHP Extension)开发了RPC的通信协议栈,解决了跨平台通信问题。当然选用Thift也是一个不错的选择,我们没有选用它主要是为了兼容我们IM软件的采用SIP协议。我认为解决异构系统通信问题的需要考虑以下几点。
孙立:对于大型系统的突发性故障,如何在架构层面帮助快速定位故障的原因?
孙朝晖:互联网应用系统由于涉及多服务集成,以致多数的异步调用造成突发性故障很难排查,针对这个问题我们主要采取以下几点策略。
主持人介绍:冯大辉,现任丁香园 (http://www.dxy.cn)网站CTO。曾历任支付宝架构师、数据库团队负责人等职。
提问嘉宾介绍:孙立,去哪儿网高级系统架构师,曾就职于凤凰网、酷6和搜狐。对分布式搜索引擎开发、大数据量网站系统架构优化、运维监控等有丰富的经验。开源项目phplock和phpbuffer的作者,近期开发了NoSQL数据库存储INetDB。
回答嘉宾介绍:孙朝晖,飞信互联网产品首席架构师。负责飞信SNS业务相关产品,空间、开放平台的总体架构设计与飞信
开发团队技术社区建设。2010年加入北京新媒传信科技有限公司。曾历任微软(中国)高级顾问、高级项目经理。