花了三天,终于搞懂了GBase 8a的nodedatamap是个啥
先说说背景。
我是小小IT人员一枚,数据库用的最多的是MySQL。年前有个前同事跳槽了,新公司做政企项目,用的数据库是GBase。他跟我聊天的时候说,这东西他们团队没人熟,全是边学边干,踩了不少坑。
我当时确实没听过GBase。但这事让我觉得,自己技术面是不是窄了点?国产数据库现在好像挺火的,万一以后找工作问到呢?
所以年后我开始抽空自学。目标也不高,不求多精通,但至少知道是个啥,能跟人聊几句。
我选的是GBase 8a,因为它是分析型的MPP数据库。
我工作中没碰过数仓,但自己一直想玩玩大数据。网上有公开的数据集,几亿条那种,MySQL根本跑不动。我想着如果能把GBase 8a搭起来,导入数据跑个查询,应该挺有意思。
然后就开始啃文档。
说实话,官方文档写得不算差,但有些地方确实绕。我最卡壳的一个概念叫nodedatamap。
文档里写的是:“nodedatamap是数据分布路由表,执行initnodedatamap进行初始化。”
我看完就一个感觉:每个字都认识,连起来不知道在说什么。
没办法,只能换路子。
先去GBase社区翻帖子。翻了得有几十条吧,有个回复帮了大忙。那个人说:你把nodedatamap理解成一个固定的地址本,里面有65536个条目,每个条目写明了“这个hash值的数据去哪个节点”。这个地址本一旦生成,就不会自己变。
然后又搜到一篇博客,博主打了个比方:nodedatamap就像一张火车时刻表,告诉你每趟车停哪个站台。如果你改了站台(比如加了新节点),就得印新时刻表,然后把车都调过去(这就是rebalance)。
这两个解释放一起,我基本就懂了。
光看不行,我得自己试试。
在自己电脑上装了个虚拟机,搭了个单机版的GBase 8a(其实就是伪分布)。照着文档一步步走:
# 创建distribution
gcadmin distribution gcChangeInfo.xml p 1 d 1
# 登录数据库执行
initnodedatamap;
然后查了一下系统表:
SELECT * FROM gclusterdb.nodedatamap LIMIT 10;
看到输出的那一瞬间,确实有点小爽。理论到实践,通了。
后来我又故意搞了个骚操作:先建表插数据,然后用gcadmin加了一个虚拟节点,再重新initnodedatamap,但不做rebalance。再去查数据,性能直接掉了一大截。这个现象完美验证了我之前的理解——路由表变了,数据没搬,查询就跨节点了。
总结一下我的理解,给同样刚接触的人参考:
GBase 8a用nodedatamap来记录“数据应该在哪”,一共65536个槽位,固定死的
initnodedatamap就是生成这个映射表,只执行一次(除非你改集群配置)
如果你加了节点或者删了节点,需要重新生成distribution,然后执行rebalance搬数据
不能回滚。错了就重新来一遍,没有undo命令
最后说点感想。
学新技术就是这样,刚开始看文档肯定懵。尤其是MPP这种思维模式和单机数据库不太一样的东西。我的经验是:别硬啃,去社区翻帖子,找别人用大白话写的解释,然后再回头看文档。
这几个月我陆续也看了其他几款国产数据库,GBase给我的感觉是比较“实在”的——案例多,文档算全的,社区也有人回。虽然我公司暂时用不上,但我觉得花时间学这个不亏。
希望这篇文章对跟我一样自学的朋友有点帮助。
评论
热门帖子
- 12025-12-01浏览数:182759
- 22023-05-09浏览数:25054
- 42023-09-25浏览数:18521
- 52020-05-11浏览数:17526