Сценарий:
Иметь кластер репликации MongoDB с 3 узлами.Непосредственно перед выдачей команды построения индекса состояние было следующим: УЗЕЛ 1: ВТОРИЧНЫЙ УЗЕЛ 2: ВТОРИЧНЫЙ УЗЕЛ 3: ОСНОВНОЙ
В момент 1, на НОДЕ 3 (ПЕРВИЧНАЯ) была введена команда для создания индекса:
db.scores.createIndex({member_id: 1, metric_name: 1, score_id: 1, "writes.k": 1}, {background: true});
Построение индекса работало в фоновом режиме около 2 часов 17 минут, после чего я случайно нажал CTRL + C в сеансе SSH и завершил процесс.После этого он продолжал работать еще несколько минут в фоновом режиме (я мог наблюдать в журналах Kibana), но затем его остановили.Поскольку mongod
создал блокировки на узле 3, пришлось перезапустить докер-контейнер на узле 3 (первичном), в котором работает mongod
.Из-за перезапуска два других узла в кластере выбрали NODE 1 в качестве нового ПЕРВИЧНОГО.Когда NODE 3 вернулся в нормальное состояние, я не смог подключиться к оболочке mongo
, но журналы Kibana показывали, что он поднял индексную сборку на переднем плане и продолжал убегать с ней.Мы даем это закончить.
Текущее состояние:
- Только NODE 3 (все еще ВТОРОЙ) имеет индекс с именем
'member_id_1_metric_name_1_score_id_1_writes.k_1'
. Попытка удалить индекс на NODE 3 приводит к ошибке:
SECONDARY>
db.scores.dropIndex('member_id_1_metric_name_1_score_id_1_writes.k_1')
{
"ok" : 0,
"errmsg" : "not master",
"code" : 10107,
"codeName" : "NotMaster"
}
Попытка удаления индекса на УЗЕ 1 (ОСНОВНОЕ) выдает ошибку:
db.scores.dropIndex('member_id_1_metric_name_1_score_id_1_writes.k_1')
{
"nIndexesWas" : 4,
"ok" : 0,
"errmsg" : "index not found with name [member_id_1_metric_name_1_score_id_1_writes.k_1]",
"code" : 27,
"codeName" : "IndexNotFound"
}
Что делать?Какие есть варианты удалить этот индекс и повторить попытку с нового PRIMARY (NODE 1)?Каковы последствия того, что этот индекс расположен так и присутствует только на одном ВТОРИЧНОМ узле в репликасе?Насколько это плохо?
Спасибо!