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

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

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

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

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

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

    面试官:不对

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

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

    我:一脸懵 b 的走了

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

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

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

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

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

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

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

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

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

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

    看取舍吧,像 word 这种 1 分钟保存一次也没事
    内存又叫易失性存储器,不易失请用 rom
        59
    murmur   2018-05-02 20:19:00 +08:00
    @7654 什么机房的 ups 能撑 4 个小时
        60
    nov11   2018-05-02 20:20:24 +08:00
    non-volatile memory?
        61
    metrotiger   2018-05-02 21:11:57 +08:00
    Sir, PLS define internal memory.
        62
    amai   2018-05-02 21:21:32 +08:00
    非易失内存, 铁电,还是有不少选择的
    nvram,fram
    注意咬字,内存和掉电,上面说 ups,后背什么的,异地什么的,都咬的不紧 ups 哪么还是没掉电,后背也是,异地 哪么内存数据还是丢了。
    办法很多,选择也很多,问这问题的得看什么样的人和什么样的事,关乎底层和硬件的还说的过去
    如果不是,几句话答回去就把天聊死了,面试聊天是门学问,答上来还得把台阶给上。
        63
    amai   2018-05-02 21:24:26 +08:00
    其实 x - p 也可以,这个在用法上天然有优势
    还有面试问 coms 工艺的呢,这你怎么回答?不知道哪想出来的,回答完基本上都挺尴尬的
        64
    yangqi   2018-05-02 21:24:49 +08:00
    @qf19910623 #38 并没完全失去意义,这种情况内存相当于缓存
        65
    saybye   2018-05-02 21:24:59 +08:00
    ups 撑四个小时?
        66
    lalala121   2018-05-02 21:27:46 +08:00
    哈哈哈哈,你这么一说我想起来刚工作的时候面试,那人问我知道什么 http 方法,我说 get,post,head,然后就不知道了,那时候还不知道 put,delete 这些,然后面试官跟我说,你说的这些我们线上都没法用,安全性太差,后来我也是想了好久,应该用啥呢
        67
    yangqi   2018-05-02 21:29:17 +08:00
    这种面试官“我就不和你多说了”,一般潜台词要么是他也不知道,要么他这个问题问的不严谨,经不起推敲,所以含糊其辞。
        68
    wdlth   2018-05-02 21:40:06 +08:00
    接下来还有问:
    包括内存坏的时候?
    包括持久化存储坏的时候?
    包括脑子不好使的时候?
        70
    twl007   2018-05-02 22:23:37 +08:00 via iPhone
    前几年 Google 机房断电 也丢了数据了,怎么可能不丢……
        71
    prolic   2018-05-02 22:27:39 +08:00 via Android
    怕不是脑筋急转弯
        72
    Marble   2018-05-02 22:57:09 +08:00 via Android
    never say never
        73
    roychan   2018-05-03 00:22:24 +08:00
    非易失存储器了解一下
        74
    SuperMild   2018-05-03 01:11:52 +08:00
    非易失存储器是方案之一,但面试官遮遮掩掩是什么意思,就一句话的事情装什么高深呢,很不尊重人啊。而且,非易失存储器只是方案之一,有很多缺点,并不见得就一定比 ups 好,凭什么搞得好像标准答案似的。
        75
    watzds   2018-05-03 01:19:35 +08:00 via Android
    只存 NULL 就可以做到,write NULLl , read NULL.
        76
    zlhsvc   2018-05-03 08:59:41 +08:00
    面试官会告诉你保存在硬盘上
        77
    eric227   2018-05-03 09:04:29 +08:00
    永不丢失?那就是在无穷多的地方备份呗
        78
    mydns   2018-05-03 09:20:29 +08:00
    你猜猜猜
        79
    ihjk   2018-05-03 09:26:39 +08:00
    区块链 无耻滑稽
        80
    fiht   2018-05-03 09:27:05 +08:00
    我觉得,遇到这种问题不要慌,具体到具体问题的话就好解决了,比如说:
    “如何保证内存里的数据永不丢失,包括断电的时候。” 我觉得这个用 Redis 最好表述了。
    “呀,您这个问题问得好,我们之前考虑过,我们之前用的是 Redis 做的 xxxx,这个 Redis 就是完全 in-memory 的,也就是说掉电之后就会消失,Redis 官方的解决方案是定期把内存中的数据持久化到硬盘上去。但是这个还是有问题滴,比如讲来没来得及持久化就 Duang 机的话数据也存不下来,我们是搞了一个 Redis 集群,master 挂了 slave 变成 slave,单机 Duang 机我们的数据也是不丢失的,如果要再加强的话,可以在多个地方起 slave 做备份节点,保证数据安全。”
        81
    xman99   2018-05-03 09:30:54 +08:00
    把数据多写几份, 先保证把固态写入后再写入内存, 然后固态做几份备份。这种方式可以吗
        82
    extreme   2018-05-03 09:51:27 +08:00
    @xman99 问题是,你调用 write()写到硬盘,难道可以跳过内存?
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1639 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 40ms · UTC 16:46 · PVG 00:46 · LAX 08:46 · JFK 11:46
    ♥ Do have faith in what you're doing.