上篇文章转载了关于mysql数据库的垂直和水平拆分的相关内容,本篇文章再谈下关于应用集中化后的集中和分布相关策略问题,以及最近关于完全去IOE思路的一些思考和回顾。
现在有一个问题我暂时还没得到比较明确的一些验证,如对于当前x86的pc
server服务器好的配置完全可以达到200万TPMC,对于磁盘阵列可以挂接到20T甚至更高的存储容量。那么在这种x86架构下的服务器如果仍然采用linux+oracle数据库,是否可以达到和常规小型机和集中存储相当的数据库性能。如果采用linux+mysql数据库,又能够达到多少相当的性能水平。对于mysql单点,如果采用innoDB引擎,在上述的服务器和存储配置情况下能够达到多大的能力?还有就是如果采用mysql的读写分离集群,在读写比例8:2左右的情况下,又能够达到如何的一个性能水平。
对于上述点的思考,主要还是基于能够不拆分尽量不拆分,能够只选择一种拆分尽量不同时使用两种拆分,在集中化的大数据架构规划下,当同时引入两种场景的拆分的时候,整个数据架构异常复杂,同时对应用设计和开发的限制也相当多(包括分布式事务,跨库操作,sql语句)等各个方面。
我们在思考基于云架构下的集中化,但是在集中化后由于本身单点存在的性能瓶颈问题,对于数据节点通过分区和分库后又变化为一个分布式的问题。不能做到对分布节点完全透明情况,也不能做到对分布节点自动化和智能化管理的大量分布就是潜在的大灾难。这种分布没有体现出云的优势,反而引入了大量的问题,将去IOE极端化再次说明只适合与互联网下的大并发弱一致性要求下的业务场景,对于大型企业信息化架构不能全盘采纳。
在集中化后如果大量的进行不合理的分片和分库,可以说是原来未集中前的问题仍然存在,原来不存在的问题也不断的新增加和抛出来。不合理的分区分库还不是简单的对一致性能力的牺牲,更多的是大量分区分库直接导致对复杂业务快速处理的能力的牺牲。
在前面《对数据库架构的再思考》我曾经谈到了关于共享数据库的问题,从现在的分析来看,比较可行的方案仍然是大型应用垂直拆分,同时对于垂直拆分后中各模块需要跨多个模块的数据实时同步到共享的可读库,可读库实时提供共享数据服务。在这种模式下可以大大减轻垂直切分的数据库的读压力,也建设对于垂直切分数据库中表索引的建立和维护。这种读写分离强调的不是单个应用模块的读写分离,而是多个应用模块对共享数据CRUD操作的读写分离。在这种情况下可以看到共享数据库已经变成一个准实时的ODS库,提供准实时的数据读能力。那么在这种情况下可以看到对于跨垂直库多个模块的查询统计和报表功能来说,就是相当简单易实现的了。
对于跨应用模块共享的共享数据查询功能而言,能够采用UI界面集成方式的尽量采用UI界面集成方式,UI界面集成将是垂直应用拆分后对共享数据查询使用的一个极好的复用模式,这种模式大大的降低了底层数据交换,也降低了业务服务的调用,属于一种数据实时查询不落地形成多份拷贝的重要思路。
写库采用IOE方案,而读库迁移为Mysql集群可能是一种在集中化过程中的一种折衷合理方案。对于不存在大量并发写的场景建议都可以采用这种方案。在这种模式下对于写库基本可以不用做任何拆分,或者说可以按大的应用模块做2-3个的垂直拆分就完全满足需要。由于写库全集中,也不进行进一步水平拆分操作,将解决掉大量的应用开发难度和对分布式事务处理和投入。
前面有文章我曾经谈到过应用本身的类型,包括了以数据为核心的应用,也包括了以流程工单为核心的应用。对于以流程为核心的应用而言进行垂直拆分相当简单。而对数据为核心的应用,底层是一个偏厚的全局数据模型,要进行垂直切分就相当困难,但是由于垂直切分困难,你会发现垂直切分的结果很难真正的做到松耦合,这是一个不可回避的问题。
在进行垂直和水平切分后,如果切分的不合理我们看到,对于切分的单数据节点,除了需要满足本应用模块的数据能力提供外,由于切分不合理将需要超外部提供大量的数据服务能力,对于不合理的数据切分,单数据节点的性能压力往往并没有真正降低下来,这个问题一开始我们很容易忽略掉。最后,如果已经进行了数据垂直和水平切分后,单点再出现性能瓶颈的情况下还能有什么方法解决?
青春就应该这样绽放 游戏测试:三国时期谁是你最好的兄弟!! 你不得不信的星座秘密