DevOps

Как установить ReplicaSet MongoDB на localhost

Иногда, требуется запустить репликасет mongod на локальном хосте. Из статьи вы узнаете как буквально за 10 минут поднять replicaset на вашем компьютере. Надеюсь вы уже прочитали статьи как установить mongodb на локальном хосте, и как добавить пользователя в mongodb, чтобы немного познакомиться с монгой.

Что такое репликасет

Source: medium

В двух словах, репликасет, это набор нод mongodb, минимум трех, максимум 50, в которых есть одна primary нода, остальные secondary. Я думаю вы и так это знаете. Либо можете прочитать в документации на сайте mongodb. Давайте сразу перейдем к настройке.

Изменения в конфиг файлах

Для того чтобы настроить репликасет, нам необходимо добавить пару строк в файл конфига монги. Это строки:

replication:
  replSetName: REPLIASET_NAME
security:
    keyFile: KEY_FILE_PATH_AND_NAMECode language: Bash (bash)

replSetName — это имя нашего репликасета

keyFile — файл для secure общения нод между друг другом

Полный конфиг вы можете увидеть ниже.

Создание директорий и файлов

Давайте первоначально создадим директории для нашего replicaset.

Путь моей домашней директории выглядит так:

/home/denisCode language: Bash (bash)

Вы будете работать со своей и заменяйте пути на свои.

Создаем директорию репликасета:

mkdir rs
cd rsCode language: Bash (bash)

Далее создадим директории для трех нод:

mkdir {node1,node2,node3}Code language: Bash (bash)

Далее создадим в каждой папке директорию для данных и для логов

cd /home/denis/rs/node1 
mkdir {data,log}
cd /home/denis/rs/node2
mkdir {data,log}
cd /home/denis/rs/node3
mkdir {data,log}Code language: Bash (bash)

Далее создадим ключ:

openssl rand -base64 741 > /home/denis/rs/key
chmod 400 /home/denis/rs/key Code language: Bash (bash)

Далее создадим три конфиг файла, для каждой ноды.

Первая нода:

nano /home/denis/rs/mongodb-1.confCode language: Bash (bash)

 Вставляем туда:

storage:
  dbPath: /home/denis/rs/node1/data
net:
  bindIp: localhost
  port: 27011
security:
  authorization: enabled
  keyFile: /home/denis/rs/key
systemLog:
  destination: file
  path: /home/denis/rs/node1/log/mongod.log
  logAppend: true
processManagement:
  fork: true
replication:
  replSetName: localhost-rsCode language: Bash (bash)

Создаем второй конфиг, для второй ноды:

nano /home/denis/rs/mongodb-2.confCode language: Bash (bash)

 Вставляем туда:

storage:
  dbPath: /home/denis/rs/node2/data
net:
  bindIp: localhost
  port: 27012
security:
  authorization: enabled
  keyFile: /home/denis/rs/key
systemLog:
  destination: file
  path: /home/denis/rs/node2/log/mongod.log
  logAppend: true
processManagement:
  fork: true
replication:
  replSetName: localhost-rsCode language: Bash (bash)

И третий конфиг:

nano /home/denis/rs/mongodb-3.confCode language: Bash (bash)

 Вставляем туда:

storage:
  dbPath: /home/denis/rs/node3/data
net:
  bindIp: localhost
  port: 27013
security:
  authorization: enabled
  keyFile: /home/denis/rs/key
systemLog:
  destination: file
  path: /home/denis/rs/node3/log/mongod.log
  logAppend: true
processManagement:
  fork: true
replication:
  replSetName: localhost-rsCode language: Bash (bash)

Если вы заметили, то мы меняем в каждом конфиге папку с данными, папку с логами, порт на котором будет крутится монго.

Наша директория rs должна выглядеть так:

-r-------- 1 denis denis 1004 фев 26 22:12 key
-rw-rw-r-- 1 denis denis  313 фев 26 22:15 mongodb-1.conf
-rw-rw-r-- 1 denis denis  313 фев 26 22:18 mongodb-2.conf
-rw-rw-r-- 1 denis denis  313 фев 26 22:18 mongodb-3.conf
drwxrwxr-x 4 denis denis 4,0K фев 26 22:11 node1
drwxrwxr-x 2 denis denis 4,0K фев 26 22:08 node2
drwxrwxr-x 2 denis denis 4,0K фев 26 22:08 node3Code language: Bash (bash)

