MOTService增强特性
内存表特性
使用了内存优化的数据结构,更加适合大内存和多核服务器。所有数据和索引都在内存中,不适用中间页缓存区,使用持续时间最短的锁,所有的数据结构和算法都为大内存优化而设计。内存表与基于磁盘的普通表并排创建,因此MOTService支持几乎完备的SQL覆盖,拥有完整的数据库功能集。另外,MOTService支持数据库事务,严格支持事务的ACID特性。
免锁事务管理
MOTService在保证严格一致性和数据完整性的前提下,采用乐观的策略实现高并发和高吞吐。在事务过程中,MOTService不会对正在更新的数据行的任何版本加锁,从而大大降低了一些大内存系统中的争用。事务中的乐观并发控制(Optimistic Concurrency Control,OCC)语句是在没有锁的情况下实现的,所有的数据修改都是在内存中专门用于私有事务的部分(也称为私有事务内存)中进行的。这就意味着在事务过程中,相关数据在私有事务内存中更新,从而实现了无锁读写,只有在提交阶段才会短时间加锁。
免锁索引
由于内存表的数据和索引完全存储在内存中,因此拥有一个高效的索引数据结构和算法非常重要。MOTService索引机制基于Masstree数据结构,这是一种用于多核系统的快速和可扩展的键值(Key Value,KV)存储索引。通过这种方式,高并发工作负载在多核服务器上可以获得较好的性能。Masstree是基于Trie和B+树的组合,用以谨慎利用缓存、预取、乐观导航和细粒度锁定。Masstree索引相对B+树索引而言,消耗更多的内存。另外,MOTService对Masstree的主要创新是增强了原有的数据结构和算法,能够支持非唯一索引,支持ARM。
查询原生编译
通过使用PREPARE客户端命令,可以以交互方式执行查询和事务语句。这些命令已被预编译成原生执行格式,也称为Code-Gen或即时(Just-in-Time,JIT)编译。这样可以实现平均30%的性能提升。在可能的情况下,应用编译和轻量级执行;否则,使用标准执行路径处理适用的查询。Cache Plan模块已针对OLTP进行了优化,在整个会话中甚至使用不同的绑定设置以及在不同的会话中重用编译结果。如图1所示,介绍了基于JIT的查询和存储过程的主要概念。
NUMA-ware内存管理
MOTService内存访问的设计支持非统一内存访问(NUMA)感知。NUMA-aware算法增强了内存中数据布局的性能,使线程访问物理上连接到线程运行的核心的内存。这是由内存控制器处理的,不需要通过使用互连(如英特尔QPI)进行额外的跳转。MOTService的智能内存控制模块,为各种内存对象预先分配了内存池,提高了性能,减少了锁,保证了稳定性。事务的内存对象的分配始终是NUMA本地的。本地处理的对象会返回到池中。同时在事务中尽量减少系统内存分配(OS malloc)的使用,避免不必要的锁。如图2所示,MOTService引擎通过根据运行事务的核的NUMA槽位自动对事务进行分组,使用非统一内存访问(NUMA)感知优化来执行同步的组提交记录。
MOTService主备HA
MOTService主备HA借助Manager的HA模块,实现自动主备切换能力,主备切换以HA主进程定期30秒检测同节点上的MOTService主进程是否正常为充分必要条件。
若进程异常,则将MOTService状态置为NonActive,再停止同节点上的Nginx进程,然后将原来的备实例升为主实例,并把相同节点上的MOTService状态置为Active,再启动相同节点上的Nginx进程。