美文网首页IT@程序员猿媛RadonDBGo
学习RadonDB源码(六)

学习RadonDB源码(六)

作者: 有财君 | 来源:发表于2019-05-20 21:09 被阅读9次

1. 停下来

这不意味着我不再学习研究RadonDB了,相反,我是很喜欢这样一个基于MySQL的分布式数据库的。

我的意思是写了那么多源码分析难免会让自己陷入一个又一个的坑里,最后变成了“不识庐山真面目,只缘身在此山中”,一叶障目,毕竟难见泰山。

2. RadonDB的一些原理

这里的图我都是盗来的,来自吴炳锡老师的主页。

整体结构

从整体结构上来看,我最近分析的部分囿于最上面的Distributed SQL Nodes,其实就是模仿的mysqld。

分库规则

其实想做分布式数据库,一定要实现Raft协议,这已经是一个共识了。那么如何去实现Raft呢?其实无非是数据多副本,每个副本分散在一个节点上,当分片集群中有一个节点挂掉,Raft会自动进行选主操作,保证了服务的可用性,同时也保证了数据不丢失。

咱们分开来说,假定现在只有三台MySQL去Raft集群,应该如何?其实我们这个时候可以参考MongoDB的副本集结构。一份数据,三个节点同时持有,就有了三个副本——当然MongoDB有一个不持有数据的仲裁节点——这三个节点组成了一个Raft Group。

现在搞得复杂一点,参考一下MongoDB的Sharding Cluster,此时集群里有了大于等于两个副本集,也就是说数据可以开始分片了。那么这个时候每个副本集持有的数据就是原来数据/n了。其实此时的Raft还是每个副本集自己玩自己的,只是持有的数据量降低了。

RadonDB是怎么做的,当我新建一张表,并指定分片算法是hash的时候,RadonDB会把我的表分成4096个slots,然后分片去均分这4096个slots。

看看代码:

// HashRange tuple.
// [Start, End)
type HashRange struct {
    Start int
    End   int
}

根据这段代码是可以知道slot的切分规则的,就是按照片键增序分开的,左闭右开区间。

4096在代码中的config.go中有写明,是一个default值,但是图中的子表配置成32我还没发现在哪里。

看到这里我们就可以知道了下面几点:

  • 每一个副本集都用Raft协议来实现高可用,高可靠;
  • 指定了片键的表会被默认分为4096个slots,均匀的分布在每个分片上;
  • 一个分片持有若干个slot,slot的开始和结束区间是连续的,没有空洞。

这个时候也不难理解insert_plan中的range是为什么了:

        tuple := xcontext.QueryTuple{
            Query:   buf.String(),
            Backend: v.backend,
            Range:   v.rangi,
        }

3. 小结

我写的这一系列我相信很不完美,也应该有不少错误,不过我想我每隔一段时间停下来回头看看,站在另外的角度上看看,应该会受益良多。

其实我还是想说那句话,学而不思则罔。

相关文章

  • 学习RadonDB源码(六)

    1. 停下来 这不意味着我不再学习研究RadonDB了,相反,我是很喜欢这样一个基于MySQL的分布式数据库的。 ...

  • 学习RadonDB源码(三)

    1. 所谓第四代语言 SQL是一种典型的第四代语言,即4GL,这种语言的突出特点是编写者不需要关注怎么做,只需要告...

  • 学习RadonDB源码(二)

    1. 为我新的一天没有放弃而喝彩 学习是一件很容易放弃的事情,因为就算是不学,我也能在现在的岗位上发光发热。可是人...

  • 学习RadonDB源码(四)

    1. 继续一下昨天的话题 昨天我学习了查询优化器的部分内容,其实主要是起了一个提纲挈领的作用,真的内容我还没有学习...

  • 学习RadonDB源码(一)

    1. 可能是开始也可能是结束 RadonDB是国内知名云服务提供商青云开源的一款产品,下面是一段来自官方的介绍: ...

  • 学习RadonDB源码(七)

    1. 准备收官 RadonDB作为一款优秀的分布式数据库产品,离不开这几大组件: 存储 计算 RadonDB的存储...

  • 学习RadonDB源码(五)

    1. 分布式数据库引入了不少新问题 移动互联没有兴起,3G没有开始之前,我们玩单机数据库玩的不亦乐乎,而且也玩的很...

  • 学习RadonDB源码(八)

    语法解析 我们DBA平时通过SQL和数据库进行交互。SQL是一门典型的第四代语言,只用说明我要什么,而不需要写出来...

  • Go语言之包初始化

    在之前的例子中提到过初始化的顺序问题和init函数: 学习RadonDB源码(一) 观察一下下面的两段代码: a....

  • Dubbo 服务调用 总结(八)

    笔记简述结合之前学习的两篇笔记 Dubbo 服务调用 源码学习(上)(六)和 Dubbo 服务调用 源码学习(下)...

网友评论

    本文标题:学习RadonDB源码(六)

    本文链接:https://www.haomeiwen.com/subject/tsvlzqtx.html