Запуск репликасета монгодб

Запускаем ноды:

cd /home/denis/rs
mongod -f mongodb-1.conf
mongod -f mongodb-2.conf
mongod -f mongodb-3.confCode language: Bash (bash)

У вас на каждый запуск должно вывестись сообщение примерно такого плана:

about to fork child process, waiting until server is ready for connections.
forked process: 68014
child process started successfully, parent exitingCode language: Bash (bash)

Если вы получили ошибку:

about to fork child process, waiting until server is ready for connections.
forked process: 67574
ERROR: child process failed, exited with 100
To see additional information in this output, start without the "--fork" option.Code language: Bash (bash)

То можете зайти в лог файл того процесса, который запускали и посмотреть в чем проблема. Путь в лог файлу у вас прописан в конфиге. Например в первый раз я получил ошибку и лог файл у меня был такой:

{"t":{"$date":"2021-02-26T22:20:37.933+03:00"},"s":"I",  "c":"CONTROL",  "id":23285,   "ctx":"main","msg":"Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'"}
{"t":{"$date":"2021-02-26T22:20:37.947+03:00"},"s":"W",  "c":"ASIO",     "id":22601,   "ctx":"main","msg":"No TransportLayer configured during NetworkInterface startup"}
{"t":{"$date":"2021-02-26T22:20:37.947+03:00"},"s":"I",  "c":"NETWORK",  "id":4648601, "ctx":"main","msg":"Implicit TCP FastOpen unavailable. If TCP FastOpen is required, set tcpFastOpenServer, tcpFastOpenClient, and tcpFastOpenQueueSize."}
{"t":{"$date":"2021-02-26T22:20:37.948+03:00"},"s":"W",  "c":"ASIO",     "id":22601,   "ctx":"main","msg":"No TransportLayer configured during NetworkInterface startup"}
{"t":{"$date":"2021-02-26T22:20:38.035+03:00"},"s":"I",  "c":"STORAGE",  "id":4615611, "ctx":"initandlisten","msg":"MongoDB starting","attr":{"pid":67574,"port":27011,"dbPath":"/home/denis/rs/node1/db","architecture":"64-bit","host":"denis-VirtualBox"}}
{"t":{"$date":"2021-02-26T22:20:38.036+03:00"},"s":"I",  "c":"CONTROL",  "id":23403,   "ctx":"initandlisten","msg":"Build Info","attr":{"buildInfo":{"version":"4.4.0","gitVersion":"563487e100c4215e2dce98d0af2a6a5a2d67c5cf","openSSLVersion":"OpenSSL 1.1.1f  31 Mar 2020","modules":[],"allocator":"tcmalloc","environment":{"distmod":"ubuntu1804","distarch":"x86_64","target_arch":"x86_64"}}}}
{"t":{"$date":"2021-02-26T22:20:38.036+03:00"},"s":"I",  "c":"CONTROL",  "id":51765,   "ctx":"initandlisten","msg":"Operating System","attr":{"os":{"name":"Ubuntu","version":"20.04"}}}
{"t":{"$date":"2021-02-26T22:20:38.036+03:00"},"s":"I",  "c":"CONTROL",  "id":21951,   "ctx":"initandlisten","msg":"Options set by command line","attr":{"options":{"config":"mongodb-1.conf","net":{"bindIp":"localhost","port":27011},"processManagement":{"fork":true},"replication":{"replSetName":"localhost-rs"},"security":{"authorization":"enabled","keyFile":"/home/denis/rs/key"},"storage":{"dbPath":"/home/denis/rs/node1/db"},"systemLog":{"destination":"file","logAppend":true,"path":"/home/denis/rs/node1/log/mongod.log"}}}}
{"t":{"$date":"2021-02-26T22:20:38.044+03:00"},"s":"E",  "c":"STORAGE",  "id":20557,   "ctx":"initandlisten","msg":"DBException in initAndListen, terminating","attr":{"error":"NonExistentPath: Data directory /home/denis/rs/node1/db not found. Create the missing directory or specify another path using (1) the --dbpath command line option, or (2) by adding the 'storage.dbPath' option in the configuration file."}}
{"t":{"$date":"2021-02-26T22:20:38.051+03:00"},"s":"I",  "c":"NETWORK",  "id":20562,   "ctx":"initandlisten","msg":"Shutdown: going to close listening sockets"}
{"t":{"$date":"2021-02-26T22:20:38.051+03:00"},"s":"I",  "c":"-",        "id":20520,   "ctx":"initandlisten","msg":"Stopping further Flow Control ticket acquisitions."}
{"t":{"$date":"2021-02-26T22:20:38.051+03:00"},"s":"I",  "c":"CONTROL",  "id":20565,   "ctx":"initandlisten","msg":"Now exiting"}
{"t":{"$date":"2021-02-26T22:20:38.051+03:00"},"s":"I",  "c":"CONTROL",  "id":23138,   "ctx":"initandlisten","msg":"Shutting down","attr":{"exitCode":100}}

