Maison > Questions et réponses > le corps du texte
RT,
听人说过:
20M的情况下插入1百万的数据进行分片,会丢数据
63M的情况下插入6千万条的数据进行分片也有丢数据的情况
不同的mongodb版本也有差异
大伙对这个值有经验吗?
高洛峰2017-05-02 09:20:15
Les "données perdues" et la taille des morceaux sont deux choses sans rapport et n'ont aucun lien logique direct. Je ne sais pas qui mettrait ces deux choses ensemble et vous le dirait. Comme je ne sais pas à quel scénario spécifique fait référence la perte de données, je vais vous donner quelques réponses qui pourraient vous être utiles en fonction de ce que je sais.
Il semble que vous soyez préoccupé par le problème de la perte de données et non par la taille du fragment. De plus, il n'y a généralement aucun problème si la taille du fragment est laissée à la valeur par défaut, je vais donc ignorer le problème de la taille du fragment.
Donnez quelques explications sur la "perte de données". Pour n’importe quelle base de données, perdre des données sans raison est intolérable. Il existe donc une situation où des données sont perdues, soit
Il existe des facteurs irrésistibles, tels qu'une panne de courant, des dommages matériels, une panne de réseau, etc.
Raison de configuration
Il y a un sérieux bug dans le logiciel.
De toute façon, vous ne pouvez rien faire à propos de 1. Cela doit être minimisé via la fonction de réplication de ReplicaSet.
Point 2, si vous n'avez pas de journal ouvert (il est ouvert par défaut), vous risquez de perdre des données dans les 30 ms en cas de panne de courant ou de crash du programme. Si les données sont très importantes et ne peuvent pas tolérer une perte de 30 ms, veuillez activer le paramètre j :
mongodb://ip:port/db?replicaSet=rs&j=1
(ce qui précède les paramètres peuvent également être transmis via le code. Précisez en fonction de la granularité d'une seule requête, veuillez consulter la documentation du pilote que vous utilisez)
Ce paramètre garantit que l'écriture des données est bloquée jusqu'à ce que le journal soit écrit sur le disque.
Mais pensez-vous que les données sont en sécurité si elles sont placées sur disque ? N'oubliez pas qu'il s'agit d'un environnement distribué et que la sécurité des données d'une seule machine ne représente pas le cluster. Donc en cas d'urgence, bien que le journal soit placé, il n'a pas eu le temps d'être copié sur les autres nœuds de la réplique. Ensuite primary
est supprimé juste à temps, et les autres nœuds deviendront le nouveau primary
par élection. Ceci Une situation intéressante se produira à ce moment-là appelée rollback. Si vous êtes intéressé, vous pouvez le lire. Bien entendu, la vitesse de copie est généralement très rapide et la restauration est très rare. Eh bien, vous pouvez toujours penser que ce n'est pas assez sécurisé, alors il y a un paramètre w qui peut être utilisé :
mongodb://ip:port/db?replicaSet=rs&j=1&w=1
paramètre w Cela garantit que les opérations d'écriture sont bloquées jusqu'à ce que les données atterrissent sur plusieurs nœuds (w=1/2/3...n).
Est-ce sûr ? Désolé, dans une situation particulièrement malheureuse (vous devriez vraiment acheter un billet de loterie), vous avez copié les données sur plusieurs nœuds. Et si cet ensemble de nœuds échouait en même temps ? Nous avons donc w=majority (majorité). Lorsque le cluster perd la plupart des nœuds, il passe en lecture seule, donc aucune nouvelle donnée ne sera écrite et il n'y aura pas de restauration. Lorsque tout sera restauré, vos données seront toujours là.
Voici quelques situations dans lesquelles une perte de données se produira. On peut imaginer que la configuration de w et j affectera certainement dans une large mesure l'efficacité de l'écriture tout en garantissant la sécurité des données. Il s'agit en fait d'une politique que vous personnalisez en fonction de votre tolérance à la perte de données et qui n'est pas considérée comme un bug.
Une autre réflexion : je rencontre souvent des gens dans la communauté qui aiment faire ce genre de chose :
kill -9 mongod
Si vous me demandez, c'est tout simplement trop cruel. Pourquoi utilisez-vous des canons pour tuer les moustiques dès que vous arrivez ? Dans ce cas, la perte de données ne peut être que méritée. En fait,
kill mongod
est sûr, mais -9 est de votre faute.
En ce qui concerne le point 3, des bugs ayant entraîné une perte de données se sont produits pendant le processus de développement de mongodb 3.0.8-3.0.10, qui est le domaine le plus durement touché, alors évitez ces versions. Cela dit, quel processus de développement logiciel ne pose pas de problèmes ? La version 3.0.11 a été publiée le jour même où le problème a été découvert dans la version 3.0.10, et la vitesse de réparation était déjà très rapide.
D'accord, après avoir dit tant de choses, je ne sais pas si cela sera utile à celui qui pose la question. Juste un rappel, décrivez le problème le plus clairement possible, sinon vous ne pouvez que deviner comme moi quel genre de problème vous avez rencontré dans quel scénario. La situation la plus probable est le vieil dicton :
.Entrée des ordures, sortie des ordures