分布式架构下的数据应用场景远比集中式架构复杂,会产生很多数据相关的问题。谈到数
据,首先就是要选择合适的分布式数据库。
分布式数据库大多采用数据多副本的方式,实现数据访问的高性能、多活和容灾。
目前主要有三种不同的分布式数据库解决方案。它们的主要差异是数据多副本的处理方式和数据库中间件。
它支持数据多副本、高可用。多采用 Paxos 协议,一次写入多数据副本,多数副本写入成
功即算成功。代表产品是 OceanBase 和高斯数据库。
它是集中式数据库与数据库中间件结合的方案,通过数据库中间件实现数据路由和全局数据管理。数据库中间件和数据库独立部署,采用数据库自身的同步机制实现主副本数据的一致性。
集中式数据库主要有 MySQL 和 PostgreSQL 数据库,基于这两种数据库衍生出了很
多的解决方案,比如开源数据库中间件 MyCat+MySQL 方案,TBase(基于PostgreSQL,但做了比较大的封装和改动)等方案。
它是一种轻量级的数据库中间件方案,分库类库实际上是一个基础 JAR 包,与应用软件部署在一起,实现数据路由和数据归集。它适合比较简单的读写交易场景,在强一致性和聚合分析查询方面相对较弱。典型分库基础组件有 ShardingSphere。
小结:这三种方案实施成本不一样,业务支持能力差异也比较大。一体化分布式数据库主要
由互联网大厂开发,具有超强的数据处理能力,大多需要云计算底座,实施成本和技术能力
要求比较高。
集中式数据库 + 数据库中间件方案,实施成本和技术能力要求适中,可满足中大型企业业务要求。第三种分库类库的方案可处理简单的业务场景,成本和技能要求相对较低。在选择数据库的时候,我们要考虑自身能力、成本以及业务需要,从而选择合适的方案。
选择了分布式数据库,第二步就要考虑数据分库,这时分库主键的设计就很关键了。
与客户接触的关键业务,我建议你以客户 ID 作为分库主键。这样可以确保同一个客户的数据分布在同一个数据单元内,避免出现跨数据单元的频繁数据访问。跨数据中心的频繁服务
调用或跨数据单元的查询,会对系统性能造成致命的影响。
将客户的所有数据放在同一个数据单元,对客户来说也更容易提供客户一致性服务。而对企
业来说,“以客户为中心”的业务能力,首先就要做到数据上的“以客户为中心”。
当然,你也可以根据业务需要用其它的业务属性作为分库主键,比如机构、用户等。
在微服务架构中,数据被进一步分割。为了实现数据的整合,数据库之间批量数据同步与复制是必不可少的。数据同步与复制主要用于数据库之间的数据同步,实现业务数据迁移、数据备份、不同渠道核心业务数据向数据平台或数据中台的数据复制、以及不同主题数据的整合等。
传统的数据传输方式有 ETL 工具和定时提数程序,但数据在时效性方面存在短板。分布式架构一般采用基于数据库逻辑日志增量数据捕获(CDC)技术,它可以实现准实时的数据
复制和传输,实现数据处理与应用逻辑解耦,使用起来更加简单便捷。如监听数据库binlog进行实时同步。
现在主流的 PostgreSQL 和 MySQL 数据库外围,有很多数据库日志捕获技术组件。CDC也可以用在领域事件驱动设计中,作为领域事件增量数据的获取技术。
跨库关联查询是分布式数据库的一个短板,会影响查询性能。在领域建模时,很多实体会分散到不同的微服务中,但很多时候会因为业务需求,它们之间需要关联查询。关联查询的业务场景包括两类:第一类是基于某一维度或某一主题域的数据查询,比如基于客户全业务视图的数据查询,这种查询会跨多个业务线的微服务;第二类是表与表之间的关联查询,比如机构表与业务表的联表查询,但机构表和业务表分散在不同的微服务。
如何解决这两类关联查询呢?
对于第一类场景,由于数据分散在不同微服务里,我们无法跨多个微服务来统计这些数据。
你可以建立面向主题的分布式数据库,它的数据来源于不同业务的微服务。采用数据库日志
捕获技术,从各业务端微服务将数据准实时汇集到主题数据库。在数据汇集时,提前做好数
据关联(如将多表数据合并为一个宽表)或者建立数据模型。面向主题数据库建设查询微服
务。这样一次查询你就可以获取客户所有维度的业务数据了。你还可以根据主题或场景设计
合适的分库主键,提高查询效率。
对于第二类场景,对于不在同一个数据库的表与表之间的关联查询场景,你可以采用小表广
播,在业务库中增加一张冗余的代码副表。当主表数据发生变化时,你可以通过消息发布和
订阅的领域事件驱动模式,异步刷新所有副表数据。这样既可以解决表与表的关联查询,还
可以提高数据的查询效率。
分布式微服务架构虽然提升了应用弹性和高可用能力,但原来集中的数据会随着微服务拆分
而形成很多数据孤岛,增加数据集成和企业级数据使用的难度。你可以通过数据中台来实现
数据融合,解决分布式架构下的数据应用和集成问题。
你可以分三步来建设数据中台。
第一,按照统一数据标准,完成不同微服务和渠道业务数据的汇集和存储,解决数据孤岛和
初级数据共享的问题。
第二,建立主题数据模型,按照不同主题和场景对数据进行加工处理,建立面向不同主题的
数据视图,比如客户统一视图、代理人视图和渠道视图等。
第三,建立业务需求驱动的数据体系,支持业务和商业模式创新。
数据中台不仅限于分析场景,也适用于交易型场景。你可以建立在数据仓库和数据平台上,
将数据平台化之后提供给前台业务使用,为交易场景提供支持。