从开始设计Cantian多主引擎这个项目之初,就一直有人在问我一个问题,基于Cantian的多写数据库集群,技术上可以做到多大,规模是否受限?
在元旦前的武汉,开放原子开发者大会上,做完关于Cantian的三层解耦及向量检索的报告之后,主持人代表观众问了我一个问题,就是Cantian是否有考虑过支持分布式数据库或者云化部署的模式。
这是个很有意思的话题,所以借元旦后的第一个周末,写一点我的看法。
参天借助一个插件嵌入MySQL实例,然后在存储加速层构建了一个全局的Cache(如下图)。这使得多个MySQL实例之间可以对同一个表进行多读多写操作,实现了
类似Oracle RAC的能力。
集群中的每个页面,都可以视为一个资源,在执行事务的时候,事务需要的资源(页面)都要被协商调度到事务执行节点(因此Cantian系统中不会出现“分布式事务”)。
Requester(R)是资源请求方。Master(M)是资源的登记服务。①请求方需要向Master询问及索取资源。如无人持有资源,Master可以告知requester,从存储读页面并成为Owner(O)。如果已经有了Owner,②Master会通知其把资源转移到Requester。③完成转移之后,④Requester变成新的Owner并通知Master更新。
所以在事务跨节点执行期间,其实涉及的主要就是这三个角色通信,他们最多分布在3个不同的实例上。
事实上,只要两个不同实例执行的事务涉及的资源不同,冲突很少,就不会有资源来回迁移的问题。而且每个实例都会把自己需要的资源(Owner代表的Page)放到本地缓存,与事务之间形成本地化,执行效率是提高的。这也是为什么Cantian+MySQL实测的TPC-C结果,2节点的线性度比单节点可以提升1.6倍以上。
随着节点进一步增多,虽然集群规模在变大,但是上述三个角色构成的“铁三角”没有变化,因此对于每个事务而言,参与的实例和网络交互没什么变化,只要没有很多资源访问冲突。性能的线性度不会随着集群规模变大受影响。
可能有人会问访问冲突很少这个假设是否合理。其实不管哪种技术架构,甚至不管是否在数据库领域,资源的耦合永远都是横向扩展的敌人。可以横向几千节点的分布式架构,一个基本假设也是节点间/shard间没有太多的关联与资源耦合才能成立。
所以当节点真的很多的时候,其实资源合理分配可能像下面的样子,每个实例执行各自的事务,事务之间资源冲突较少,各自缓存各自的页面。所有数据都在一套共享存储中。
到了这里,如果我们再回顾一下《
分布式数据库的多主,有哪几种方式?》中的这张图就会发现,既然我们有了访问冲突不大的这种假设,那么不论是Cantian的多主架构,还是分布式Sharding架构,他们的运行时资源布局似乎呈现了相似的模样,即每个实例都在管理自己需要的资源。
上面的分布式数据库一个Shard的实例故障时,是通过主从倒换的方式完成故障接管修复的,其中一个从节点需要升主回放日志。
而Cantian多主则是基于共享缓存和集群管理,在故障时直接有另外一个主实例提供服务即可,没有主从倒换的过程,只有重新路由的过程,能够快速恢复。
上面的分布式数据库,其Shard分配策略是固定不变的。所以如果出现了跨Shard操作,就必须用分布式事务解决。
Cantian的分配策略,是基于RMO三个角色动态决定的,随着业务访问的变化,Cantian会自动去调整Owner的布局分配来让事务的资源局部性最好,不会产生分布式事务。
当然了,目前一些原生分布式数据库,对于上面提到的故障切换接管会有更优雅一些的处理方式。
继而,我们还可以考虑做进一步的资源局部性优化,比如实例1/2与实例3/4的操作来自不同业务部门,他们之间没有互访需求这时我们就可以把RMO的角色分配(主要是M的分配)进一步局部化,让实例1/2相关RMO交互尽量局限在左侧虚框,同样3/4的RMO交互也尽量局限在右侧虚框。两个虚框整体还是一个集群,数据依然共享一套存储。
至此我们发现,如果把虚框映射到分布式数据库的“Shard”概念上去,那么上面描述的其实就是一个可以横向扩展且支持多读多写(RAC)和缓存级同步快速倒换的架构了。
在Shard(姑且先借用这个词这么叫吧)内,多个实例之间是多主基于RMO调度的共享缓存,在Shard间资源访问冲突极低,Master不跨Shard分配。
所以,当时主持人的问题,我回答的是Cantian的架构本身,和分布式之间是完全可以深度结合起来的。
可能有小伙伴会指出,这个是不是和Oracle的Sharding很像。确实,只要把问题说透了,阳光底下确实没啥新鲜事。
所以Cantian多主架构,其实可以很容易地扩展成大规模集群。对此,你怎么看。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70042829/viewspace-3062413/
,如需转载,请注明出处,否则将追究法律责任。