人大金仓数据库KingbaseES RAC资源同步

金仓数据库KingbaseES RAC资源同步

关键字:

RAC、resource distribution、资源同步、人大金仓

RAC资源同步模块概要介绍

RAC是Kingbase ES的一种共享存储集群,RAC不同于分布式集群或者主备集群,RAC集群可以在逻辑上认为是一台性能更好的机器,原因就在于整个集群共享同一块存储阵列、并且在逻辑上实现了集群各个节点之前内存的融合,我们称这种内存融合的技术为CacheFusion,因此对于用户来说使用RAC与使用单机是没有什么区别的,由于CacheFusion的存在,RAC在逻辑上和单机没什么不同。现在我们来考虑一个问题,在RAC中一个backend希望拿一把锁,那么这把锁怎么拿,找谁拿?假设一个四节点RAC,这把锁在这四个节点中哪个节点的共享内存中呢,这就是RAC的资源同步需要解决的问题。RAC的资源同步模块主要负责在集群的所有节点中同步共享的资源。

资源的分布方式

在RAC中大体上可以分成两种类型的资源,一种是本地资源,一种是全局资源。

本地资源就是指该资源放在本地节点中且不会被其它节点所访问,当节点想要访问本地资源时只需要从共享内存中拿即可,LWLock、XID、CLOG、XLOG,这些都是本地资源,比如节点一的backend希望拿到一个事务号,那么直接从本地共享内存中读即可,不需要同其它节点做交互。这里值得说明的是XLOG,在我们的RAC中XLOG是一类本地资源,每个节点只需要写自己本节点的XLOG即可,这时由于写XLOG的操作是相当频繁的,如果让远程节点去写XLOG这要做大量的RPC因此这种情况对于性能是一种极大的考验,因此我们把XLOG拆分放在本地,每个节点只负责自己的XLOG,而在集群做IR时其它节点会借助特殊的方式去读Crash掉的节点的XLOG进行REDO。

全局资源就是指会被远程访问的资源,这里有一个非常经典的全局资源就是常规锁,

同一个locktag拿到的锁在整个集群中应当是唯一的,因此现在就涉及到了一个问题如何保证常规锁的全局唯一性?在我们的RAC中给出了一个非常合理的方案,就是对全局资源做划分,每个节点都需要管理一部分的全局资源,现在我们有了一个locktag,针对这个locktag我们的RAC会使用一种特殊的算法获得这把锁的属主,在得知属主信息后,希望拿这把锁的节点会与资源属主节点做一次通信,这次通信会将锁资源从属主节点的共享内存中拿出来交给请求节点,同时属主节点也需要对整个集群的请求信息做记录,这就是全局资源的预分配管理方式,同常规锁异常采取这种方式的资源还有oid和CacheFusionLock,oid的属主永远是集群节点号最小的节点,而CacheFusionLock的分配方式与常规锁相同。

另外还有一部分资源采用了预先拆分的方式,比如XLOG被拆分成了四份每个节点都有一份自己的XLOG同样地XID也是采取的这种方式,xid是一个32位的数字,最高位由00开始的事务号由一节点管理,最高位由01开始的事务号由二节点管理,最高位由10开始的事务号由三节点管理,最高位由11开始的事务号由4节点管理,这样每个节点拿到的事务号就都不相同并且可以保障全局事务号唯一。

还有一部分资源采用广播方式同步,即在特定的时机发广播同步该资源的修改,globalXmin就是这种资源。

一致性哈希算法

确定GlobalLock以及CacheFusionLock的属主的算法就是一致性哈希算法,对于该算法读者不需要过于深入地了解,读者只需要知道一致性哈希算法存在一个哈希环,每个节点会均匀地分布在哈希环上对应若干个哈希值,当节点针对tag做哈希运算时,会根据该值沿着哈希环做顺时针查找,遇到的第一个节点就是它的属主节点。

file 更多信息,参见https://help.kingbase.com.cn/v8/index.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值