Покращення MongoDB для обробки навантаження в продуктивному середовищі

Задача:

Система на виробництві стикається з проблемами через несподіваний сплеск трафіку, що перевантажує сервери. Це спричиняє уповільнення системи, затримки у відповідях, часті таймаути та іноді збої в роботі сервісу. Як наслідок, продуктивність системи погіршується, і користувачі незадоволені. Нам потрібно швидко знайти рішення для усунення проблеми та стабілізації сервісу.

Рішення:

Для ефективного вирішення проблеми ми зосередимося на оптимізації життєвого циклу з’єднання з базою даних. Це включає покращення процесу встановлення, управління та закриття з’єднань між Spring Boot і MongoDB на виробництві. Забезпечуючи ефективне оброблення високих навантажень та своєчасне очищення з’єднань, ми прагнемо покращити стабільність та продуктивність системи під час великих навантажень.

Оптимізація життєвого циклу з’єднання з MongoDB в Spring Boot: Практичний посібник

Розуміння та концепції

Управління високим трафіком у виробничих середовищах вимагає ретельного налаштування життєвого циклу з’єднань з базою даних. У цьому пості ми розглянемо практичні кроки для оптимізації з’єднань між Spring Boot і MongoDB, що забезпечить кращу продуктивність, стабільність та масштабованість. Пам’ятайте, що потрібно тестувати застосунок під навантаженням, постійно моніторити продуктивність та коригувати налаштування на основі спостережуваних результатів.

1. Збільшити max-connections-per-host

Це налаштування визначає максимальну кількість з’єднань до одного хоста MongoDB. Збільшення цього значення допомагає вашій програмі обробляти більше навантажень, покращуючи використання з’єднань. Налаштуйте цей параметр залежно від потужностей вашої системи та характеру навантажень.

2. Тонка настройка параметрів з’єднувального пулу

З’єднувальний пул працює як міст між вашою програмою та базою даних. Оптимізація цих налаштувань забезпечує ефективне використання ресурсів:

max-wait-time: Визначає, як довго з’єднання чекає на нове з’єднання.
max-connection-idle-time: Визначає, як довго з’єднання може залишатися без активності перед його закриттям.
max-connection-life-time: Визначає максимальний термін життя з’єднання.

Налаштуйте ці параметри, щоб знайти баланс між продуктивністю та управлінням ресурсами.

3. Увімкнути моніторинг з’єднувального пулу

Моніторинг з’єднувального пулу забезпечує його стабільну роботу. Використовуйте такі інструменти:

Інструменти моніторингу з’єднувального пулу MongoDB
Spring Boot Actuator ендпоінти

Слідкуйте за ключовими метриками, такими як активні з’єднання, неактивні з’єднання та час очікування з’єднань для отримання інформації про стан пулу.

4. Впровадити регулярні перевірки стану

Регулярні перевірки стану допомагають підтримувати пул з’єднань у хорошому стані. Моніторте метрики пулу з’єднань, перевіряйте наявність витоків з’єднань та доступність сервера MongoDB, щоб оперативно вирішувати потенційні проблеми.

5. Впровадити динамічне налаштування розміру пулу з’єднань

Розгляньте можливість динамічного налаштування розміру пулу з’єднань залежно від реального навантаження. Моніторте метрики продуктивності та коригуйте розмір пулу відповідно, щоб запобігти вузьким місцям під час сплесків трафіку.

6. Увімкнути видалення з’єднань з пулу

Неактивні з’єднання можуть споживати зайві ресурси. Увімкнення видалення дозволяє автоматично звільняти невикористовувані з’єднання, підтримуючи пул здоровим і уникаючи витоків ресурсів.

7. Оптимізувати налаштування пулу потоків

Операції з базою даних часто залежать від пулу потоків вашої програми. Налаштуйте конфігурацію пулу потоків у Spring Boot, включаючи:

corePoolSize: Мінімальна кількість потоків, які повинні залишатися активними.
maxPoolSize: Максимальна кількість потоків, дозволених до використання.
queueCapacity: Кількість запитів, які можуть очікувати в черзі.

Тонка настройка цих параметрів забезпечує ефективне оброблення очікуваного навантаження вашою програмою.

Оптимізоване конфігурування YAML для обробки високого навантаження та звільнення з’єднань у Spring Boot з MongoDB

Для конфігурації можна використовувати властивості spring.data.mongodb.

Налаштування розміру з’єднувального пулу:

У цьому прикладі налаштування розміру з’єднувального пулу увімкнене, мінімальний розмір пулу встановлено на 10, максимальний розмір пулу — 100, розмір інкременту — 10, розмір декременту — 10, а час бездіяльності до зменшення — 30 секунд.

connection-pool-size-tuning:  
 enabled: true  
 min-pool-size: 10  
 max-pool-size: 100  
 increment-size: 10  
 decrement-size: 10  
 idle-time-before-decrement: 30000

