1、引子
今天看到一篇技术文章,讲到从mysql迁移到tidb,为避免热点问题,将auto_increment自增ID主键改变为预分片RowID的技巧,从而能充分利用分布式资源的优势。
这表面看是一个应对小问题的小技巧,但如果深入探讨,却可以引发从单点迁移到分布式,包括数据与应用迁移的方法论思考。
2、平移与重构的思考
随着数字化转型的不断深入,在线数据量需求的增加,以及场景化带来的业务敏态进化趋势,近年来,从单点技术体系迁移到分布式技术体系,已经形成不可逆转的热潮。这其中涉及到很多具体的技术问题,包括迁移过程的稳定性、一致性、连续性等等,但其中不可避免的核心工作就是将数据与应用“搬到”分布式架构中来。而为了追求迁移的效率,最方便有效的方法就是尽量实现“平移”。
在实践中,以这套思路指导工作的组织不在少数,即投入一定精力做“平移”工具、尽量选择与传统技术工具“兼容”的产品等等,以达到很快就能在分布式架构上运行业务的目标。然而,从上面的小技巧入手思考,可以提出一个问题:这样的策略对吗?
类似上面自增ID的需求,在整个迁移过程中,无疑会有很多很多。整体采用“平移”的策略,再加上一大堆技巧的总结,似乎也算一种可行的方案。但应该看到,前述对数据库表主键ID进行资源分散的适配技巧,实际上可以看作是表结构的调整,进一步讲,是模型的改变。这就引发本文的思考:从单点到分布式中的迁移,是否应该以整体模型重构为根本策略,而不是大“平移”思路下的技巧定位?
为了加深理解,加强印象,再举一个例子:在NewSQL分布式数据库流行之前,从传统数据库向大数据平台迁移非常流行,直到今天也仍然有很多这样的需求,目的很明确,也是成本、扩展性与效率的考量。在这种工程中,也同样存在传统关系型数据库的数据迁移问题。很自然,为了方便与工作量,大数据平台都尽力提供“兼容”的功能,以图迁移工作能尽量平移。但这却引发了很多问题,即:从关系数据库的表,迁移到大数据平台,把原来的表结构或者模型完全不变,或者尽量少变,实现“平移”,会使大数据平台的内在优势在很大程度上难以发挥。大数据平台是通过牺牲了一致性、模型范式的严格性以及低冗余性的要求换来性能提升的,传统关系数据库中根据范式模型、主外键模型等的设计理念,在大数据平台并不适用:一个简单的“学生--选课”关系,在标准的关系模型中,需要三张表构建ER图,即学生表、课程表及关联表,然后通过表关联进行数据操作;而在大数据平台中,可能需要将这三张表合成一张表(或者在如文档数据库MongoDB中采用类JSON层次模型),这张表不仅逻辑上将所有的信息都组织在一起,物理存储方式也整体改变,不考虑冗余,不考虑范式,不考虑schema的约束,完全关注在扩展与效率上,这才符合它的根本设计理念。也就是说,在向大数据平台迁移的工程中,大多数采用“平移”策略的案例都不应该算是成功的,从根本没有理解到或者结合到大数据平台的本质优势。正确的做法显然应该是:一开始就从整体策略上、根本上进行模型重构,即使刚开始那样看上去似乎多花了一点时间。
至此,相信大家的理解要比前面”自增ID修改”的简单例子深入一些了。同样,新兴的NewSQL分布式数据库,虽然确实比大数据平台面向传统关系库友好了很多,但其设计的根本理念也是不同的;以微服务化为核心的分布式应用也是一样。这就自然要求,在单点向分布式迁移时,应该最起始,就从根本上彻彻底底地尊从分布式设计的理念,进行整体模型重构,而不是以“平移”为策略。只有这样,才能真正的使数据、使应用与分布式有机融合,而不是貌合神离。
有人会说,那我先采用“平移”策略,尽快上线,然后再改造,行吗?这里的观点是不建议。因为这样的话,很多问题都会被隐藏,永远潜伏起来,甚至会包括绝大多数关键的问题;并且在后期可能会遭遇更大的工作量,甚至导致在机制上无法实施。只有一开始,就以全面“重构”为指导策略,才能驱动人们从根本上结合分布式的技术理念对原有的系统进行重新构造与设计。
引深一点,同样,云原生的迁移,也是一样的道理。
正如一句话所说:“普通人改变结果,优秀的人改变原因,而顶级优秀的人改变模型”。
3、一点哲学启蒙
到这里,观点应该是比较明确了,但本文还想再进一步引深,做一点从单点到分布式的哲学思考。
分布式架构是让很多单点能在同一时间并行干一件事,其本质是资源利用率的提高。如果一个单点系统与一个分布式系统具有同样水平的资源,如计算与存储,那么,理论上讲,若单点系统对资源的利用率能与分布式系统一样,两者的效能也应该是一样的,分布式并没有优势。但是,分布式系统却可以让用户自行灵活地增减其构成细胞,而单点系统则只能增减一个整体,很显然,从弹性的角度,只能选分布式。
那么,如果把一堆MySQL堆起来,算不算分布式呢?严格来讲,不算。因为这一堆MySQL,对外没有整体性,从而大大增加了问题的复杂度。分布式系统需要对外有整体性,也就是说,对用户使用而言,它与通常理解的单点应该没有分别。
这样看,大家所说的分布式系统应该是指:对外开放其组成细胞的单体系统。从最终目的来讲,其给用户提供的其实是类似“单点”,而不是分布式,但却是结构开放的复杂系统。要强调的是,这里的“开放”,包括细胞的开放,结构建构的开放,而不只是源码。
因此,本文认为,分布式系统的技术本质,在很大程度上是开放性,而分布式系统能比单点系统更有活力、更先进,可能也有架构的优势,也有功能设计的优势,但其最根本的优势是开放。分布式的路,即代表了技术开放的路,预示着未来的技术发展方向,必然是越来越走向开放,这其中也包括开源。
因而由此带来一点哲学启蒙:或许,开放是一切系统持续发展的根本前提与本质特征。