Назад | Перейти на главную страницу

Вторичная реплика MongoDB постоянно находится в недоступном / работоспособном состоянии

У меня есть стандартный набор реплик MongoDB с тремя узлами:

В настоящее время я не могу подключиться к ним как к набору реплик, я могу подключиться только через основной. Если я сбегу rs.status() на первичном я неоднократно получаю:

{
        "set" : "ecReplica",
        "date" : ISODate("2018-04-23T19:12:10.014Z"),
        "myState" : 1,
        "term" : NumberLong(-1),
        "heartbeatIntervalMillis" : NumberLong(2000),
        "members" : [
                {
                        "_id" : 0,
                        "name" : "ip-10-0-3-169:27017",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",
                        "uptime" : 10717677,
                        "optime" : Timestamp(1524510722, 15),
                        "optimeDate" : ISODate("2018-04-23T19:12:02Z"),
                        "lastHeartbeat" : ISODate("2018-04-23T19:12:08.186Z"),
                        "lastHeartbeatRecv" : ISODate("2018-04-23T19:12:09.656Z"),
                        "pingMs" : NumberLong(1),
                        "syncingTo" : "ip-10-0-2-35:27017",
                        "configVersion" : 405240
                },
                {
                        "_id" : 1,
                        "name" : "ip-10-0-1-48:27017",
                        "health" : 0,
                        "state" : 6,
                        "stateStr" : "(not reachable/healthy)",
                        "uptime" : 0,
                        "optime" : Timestamp(0, 0),
                        "optimeDate" : ISODate("1970-01-01T00:00:00Z"),
                        "lastHeartbeat" : ISODate("2018-04-23T19:12:09.116Z"),
                        "lastHeartbeatRecv" : ISODate("2018-04-23T19:12:08.404Z"),
                        "pingMs" : NumberLong(0),
                        "authenticated" : false,
                        "configVersion" : -1
                },
                {
                        "_id" : 2,
                        "name" : "ip-10-0-2-35:27017",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "uptime" : 10717680,
                        "optime" : Timestamp(1524510722, 15),
                        "optimeDate" : ISODate("2018-04-23T19:12:02Z"),
                        "electionTime" : Timestamp(1524486537, 1),
                        "electionDate" : ISODate("2018-04-23T12:28:57Z"),
                        "configVersion" : 405240,
                        "self" : true
                }
        ],
        "ok" : 1
}

Когда я подключаюсь по ssh к основному, я вижу следующую ошибку в /var/log/mongodb/mongod.log:

2018-04-23T19: 23: 54.326 + 0000 I REPL [ReplicationExecutor] Ошибка в запросе пульса на ip-10-0-1-48: 27017; Неавторизованный администратор не авторизован для выполнения команды {replSetHeartbeat: "ecReplica", pv: 1, v: 405240, from: "ip-10-0-2-35: 27017", fromId: 2, checkEmpty: false}

Дополнительная информация

Связь

я жестяная банка подключиться ко всем трем узлам индивидуально с помощью Mongo Shell и Robo3T, используя SSH-туннелирование, но я не могу подключиться к трем в качестве набора реплик.

Производственные серверы, по-видимому, успешно подключаются к набору реплик.

телнет

telnet 10.0.1.48 27017 из 10.0.2.35 работает.

/etc/mongod.conf

Конфигурационные файлы практически идентичны, единственная разница заключается в net раздел:

Узел 10.0.1.48:

# network interfaces
net:
  port: 27017
  bindIp: [127.0.0.1,10.0.3.169,10.0.2.35]

Узел 10.0.3.169:

# network interfaces
net:
  port: 27017
  bindIp: [10.0.1.48,10.0.2.35,127.0.0.1]

Узел 10.0.2.35:

# network interfaces
net:
  port: 27017
  bindIp: [127.0.0.1,10.0.3.169,10.0.1.48]

ВНИМАНИЕ: в security раздел пуст, так что это не проблема с ключевым файлом.

db.version ()

3.2.0

Инфраструктура

Все узлы работают в одном AWS VPC, находясь в разных зонах доступности, они принадлежат к одной группе безопасности и используют одни и те же сетевые ACL и таблицы маршрутов.


Это унаследованная установка, она живет более 2-х лет.

Что мне не хватает?

Кажется, что ваши настройки все еще auth отключен в ReplicaSet.

Чтобы включить его, просто добавьте security.keyFile в настройках или используйте --keyFile в опции командной строки.

Вот пример, показывающий, как создать такой файл:

openssl rand -base64 756 > <path-to-keyfile>
chmod 400 <path-to-keyfile>

затем добавить к mongod.conf путь к ключевому файлу жанра:

security:
   authorization: enabled
   keyFile: /path/to/keyfile

перезапустите службу mongod, прямо сейчас ваш mongo должен быть auth включен.

для получения дополнительной информации о keyFile, Ссылаться на Обеспечить контроль доступа к ключевым файлам в наборе реплик

Мне удалось найти корень проблемы благодаря информации от @Stennie.

