300 likes | 473 Views
Hekaton 初探. PASS Beijing Local Chapter Session. 宋沄剑 01/26/2013. 由一个类比开始. 你也许或说,这个类比不太恰当 ……. 如果说传统的硬盘作为辅助存储,那么每次缓存到 Buffer 中不也是只访问内存吗? 但请想一想并发问题,就像去即使 同样是去附近的超市买水,只有一个收银台, 10 个人同时买也需要等待,使用 Hekaton 的内存优化表就像是增开了 10 个收银台
E N D
Hekaton初探 PASS Beijing Local Chapter Session 宋沄剑 01/26/2013
由一个类比开始 你也许或说,这个类比不太恰当…… 如果说传统的硬盘作为辅助存储,那么每次缓存到Buffer中不也是只访问内存吗? 但请想一想并发问题,就像去即使同样是去附近的超市买水,只有一个收银台,10个人同时买也需要等待,使用Hekaton的内存优化表就像是增开了10个收银台 而Native Compile存储过程就像是你出门去超市原来是一路小跑,而现在是开车去,速度大大提升。此外我们还可以看出,你家离超市越远,开车去越合适,就像Native Complie存储过程,存储过程中逻辑越多越长性能提升越明显 硬盘作为辅助存储,如果大量的操作,每次只取少量的数据的话,就好像你需要喝水,出家门的超市买一瓶好了,而你却坐飞机去上海买……
Hekaton的两大部分 • 内存优化表 • 本地编译存储过程
OLTP面临大量并发时会遇到的瓶颈 • CPU • Hekaton通过本地编译存储过程来减少CPU周期 • IO • 通过内存优化表,大量减少IO • 内存 • Hekaton并不能减少内存使用,相反由于多版本并发控制(MVCC)的出现,反而会增加内存使用 • 网络 • Hekaton对于网络方面没有影响
议程 • Hekaton 出现的硬件背景 • Hekaton使用的Hash-Index与传统B-Tree Index的比对 • 实现隔离的不同方式 • 日志写入的不同方式 • Hekaton的兼容性和适用场景 • 读性能并发测试DEMO
硬件背景 • TB级的主存不再是遥不可及的事了。 • CPU主频增长已经基本停滞,而CPU核数的增长会越来越多,Tilera曾在2008年预测,嵌入式系统市场在2017年将出现4096核的芯片,Sun在2008年时曾经预测,在2018年,普通服务器将采用32到128核芯片。 • NUMA构架的成熟消除了大量CPU和主存之间通路的瓶颈,并且Windows和SQL Server OS都原生支持NUMA
议程 • Hekaton 出现的硬件背景 • Hekaton使用的Hash-Index与传统B-Tree Index的比对 • 实现隔离的不同方式 • 日志写入的不同方式 • Hekaton的兼容性和适用场景 • 读性能并发测试DEMO
B-Tree Index 5 3 7 1 8 6 4
B-Tree Index • 面对以磁盘作为辅助存储的数据结构。 • 由于磁盘存在旋转延迟和寻道时间,所以磁盘单点查找很慢,但顺序读非常快。B-Tree的结构使得尽量减少查找,数据几何级的增长也只可能导致B树高度只增加一层。并且叶子节点之间通过双链表连接,使得在没有外部碎片的情况下,和硬盘磁道顺序保持一致,所以顺序读非常快。
Hash-Index G1 G2 G3 G G4 Hash Function M G Hash Bucket M1 M3 M2 M Hash Bucket
Hash Index • 以内存作为辅助存储的数据结构。 • 内存没有寻道时间,对于所有内存单位的访问时间是一样的,因此Hash对于所有的行查找都是通过LOOK UP进行的 • 对于大量的随机读写,性能提升显著,尤其是where a=a1 and b=b1 and c=c1….这类情况 • 对于大量的顺序读,性能提升非常有限
议程 • Hekaton 出现的硬件背景 • Hekaton使用的Hash-Index与传统B-Tree Index的比对 • 实现隔离的不同方式 • 日志写入的不同方式 • Hekaton的兼容性和适用场景 • 读性能并发测试DEMO
SQL Server实现隔离的方法 • 悲观并发控制 • 让事务以独占的方式占有某些资源。也就是通过所谓的“锁”来实现隔离。 • 不同的隔离等级,锁的行为也不同。 • 乐观并发控制 • 快照隔离
Hekaton实现隔离的方法和基本原理 • 多版本并发控制(MVCC) • 所谓多版本指的是,同一行数据可能存在多个版本。 开始时间戳 结束时间戳 行数据 1 无限 行数据 第一次插入,事务A(时间1) 事务B将结束时间改为4 同一个数据,不同版本 第二次修改,事务B(时间4) 4 无限 行数据 逻辑时间严格递增,每个事务都有一个对应的逻辑时间,只有行数据的逻辑时间小于事务的逻辑时间的行(也就是在事务开始前被Commit的行)对于事务可见。
Hekaton垃圾回收机制 • 只插入更新 • 由于是只插入更新,导致同一行数据可能存在多个版本,因此随着逻辑时间的前移,很多事务提交后,有一些行再也不被需要。 • 垃圾回收 • 如果一行对于所有的事务都不可见,则这行会被后台线程垃圾回收以释放内存。
议程 • Hekaton 出现的硬件背景 • Hekaton使用的Hash-Index与传统B-Tree Index的比对 • 实现隔离的不同方式 • 日志写入的不同方式 • Hekaton的兼容性和适用场景 • 读性能并发测试DEMO
SQL Server的日志写入方式 • 随着“事务”的引入,催生了事务的ACID这个理念 • 其中的D,也就是持久性催生了WAL • 持久性(Durability),意味着要保证每一个事务所做的修改都会被持久化,这就需要Write-Ahead-Log来保证。 • 传统的事务,SQL Server当日志写入磁盘步骤完成后,就会给客户端程序返回确认信息了,而被修改的脏页数据会等Checkpoint或Lazy Writer持久化到磁盘。
Hekaton日志写入方式 • 独立于SQL Server的CheckPoint线程,Hekaton Checkpoint线程异步将日志写入Checkpoint文件。 • 不再需要WAL,而是批量日志写入,因此可能导致断电后内存数据的丢失。 • 非常频繁的日志批量写入,将内存数据丢失减少到最小。 • 内存优化表如果选择了非持久化表,则日志写入部分都会省略,但内存崩溃会导致内存优化表中的数据将会全部丢失,作为ETL的中间结果非常合适。
议程 • Hekaton 出现的硬件背景 • Hekaton使用的Hash-Index与传统B-Tree Index的比对 • 实现隔离的不同方式 • 日志写入的不同方式 • Hekaton的兼容性和适用场景 • 读性能并发测试DEMO
Hekaton适用场景 适用非持久化内存优化表,数据加载速度将会得到几何级提升。 • Scale Up 消除锁,使得可以通过增加硬件提升的性能增加。而不会被卡在“锁”这个性能瓶颈上。 • Read Scale Out 使用本地编译存储过程,大大减少CPU周期。在读负载上使用Hekaton可以减少所需的读缓存服务器。 • 需要低延迟的业务场景 Hekaton内存优化表和本地编译存储过程相比较传统的表和存储过程而言,延迟更低。 • ETL中间结果集
Scale Up 性能提升 硬件投入
Read Scale-out Read Cache Read Cache Read Cache Centeral Update • 在Read Cache上使用Hekaton
Hekaton所不适用的场景 • 大量顺序读的情况(大多是OLAP) • 对于小的存储过程,Native Compiled的性能提升不太明显。 • 对于内存表,性能提升主要在消除锁争用上。
议程 • Hekaton 出现的硬件背景 • Hekaton使用的Hash-Index与传统B-Tree Index的比对 • 实现隔离的不同方式 • 日志写入的不同方式 • Hekaton的兼容性和适用场景 • 读性能并发测试DEMO