分布式存储的七方面问题

复制、存储引擎、事务、分析、多核、计算、编译

分布式存储的概念:Partitioning及多机scale,Replication以灾备容错

1.复制

复制时解决可用性、可扩展性和高性能的关键。数据的维护离不开复制,复制可转移而不可消除,同时复制也引出了多副本一致性问题,而一致性保证需要考虑各种软件和硬件故障,以及误操作。共识算法和复制日志时解决复制所产生的问题的核心。

2.存储引擎

指的是本地的持久化存储引擎,要考虑到cpu和memory系统和持久化设备之间的速度和带宽差异,可以总结为1-3-5:

1指的是fsync的调用,以及和fsync地位等同的函数的调用。调用次数、频率,设备的带宽和利用率是否合理,fsync的调用如何均摊到更多的io次数和吞吐之上

3指的是读/写/空间的放大,如何tradeoff,牺牲一个保住两个

5指的是WAL的五个LSN,分别为prepare point,commit point,apply point,check point,prune point

3.事务

事务指ACID,事务可以用来给存储系统做baseline分析,检查系统在原子性、一致性、隔离性、持久化四个方面可以走多远。事务反应了正确性和并发性的折中,作为事物的使用方,理论上并发访问存储系统时,不需要担心结果不正确的问题,假如存在这种担忧,一定是事务处理上牺牲了某些正确性,偏向了并发性,而将错误处理和选择权交给了使用方,使用方需要额外在客户代码插入fence代码和容错处理。

事务处理的核心是并发控制,其主要解决以下两个问题:

①两个并发事务冲突应如何处理,是选择加锁等待还是主动夭折冲突

②已经提交的事务对数据库的影响,怎么对当前outstanding事务的读操作可见

4.分析

分析处理涵盖了很多东西,从一个角度看,是如何实现SQL语言,从另一个角度看,是如何实现一个分布式系统由SQL驱动起来工作。

一条SQL语句,经过分词、语法分析、访问catalog和语义分析、关系代数的等价变化,形成逻辑查询计划,然后根据数据的分布,算子自身特点和计算资源状况,生成物理执行计划。

5.多核

多核为什么如此重要:

假设摩尔定律,没有功率墙的限制,显然我们不需要修改老代码,只要增加单核晶体管的数量,老代码就会得到提升,当撞到功率墙后,发现需要增加核数以提升计算速度。现在问题来了,代码已经写成了多线程执行,随着核数的增长,修改worker线程池的大小,老代码的计算能力不会随着核数增加而持续增加。原因是因为多核上scale收阿姆达尔定律的制约,当代码中串行执行的部分占比1%时,256核机器只能加速到72倍,如果是10%,则只能最多加速到10倍。显然修改线程池的大小不是一个好方法,减少代码中的contention才是关键。

6.计算

计算主要讲执行引擎,执行引擎是一个很大的scope,目前roadmap已经建立,但是缺乏baseline,待两者都ready之后会补充

7.编译

编译对数据库的渗透是全方位的,比如计算引擎在向量化之外可采用编译技术优化性能。数据库中很多case-by-case的性能优化,需要深入研究体系结构,异构计算加速处理也需要使用编译技术。流批DSL脚本使用现有的SQL执行引擎做计算,UDF扩充等。

 

来源微信公众号:架构师

 

posted @ 2022-03-21 15:05  Arisf  阅读(85)  评论(0编辑  收藏  举报