Задача:
Система на виробництві стикається з проблемами через несподіваний сплеск трафіку, що перевантажує сервери. Це спричиняє уповільнення системи, затримки у відповідях, часті таймаути та іноді збої в роботі сервісу. Як наслідок, продуктивність системи погіршується, і користувачі незадоволені. Нам потрібно швидко знайти рішення для усунення проблеми та стабілізації сервісу.
Рішення:
Для ефективного вирішення проблеми ми зосередимося на оптимізації життєвого циклу з’єднання з базою даних. Це включає покращення процесу встановлення, управління та закриття з’єднань між 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)