MariaDB случайным образом теряет устойчивость.

Вопрос или проблема

Я столкнулся с необычной проблемой, связанной с моей инстанцией базы данных MariaDB (версия 10.2), которая вызывает неожиданное прекращение работы службы MariaDB. Я пытался исследовать проблему, регулярно записывая использование ОЗУ топ-3 процессов каждую минуту с помощью cronjob, стремясь определить, потребляет ли MariaDB чрезмерное количество памяти перед сбоем сервера. Однако, проведя это исследование, я склонен полагать, что чрезмерное использование ОЗУ не является коренной причиной проблемы.

Кроме того, всякий раз, когда сервер падает, я пытался изучить журналы MariaDB с помощью следующих команд:

  • sudo cat /var/log/mariadb/mariadb.log – Эта команда не возвращает результатов.
  • sudo systemctl status mariadb -l – Эта команда дает следующий вывод:

Результат команды

Также вот скриншот информации об операционной системе:

[someuser ~]$ uname -a
Linux ec2.internal .amzn2.x86_64 #1 SMP Thu Dec 8 01:29:11 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
[someuser ~]$ hostnamectl
   Static hostname: <ip>.ec2.internal
         Icon name: computer-vm
           Chassis: vm
        Machine ID: -
           Boot ID: -
    Virtualization: xen
  Operating System: Amazon Linux 2
       CPE OS Name: cpe:2.3:o:amazon:amazon_linux:2
            Kernel: Linux <ip>.amzn2.x86_64
      Architecture: x86-64

Я был бы очень признателен за помощь в диагностике и решении этой проблемы со стабильностью сервера. Любые идеи и рекомендации по дальнейшим действиям будут бесценны.


Ответы на комментарий от @NikitaKipriyanov:
Привет @NikitaKipriyanov, спасибо за вопросы. Следуя вашему совету, я запустил dmesg -T | grep mysql и обнаружил следующее (вставляю только актуальные данные):

[Mon Sep 18 17:37:34 2023] [  26231]    27 26231    29965       52    61440        0             0 mysql-prepare-d
[Tue Sep 19 14:04:29 2023] [  26839]    27 26839   367222    19121   630784        0             0 mysqld
[Tue Sep 19 14:04:31 2023] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/,task=mysqld,pid=26839,uid=27
[Tue Sep 19 14:04:31 2023] Out of memory: Killed process 26839 (mysqld) total-vm:1468888kB, anon-rss:76484kB, file-rss:0kB, shmem-rss:0kB, UID:27 pgtables:616kB oom_score_adj:0
[Tue Sep 19 14:05:41 2023] [  29800]    27 29800     2326       26    61440        0             0 mysql-check-soc
[Tue Sep 19 14:05:52 2023] [  29800]    27 29800     2326       26    61440        0             0 mysql-check-soc

Как мы видим, дата и время примерно совпадают с тем, когда служба перестала работать. Хочу отметить, что когда я запускаю dmesg -T, я чаще вижу, что веб-сервер httpd упал:

[Tue Sep 19 14:13:00 2023] [  30195]     0 30195   143596     2011   839680        0             0 httpd
[Tue Sep 19 14:13:00 2023] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/,task=httpd,pid=28937,uid=48
[Tue Sep 19 14:13:00 2023] Out of memory: Killed process 28937 (httpd) total-vm:628120kB, anon-rss:11732kB, file-rss:0kB, shmem-rss:96kB, UID:48 pgtables:860kB oom_score_adj:0
[Tue Sep 19 14:13:17 2023] systemd-journald[30073]: Received SIGTERM from PID 1 (systemd).

Тем не менее, веб-сервер никогда не испытывал сбоев или перебоев в работе. Проблема касается только службы MariaDB. Проблема появляется время от времени только в службе MariaDB, например, каждые 3-5 дней.
Вот единственные журналы, которые у меня есть в папке /var/log/mariadb:

[root@ip mariadb]# ls -la
total 28
drwxr-x---  2 mysql mysql  146 Sep 20 03:48 .
drwxr-xr-x 10 root  root  4096 Sep 26 03:23 ..
-rw-------  1 mysql mysql    0 Sep 20 03:48 mariadb.log
-rw-------  1 mysql mysql 8714 Sep  7 12:40 mariadb.log-20230908
-rw-------  1 mysql mysql 2005 Sep 15 18:02 mariadb.log-20230916.gz
-rw-------  1 mysql mysql 1917 Sep 18 17:39 mariadb.log-20230919.gz
-rw-------  1 mysql mysql 1909 Sep 19 14:16 mariadb.log-20230920.gz
[root@ip mariadb]# pwd
/var/log/mariadb

Вот также вывод sysctl -A | grep panic :

[root@ip log]# sysctl -A | grep panic
fs.xfs.panic_mask = 0
kernel.hardlockup_panic = 0
kernel.hung_task_panic = 0
kernel.panic = 30
kernel.panic_on_io_nmi = 0
kernel.panic_on_oops = 0
kernel.panic_on_rcu_stall = 0
kernel.panic_on_unrecovered_nmi = 0
kernel.panic_on_warn = 0
kernel.panic_print = 0
kernel.softlockup_panic = 0
kernel.unknown_nmi_panic = 0
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.eth0.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
vm.panic_on_oom = 0

Ответы на вопросы Wilson Hauck:

