LogNotes

2025-06-02 07:08:34
Чтобы снизить потребление памяти MariaDB на CentOS 7 и ограничить его до 80% от общей оперативной памяти, нужно настроить параметры конфигурации MariaDB, в частности, в файле `my.cnf`. Основной параметр, влияющий на потребление памяти, — это `innodb_buffer_pool_size`, так как он определяет объем памяти, выделяемый для кэширования данных и индексов InnoDB. Также стоит проверить другие параметры, такие как `query_cache_size`, `tmp_table_size`, `max_connections` и т.д. Вот пошаговый план:

---

### 1. **Проверить текущее потребление памяти**
- Используйте команду `top` или `htop`, чтобы подтвердить, что MariaDB действительно потребляет 90% памяти.
- Проверьте текущую конфигурацию MariaDB:
  ```bash
  mysql -u root -p -e "SHOW VARIABLES LIKE '%buffer_pool_size%';"
  mysql -u root -p -e "SHOW VARIABLES LIKE '%cache%';"
  ```
  Это покажет текущие значения `innodb_buffer_pool_size`, `query_cache_size` и других параметров, влияющих на память.

---

### 2. **Определить объем оперативной памяти**
- Узнайте общий объем оперативной памяти на сервере:
  ```bash
  free -m
  ```
  Например, если у вас 16 ГБ (16384 МБ) оперативной памяти, то 80% = ~13 ГБ (13312 МБ).

---

### 3. **Настроить `innodb_buffer_pool_size`**
- Основной параметр, который нужно настроить, — это `innodb_buffer_pool_size`. Рекомендуется установить его на уровне 60–80% от общей оперативной памяти, оставляя место для ОС и других процессов.
- Откройте файл конфигурации MariaDB (обычно `/etc/my.cnf` или `/etc/my.cnf.d/server.cnf`):
  ```bash
  sudo nano /etc/my.cnf
  ```
- Найдите или добавьте секцию `[mysqld]` и установите параметр `innodb_buffer_pool_size`. Например, для 13 ГБ:
  ```ini
  [mysqld]
  innodb_buffer_pool_size=13G
  ```
  Если у вас меньше памяти (например, 8 ГБ), установите значение около 6–6.4 ГБ:
  ```ini
  innodb_buffer_pool_size=6G
  ```

---

### 4. **Дополнительные параметры для оптимизации памяти**
- **Отключить или уменьшить кэш запросов** (устаревший в новых версиях MariaDB, но может быть включен):
  ```ini
  query_cache_size=0
  query_cache_type=0
  ```
- **Ограничить размер временных таблиц**:
  ```ini
  tmp_table_size=64M
  max_heap_table_size=64M
  ```
- **Уменьшить количество соединений**, если их слишком много:
  ```ini
  max_connections=100
  ```
- **Ограничить память для сортировки**:
  ```ini
  sort_buffer_size=512K
  read_rnd_buffer_size=256K
  join_buffer_size=256K
  ```

---

### 5. **Перезапустить MariaDB**
После внесения изменений сохраните файл и перезапустите службу MariaDB:
```bash
sudo systemctl restart mariadb
```

---

### 6. **Проверить эффект изменений**
- После перезапуска снова проверьте потребление памяти:
  ```bash
  top
  ```
  или
  ```bash
  free -m
  ```
- Убедитесь, что MariaDB теперь использует не более 80% памяти.

---

### 7. **Мониторинг и тюнинг**
- Используйте утилиту `mysqltuner` для дополнительной оптимизации:
  ```bash
  sudo yum install mysqltuner
  mysqltuner
  ```
  Она предложит рекомендации по настройке параметров в зависимости от текущей нагрузки.
- Если алерт продолжает срабатывать, проверьте, не вызвано ли это другими процессами или утечками памяти. Используйте `ps aux --sort=-%mem | head` для анализа.

---
=============

если у вас настроен Galera Cluster для MariaDB, изменения конфигурации, описанные ранее (например, настройка `innodb_buffer_pool_size` и других параметров памяти), применяются **к каждому инстансу (узлу) кластера индивидуально**. Galera Cluster состоит из отдельных узлов, каждый из которых работает как самостоятельный экземпляр MariaDB со своей собственной конфигурацией. Поэтому вам нужно учесть несколько важных моментов:

---

