09 | Bigtable(二):不认识“主人”的分布式架构
徐文浩
你好,我是徐文浩。上一讲里我们一起分析了如何对一个 MySQL 集群进行扩容,来支撑更高的随机读写请求。而在扩容过程中遇到的种种不便,也让我们深入理解了 Bigtable 的设计中需要重点解决的问题。
第一个问题,自然还是如何支撑好每秒十万、乃至百万级别的随机读写请求。
第二个问题,则是如何解决好“可伸缩性”和“可运维性”的问题。在一个上千台服务器的集群上,Bigtable 怎么能够做到自动分片和灾难恢复。
今天我们就先来看看第二个问题,其实也是 Bigtable 的整体架构。而第一个问题,一半要依赖第二个问题,也就是可以不断将集群扩容到成百上千个节点。另一半,则取决于在每一个节点上,Bigtable 的读写操作是怎么进行的,这一部分我们会放到下一讲,也就是 Bigtable 的底层存储 SSTable 究竟是怎么一回事儿。
那么接下来,我们就一起来看看 Bigtable 的整体架构。在学完这一讲后,希望你可以掌握 Bigtable 三个重要的知识点:
第一个,Bigtable 是如何进行数据分区,使得整个集群灵活可扩展的;
第二个,Bigtable 是如何设计,使得 Master 不会成为单点故障,乃至单点性能的瓶颈;
最后,自然是整个 Bigtable 的整体架构和组件由哪些东西组成。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
Bigtable是一种分布式架构,旨在解决高并发读写请求和可伸缩性的问题。文章深入解析了Bigtable的设计理念和架构特点,强调了其简单的设计和灵活的稀疏表结构。与传统关系数据库相比,Bigtable的数据模型更适合早期的互联网业务,提供了更大的灵活性和可扩展性。 文章首先介绍了Bigtable的整体架构,重点讨论了数据分区、Master节点的设计以及整体架构和组件。其次,文章解释了Bigtable的基本数据模型,强调了其简单的设计和灵活的稀疏表结构。每行数据都有一个行键,而列族和版本的设计使得数据存储更加灵活。 Bigtable采用了动态区间分区的方式来动态地进行分区,使得数据分区更加灵活,并且每个分区在数据量上都会相对比较均匀。此外,文章还介绍了Bigtable的分区管理机制,包括Master、Chubby和Tablet Server的用途,以及Chubby的作用和重要性。 总的来说,本文对于想要了解分布式数据库设计、分区和复制机制、系统整体架构设计以及架构优化的读者来说,是一篇值得阅读的技术文章。文章内容详实,涵盖了Bigtable的设计理念和架构特点,为读者提供了全面的了解和参考价值。 Bigtable的设计采用了巧妙的方法,如将分区信息存储为一张METADATA表,以及Master节点的调度功能对Chubby的依赖,这些设计使得Bigtable具有高可用性和灵活的分区管理能力。文章还提到了Bigtable在随机读数据上的性能表现并不好的问题,这为读者提供了思考和探索的方向。 总体而言,本文为读者提供了对Bigtable系统架构的深入了解,并引发了对分布式数据库设计和性能优化的思考。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《大数据经典论文解读》,新⼈⾸单¥59
《大数据经典论文解读》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(25)
- 最新
- 精选
- 在路上徐老师好,在Bigtable论文的第 7 部分“性能评估”里写道: Each random read involves the transfer of a 64 KB SSTable block over the network from GFS to a tablet server, out of which only a single 1000-byte value is used…… Random and sequential writes perform better than random reads since each tablet server appends all incoming writes to a single commit log and uses group commit to stream these writes efficiently to GFS. 随机写和顺序写的性能旗鼓相当,不仅在单台tablet server上表现类似,在tablet server集群上表现也几乎一样。原因是它们都会先写commit log,同步修改内存中的数据,异步修改SSTable中的数据。随机写和顺序写的差异在于SSTable的变更,由于这个操作被异步执行,所以它们的性能没有差异。 如果SSTable的不缓存在tablet server上,随机读的性能非常差,比写入操作几乎慢一个数量级。原因是不管要实际需要多小的数据,都需要从GFS上加载64k的SSTable块数据。它的瓶颈不在于tablet server的多少,而在于从GFS上读取数据。 我在学习今天的课程和阅读Bigtable论文的时候,有三个疑问: 1.课程中提到通过外部服务去监控Master的存活,可能会导致系统中出现两个Master,那么GFS没有这个问题吗?如果有的话不会造成严重的后果吗? 2.当我向bigtable写入数据时,metadata的三层结构会如何变更?变更的过程如何避免加锁?如果需要全局锁的话,我想读写性能肯定上不去。 3.随机读比写入操作慢一个数量级我还是很惊讶,因为写入操作的commit log需要写入GFS,同样有GFS操作,怎么能差出一个数量级?2021-10-0949
- thomasMETADATA 的一条记录,大约是 1KB,而 METADATA 的 Tablet 如果限制在 128MB,三层记录可以存下大约 (128*1000)2=234 个 Tablet 的位置,也就是大约 160 亿个 Tablet =============================================》 这个是如何算出来的?2021-10-2343
- 陈迪问老师: 10多年前的Bigable架构是否是一种符合当下潮流的“存储和计算分离”的架构?存储GFS做得够了,就用GFS单独存,前面哪个tablet压力大可以调度出来多一点。 当下则是objcet storage又便宜又可靠,不要share nothing本机再做一遍存储了,都交给object storage2021-10-0822
- 那时刻Bigtable数据随机读写慢,我想到的原因是:其一是个三层 Tablet 信息存储的架构,读写有多次网络请求。其二是tablet的分裂和合并,使数据产生迁移。2021-10-082
- 爱码士感觉这一片的三层结构的插图有点抽象,希望老师能够再解释一下2023-02-01归属地:浙江1
- 麋鹿在泛舟3层b+tree结构的metadata存储tablet个数的计算: 1. 第1层为根节点,第2层每个元素指向的是一个tablet,因此总存储tablet个数实际上是2层b+tree存储元素的总个数。 2. 一个tablet元素个数 = (128 * 1024KB) / 1KB = 2 ^ 17,即根节点可以存储这么多元素 3. 根节点的每个元素又指向了一个tablet,因此2层b+tree存储个数= 2^17 * 2^17 = 2 ^ 342022-11-07归属地:上海1
- 陈迪随机读,最差情况下,要网络走查元数据+从gfs读出来,gfs一读一block就是64mb,一个key value大小往往远小于这个数字。写的话就没这个问题,读内存也会快,顺序读的话key排序+ gfs支持得本来也好。相比之下,随机读显得很糟糕了2021-10-081
- 峰随机读最后只落在一台sever上,不能并行,再加上一次读取转换成了串行的三次读,自然相较而言是慢的。2021-10-081
- xxx描述方式太过抑扬顿挫了,结构感不够。2023-11-18归属地:江苏
- piboyetablet迁移是怎么搞的? 迁移会带来短时间不可以用吧?2022-01-15
收起评论