Установка і настройка MongoDB в CentOS

MongoDB - це безкоштовна документо-орієнтована база даних з відкритим вихідним кодом, написана на C ++. класифікується як NoSQL база даних, так як в її основі не лежить традиційна реляційна структура БД. Замість цього в MongoDB використовуються JSON-подібні документи з динамічними схемами. DСхеми можна змінювати в будь-який зручний час без необхідності установки нової бази даних з оновленою схемою.

перевага NoSQL БД перед звичними реляційними БД в тому, що можна без проблем налаштувати горизонтальне масштабування, реплікацію і шардінг. MongoDB бази часто використовується для зберігання документів, тестових файлів, поштових повідомлень і т.д.

У даній статті, ми розглянемо установку MongoDB на сервер з CentOS 7 або 8, виконаємо базову настройку, а також розглянемо варіанти оптимізації.

зміст:

  • Підключення сховища MongoDB
  • Установка MongoDB в CentOS
  • Основні команди MongoDB
  • Конфігураційний файл MongoDB
  • Оптимізація MongoDB для підвищення продуктивності

Підключення сховища MongoDB

MongoDB має свій власний репозиторій, звідки і виконується установка. У стандартних репозиторіях пакета для установки даного сервера БД, немає. Створимо файл для сховища та додамо в нього дані для підключення:

# Nano /etc/yum.repos.d/mongodb-org.repo

Вміст файлу буде наступне:

[Mongodb-org-4.2] name = MongoDB Repository baseurl = https: //repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/x86_64/ gpgcheck = 1 enabled = 1 gpgkey = https: // www.mongodb.org/static/pgp/server-4.2.asc 

На момент написання статті остання версія MongoDB в репозиторії була саме 4.2. Перед установкою на ваш сервер, перейдіть на сайт розробника і перевірте актуальну версію.

Після створення repo файлу з параметрами сховища, можна приступати до установки пакетів.

Установка MongoDB в CentOS

Щоб встановити потрібний пакет для роботи MongoDB, запустіть команду yum або dnf (в CentOS 8):

# Yum install mongodb-org -y

Як і будь-який інший сервіс, MongoDB потрібно запустити і додати в автозавантаження:

# Systemctl start mongod
# Systemctl enable mongod

Щоб перевірити, що сервіс mongod "слухає" потрібний порт (за замовчуванням TCP 27017), виконайте:

# Lsof -i: 27017

Можна відкрити доступ до служби MongoDB в файлеволе (нижче приклад для firewalld):

# Firewall-cmd --add-port = 27017 / tcp --permanent
# Firewall-cmd --reload

Список сервісу доступні в файлі:

# Tail -f /var/log/mongodb/mongod.log

При запуску MongoDB може вийти попередження:

** WARNING: soft rlimits too low. rlimits set to 4096 processes, 64000 files. Number of processes should be at least 32000: 0.5 times number of files.

P.S. У мене такої помилки не було, але в мережі часто зустрічається подібне питання і я вирішив описати його рішення.

Для вирішення проблеми, потрібно відкрити файл /etc/security/limits.d/20-nproc.conf і підвищити ліміти:

# Nano /etc/security/limits.d/20-nproc.conf

В кінець файлу додайте:

mongod soft nproc 32000

Збережіть файл і перезапустіть сервіс mongod:

# Systemctl restart mongod

Щоб увійти в консоль MongoDB, введіть mongo:

[Root @ server mongodb] # mongo

MongoDB shell version v4.2.2 connecting to: mongodb: //127.0.0.1: 27017 /? Compressors = disabled & gssapiServiceName = mongodb Implicit session: session  "id": UUID ( "f75bee8f-d71d-47fb-8728-6f67fb7a6982") MongoDB server version: 4.2.2 

Основні команди MongoDB

Розглянемо кілька команд MongoDB, які можна використовувати в Шелі mongo. Зокрема, створимо базу даних, користувача і покажемо парочку інших корисних команд.

Щоб створити базу даних в MongoDB, потрібно виконати команду в консолі СУБД:

> Use buildcentos

Помітили, що вона схожа на ту, що використовується в mysql / mariadb для входу в існуючу БД? В MongoDB як виявилося все простіше.

Щоб перевірити, що ми дійсно перебуваємо в цій БД, виконаємо:

> db

Але є один нюанс, насправді нова база даних не буде створена, поки ви в ній не збережете хоча б один документ. Якщо виконати перевірку на існуючі БД глобально, ми побачимо, що нашій БД в списку немає:

> Show dbs

Виконаємо простий запит, який збереже документ в нашій БД:

