急急急急,求教,。。。各位大神,公司的 mongodb 挂了半个月没发现,现在 oplog 已经跟不上了 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Mrzhang0320
V2EX    MongoDB

急急急急,求教,。。。各位大神,公司的 mongodb 挂了半个月没发现,现在 oplog 已经跟不上了

  •  
  •   Mrzhang0320 2018-02-06 09:55:03 +08:00 8604 次点击
    这是一个创建于 2878 天前的主题,其中的信息可能已经有所发展或是发生改变。

    请教如何恢复数据,官档看了一下,说是要停止实例;或者自动全量同步; 这里大概问一下,自动全量同步 initial sync 1T 数据要多久

    27 条回复    2018-02-07 12:20:09 +08:00
    timothyye
        1
    timothyye  
       2018-02-06 10:00:49 +08:00   1
    我们也遇到过,后来直接停掉,从 primary 拷贝数据……
    也可以把数据全部删掉,从头同步,花的时间跟你的带宽和磁盘读写速度有关
    onion83
        2
    onion83  
       2018-02-06 10:01:43 +08:00   1
    看看是否有空闲的副本集实,停掉,全量拷贝数据( scp、注意文件夹权限)包含 oplog,重启即可。
    Mrzhang0320
        3
    Mrzhang0320  
    OP
       2018-02-06 10:04:18 +08:00
    @timothyye 主库不能停,不过还有一台从库;再请问一下 cp 数据的话是不是把 dbpath 的所有数据拷过来就行了
    Mrzhang0320
        4
    Mrzhang0320  
    OP
       2018-02-06 10:05:37 +08:00
    @onion83 是还有一台副本集的实例;只拷贝 dbpath 的数据就可以吗
    rrfeng
        5
    rrfeng  
       2018-02-06 10:09:34 +08:00   1
    只有主库的话只能自动全量同步了,时间主要取决于磁盘和 CPU 性能。按照我们之前的经验 1T 如果用 SSD 的话大概要几个小时,不过不同场景下差距也很大,十几个小时也有可能。

    如果还有一个从库并且可以停掉(主库完全能暂时抗住压力的话),那直接 rsync dbpath 就可以了。注意文件权限。官方文档有类似的操作说明。注意拷贝时间不能超过存活的从库的 oplog 大小,不然唯一的从库也能跟不上了…
    jy02201949
        6
    jy02201949  
       2018-02-06 10:12:27 +08:00   2
    急啥,都挂了半个月没发现了,说明也不是什么重要业务,全量同步吧
    timothyye
        7
    timothyye  
       2018-02-06 10:19:55 +08:00
    @Mrzhang0320 额,我是说把这个 oplog 跟不上,挂掉的实例停掉,然后从一个 primary 或者 secondary 把数据直接 cp 过去……
    onion83
        8
    onion83  
       2018-02-06 10:32:47 +08:00   1
    1、对,直接拷贝 dbpath 即可。

    2、但是,如果整个副本集剩余 1 主 1 从的情况,你将剩下来的 1 从都关掉拷贝数据,整个集群会变成只读状态(不能写数据),你要评估下后果。

    3、对于 2,可以尝试不关闭从实例,使用 db.fsyncLock(),将从数据库进入锁定状态,确保在 scp, rsync 过程中 oplog、数据文件锁定,不产生变动。但是,程序有可能会读到过期数据。https://docs.mongodb.com/manual/reference/method/db.fsyncLock/

    对于 3,这是新功能和理论知识,我没有在生产环境验证过,但最符合你目前的状况。
    Mrzhang0320
        9
    Mrzhang0320  
    OP
       2018-02-06 10:44:58 +08:00
    @timothyye 好像看了很多资料说在运行的示例不能直接 copy,需要停掉再 copy,不然在写入数据的话 copy 的数据会有问题
    Mrzhang0320
        10
    Mrzhang0320  
    OP
       2018-02-06 10:45:58 +08:00
    @rrfeng 现在是一主两从,挂了一台,不知道停掉两个从 ,会不会像楼下说的,整个集群变成了只读
    Mrzhang0320
        11
    Mrzhang0320  
    OP
       2018-02-06 10:47:47 +08:00
    @onion83 非常感谢, 我们现在的集群 是一主两从,挂了一个从了,还有一主一从再运行,再停一个从就会变成只读了吗?
    onion83
        12
    onion83  
       2018-02-06 11:20:59 +08:00   2
    1、“我们现在的集群 是一主两从,挂了一个从了,还有一主一从再运行,再停一个从就会变成只读了吗?”

    100% 生产环境确认,请谨慎操作。

    2、对于 3 是可以尝试的方案,但是请务必理解文档的描述,例如会阻塞读等。

    db.fsyncLock() may block reads, including those necessary to verify authentication. Such reads are necessary to establish new connections to a mongod that enforces authorization checks.

    很可能需要调整程序,将 read preference 强制为 primary .

    3、其实最安全的办法,是将老机器的 datapath 转移一下(mv xxx xxx.old) 然后再做一个空的数据目录,启动从实例会从主库重新全量回放所有 oplog,但是时间无法保证。给你一个经验值,100G 数据,带索引重建,普通 SAS 硬盘大概需要 4 小时左右。

    4、终极武器(第三方工具)
    http://nosqldb.org/p/5173d275cbce24580a033bd8 (已经验证,相对好用)
    https://github.com/Qihoo360/mongosync/
    Mrzhang0320
        13
    Mrzhang0320  
    OP
       2018-02-06 11:30:11 +08:00
    @onion83 我现在是在用你说的第三个方法,但是我实时看那个 datapath 目录大小,发现增加很慢,有时候还会暂停,不知道什么机制,甚至有时候还会减少,我怕 1T 的数据要弄到过年。。。
    onion83
        14
    onion83  
       2018-02-06 11:48:09 +08:00   1
    1、实时进度可以在日志文件中找到 (配置项 systemLog.path) 中找到,不要告诉我你没有配...
    2、数据恢复不是问题,建索引那才叫痛苦 ....
    3、慢的请可以看看网络或者 IO 是否有瓶颈,我试过 7 天才恢复 100G 数据... 按你的情况,过完年都不一定能搞完,要么老老实实和老板道个歉,通宵停机维护吧。按千兆网络 70MB/s 来算,全量拷贝数据的时间为 1*1024*1024/70/60/60 = 4.16 小时,5 小时就能安心回家过年:)
    Mrzhang0320
        15
    Mrzhang0320  
    OP
       2018-02-06 11:59:31 +08:00
    @onion83 配了,看情况是得停机了;话说你那个终极武器可以不停机吗?你验证的时候
    xkeyideal
        16
    xkeyideal  
       2018-02-06 12:07:47 +08:00
    @Mrzhang0320 先把锅甩给 DBA 和运维,挂了这么长时间都没有发现,也是奇葩。

    停机,拷贝数据最靠谱吧,毕竟数据量太大

    mongodb 用来存 1T 的数据,做业务的人也是奇葩
    onion83
        17
    onion83  
       2018-02-06 12:48:29 +08:00   1
    mongosync 带 oplog 本质上是数据热拷贝和集群的状态无关,其它节点不会感知到目标机的存在,自然也就无需停机了。但是因为其基于 oplog 回放,所以建索引之类的操作依然无法避免,恢复起来的时间也是很长的,但好处是不影响其它机器和线上业务,放着慢慢搞也不迟。

    被恢复机器有一些需要注意的事项,例如实例要配置为单独节点( standalone,配置文件中 replication.replSetName 不要设置),最后看 mongosync 的日志文件,当状态为 full sync 的时候,就 kill 掉同步程序,关闭会被恢复数据库,修改配置文件,添加相同的 replicationreplSetName,最后在主节点上 rs.add() 被恢复机器即可。

    还有一个办法是使用磁盘快照,数据盘全盘打快照后,起实例挂新数据盘,这种方式验证过也是可行的(阿里云)

    所以,一个稳妥的生产环境,我觉得至少标配下列条件:

    1、一个隐含节点,实时同步数据,并可以用于故障的随时切换。
    2、一个隐含节点,延时同步数据,用于数据库误操作无法逆转时的有损恢复。
    3、以天为单位的数据盘快照,保留 30 天。
    caola
        18
    caola  
       2018-02-06 12:59:08 +08:00
    半个月没发现,说明真不是什么重要的服务,
    直接全量同步吧,半个月都过去了,也不差这点时间同步
    tvboxme
        19
    tvboxme  
       2018-02-06 15:10:30 +08:00
    干掉原始数据,当成个新节点全量同步,慢慢等,不着急。
    Mrzhang0320
        20
    Mrzhang0320  
    OP
       2018-02-06 15:15:08 +08:00
    @tvboxme 主要是数据太大了,要是一两百 G 我就直接等了,,而且 不是 ssd,就是普通硬盘
    tvboxme
        21
    tvboxme  
       2018-02-06 15:23:27 +08:00
    @Mrzhang0320 主要问题在于你家服务能不能停机,能停多久。 官网就提供了两种思路,按照你们的数据量,rsync 一份完整的存储需要多久,这个可以先自己生成一个 100G 的大文件来测试。如果网速是瓶颈,可以先在本地镜像一份,避免停机时间过长。
    如果不能接受这个程度的停机,你们的服务本来也正常运行着,初始化同步是最优的,反正已经 15d 了,再同步个 2-3d 也无所谓。
    goodryb
        22
    goodryb  
       2018-02-06 16:31:45 +08:00
    挂掉半个月都没出问题,我觉得还是重新全量同步比较靠谱,万一贸然停机导致预期外的故障或者损失,责任更大。
    hyi
        23
    hyi  
       2018-02-06 23:38:30 +08:00
    想问一下楼主,这是什么职位负责的啊,这是数据库问题吗
    Mrzhang0320
        24
    Mrzhang0320  
    OP
       2018-02-06 23:54:32 +08:00 via iPhone
    @hyi 这个就说来话长了,身兼多职,测试,运维,dba ……
    Mrzhang0320
        25
    Mrzhang0320  
    OP
       2018-02-07 10:10:22 +08:00
    @onion83 请问一下,你们停机复制的话 有什么好的办法可以让权限也同步过来。
    pmispig
        26
    pmispig  
       2018-02-07 10:22:20 +08:00
    如果你主库有磁盘快照的话,可以直接用主库的磁盘快照启动一个从节点,加入集群就可以了
    onion83
        27
    onion83  
       2018-02-07 12:20:09 +08:00
    @Mrzhang0320 如果是直接拷贝数据文件夹,理论上权限也会带过去。

    1、如果是副本集复制,有可能不会带权限。(未验证)

    2、如果所有的 user 和 role 都在默认的 admin 数据库中配置,
    可以尝试用 mongodump 将 admin 库导出来再用 mongoresotre 恢复。(未验证,请谨慎操作)

    mongodump -h <ip> -d admin -u <user> -p <password> --authenticationDatabase admin --dumpDbUsersAndRoles
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5115 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 01:14 PVG 09:14 LAX 17:14 JFK 20:14
    Do have faith in what you're doing.
    ubao msn 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