Code language: Bash (bash)

Ошибка описана в строке 9 лога. То есть у меня не было директории db, так как директория называлась data, я поменял в конфиге название директории в конфиге и монгодб запустилась.

Чтобы посмотреть запущены ли ваши ноды, надо ввести команду:

ps -ef | grep mongo                                                   Code language: Bash (bash)

Вы должны увидеть следующее:

denis      68897    1986  1 22:32 ?        00:00:06 mongod -f mongodb-1.conf
denis      68950    1986  1 22:32 ?        00:00:06 mongod -f mongodb-2.conf
denis      69004    1986  1 22:32 ?        00:00:07 mongod -f mongodb-3.confCode language: Bash (bash)

Создаем ReplicaSet Mongodb

Теперь нам необходимо подключится к первой ноде:

mongo --host localhost:27011Code language: Bash (bash)

Далее необходимо выполнить команду:

rs.initiate()Code language: Bash (bash)

После этого, необходимо подождать несколько секунд и создать суперпользователя:

use admin
db.createUser({
user: "rootuser",
pwd: "rootpassword",
roles : [ "root" ]
})Code language: Bash (bash)

Выйти из монги, нажав CTRL+C и залогиниться снова:

mongo --host localhost:27011 --username rootuser --password rootpassword --authenticationDatabase adminCode language: Bash (bash)

Добавляем ноды:

rs.add("localhost:27012")Code language: Bash (bash)

Вы должны увидеть сообщение:

{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1614368238, 2),
"signature" : {
"hash" : BinData(0,"ywMZcKvyYiIZCoQA9MiuDEafCW4="),
"keyId" : NumberLong("6933657969867358212")
}
},
"operationTime" : Timestamp(1614368238, 2)
}Code language: Bash (bash)

Добавляем третью ноду:

rs.add("localhost:27013")Code language: Bash (bash)

Теперь, выполнив команду:

rs.status()Code language: Bash (bash)

или

rs.config()Code language: Bash (bash)

вы сможете увидеть состояние ваших нод.

На этом все.

Denis Pershin

Published by
Denis Pershin

Recent Posts

Как исправить ошибку «Write Failed: broken pipe» при SSH соединении

Ошибка "Write Failed: broken pipe" в SSH соединении обычно возникает, когда клиент или сервер разрывает…

3 дня ago

Java Enum — перечисления в Java

Что такое Enum в Java Перечисление (enum) в Java - это тип данных, который позволяет…

8 месяцев ago

Массивы в Java — создание, доступ к элементам, изменение данных

Что такое массивы? Массив - это структура данных в Java, которая представляет собой упорядоченную коллекцию…

8 месяцев ago

ArrayList в Java — Основное

ArrayList в Java - это класс, предоставляющий возможность создания массива переменной длины, который можно изменять…

8 месяцев ago

Как подключиться к Yandex Cloud Storage через AWS S3 golang

Проблема Если вы вдруг решили подключиться в Yandex Cloud Storage с помощью библиотеки golang aws,…

8 месяцев ago

JDK MIssion Control на Mac

В данной заметке я попытаюсь рассказать как исправить ошибку с запуском JDK Mission Control на…

1 год ago

This website uses cookies.