Системные требования

Для развертывания реплик MongoDB требуется операционная система Ubuntu 22.04 x64 LTS.

Требуется наличие процессора с поддержкой инструкций AVX.

Рекомендуемые системные требования сервера:

  • число аппаратных серверов — 1;
  • процессор — Intel, AMD (4+ процессорных ядер);
  • оперативная память — 4 ГБ;
  • место на диске — 100 ГБ;
  • производительность дискового массива (чтение/запись) — 2000 IOPS.

Подготовка к установке MongoDB

Перед началом работ по установке, необходимо определиться с требуемым количеством реплик БД.

Минимальное необходимое количество реплик БД — 3.
Максимальное количество реплик БД — 50.

Рекомендуется разворачивать нечетное количество реплик, так как четное количество не повышает отказоустойчивость по сравнению с меньшим на единицу нечетным количеством реплик.
Количество реплик БД следует выбирать с учетом таблицы ниже:

Общее количество репликКол-во реплик, которые можно потерять с сохранением работоспособности
31
41
52
62
73
83
94
104
115
125
136

Пример схемы работы с 3 репликами:

Установка MongoDB

Примечание

Приведенные ниже команды предназначены для установки MongoDB 6.0 на ОС Ubuntu 22.04 (Jammy Jellyfish)

1.1. Установите MongoDB на все сервера, которые будут выполнять роль реплик БД, при помощи следующих команд:

sudo apt update
sudo apt -y install gnupg curl
curl -fsSL https://www.mongodb.org/static/pgp/server-6.0.asc | \
   sudo gpg -o /usr/share/keyrings/mongodb-server-6.0.gpg \
   --dearmor
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-6.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list
sudo apt update
sudo apt-get install -y mongodb-org

1.2. Включите сервис MongoDB при помощи следующей команды:

sudo systemctl enable mongod

1.3. Отредактируйте файл конфигурации /etc/mongod.conf:

sudo nano /etc/mongod.conf

Базовая структура разделов net и replication в файле /etc/mongod.conf:

# mongod.conf

# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

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

# Where and how to store data.
storage:
  dbPath: /var/lib/mongo

# how the process runs
processManagement:
  timeZoneInfo: /usr/share/zoneinfo

# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1  # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.


#security:

#operationProfiling:

#replication:

#sharding:

## Enterprise-Only Options

#auditLog:

Описание основных параметров реплики БД в файле mongod.conf:

ПараметрЗначение по умолчаниюТребуемое значениеОписание
net.port2701727017Порт, по которому MongoDB будет принимать подключения к БД
net.bindIp127.0.0.10.0.0.0Список IP-адресов, которые MongoDB будет прослушивать для подключений к БД.
replication.replSetName
iotRepl

Название набора реплик, к которому будет принадлежать данная реплика БД.

Необходимо, чтобы это значение было одинаковым на всех репликах БД.

Пример итогового содержимого файла mongod.conf:

# mongod.conf

# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

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

# Where and how to store data.
storage:
  dbPath: /var/lib/mongo

# how the process runs
processManagement:
  timeZoneInfo: /usr/share/zoneinfo

# network interfaces
net:
  port: 27017
  bindIp: 0.0.0.0  # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.


#security:

#operationProfiling:

replication:
  replSetName: iotRepl

#sharding:

## Enterprise-Only Options

#auditLog:

В целях безопасности настоятельно рекомендуется ограничить доступ к порту, указанному в параметре net.port (по умолчанию: 27017), со всех IP-адресов, кроме IP-адресов реплик БД и IP-адреса платформы умного дома ELIS.

1.4. Запустите сервис MongoDB при помощи следующей команды:

sudo systemctl start mongod

1.5. Проверьте состояние сервиса MongoDB:

sudo systemctl status mongod

Пример вывода команды:

● mongod.service - MongoDB Database Server
     Loaded: loaded (/lib/systemd/system/mongod.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2025-04-16 05:08:36 UTC; 21h ago
       Docs: https://docs.mongodb.org/manual
   Main PID: 1084 (mongod)
     Memory: 2.7G
        CPU: 7min 59.969s
     CGroup: /system.slice/mongod.service
             └─1084 /usr/bin/mongod --config /etc/mongod.conf

Apr 16 05:08:36 repl-test-db systemd[1]: Started MongoDB Database Server.
Apr 16 05:08:37 repl-test-db mongod[1084]: {"t":{"$date":"2025-04-16T05:08:37.003Z"},"s":"I",  "c":"CONTROL",  "id":7484500, "ctx":"-","msg":"Environment variable MONGODB_CONFIG_OVERRIDE_NOFORK == 1, overriding \"processManagement.fork\" to false"}

В выводе данной команды необходимо найти состояние сервиса в поле Active. Сервис должен иметь состояние  active (running).

Настройка набора реплик

Примечание

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

2.1. Подключитесь к любой из реплик при помощи утилиты mongosh:

mongosh mongodb://[ip любой из реплик]:[port mongodb любой из реплик]

2.2. Инициируйте набор реплик следующей командой, подставив IP-адреса и порты MongoDB всех развернутых реплик БД:

rs.initiate(
   {
      _id: "iotRepl",
      version: 1,
      members: [
         { _id: 0, host : "[ip первой реплики]:[port MongoDB первой реплики]" },
         { _id: 1, host : "[ip второй реплики]:[port MongoDB второй реплики]" },
         { _id: 2, host : "[ip третьей реплики]:[port MongoDB третьей реплики]" }
      ]
   }
)

2.3. При помощи команды rs.status().members.map(x => x.stateStr) проверьте, что все реплики перешли в корректные состояния (одна PRIMARY, а все остальные SECONDARY). Этот процесс может занять до нескольких минут.

Пример выполнения команды для проверки состояния реплик в mongosh
iotRepl [direct: secondary] test> rs.status().members.map(x => x.stateStr)
[ 'PRIMARY', 'SECONDARY', 'SECONDARY' ]
  • Нет меток