### 1. **Применение изменений к каждому узлу**
- Параметры в файле `my.cnf` (или `/etc/my.cnf.d/server.cnf`) задаются для каждого узла отдельно. Если вы хотите, чтобы MariaDB на всех узлах кластера использовала до 80% памяти, необходимо:
  - Внести изменения в конфигурационный файл на каждом узле.
  - Убедиться, что объем памяти, выделяемый для `innodb_buffer_pool_size` и других параметров, соответствует доступной оперативной памяти на каждом сервере (если узлы имеют разное оборудование, настройки могут отличаться).
- Например, если у вас три узла с 16 ГБ RAM на каждом, настройте `innodb_buffer_pool_size=13G` в файле `my.cnf` на каждом узле.

---

### 2. **Синхронизация конфигурации**
- Для согласованности работы кластера рекомендуется, чтобы конфигурации всех узлов были максимально идентичны (за исключением параметров, связанных с индивидуальными настройками узлов, таких как `wsrep_node_address`).
- Если вы измените параметры только на одном узле, это может привести к:
  - Несбалансированному потреблению памяти (один узел будет использовать больше/меньше ресурсов, что может повлиять на производительность).
  - Потенциальным проблемам с репликацией или синхронизацией, если настройки сильно различаются.

---

### 3. **Перезапуск узлов в Galera Cluster**
- Перезапуск службы MariaDB для применения изменений нужно выполнять **осторожно**, чтобы не нарушить работу кластера:
  1. Перезапускайте узлы по одному (rolling restart), чтобы кластер оставался доступным.
  2. Убедитесь, что узел синхронизировался с кластером после перезапуска:
     ```bash
     mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_status';"
     ```
     Значение `Primary` указывает, что узел в порядке и синхронизирован.
  3. Команда для перезапуска на каждом узле:
     ```bash
     sudo systemctl restart mariadb
     ```

---

### 4. **Особенности Galera Cluster**
- **Память для репликации**: Galera Cluster использует дополнительную память для механизма репликации (например, для кэширования write-set’ов). Параметр `wsrep_slave_threads` влияет на количество потоков репликации, что также может влиять на потребление памяти. Рекомендуется оставить его в разумных пределах (например, 2–4 потока на узел, в зависимости от числа CPU).
- **Общие параметры памяти**: Параметры, такие как `innodb_buffer_pool_size`, `tmp_table_size`, `query_cache_size` и т.д., действуют только на локальном узле и не синхронизируются между узлами.
- **Мониторинг**: Используйте `SHOW STATUS LIKE 'wsrep_%';` для проверки состояния кластера и убедитесь, что изменения в конфигурации не вызывают проблем с синхронизацией.

---

### 5. **Рекомендации для Galera Cluster**
- **Рассчитайте память для каждого узла**: Если узлы имеют одинаковую конфигурацию, установите `innodb_buffer_pool_size` на 60–80% от RAM на каждом узле (например, 13 ГБ для 16 ГБ RAM). Если узлы различаются по объему памяти, настройте пропорционально.
- **Проверьте параметры Galera**:
  ```ini
  [mysqld]
  # Параметры для Galera
  wsrep_on=ON
  wsrep_provider=/usr/lib64/galera/libgalera_smm.so
  wsrep_cluster_address="gcomm://node1,node2,node3"
  # Память
  innodb_buffer_pool_size=13G
  query_cache_size=0
  tmp_table_size=64M
  max_heap_table_size=64M
  max_connections=100
  ```
- **Тестирование**: Внесите изменения на одном узле, протестируйте производительность и потребление памяти, затем примените к остальным узлам.
- **Мониторинг**: Используйте инструменты вроде `mysqltuner` или `pt-mysql-summary` для анализа потребления ресурсов на каждом узле.

---

### 6. **Проверка результата**
- После настройки каждого узла проверьте потребление памяти на всех узлах:
  ```bash
  free -m
  top
  ```
- Убедитесь, что ни один узел не превышает 80% использования RAM.
- Проверьте состояние кластера:
  ```bash
  mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_local_state_comment';"
  ```
  Ожидаемое значение: `Synced`.

---

### 7. **Дополнительные советы**
- Если корпоративный алерт продолжает срабатывать, проверьте, не связан ли он с пиковыми нагрузками или другими процессами на серверах.
- Для автоматизации применения одинаковой конфигурации на всех узлах используйте инструменты управления конфигурацией (Ansible, Puppet, Chef).
- Если кластер обслуживает высоконагруженное приложение, протестируйте изменения на staging-окружении, чтобы избежать влияния на производительность.
← Previous Next →
Back to list