为提高数据的安全性与系统的可扩充性,可在两层模型的基础上考虑采用三层或多层设计模型,将数据库访问分布在一个或多个中间层。这种体系结构称为多层分布式系统。
分布式数据库访问层的特点
1、可伸缩。

这里是指水平可伸缩。事实上,这点更应该是整个系统要考虑的目标了,而非DAL,DAL要考虑的是怎么更好地支持。举例说,我们可以一个库一个服务,甚至可以是一个表一个服务,库、表拆分后,DAL应能路由查询、合并结果,而不是让应用程序去操心这些事。
2、高可用性。
我们认为出错失败是很正常的,一台机器倒下了,其它机器应继续保持系统正常运作。容错是很重要的一个要求。
系统规模大了以后,很容易出现“异构”的情况,如原有模块MySQL表引擎是MyISAM的,是不支持事务的,而新上的模块又采用了InnoDB表引擎,在这种情况下,DAL应能对原有模块进行优雅降级。即:一个系统支持多种数据库,来实现数据库层的迁移,升级等。
失败恢复也是要考虑的,失败后,需要把失败前驻留在内存中的消息找回来。
另外,DAL本身也在快速的迭代当中,升级是很经常的事,应能进行在线热升级(不重启原有服务)。
3、良好的性能。
对于根据id来取进行的查询,在缓存命中的情况下,应该达到和Memcached不相上下的读取速度。在缓存不命中的情况下,则应该充分利用分库分表和并行计算的优势,最大化地提高查询的效率。对于修改型查询,挂在上面的监听器,不应该影响性能。
4、易于编程。
需要设计一套简单好用的API便于应用程序的开发。API必须是自完备的应用开发者不需要太费力就能记住的。应用开发人员不再关心分库分表问题,不再关心缓存问题,特别是缓存清除问题。甚至不再关心后端的数据库是MySQL,还是Oracle,或者是其它。
5、可定制、可扩展、可维护的架构设计。
像连接池组件、缓存组件、查询分析组件、消息队列组件、通讯协议等等不应该写死,应设计成可方便定制的。还应该提供足够的钩子用于扩展。只有这样,DAL 的架构才是灵活的、拥抱变化的。简单说,我们定的是机制,提供的是策略,机制是软件目标和宗旨的体现,一般是不能轻易改变的,而策略则应当是能比较简单地进行切换的。
分布式系统数据应用
传统银行使用的高端硬件资源和商业数据库,单机的性能和稳定性肯定占有绝对的优势。互联网分布式架构,则需要从架构设计上做文章,提高系统整体的并发处理能力和容灾能力,其中容灾能力又主要有两个指标:
RTO,Recovery Time Objective,恢复时间目标。表示能容忍的从故障发生到系统恢复正常运转的时间,这个时间越短,容灾要求越高。
RPO,Recovery Point Objective,数据恢复点目标。表示能容忍故障造成过去多长时间的数据丢失,RPO 为 0 表示不允许数据丢失。
分布式领域 CAP 理论告诉我们,一致性、可用性、分区容忍性三者无法同时满足。我们不要奢望寻找能解决所有问题的万能方案,而应该根据不同的场景作出取舍。虽然业务场景五花八门,但是根据实际经验,往往可以归到有限的几种模式中,处理策略也是相对固定的。
我们抽象一个简化的支付系统模型来帮助理解,为了叙述方便,不一定跟支付宝的实际业务情况完全一致。它采用 SOA 架构,主要划分了交易、账务、用户、运营支撑这几个子系统,各自有各自的数据库。另外还有一个全局的配置库,存放一些会被各处用到的配置数据。
这几个子系统涵盖了几种常见的模式,先简要介绍它们的主要业务:
账务:金融/支付系统中最核心的业务,简化后姑且认为只保存每个账户的余额,主要操作是增减余额。它的特点是要求数据强一致,每一次对余额的增减必须基于一个绝对正确的当前值,否则就会造成资损。
交易:负责记录每笔交易的状态和上下文。在电商系统中,它可能是商品订单;在银行系统中可能是转账流水。交易类的数据有生命周期,可能有创建、付款、发货、确认收货、退款等状态变迁。这些都不重要,重要的是它的业务特点:每一笔交易的创建是独立的,不需要依赖其他交易的数据;推进一笔交易状态的时候,要求这条数据是强一致的,但跟其他交易数据无关。
用户:维护用户的用户名、密码、邮箱、手机等非账务信息,提供注册、登录、查询业务。在执行核心业务的时候,有多处需要读用户的基本信息,关键业务链路对其有读强依赖。
运营支撑:供内部工作人员用的后台系统,包括但不限于工作流、客服等功能。
配置数据:这里是个宽泛的说法,笼统地表示各类变更不频繁,但是在主业务流程中需要频繁读取的数据,例如交易类目、机构代码、汇率。它们实际可能是散在各个业务系统中的,为了方便描述,单独用一个配置数据库来表示。
把数据库按业务模块进行拆分,是典型的垂直扩展思路,突破了单库的能力限制,使得系统可以支撑更多的业务量。当然这也引入了分布式事务的问题,另有专题介绍暂且不表。拆分开后,就方便不同的业务采取不同的架构设计了。
相信随着技术的发展,分布式系统将会在越来越多的领域得到进一步的应用,从而提高服务器处理任务的能力,进一步提高分布式作业系统的性能。