2011-01-17 3 views
1

Я постоянно вставлял данные в автошарный монгодб. (не обновление, только вставка)nosql mongodb replicaset autosharding, потеря данных при запуске эксперимента

Экспериментальная установка 2 осколка, каждый осколок имеет 2 узла.

в shard1 -> node1 (первичный), node2 в shard2 -> node3 (первичный), node4

в одном осколке я принес вторичный узел (NODE2) вниз -> еще данные получили вставленные правильно Теперь Я также привел первичный (node1) вниз -> полный осколок вниз

Удивительно, но вся установка mongo не писала.

есть еще один поворот в истории. Теперь я привел узел2, так как это единственный доступный узел, он beccame primary и начал принимать данные.

После 10 минут я также привел узел1 вверх.

Но когда я проверил данные, которые я вставил в node1 (когда node2 вниз) был потерян :(.

s1    s2 
    (n1,n2)  (n3,n4) 
    ---------  --------- 
1. (up,up)  (up, up) -> data was getting inserted 
2. (up,down)  (up, up) -> data was getting inserted properly (but got lost :() 
3. (down, down) (up, up) -> no data inserts were happening 
4. (down, up) (up, up) -> started taking data again 
5. (up, up)  (up, up) -> n1 picked data from n2, but couldn't give the data to n2 

на последней стадии, когда я принес n1 вверх, он получил новые записи от n2, но что n1 получил на стадии 2 выше, были полностью потеряли :(.

это ожидаемое поведение Монго?

Кто-то пожалуйста, помогите мне, я могу запустить несколько экспериментов, если требуется :).

Заранее спасибо, Vivekananda Tadala

ответ

3

Если вы сбиваете один элемент в наборе реплик из двух частей, другой перестает принимать записи. См. Это explanation, почему вам нужны три члена и всегда используйте безопасный режим, когда вы играете.

Репликация в MongoDB является однонаправленной: подчиненный копирует данные из более современного ведомого или ведущего устройства. У вас не может быть двух узлов, копирующих данные друг от друга (пока). Возможно, вас заинтересует ensuring write replication.

Вставка в куски на сложенном осколке не будет работать, но вы можете вставить куски на осколки, которые находятся на другом осколке. Вы можете использовать db.printShardingStatus(), чтобы увидеть, какие куски есть.

+0

спасибо за ответ, он очистил многие из моих сомнений, но есть ли способ получить данные о мертвом хозяине и подтолкнуть его к новому хозяину? мы можем что-то сделать с помощью oplog? –

+0

Да ... по крайней мере теоретически. Всякий раз, когда происходит откат, данные должны записываться в .bson-файл в каталоге данных. Вы можете использовать mongorestore, чтобы применить его к текущему мастеру. Однако мы (разработчики MongoDB) говорили сегодня о том, как мы не были уверены, действительно ли он писал файл отката, так что там может быть ошибка. Но если есть, то он будет установлен на 1.8.0. – kristina

+0

Ложная тревога, она не сломана. Данные будут сохранены в каталоге rollback /, см. Http://www.snailinaturtleneck.com/blog/2011/01/19/how-to-use-replica-set-rollbacks/. – kristina