关系数据库牺牲持久性Durability获得性能提升

banq 16-07-14
              

你是否愿意以几秒钟的写入可能丢失风险换取关系数据库写操作性能的数百倍提升?如果愿意,你可以不必使用NoSQL,通过配置传统关系数据库获得与NoSQL一样的高性能。

MariaDB (之前: MySQL)
下面的配置会让你的MySQL写性能提高很多,冒可能1秒数据丢失风险:
innodb_flush_log_at_trx_commit = 0
innodb_flush_log_at_timeout = 1

第二个配置timeout只有从5.6.6版本以后可用。

MYSQL文档如是说:控制严格ACID的提交操作柔顺度和高性能之间平衡是可能的,这种情况是在提交相关的I/O操作时被重新安排并在批处理中完成时可能的,通过改变默认值,你能获得较好性能,但是你会冒丢失一秒事务数据丢失风险。


PostgreSQL
PostgreSQL有类似设置:
synchronous_commit off

文档是如此说:默认安全设置是on,当设置off时,成功报告给客户端和事务真正安全完成之间有一个延迟,最大延迟是wal_writer_delay的三倍。

也推荐其他优化:
在许多场景,异步提交会提高大部分性能的提高,只要关闭fsync,但是会有数据中断风险。

这个特性适合所有版本。

Microsoft SQL Server
在SQL Server 2014,很容易配置如下:

ALTER DATABASE dbname SET DELAYED_DURABILITY = FORCED;

文档提到:一些事务总是完全持久化的,不考虑数据库设置或提交设置,比如:系统事务、跨数据库事务和FileTable操作等等。

特别是在跨数据库事务中这种设置也许不方便。

总结
以上配置都是延迟数据库写操作的实时持久化以换取性能提升,也就是ACID中的Durability持久性,实际是让数据保留在内存,同时保留ACI三个优点。从而可以实现without NOSQL却与NOSQL媲美的性能。之所以能够这样做,是因为NoSQL也是这么干的,见MongoDB文档:我们认为单台服务器的实时持久性被过于看重,有很多情况服务器会丢失很多数据,比如漏水造成损坏,火灾和一些硬件故障等,不管数据库软件是否实时持久化,在这些情况下数据也会丢失。

Trading durability for performance without NoSQL
[该贴被banq于2016-07-14 21:07修改过]