V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
whatisnew
V2EX  ›  问与答

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

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

    看到有 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 膜拜,膜拜,这个月的膝盖献上
    Flobit
        32
    Flobit  
       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 在美国?
    jinyang656
        55
    jinyang656  
       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   ·   实用小工具   ·   2586 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 06:12 · PVG 14:12 · LAX 22:12 · JFK 01:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.