Иногда, требуется запустить репликасет mongod на локальном хосте. Из статьи вы узнаете как буквально за 10 минут поднять replicaset на вашем компьютере. Надеюсь вы уже прочитали статьи как установить mongodb на локальном хосте, и как добавить пользователя в mongodb, чтобы немного познакомиться с монгой.
В двух словах, репликасет, это набор нод mongodb, минимум трех, максимум 50, в которых есть одна primary нода, остальные secondary. Я думаю вы и так это знаете. Либо можете прочитать в документации на сайте mongodb. Давайте сразу перейдем к настройке.
Для того чтобы настроить репликасет, нам необходимо добавить пару строк в файл конфига монги. Это строки:
replication:
replSetName: REPLIASET_NAME
security:
keyFile: KEY_FILE_PATH_AND_NAME
Code language: Bash (bash)
replSetName — это имя нашего репликасета
keyFile — файл для secure общения нод между друг другом
Полный конфиг вы можете увидеть ниже.
Давайте первоначально создадим директории для нашего replicaset.
Путь моей домашней директории выглядит так:
/home/denis
Code language: Bash (bash)
Вы будете работать со своей и заменяйте пути на свои.
Создаем директорию репликасета:
mkdir rs
cd rs
Code 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.conf
Code 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-rs
Code language: Bash (bash)
Создаем второй конфиг, для второй ноды:
nano /home/denis/rs/mongodb-2.conf
Code 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-rs
Code language: Bash (bash)
И третий конфиг:
nano /home/denis/rs/mongodb-3.conf
Code 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-rs
Code 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 node3
Code language: Bash (bash)
Запускаем ноды:
cd /home/denis/rs
mongod -f mongodb-1.conf
mongod -f mongodb-2.conf
mongod -f mongodb-3.conf
Code language: Bash (bash)
У вас на каждый запуск должно вывестись сообщение примерно такого плана:
about to fork child process, waiting until server is ready for connections.
forked process: 68014
child process started successfully, parent exiting
Code 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.conf
Code language: Bash (bash)
Теперь нам необходимо подключится к первой ноде:
mongo --host localhost:27011
Code 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 admin
Code 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)
вы сможете увидеть состояние ваших нод.
На этом все.
Ошибка "Write Failed: broken pipe" в SSH соединении обычно возникает, когда клиент или сервер разрывает…
Что такое Enum в Java Перечисление (enum) в Java - это тип данных, который позволяет…
Что такое массивы? Массив - это структура данных в Java, которая представляет собой упорядоченную коллекцию…
ArrayList в Java - это класс, предоставляющий возможность создания массива переменной длины, который можно изменять…
Проблема Если вы вдруг решили подключиться в Yandex Cloud Storage с помощью библиотеки golang aws,…
В данной заметке я попытаюсь рассказать как исправить ошибку с запуском JDK Mission Control на…
This website uses cookies.