
高性能需求显现
随着企业业务规模的攀升,大量的数据需要被实时处理,传统的数据处理方案已无法满足大吞吐、低延迟的写入和高速查询的场景,采用redis等缓存策略也无法满足高并发场景下实时数据写入和更改的业务需求,同时随之而来的缓存穿透、缓存雪崩问题则更为棘手。因此越来越多的用户寻求高性能或缓存替换方案,关系型内存数据库的优势逐步显现。尽管内存数据库已具备较高性能,但企业对业务效率目标也在逐年提升,越来越多的特定业务场景需要更快速的响应来提升整体业务系统的响应能力。
Qcubic内存数据库是快立方自主研发的一款内存型分布式关系型数据库,已经广泛应用于运营商、广电、能源等行业,在提高企业用户业务系统性能的同时保障系统的安全和稳定。Qcubic的高性能机制将用户数据全部存储在内存中,数据查询及数据更新全部在内存中进行,通过内存的优势及算法实现高性能特性,再通过checkpoint和redo log来保证数据的安全。尽管相对于传统磁盘数据库而言性能得到大幅提升,但实时redo log的磁盘同步和日志竞争带来的延迟使内存数据库的更新无法发挥更高的性能。
为保证数据的安全(即在宕机时保证数据的安全),所有并发的事务需要把当前事务产生的redo log写入redo log buffer,然后写入到文件。为确保并发写入不重叠覆盖,需要通过锁来保证其顺序写入。虽然采用了WAL(write ahead log)优化策略,但高并发场景下仍成为数据更改的性能瓶颈。另外在redo log 顺序写到磁盘时,磁盘的写入性能也阻碍了并发事务的性能,导致数据更新无法充分发挥内存数据库的优势。
在对超高性能业务场景进行性能瓶颈定位后,结合业务本身特性(可接受半持久化)以及数据库ACID原则,保障rollback和savepoint的正确运行,决定采用内存undo log + 单事务undo buffer的方式进行优化。所有DML的redo log不再写入磁盘,完全避免了日志竞争等待的情况,也极大程度缓解了redo log落盘带来的IO性能损耗。

▲ 无磁盘实时写入设计原理示意图
Trans:事务
Statement:针对数据库的最小单位修改,一个statement只影响一条记录
Undo log buffer:记录statement修改前后的ROW内存地址(利用MVCC机制减少内存占用)
Dirty page:内存中发生修改但还未写入到磁盘的数据页,针对单个page的任意修改都会将其变更为dirty page
Timer:定时器,在本文中表示如果定时器被触发,则向checkpoint flusher发出脏页落盘信号
如图所示:undo log buffer每trans分配一个,事务开启时进行内存分配,在事务执行过程中如果空间不足则进行realloc,事务结束时释放。该设计遵循极速原则,log不落盘,全部存储在内存中。
Checkpoint flusher主要负责管理dirty page manager。Dirty page manager中记录了针对于各个表空间的dirty page list,各表空间在内存中被修改过的页都会记录到此处。当用户手动执行“alter system checkpoint”或定时器被触发时,将所有的脏页刷新到磁盘,保证了数据的持久化原则。
这样通过减少redo log buffer锁竞争、降低redo log落盘的IO阻塞的方式大幅提升了Qcubic性能。经测试验证,该功能使INSERT、UPDATE性能均提升了2倍以上。
应用场景

“无磁盘实时写入”功能适用于企业某特定对性能有极致需求的场景,对数据的查询和更新提供实时保障,也避免了缓存失效、缓存穿透等问题,目前主要用于实时数据处理创新业务,保证数据被快速的提取调用。如:运营商位置信息实时加工系统,该系统需要数据库提供各终端用户的最新实时位置信息,并经过特定的规则筛选提取,在特定的场景中发挥效用。例如:家庭看护场景,可供客户在需要时能够通过APP实时查询到佩戴终端当前的位置信息,进而判断家人的位置,避免出现家人走失或者走散等。该功能同样也适用于电子围栏、灾害预警、疫情防控等场景。