如何保证内存里的数据永不丢失? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
whatisnew
V2EX    问与答

如何保证内存里的数据永不丢失?

  •  
  •   whatisnew 2018-05-02 11:02:17 +08:00 9658 次点击
    这是一个创建于 2722 天前的主题,其中的信息可能已经有所发展或是发生改变。

    看到有 v 友分享面试经历,我想起来几年面试的时候遇到的一个问题,至今还没有解答:

    面试官:如何保证内存里的数据永不丢失,包括断电的时候。

    我:数据持久化、分布式,配合硬件上的灾备支持。

    面试官:不对

    我:那有什么好方法分享一下吗

    面试官:我就不跟你多说了,你回去了解一下

    我:一脸懵 b 的走了

    至今还是没有明白这个问题到底是啥情况,真的有更优雅的解决方案吗。。。

    82 条回复    2018-05-03 09:51:27 +08:00
    ballshapesdsd
        1
    ballshapesdsd  
       2018-05-02 11:03:41 +08:00
    ups
    windfarer
        2
    windfarer  
       2018-05-02 11:04:17 +08:00   2
    刻在石头上
    whatisnew
        3
    whatisnew  
    OP
       2018-05-02 11:08:27 +08:00
    @ballshapesdsd 硬件上的灾备支持就包括 ups 啊
    yannxia
        4
    yannxia  
       2018-05-02 11:11:16 +08:00
    我猜是想问 Redis 的 aof 和 rdb
    whatisnew
        5
    whatisnew  
    OP
       2018-05-02 11:16:17 +08:00
    @yannxia aof 和 rdb 不就是数据持久化吗
    BOYPT
        6
    BOYPT  
       2018-05-02 11:20:20 +08:00
    只要保证电源永远不断就可以
    SuperMild
        7
    SuperMild  
       2018-05-02 11:21:36 +08:00
    内存,一般是指断电就丢失数据的快速存储器,根据定义可见要使内存数据不丢失,只有防止断电才能做到。莫非这个面试官说的内存不是这种内存?
    realityone
        8
    realityone  
       2018-05-02 11:24:05 +08:00
    你和他讨论 ROM 算不算内存
    lance7in
        9
    lance7in  
       2018-05-02 11:24:07 +08:00
    只要断电的时间足够段,电源里电容存的电还是可以撑过去的
    7654
        10
    7654  
       2018-05-02 11:28:37 +08:00   3
    我们机房的 UPS 可以保证所有服务器及空调满负荷工作 4 小时,楼顶还有 3 台 120KW 柴油发电机,还有地底的油库

    而我们只是一个小公司
    whatisnew
        11
    whatisnew  
    OP
       2018-05-02 11:28:44 +08:00
    @lance7in 硬件上的灾备支持就包括使用超级电容
    sbbeta
        12
    sbbeta  
       2018-05-02 11:29:36 +08:00 via Android
    @realityone 哈哈!想起以前有人说手机有 64G 内存
    RHFS
        13
    RHFS  
       2018-05-02 11:36:37 +08:00 via iPhone
    @sbbeta 叫 64g 内存也没什么不对 存储内存也是内存
    WispZhan
        14
    WispZhan  
       2018-05-02 11:36:52 +08:00
    你要问面试官,Flash 闪存分哪几类。
    RHFS
        15
    RHFS  
       2018-05-02 11:37:14 +08:00 via iPhone
    我猜面试官 想告诉你 用网盘
    fffflyfish
        16
    fffflyfish  
       2018-05-02 11:42:19 +08:00   1
    换那种非易失存储的内存,比如 MRAM 这种用磁性介质存储的内存条呗
    jason19659
        17
    jason19659  
       2018-05-02 11:58:31 +08:00
    用硬盘当内存
    MonoLogueChi
        18
    MonoLogueChi  
       2018-05-02 12:02:17 +08:00 via Android
    感觉应该是保证不断电吧,内存数据要和硬盘同步的话,就失去了速度优势了。难道现在真的有这种技术了吗
    Shura
        19
    Shura  
       2018-05-02 12:06:40 +08:00
    用相变内存啊,非易失 RAM。
    otakustay
        20
    otakustay  
       2018-05-02 12:13:28 +08:00
    我也想知道,这样我就弄个好主板插 256G 内存不买硬盘了
    phpdever
        21
    phpdever  
       2018-05-02 12:23:48 +08:00   2
    常见数据库有 wal 这种 log 保证先刷 log 顺序到磁盘,然后数据到内存,保证数据不会丢。

    内存数据 dump 磁盘在删除 log。但是实际工作经验显示,wal 可能不一定有效,因为你刷 wal log 可能为了吞吐而让刷 log 做那种批量之类的刷,数据也会内存有,掉电的话还是会丢数据,除非你愿意牺牲吞吐(也有业务这么做)。

    还有一种就是你拿钱去换数据可靠性,直接数据写 nvme 介质。

    这种介质内部有一个自己的电源的东西保证数据不易失,但是这个没有用过,也就是论文里面看过,有学术界玩过。

    仅供参考。
    zn
        22
    zn  
       2018-05-02 12:47:13 +08:00 via iPhone   1
    说不断电就可以的,死机了解一下?
    myliyifei
        23
    myliyifei  
       2018-05-02 12:51:41 +08:00 via Android   1
    @phpdever sap hana 属于哪种 wal
    zst
        24
    zst  
       2018-05-02 13:06:08 +08:00 via Android
    UPS 还可以失火导致自动断电保护呢也不靠谱
    herozhang
        25
    herozhang  
       2018-05-02 13:14:37 +08:00
    @zst 上 UPS 的 UPS
    ender049
        26
    ender049  
       2018-05-02 13:25:35 +08:00
    液氮
    mengyaoss77
        27
    mengyaoss77  
       2018-05-02 13:29:28 +08:00 via Android
    面试官都好有趣啊。
    logOo
        28
    logOo  
       2018-05-02 13:33:18 +08:00   7
    估计面试官刚被女朋友问过:你会永远爱我么。什么是永远,宇宙毁灭么?
    KgM4gLtF0shViDH3
        29
    KgM4gLtF0shViDH3  
       2018-05-02 14:00:48 +08:00
    以前遇到过好几个这种问了问题请教下都不回答的。。一般都是向 hr 和同事炫耀自己能问倒面试的人,好像很厉害的样子,呵呵。
    l30n
        30
    l30n  
       2018-05-02 14:09:40 +08:00 via Android
    内存计算
    tanranran
        31
    tanranran  
       2018-05-02 14:14:54 +08:00
    @7654 膜拜,膜拜,这个月的膝盖献上
    YanSep
        32
    YanSep  
       2018-05-02 14:28:07 +08:00 via Android
    存区块链上吧
    odirus
        33
    odirus  
       2018-05-02 14:33:41 +08:00
    如果不钻牛角尖的话,所有内容都先写入磁盘(持久化),读取的时候刷新到内存中,即使断电了,重启的时候程序也能自动刷新最新内容到内存中。

    不知道是不是想要的方案。
    Navee
        34
    Navee  
       2018-05-02 15:12:53 +08:00
    先写入磁盘再加载到内存
    jianzong
        35
    jianzong  
       2018-05-02 15:17:57 +08:00
    mmap
    shuax
        36
    shuax  
       2018-05-02 15:24:55 +08:00
    傲腾内存?
    judeng
        37
    judeng  
       2018-05-02 15:54:05 +08:00
    mram 了解一下?
    qf19910623
        38
    qf19910623  
       2018-05-02 15:55:14 +08:00
    @odirus 这样已经失去了内存的意义了,直接可以把内存去掉了
    sgissb1
        39
    sgissb1  
       2018-05-02 16:27:00 +08:00
    傲疼了解一下,热数据永不丢失,冷数据万年找不回(前提是硬盘上没回写)。

    内存上数据还不想丢失的话也有一种办法,就是内存和硬盘一起写数据。貌似 n 年前有一些对数据可靠性要求高的在做,比如"事务"这个功能。
    lixile
        40
    lixile  
       2018-05-02 16:40:52 +08:00
    硬件灾备喽 有自带电容和固态的那种内存 断电自动写入。。
    sampeng
        41
    sampeng  
       2018-05-02 16:53:39 +08:00
    除了硬件容灾,真想不到有什么着了。所以的一切都是建立在物理介质上备份的。压根和内存的本身定义就没有什么关系。不管是断电自动写入还是 log flush 到某个地方防止断电丢失。

    难道面试官的 G 点是 mmap ?也不像啊。。。。只能说。很有趣的面试官
    recordnow
        42
    recordnow  
       2018-05-02 17:18:25 +08:00   1
    对面试官使用激将法
    脸上略带嘲讽:哦,原来你也不知道。不错喔,你很因脆丝汀。
    eurokingbai2
        43
    eurokingbai2  
       2018-05-02 17:39:09 +08:00
    不就是 nvm 么。。
    limbo0
        44
    limbo0  
       2018-05-02 17:58:29 +08:00
    这个面试官有点叼, 我去买橘子
    chentydev
        45
    chentydev  
       2018-05-02 18:27:29 +08:00
    这题目本身就有问题。
    根本不存在“永不丢失”的数据。最极端的情况,宇宙炸了,数据还能不丢失吗?实际能做到的只能是尽可能减小数据丢失的可能性。
    从这个角度来看,要么就承认 LZ “数据持久化、分布式,配合硬件上的灾备支持”的答案是合格的,要么就只能承认自己提的问题本身无解了。
    sumu
        46
    sumu  
       2018-05-02 18:31:17 +08:00
    在一个不完美的基础上构建一个,比如 5 个 9,或者 6 个 9 系统,是可以的,但构建一个 100%可靠的?我估计他没学过概率
    cabing
        47
    cabing  
       2018-05-02 18:32:25 +08:00
    哪有绝对的不丢失。。一般的都是磁盘持久化,分布式,多机房备份~~
    whatisnew
        48
    whatisnew  
    OP
       2018-05-02 18:35:36 +08:00
    @chentydev 我当时就想跟面试官说这世界上没有 100%保证的事,但是我看他好像并不想知道。。。
    whatisnew
        49
    whatisnew  
    OP
       2018-05-02 18:36:57 +08:00
    @chentydev 而且还想引用支付宝机房停电的事例,但是从面试官的表情上感觉他好像并不想知道。。。
    360045
        50
    360045  
       2018-05-02 18:38:48 +08:00
    根据能量守恒定律,这些数据本身就不会消失啊,就算上面说的炸了也不会消失,只是换了另外一种形式存在,手动滑稽
    swulling
        51
    swulling  
       2018-05-02 19:15:34 +08:00
    @7654 那也不能保证永不丢失,机房进水了解下,机房爆炸了解下,机房被雷劈了了解下。
    leeg810312
        52
    leeg810312  
       2018-05-02 19:18:17 +08:00 via Android
    遇到这种装 b 面试官,直接嘲讽怼,反正肯定不会要你了,不要让自己不爽
    GjriFeu
        53
    GjriFeu  
       2018-05-02 19:19:10 +08:00
    persistent memory 了解一下
    zj299792458
        54
    zj299792458  
       2018-05-02 19:20:11 +08:00 via iPhone
    @7654 在美国?
    yufz
        55
    yufz  
       2018-05-02 19:21:26 +08:00
    nvram?
    iceheart
        56
    iceheart  
       2018-05-02 19:42:08 +08:00 via Android
    他是想问 filemapping 吧?
    jetyang
        57
    jetyang  
       2018-05-02 19:53:06 +08:00
    有时候就这样,面试官想要的点候选人总是 get 不到,只能说这个问题设计的不好。启发式的发问最好,有个背景有个一般的方案,候选人在面试官的引导下逐步优化,再考察一下边界情况。题主说的这个题,双方没想到一起就尴尬了,面试官也不好据此判断候选人的能力,只好换题
    pkookp8
        58
    pkookp8  
       2018-05-02 19:57:18 +08:00 via Android
    硬盘读写多了费硬盘费时间
    硬盘读少了丢数据

    看取舍吧,像 word 这种 1 分钟保存一次也没事
    内存又叫易失性存储器,不易失请用 rom
    murmur
        59
    murmur  
       2018-05-02 20:19:00 +08:00
    @7654 什么机房的 ups 能撑 4 个小时
    nov11
        60
    nov11  
       2018-05-02 20:20:24 +08:00
    non-volatile memory?
    metrotiger
        61
    metrotiger  
       2018-05-02 21:11:57 +08:00
    Sir, PLS define internal memory.
    amai
        62
    amai  
       2018-05-02 21:21:32 +08:00
    非易失内存, 铁电,还是有不少选择的
    nvram,fram
    注意咬字,内存和掉电,上面说 ups,后背什么的,异地什么的,都咬的不紧 ups 哪么还是没掉电,后背也是,异地 哪么内存数据还是丢了。
    办法很多,选择也很多,问这问题的得看什么样的人和什么样的事,关乎底层和硬件的还说的过去
    如果不是,几句话答回去就把天聊死了,面试聊天是门学问,答上来还得把台阶给上。
    amai
        63
    amai  
       2018-05-02 21:24:26 +08:00
    其实 x - p 也可以,这个在用法上天然有优势
    还有面试问 coms 工艺的呢,这你怎么回答?不知道哪想出来的,回答完基本上都挺尴尬的
    yangqi
        64
    yangqi  
       2018-05-02 21:24:49 +08:00
    @qf19910623 #38 并没完全失去意义,这种情况内存相当于缓存
    saybye
        65
    saybye  
       2018-05-02 21:24:59 +08:00
    ups 撑四个小时?
    lalala121
        66
    lalala121  
       2018-05-02 21:27:46 +08:00
    哈哈哈哈,你这么一说我想起来刚工作的时候面试,那人问我知道什么 http 方法,我说 get,post,head,然后就不知道了,那时候还不知道 put,delete 这些,然后面试官跟我说,你说的这些我们线上都没法用,安全性太差,后来我也是想了好久,应该用啥呢
    yangqi
        67
    yangqi  
       2018-05-02 21:29:17 +08:00
    这种面试官“我就不和你多说了”,一般潜台词要么是他也不知道,要么他这个问题问的不严谨,经不起推敲,所以含糊其辞。
    wdlth
        68
    wdlth  
       2018-05-02 21:40:06 +08:00
    接下来还有问:
    包括内存坏的时候?
    包括持久化存储坏的时候?
    包括脑子不好使的时候?
    darluc
        69
    darluc  
       2018-05-02 22:08:52 +08:00
    twl007
        70
    twl007  
       2018-05-02 22:23:37 +08:00 via iPhone
    前几年 Google 机房断电 也丢了数据了,怎么可能不丢……
    prolic
        71
    prolic  
       2018-05-02 22:27:39 +08:00 via Android
    怕不是脑筋急转弯
    Marble
        72
    Marble  
       2018-05-02 22:57:09 +08:00 via Android
    never say never
    roychan
        73
    roychan  
       2018-05-03 00:22:24 +08:00
    非易失存储器了解一下
    SuperMild
        74
    SuperMild  
       2018-05-03 01:11:52 +08:00
    非易失存储器是方案之一,但面试官遮遮掩掩是什么意思,就一句话的事情装什么高深呢,很不尊重人啊。而且,非易失存储器只是方案之一,有很多缺点,并不见得就一定比 ups 好,凭什么搞得好像标准答案似的。
    watzds
        75
    watzds  
       2018-05-03 01:19:35 +08:00 via Android
    只存 NULL 就可以做到,write NULLl , read NULL.
    zlhsvc
        76
    zlhsvc  
       2018-05-03 08:59:41 +08:00
    面试官会告诉你保存在硬盘上
    eric227
        77
    eric227  
       2018-05-03 09:04:29 +08:00
    永不丢失?那就是在无穷多的地方备份呗
    mydns
        78
    mydns  
       2018-05-03 09:20:29 +08:00
    你猜猜猜
    ihjk
        79
    ihjk  
       2018-05-03 09:26:39 +08:00
    区块链 无耻滑稽
    fiht
        80
    fiht  
       2018-05-03 09:27:05 +08:00
    我觉得,遇到这种问题不要慌,具体到具体问题的话就好解决了,比如说:
    “如何保证内存里的数据永不丢失,包括断电的时候。” 我觉得这个用 Redis 最好表述了。
    “呀,您这个问题问得好,我们之前考虑过,我们之前用的是 Redis 做的 xxxx,这个 Redis 就是完全 in-memory 的,也就是说掉电之后就会消失,Redis 官方的解决方案是定期把内存中的数据持久化到硬盘上去。但是这个还是有问题滴,比如讲来没来得及持久化就 Duang 机的话数据也存不下来,我们是搞了一个 Redis 集群,master 挂了 slave 变成 slave,单机 Duang 机我们的数据也是不丢失的,如果要再加强的话,可以在多个地方起 slave 做备份节点,保证数据安全。”
    xman99
        81
    xman99  
       2018-05-03 09:30:54 +08:00
    把数据多写几份, 先保证把固态写入后再写入内存, 然后固态做几份备份。这种方式可以吗
    extreme
        82
    extreme  
       2018-05-03 09:51:27 +08:00
    @xman99 问题是,你调用 write()写到硬盘,难道可以跳过内存?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4150 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 10:15 PVG 18:15 LAX 03:15 JFK 06:15
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86