实现一个分布式存储需要考虑如下几个问题:
- 存储引擎
- 负载均衡(包括如何扩容,缩容)
- 高可用
- 一致性
存储引擎:
tidb 底层存储的数据内容就是 key-value, 其实就是一个大的map,tidb 选择开源的 RocksDB
负载均衡:
因为面向的是海量数据,所以数据需要均衡的分布在不同的存储节点上, 通常就两种选择 hash (对key进行hash计算,根据hash结果分散在不同节点), range(对key 进行排序,按照顺序分钟多段,每段存在一个节点上) 两种, tidb 选择 range 方式。
选择 range 方式,主要是根据tidb业务场景选择的, 因为是 关系数据库,所以有大量连续数据场景, 所以其实是没得选择,只能选range。选range 带来的问题是热点数据的问题。
高可用,一致性:
分布式系统数据一定要高可用,也就是同一份数据要存储多份(每份数据都要存储在不同的节点上),这样就牵扯出来一致性问题,因为 tidb 的目标是强一致,所以一定要选择 raft,paxos 等强一致协议,tidb 选择的是 raft(采用开源etcd中的raft实现)
看起来很简单,其实原理就是这么简单。。。。