前言(未完成)
整体设计
- 所有计算机科学里面的问题都可以把它不停地抽象,抽象到另外一个层次上去解决。
- 我们在做技术选型的时候,如果在有很大自由度的前提下,怎么去控制发挥欲望和膨胀的野心?你的敌人并不是预算,而是复杂度。 这一点跟 《从0开始学架构》笔记 异曲同工。
- 你怎么控制每一层的复杂度是非常重要的,特别是对于一个架构师来说,所有的工作都是在去规避复杂度,提升开发效率和稳定性。
- 我仔细看过 Etcd 的源码,每个状态的切换都抽象成接口,我们测试是可以脱离整个网络、脱离整个 IO、脱离整个硬件的环境去构建的。我觉得这个思路非常赞
- 对架构师而言一个很重要的工作就是查看系统中有哪些 block 的点,挨个解决掉这些问题。所有的东西,只要有 Metrices,能被监控,这个东西就能被解决。
十问 TiDB :关于架构设计的一些思考这个世界有很多人,感觉大于思想,疑问多于答案。
存储设计
- 单机存储使用了rocksdb,本质上还是kv 存储
存储层:rocksdb,同时解决可靠性(副本、及副本一致性)、事务等 SQL 层
数据分片
-
分片的考量
- 如何划分
- 数据规模变大时,是否可以通过新增节点来动态适应
- 当某个节点故障的时候,能否将该节点上的任务均衡的分摊到其他节点
- 对于可修改的数据(比如数据库数据),如果某节点数据量变大,能否以及如何将部分数据迁移到其他负载较小的节点,及达到动态均衡的效果?
- 元数据的管理(即数据与物理节点的对应关系)规模?元数据更新的频率以及复杂度?
-
分片的几种方式
- hash
- consistent hash without virtual node
- consistent hash with virtual node
-
range based。
- 假设以id 作为分片特征值,那么一个节点可能负责0~100,300~400,800~900等,元数据服务记录range与节点的映射关系
- 区间的大小不是固定的,以数据量的大小为片段标准。即0~100占了1M,100~150 也可能占了1M
对于range based 来说,如果一个节点负责的数据只有一个区间,range based与没有虚拟节点概念的一致性hash很类似;如果一个节点负责多个区间,range based与有虚拟节点概念的一致性hash很类似。
- 分片特征值的选择
- 分片元数据及元数据服务