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