Я изменил конфигурацию набора реплик, чтобы использовать фактические IP-адреса вместо внутреннего DNS AWS.

Также я исправил bindIp вариант для хозяев:

# Where and how to store data.
storage:
  dbPath: /var/lib/mongodb
  journal:
    enabled: true
#  engine:
#  mmapv1:
#  wiredTiger:

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log

# network interfaces
net:
  port: 27017
  bindIp: [127.0.0.1,**INSTANCE PRIVATE IP**]


#processManagement:

#security:
#  authorization: enabled

#operationProfiling:

replication:
  replSetName: ecReplica
#sharding:

## Enterprise-Only Options:

#auditLog:

#snmp:

Все еще работает rs.status() дал мне:

{
    "set" : "ecReplica",
    "date" : ISODate("2018-04-25T16:03:27.277Z"),
    "myState" : 1,
    "term" : NumberLong(-1),
    "heartbeatIntervalMillis" : NumberLong(2000),
    "members" : [
        {
            "_id" : 0,
            "name" : "10.0.3.169:27017",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
            "uptime" : 6153,
            "optime" : Timestamp(1524671340, 1),
            "optimeDate" : ISODate("2018-04-25T15:49:00Z"),
            "electionTime" : Timestamp(1524672170, 1),
            "electionDate" : ISODate("2018-04-25T16:02:50Z"),
            "configVersion" : 405245,
            "self" : true
        },
        {
            "_id" : 1,
            "name" : "10.0.1.48:27017",
            "health" : 0,
            "state" : 6,
            "stateStr" : "(not reachable/healthy)",
            "uptime" : 0,
            "optime" : Timestamp(0, 0),
            "optimeDate" : ISODate("1970-01-01T00:00:00Z"),
            "lastHeartbeat" : ISODate("2018-04-25T16:03:26.532Z"),
            "lastHeartbeatRecv" : ISODate("2018-04-25T16:03:25.651Z"),
            "pingMs" : NumberLong(0),
            "authenticated" : false,
            "configVersion" : -1
        },
        {
            "_id" : 2,
            "name" : "10.0.2.35:27017",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 5916,
            "optime" : Timestamp(1524671340, 1),
            "optimeDate" : ISODate("2018-04-25T15:49:00Z"),
            "lastHeartbeat" : ISODate("2018-04-25T16:03:26.531Z"),
            "lastHeartbeatRecv" : ISODate("2018-04-25T16:03:25.760Z"),
            "pingMs" : NumberLong(1),
            "lastHeartbeatMessage" : "could not find member to sync from",
            "configVersion" : 405245
        }
    ],
    "ok" : 1
}

Также я заметил, что следующая строка была раскомментирована в /etc/mongod.conf в 10.0.1.48:

security:
  authorization: enabled

В двух других конфигурационных файлах такая строка была прокомментирована.

Когда я закомментировал authorization line и перезапустил службу, мошеннический узел наконец смог синхронизироваться:

{
    "set" : "ecReplica",
    "date" : ISODate("2018-04-25T16:14:18.489Z"),
    "myState" : 1,
    "term" : NumberLong(-1),
    "heartbeatIntervalMillis" : NumberLong(2000),
    "members" : [
        {
            "_id" : 0,
            "name" : "10.0.3.169:27017",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 70,
            "optime" : Timestamp(1524672835, 2),
            "optimeDate" : ISODate("2018-04-25T16:13:55Z"),
            "lastHeartbeat" : ISODate("2018-04-25T16:14:18.248Z"),
            "lastHeartbeatRecv" : ISODate("2018-04-25T16:14:16.605Z"),
            "pingMs" : NumberLong(1),
            "lastHeartbeatMessage" : "syncing from: 10.0.2.35:27017",
            "syncingTo" : "10.0.2.35:27017",
            "configVersion" : 405245
        },
        {
            "_id" : 1,
            "name" : "10.0.1.48:27017",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 186,
            "optime" : Timestamp(1524672835, 2),
            "optimeDate" : ISODate("2018-04-25T16:13:55Z"),
            "lastHeartbeat" : ISODate("2018-04-25T16:14:18.313Z"),
            "lastHeartbeatRecv" : ISODate("2018-04-25T16:14:17.533Z"),
            "pingMs" : NumberLong(3),
            "lastHeartbeatMessage" : "syncing from: 10.0.3.169:27017",
            "syncingTo" : "10.0.3.169:27017",
            "configVersion" : 405245
        },
        {
            "_id" : 2,
            "name" : "10.0.2.35:27017",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
            "uptime" : 186,
            "optime" : Timestamp(1524672835, 2),
            "optimeDate" : ISODate("2018-04-25T16:13:55Z"),
            "infoMessage" : "could not find member to sync from",
            "electionTime" : Timestamp(1524672748, 1),
            "electionDate" : ISODate("2018-04-25T16:12:28Z"),
            "configVersion" : 405245,
            "self" : true
        }
    ],
    "ok" : 1
}