How safe is MongoDB's safe mode on inserts?

前端 未结 2 1262
借酒劲吻你
借酒劲吻你 2021-02-13 09:16

I am working on a project which has some important data in it. This means we cannot to lose any of it if the light or server goes down. We are using MongoDB for the database. I\

2条回答
  •  傲寒
    傲寒 (楼主)
    2021-02-13 09:44

    I received a really nice answer from a person called GVP on google groups. I will quote it(basically it adds up to Rich's answer):

    I'd like to be sure that my data is in the database after the insert and rollback the whole batch if one element was not inserted.

    This is a complex topic and there are several trade-offs you have to consider here.

    Should I use sharding?

    Sharding is for scaling writes. For data safety, you want to look a replica sets.

    Should I use some specific mongoDB commands?

    First thing to consider is "safe" mode or "getLastError()" as indicated by Andreas. If you issue a "safe" write, you know that the database has received the insert and applied the write. However, MongoDB only flushes to disk every 60 seconds, so the server can fail without the data on disk.

    Second thing to consider is "journaling" (v1.8+). With journaling turned on, data is flushed to the journal every 100ms. So you have a smaller window of time before failure. The drivers have an "fsync" option (check that name) that goes one step further than "safe", it waits for acknowledgement that the data has be flushed to the disk (i.e. the journal file). However, this only covers one server. What happens if the hard drive on the server just dies? Well you need a second copy.

    Third thing to consider is replication. The drivers support a "W" parameter that says "replicate this data to N nodes" before returning. If the write does not reach "N" nodes before a certain timeout, then the write fails (exception is thrown). However, you have to configure "W" correctly based on the number of nodes in your replica set. Again, because a hard drive could fail, even with journaling, you'll want to look at replication. Then there's replication across data centers which is too long to get into here. The last thing to consider is your requirement to "roll back". From my understanding, MongoDB does not have this "roll back" capacity. If you're doing a batch insert the best you'll get is an indication of which elements failed.

    Here's a link to the PHP driver on this one: http://it.php.net/manual/en/mongocollection.batchinsert.php You'll have to check the details on replication and the W parameter. I believe the same limitations apply here.

提交回复
热议问题