Звільнення з’єднань з пулу:

У цьому прикладі звільнення з’єднань з пулу увімкнене, політика видалення налаштована на бездіяльність, час бездіяльності до видалення встановлено на 30 секунд, а інтервал видалення — 60 секунд.

connection-pool-eviction:  
 enabled: true  
 eviction-policy: idle-time  
 idle-time-before-eviction: 30000  
 eviction-interval: 60000

Конфігурація індексів:

У конфігурації spring.data.mongodb.indexes поле type може мати кілька значень, залежно від типу індексу, який ви хочете створити. Ось деякі популярні значення для поля type:

number: Створює числовий індекс, який використовується для ефективного запиту числових даних.
string: Створює індекс для рядків, що використовується для ефективного запиту рядкових даних.
boolean: Створює булевий індекс, що використовується для ефективного запиту булевих даних.
date: Створює індекс для дат, що використовується для ефективного запиту даних типу дата.
objectId: Створює індекс для ObjectId, що використовується для ефективного запиту даних типу ObjectId.
text: Створює текстовий індекс, який використовується для повнотекстового пошуку.
hashed: Створює хешований індекс, який використовується для ефективного пошуку та вставки документів.
2dsphere: Створює геопросторовий індекс, який використовується для ефективного запиту геопросторових даних.
2d: Створює геопросторовий індекс, який використовується для ефективного запиту геопросторових даних.
geoHaystack: Створює геопросторовий індекс, який використовується для ефективного запиту геопросторових даних.

spring:  
 data:  
 mongodb:  
 indexes:  
 - collection: myCollection  
 fields:  
 - field: name  
 order: ascending  
 type: string

Налаштування пулу потоків: Ви можете використовувати властивості spring.task.execution для конфігурації налаштувань пулу потоків для ефективного керування асинхронними завданнями:

core-pool-size: 10: Мінімум 10 потоків, які завжди активні.
max-pool-size: 20: Пул може збільшуватися до 20 потоків під високим навантаженням.
queue-capacity: 100: До 100 завдань можуть чекати в черзі, коли потоки зайняті.
keep-alive-seconds: 60: Додаткові потоки (поза основним пулом) завершуються через 60 секунд бездіяльності.

allow-core-thread-timeout: true: Навіть основні потоки можуть мати час очікування і бути завершені при бездіяльності.

spring:  
 task:  
 execution:  
 thread-pool:  
 core-pool-size: 10  
 max-pool-size: 20  
 queue-capacity: 100  
 keep-alive-seconds: 60  
 allow-core-thread-timeout: true

Остання повна конфігурація: Оптимізація життєвого циклу з’єднань між Spring Boot та MongoDB

server:  
 port: 8080  
spring:  
 data:  
 mongodb:  
 uri: // Вкажіть URI вашого MongoDB кластера   
 database: // не обов'язково вказувати вашу базу даних  
 connect-timeout: 30000  
 max-connection-idle-time: 30000  
 max-connection-life-time: 60000  
 max-connections-per-host: 100  
 max-wait-time: 60000  
 min-connections-per-host: 5  
 server-selection-timeout: 30000  
 socket-timeout: 30000  
 #threads-allowed-to-block-for-connection-multiplier: 5  
 socket-keep-alive: true  
 cache-enabled: true  
 connection-pool-size-tuning:  
 enabled: true  
 min-pool-size: 5  
 max-pool-size: 100  
 increment-size: 5  
 decrement-size: 5  
 idle-time-before-decrement: 30000  
 connection-pool-eviction:  
 enabled: true  
 eviction-policy: idle-time  
 idle-time-before-eviction: 30000  
 eviction-interval: 60000  
 indexes:  
 - collection: // Вкажіть ім'я вашої колекції в базі даних  
 fields:  
 - field: // Вкажіть ім'я вашого індексу в колекції для дат  
 order: descending  
 type: date  
 - field: // Вкажіть ім'я вашого індексу в колекції для чисел  
 type: number  
 - field: // Вкажіть ім'я вашого індексу в колекції для рядків  
 type: string  
 - field: // Вкажіть ім'я вашого індексу в колекції для об'єктів  
 type: objectId  
 task:  
 execution:  
 thread-pool:  
 core-pool-size: 10  
 max-pool-size: 20  
 queue-capacity: 100  
 keep-alive-seconds: 60  
 allow-core-thread-timeout: true  

management:  
 endpoint:  
 health:  
 show-details: always  
 endpoints:  
 web:  
 exposure:  
 include: metrics, health, heapdump, prometheus, beans, threaddump




Перекладено з: [MongoDB Production Improvements to handle load](https://medium.com/@akshat.available/mongodb-production-improvements-to-handle-load-2ffdcadfa1f7)

Leave a Reply

Your email address will not be published. Required fields are marked *