Относительно ОЗУ:

[ec2-user@ip ~]$ free -h
              всего       использовано     свободно    общая    буферы/кэш   доступно
Mem:           964M        333M        197M        724К        433M        451M
Swap:            0B          0B          0B

SELECT COUNT(*) FROM information_schema.tables; – 238

SHOW GLOBAL STATUS; – Возвращает слишком много строк, чтобы их вставлять сюда, какое значение вас интересует

SHOW GLOBAL VARIABLES;– То же самое

Как я должен отправить вывод всех запрошенных запросов?

Я получу приз за правильно угаданное?

Здесь и в других местах в интернете есть множество ответов о том, как это исправить. К сожалению, многие из них ошибочны. Если они упоминают oom_adj или oom_score_adj, то это НЕ способ исправить вашу проблему.

Есть 2 вещи, которые вам нужно сделать.

Во-первых, нужно взглянуть на вашу конфигурацию веб-сервера и базы данных (и, вероятно, здесь также есть уровень приложения) и убедиться, что они не пытаются использовать больше оперативной памяти, чем у вас доступно. Поскольку вы не рассказали нам об сервере приложений или веб-сервере, я не могу точно посоветовать (но вот подсказка для пред-форк Apache, возможно, с PHP). Что касается Mariadb – возьмите копию mysqltuner.pl и запустите против вашего установки.

Это должно предотвратить нехватку памяти в большинстве случаев, но вам также следует уменьшить количество несуществующей памяти, которую ядро будет выдавать:

sysctl vm.overcommit_memory=2
sysctl vm.overcommit_ratio=20

…и пытаться снизить значения для соотношения, если вы все еще видите «убийцу» OOM.

sysctl vm.overcommit_memory=2

sysctl vm.overcommit_ratio=20

опасно, так как получаются ошибки “нельзя выделить память” при каждой bash-команде, и ничего не будет работать, включая postfix и apache, пока я не перезагрузил мой экземпляр Linux EC2 в консоли aws.amazon.com, и изначальные безопасные значения 0 и 50 не были восстановлены соответственно, чтобы я мог подключиться по ssh, и все службы были перезапущены нормально.

Если mysqld падает с ошибкой «убийца» OOM, просто перезапустите его – все по-старому:

service mysqld start

Не меддайте с значениями vm.overcommit_memory или vm.overcommit_ratio, иначе рискуете потерять все на сервере, если он не будет резервным.

.

Ответ или решение

MariaDB: Решение проблемы неожиданного завершения работы сервиса

Если MariaDB версии 10.2 на базе Amazon Linux 2 периодически прекращает свою работу, вероятные причины и решение данной проблемы можно определить через тщательное изучение логов и конфигурации системы.

Диагностика текущей ситуации

  1. Анализ использования памяти:

    • Ваша команда dmesg -T | grep mysql показывает, что процесс MariaDB подвергается действию OOM-killer. Это значит, что система Linux завершала работу процесса из-за нехватки оперативной памяти.
    • Согласно данным команды free -h, ваш сервер имеет всего 964 MB оперативной памяти и не использует swap, что создаёт предпосылки для переполнения памяти.
  2. Настройки MariaDB и веб-сервера:

    • В данной ситуации важно оптимизировать конфигурации обоих компонентов для минимального потребления памяти. MySQLTuner поможет вам дать рекомендации по оптимизации MariaDB.
    • Убедитесь, что ваш веб-сервер настроен правильно, чтобы не потреблять избыток ресурсов. Например, для Apache важно ограничить количество одновременных процессов.
  3. Логи MariaDB:

    • Отсутствие информации в mariadb.log может указывать на проблемы с правами доступа или конфигурацией логирования. Убедитесь, что ваш MariaDB настроен для ведения логов деталей работы и им доступны необходимые права.

Рекомендации по решению

  1. Оптимизируйте использование памяти:

    • Запустите MySQLTuner, чтобы произвести анализ текущих настроек и получить рекомендации по их оптимизации. Сфокусируйтесь на уменьшении значений buffer pool и других параметров, отвечающих за потребление памяти.
    • Пересмотрите настройки Apache и других сервисов на предмет чрезмерного использования ресурсов.
  2. Настройте swap и параметры overcommit:

    • Рассмотрите возможность использования swap-файла для уменьшения риска нехватки памяти. Это особенно актуально для систем с ограниченной физической памятью.
    • Установка vm.overcommit_memory=1 может быть более универсальным решением, чем использование значения 2, так как позволяет использовать своп-файл и резервную память при выходе за пределы физической памяти.
  3. Мониторинг и логи:

    • Настройте мониторинг для своевременного обнаружения случаев нехватки памяти. Возможно использование инструментов для мониторинга использования ресурсов, таких как Prometheus или Grafana.
    • Проверьте правильность конфигурации логирования MariaDB, убедитесь, что у процесса есть необходимые права для записи в директорию /var/log/mariadb.
  4. Резервное копирование и аварийное восстановление:

    • Настройте автоматическое резервное копирование настроек и данных для быстрого восстановления сервиса в случае его аварийного завершения.

Следуя этим рекомендациям, вы сможете минимизировать вероятность остановки MariaDB из-за нехватки ресурсов и убедиться в стабильной работе вашего сервера.

Оцените материал
Добавить комментарий

Капча загружается...