微服务架构的应用具有良好的扩展性,所以看起来微服务不选择数据库,微服务使用哪个数据库的问题也不是什么大问题。这是真的吗?或许对于一些研发能力强的团队来说,微服务选择数据库是非常容易的,因为无论选择的数据库存在什么缺陷,他们都有办法通过应用优化来解决。而对于一些普通的研发团队来说,有时候真的想不通。很多公司在刚开始转向微服务架构的时候也交了很多学费。很多企业的微服务架构改造是:“开发爽一会,运维两滴泪”。事实上,很多设计和开发的缺陷最终都是留给运维去想办法填坑的。与传统的中心化架构不同,微服务的坑要运维更难填。如果一个微服务应用将一个大数据库拆分成多个小域数据库,那么一个重要的原则就是始终保证这些数据库都是小数据库,并且它们的数据量增长缓慢。如果增长一点点,历史数据必须能够及时归档。这么小的数据库在长时间运行的时候可以保证更好的性能,不会给运维人员带来太大的负担。从另一个角度来看,微服务的数据应该存储在一个合适的数据库中,而不是在没有掌握数据访问特点的情况下,随意选择一个数据库。目前可供选择的数据库种类太多。以阿里云等云厂商为例,他们为微服务开发者提供了令人眼花缭乱的选择。针对不同的应用场景选择不同的数据库产品,可以让项目未来的发展道路更加顺畅。数据库产品那么多,我们应该如何选择呢?虽然微应用弱化了数据库的很多特性,大大减少了跨服务的数据融合计算,但是对于不同类型的微服务,我们在选择数据库产品时还是需要非常谨慎。我们如何为我们的微服务选择合适的数据库产品?这需要从几个方面考虑。首先要考虑的是如何在微服务中访问数据。选择数据库最重要的因素是查询的模式是什么样的。如果只需要存储某些键值,那么KV数据库可能是更好的选择,比如可以选择Redis;如果你的应用基本上是基于主键查询,添加一些其他与主键关联的字段,那么一些宽列的数据库可能非常适合你的微服务,比如Cassandra;如果你的应用主要是访问单表数据,但是检索条件可能比较丰富,模式不是很固定,那么使用文档型数据库可能会更好,比如MongoDB、CouchDB等可能更适合你;如果你的应用经常有一些多表的关系访问,那么关系型数据库,比如PostgreSQL、MySQLl等可能更适合;如果你的应用主要是做基于主键的模糊查询,全文检索,那么ES可能比其他数据库好。如果一个场景有多个适合的数据库,可以根据数据一致性等要求进一步筛选。比如MySQL和MongoDB更适合你的场景,那么如果需要强一致性,倾向于选择MySQL,否则可以考虑MongoDB。事实上,在你的应用系统中,不同的微服务可以选择不同类型的数据库来最大化数据访问。比如你有很多视频要存储,那么选择S3对象存储来存储视频肯定比存储在关系型数据库的LOB字段更好。在关系型数据库中,只需要保存对象的ID。在一个应用系统中使用多个数据库是不好的。数据库种类过多会导致系统架构臃肿,运维成本大大增加。因此,适当地选择几个数据库是一个更好的设计方案。在这种情况下,一些多模数据库就有了优势。比如系统中以RDBMS为主,存储一些JSON数据,少量应用使用一些时序数据和一些GIS数据,那么选择PostgreSQL可以满足这些综合需求。其实选择微服务的数据库产品不仅要考虑这些因素,还要考虑开发团队的经验、运维能力、成本等因素。由于微服务架构的特点,我们会通过领域建模将一个大系统的数据拆分成多个不同的子领域。因此需要考虑高并发的支持能力、性能以及大数据量下的复杂SQL性能。因素相对较少。但是,对于一些稍微极端一点的应用场景,我们可能需要考虑的更复杂一些。还有一点就是聚合计算的问题。任何应用都存在聚合计算的问题,尤其是一些实时的聚合计算需求,也是我们必须要满足的。因此,领域建模拆分数据后,我们还需要将数据汇集起来进行计算。虽然我们也可以使用ShardingSphere等数据库网关来实现一定的聚合计算,但是在大数据量的分布式环境下进行聚合计算往往会遇到一些性能问题。解决这类问题的方法不外乎两种。一是在微服务层面准实时汇总明细数据,不需要对明细数据进行聚合计算。另一种方法是使用ODS或数据中心作为聚合计算平台,从而减轻微服务数据层的负担。一个大数据库拆分成很多小数据库,会不会给运维带来压力?答案是肯定的,所以微服务架构师应该为这些小型数据库做好架构设计,包括高可用、容灾、数据归档、数据自动清洗等。这些任务的运维人员可以参与设计,但必须在应用中实现自动化管理。不然一堆一堆的小库上来,平时运维人员去监控巡查的话,平时无事可做,浪费时间。一旦出现问题,处理起来并不容易。如果你的应用是托管在公有云上,并且你的各个库的容量和负载都可以很好的控制,那么从公有云购买RDS还是比较容易的,但是公有云的特点是价格便宜开始吧,一旦你的图书馆变大,需要升级服务,那么价格绝对不是简单的乘以某个倍数的问题。在公有云上,大型主机和数据库服务的价格会突飞猛进,应用架构师应该高度重视这一点。私有云对成本的敏感度相对较低,使用私有云RDS服务可以大大减轻运维压力。对此,微服务架构师首先要与云平台部门进行沟通。如果你不想管理碎片化的小型数据库(无论是RDS还是运行在容器中的数据库),那么具有多租户和多模式存储能力的分布式数据库可能是你最喜欢的选择。运维一个大型云数据库可能比运维几十个小数据库更合你的心意。这个选择也很合适,只要符合贵公司整体的IT政策和IT基础架构,也是不错的选择。