> Db.new_collection.insert (some_key: "some_value")

Щоб видалити БД, потрібно знаходиться в тій самій БД, яку будете видаляти і виконати запит:

> Db.dropDatabase ()

наприклад:

> Use buildcentos

switched to db buildcentos

> Db.dropDatabase ()

 "Dropped": "buildcentos", "ok": 1>

Після чого, БД буде видалена:

> Show dbs

admin 0.000GB config 0.000GB local 0.000GB>

Щоб створити нового користувача з правами читання та запису для вашої БД, виконайте наступний запит:

> Db.createUser (

User: "centos", pwd: "rewqrwe213213", roles: [role: "readWrite", db: "buildcentos"]) 

Щоб вивести список користувачів, виконайте запит:

> Db.getUsers ()

або

> Show users

Обидві команди, виводять ідентичний результат:

Щоб видалити користувача:

> Db.dropUser ( 'centos')

Після виконання команди, при виведенні списку користувачів, у вас його не буде:

> Db.dropUser ( 'centos')

true

> Db.getUsers ()

Конфігураційний файл MongoDB

Як у будь-якої СУБД, у MongoDB є конфігураційний файл, розташований по шляху /etc/mongod.conf. Розглянемо його основні параметри:

  • Блок systemLog - відповідає за логирование. Мінімальні параметри, які повинні бути прописані в цьому блоці, щоб логирование працювало:
    systemLog: destination: file logAppend: true path: /var/log/mongodb/mongod.log
  • Блок processManagement - управління процесом в якому працює MongoDB: fork - запускає демона в фоновому режимі для роботи бази, за замовчуванням значення false pidFilePath - шлях до PID файлу timeZoneInfo - вказує шлях до файлу для завантаження тимчасових зон Приклад конфіга:
    processManagement: fork: true # fork and run in background pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile timeZoneInfo: / usr / share / zoneinfo
  • блок net - служить для управління роботи з мережею:
    port - вказує номер порту на якому буде запущений демон mongod, за замовчуванням порт 27017
    bindIp - ip адреса з якого можна звертатися до БД. Як і у випадку з mysql / mariadb це настройка служить для безпеки, щоб уникнути доступу з зовнішніх серверів. Якщо вказати тут 127.0.0.1, то підключення буде працювати тільки локально.
    maxIncomingConnections - кількість одночасних підключень, які може обробити MongoDB. Даний параметр не може перевищувати системний, за замовчуванням значення 65536
    приклад:

    net: port: 27017 bindIp: 127.0.0.1
  • блок security - даний блок відповідає за безпеку: authorization - якщо параметр включений, то необхідно ввійти в систему користувача, без логіна і пароля не буде встановлено з'єднання з процесом, який його запитує. За замовчуванням, отключен.javascriptEnabled - включає / відключає виконання JavaScript на стороні сервера.
  • блок storage - блок відповідає за параметри зберігання БД: dbPath - рядок яка вказує в якому місці буде зберігається БД. За замовчуванням / data / dbjournal - якщо включений, включає журнал довговічності, щоб файли в базі залишалися дійсними і восстанавлівалісь.Прімер настройки:
    storage: dbPath: / var / lib / mongo journal: enabled: true

Більш розширені настройки, можна знайти в документації до MongoDB на офіційному сайті.

Оптимізація MongoDB для підвищення продуктивності

щоб MongoDB працювало досить швидко і не виникало проблем, потрібно щоб були дотримані деякі умови:

  • Використовуйте файлову систему XFS, натомість більш повільної EXT4(XFS використовує паралельний дисковий ввод / вивід, що значно покращує продуктивність у порівнянні з EXT4).
  • Використовуйте на своїх серверах швидкі SSD / NVME диски, натомість більш повільних HDD.
  • вимкніть Transparent Huge Page. Для відключення THP в unit-файл MongoDB додати виклик команд:
    # Echo 'never' >> / sys / kernel / mm / transparent_hugepage / enabled
    # Echo 'never' >> / sys / kernel / mm / transparent_hugepage / defrag
  • Перевірте і при необхідності встановіть ліміти ulimit:
    -f (file size): unlimited -t (cpu time): unlimited -v (virtual memory): unlimited -n (open files): 32000 і більше -m (memory size): unlimited -u (processes / threads): 32000 і більше
  • Так само стежте за споживанням пам'яті на сервері, якщо MongoDB споживає досить багато пам'яті, проводите оптимізацію самих баз даних. Якщо проект дуже великий, є сенс рознести бази на різні сервера для більшої продуктивності.