В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.
При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.
Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».
Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this
. Возьмем этот пример:
public class Some {
private int id;
public int getId(){
return this.id;
}
public setId( int newId ) {
this.id = newId;
}
}
И в другом месте вашего кода:
Some reference = new Some(); // Point to a new object of type Some()
Some otherReference = null; // Initiallly this points to NULL
reference.setId( 1 ); // Execute setId method, now private var id is 1
System.out.println( reference.getId() ); // Prints 1 to the console
otherReference = reference // Now they both point to the only object.
reference = null; // "reference" now point to null.
// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );
// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...
Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference
и otherReference
оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.
Ожидается, что, поскольку большинство членов отключены, MongoDB не предполагает, что последний оставшийся член согласован.
Когда у вас есть большинство участников, есть несколько вариантов: http://docs.mongodb.org/manual/tutorial/reconfigure-replica-set-with-unavailable-members/
Вы говорите, что когда первичный срез отключен от двух других узлов, он должен оставаться на месте, в противном случае доступность записи теряется, но это не обязательно так. Если два других узла находятся на самом деле вверх, а с другой стороны сетевого раздела, то они выбрали новый первичный (поскольку два из трех - это большинство), и именно это первично принимает новые записи.
Если предыдущий первичный продолжал принимать записи, у вас были бы потенциально конфликтующие данные, в которых не было механизма для решения. Поскольку набор реплик MongoDB является единой первичной архитектурой (в отличие от системы с несколькими мастерами), механизм выборов гарантирует, что одновременно не может быть двух праймериз.
С точки зрения двух второстепенных, сетевой раздел такой же, как первичный, недоступен, и с точки зрения первичной сети сетевой раздел неотличим от «обоих остальных узлов». Он уходит в отставку, потому что в случае сетевого раздела уже может быть другой первичный с другой стороны, и он уверяет, что не может быть двух праймериз, спустившись вниз.
Не так, набор реплик «отступает, когда первичный чувствует себя одиноким - причина, по которой основные шаги вниз, когда он чувствует себя в одиночку, заключается в том, чтобы сохранить целостность набора реплик в целом. Неверно, что установка высокоприоритетного показателя фиксирует роль узла - первичный может быть избран только на основе консенсуса среди большинства - все приоритетные оценки влияют на выборы, когда все остальные вещи равны.
Я высоко рекомендуйте отличную серию «назовите меня, возможно», чтобы прочитать проблемы доступности записи в распределенной системе: http://aphyr.com/posts/281-call-me-maybe-carly-rae-jepsen- и самая опасность-оф-сеть-разбиения
Просто чтобы услышать ответы. Ожидается поведение в этом сценарии. MongoDB использует алгоритм выбора лидера для избрания нового лидера. Так что, если нет большинства, вы не можете выбрать лидера и, следовательно, не писать.
Ваш единственный вариант в точке, где два узла опущены, состоит в том, чтобы перенастроить ваш набор реплик как набор реплик 1 узла, чтобы сделать его доступным для записи , Вы можете сделать это с помощью команды rs.reconfig cmd только с одним сервером. Однако учтите, что это должна быть временная и аварийная конфигурация. Для большей продолжительности вы должны иметь нечетное количество общих узлов (3+) в вашей конфигурации реплики.
Попробуйте использовать арбитра , большинство документов говорят, что нужно использовать только один, но в этом случае вам нужно выиграть выборы.
From http: // docs.mongodb.org/manual/core/replica-set-architectures/:
Отказоустойчивость для набора реплик - это количество членов, которые могут стать недоступными и по-прежнему оставлять достаточно членов в наборе, чтобы выбрать первичный. Другими словами, это разница между количеством членов в наборе и большинством голосов, необходимым для выбора первичного. Без первичного набора реплик не может принимать операции записи. Отказоустойчивость - это эффект размера набора реплик, но связь не является прямой.
blockquote>Подробнее о выборах: http://docs.mongodb.org/manual/core/replica -set-election /
Подробнее о судьях: http://docs.mongodb.org/manual/faq/replica-sets/#how-many-arbiters-do- реплики-наборы, необходимо