高频金融系统如何防止突然断电导致的数据丢失?

133 天前
 latifrons

我知道 MySQL ,RocksDB 等数据库其实都有 WAL ,但同样地都依赖操作系统定期将内存缓存中的数据通过 fsync()刷回磁盘。如果此时断电(或者操作系统崩溃),1 秒内的数据可能会丢失。

MySQL:innodb_flush_log_at_trx_commit

https://dba.stackexchange.com/questions/12611/is-it-safe-to-use-innodb-flush-log-at-trx-commit-2

The default value of 1 is required for full ACID compliance. You can achieve better performance by setting the value different from 1, but then you can lose up to one second worth of transactions in a crash. With a value of 0, any mysqld process crash can erase the last second of transactions. With a value of 2, only an operating system crash or a power outage can erase the last second of transactions. InnoDB's crash recovery works regardless of the value.

所以似乎为了数据完备性,innodb_flush_log_at_trx_commit=1 是不可避免的,从而会导致比较严重的性能劣势。

例如 LevelDB ,开启 WriteOptions(Sync=true)后,tps 从 190000/s 骤降为 1200/s.

Qwen3 的一个回答: https://chat.qwen.ai/s/0e7d9977-4400-41da-883f-2972893104cf?fev=0.0.85

想请教一下大家,在对数据完备性要求极高的场景下,大家是怎么优化性能的?

10950 次点击
所在节点    程序员
133 条回复
joyhub2140
133 天前
一切软件或者 OS 层面的措施都不如物理防御。

直接上 UPS+柴油发电机。简单暴力可靠。
scegg
133 天前
@latifrons 根据业务对“数据一致性”的要求,必要时牺牲性能的方法包括但不限于分布式事务,或其等价的逻辑层实现。
latifrons
133 天前
@comlewin 可能是我没表述清楚,我的核心 concern 是落盘 fsync()失败,原因可能会有很多,掉电只是其中之一。
scegg
133 天前
@latifrons 如果是担心数据一致性的问题,考虑分布式事务或其等价的逻辑实现方案。如果不能接受其性能开销,考虑硬件冗余机制(包括电力、硬件 FT 或虚拟化 FT )。
crc8
133 天前
世界的核心不是石油,就是电磁波。
woodfizky
133 天前
有些技术的牛角尖可以不用钻那么深,有些事情可以不用技术的思路而是用工程的思路去解决。
怕断电,那就保证不要断电就行了。怕机房爆炸,那增设若干套冗余异地系统和线路就好了。

真的遇上事,服务断了就断了吧,比如机房都被炸了,就没必要想过多技术问题了。
picone
133 天前
分布式系统的 CAP 定理,只能折中。
viking602
133 天前
同城容灾 异地多活 多可用区 多云 自建机房那就是 UPS 柴发拉满 多演练 保证不断电到电才是硬道理
Richared
133 天前
第一家工作电商公司,在一个园区里,一共 7 层,2-3-4 楼是机房,还有两个异地机房。然后 ups+发电机。有一次园区停电,十分钟发电机就顶上了。三台车,在楼下发了两天。别的单位都在摸鱼,只有我们在上班,领导开玩笑,我就说要把机房搬走,如果要从系统层面想招,那么离世界末日不远了。
kkk1234567
133 天前
机器上配置电容卡,供电电路加 UPS ,机房再弄个柴发
dem0ns
133 天前
别人问的是断电数据丢失,都说用 UPS...... 这玩意儿都是标配好吧,几地几中心也是等保强制要求。
dlmy
133 天前
我再补充一下,可以使用 RAID 多磁盘冗余阵列技术,RAID 卡自带了 SDRAM 缓存,还可以配置独立的锂电池或电容,就算服务器掉电了,也可以把服务器缓存中的数据写入到磁盘。
ivvei
133 天前
@latifrons 落盘了再说做完了。落盘是必要时间,是事务的一部分。
shiny
133 天前
哪怕没有发电机,UPS 断电时候可以设置向系统发送关机信号。可以避免一些突然断电的故障。
bli22ard
133 天前
代码层面,没办法保证断电不丢数据,只能保证断电数据一致性
zong400
133 天前
用 Oracle 就不用系统管理磁盘,lvm 管理磁盘,redolog 放在高速 ssd 上基本能最大限度规避断电问题
fuzzsh
133 天前
了解下 Oracle RAC ,集群多写多读,这也是 Oracle 能主宰数十年的原因,只要应用层面写好 try catch ,数据 99.99%可写入,除非数据阵列挂了
Jinnrry
133 天前
你是研发还是 dba ?如果你是研发,直接找你们 dba ,他们有现成方案。如果你是 dba ,你连这都不知道,趁早收拾东西走人
bearbest
133 天前
这已经不是技术问题了,这是系统问题。
断电造成的后果,不是一个数据库技术上处理就能解决的问题。
感觉有点程序员思维了。
yc8332
133 天前
这是工程问题。。正常都是有 ups 的不断电系统的。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1128883

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX