Обновление СУБД одна из наиболее распространенных задач администратора баз данных. С чего стоит начать, и с каким процессом действий предстоит столкнуться, расскажет наш технический специалист Владислав Лоскутов. Итак, существует множество причин обновления:
В данной статье описан процесс обновления версии MariaDB Galera Cluster с версии 10.4.13 на 10.4.19. В нашем случае, причин обновления было две: Первая причина: были замечены утечки памяти, которые отчетливо видны на графике ниже. Вторая причина: создание page-файлов при перезапуске сервиса. В первую очередь, мы просмотрели похожие случаи на официальном сайте вендора и нашли пару примеров, описывающих нашу проблему: https://jira.mariadb.org/browse/MDEV-22998 https://jira.mariadb.org/browse/MDEV-23060 В обоих ситуациях, MariaDB рекомендует обновление версии на 10.4.14 и 26.4.5 для Galera. Также мы думали над тем, чтобы изменить менеджер распределения оперативной памяти, например, jemalloc. Однако было принято решение протестировать обновленную версию MariaDB. Перейдем к непосредственному процессу обновления:
Резервное копирование — это необходимый этап любого изменения. Прежде всего, данный процесс должен быть автоматизирован. Подробнее это действие опишем в отдельной статье. cp -v /etc/my.cnf.d/galera.cnf /etc/ my.cnf.d/galera.cnf_preupgrade ‘/etc/my.cnf.d/galera.cnf’ -> ‘/etc/my.cnf.d/galera.cnf_preupgrade’
Проверку можно осуществить с помощью списка переменных на официальном сайте. Если переменная является устаревшей, то у нее будет соответствующее поле – Deprecated, с указанием неактуальной версии. Обнаружив такой параметр, его необходимо убрать из файла конфигурации. В ходе проверки мы не нашли устаревших параметров.
В большинстве случаев, репозиторий yum уже сконфигурирован так, чтобы получить самую свежую версию. Однако лучше проверить и привести файл источника в следующий вид: cat /etc/yum.repos.d/mariadb.repo [mariadb-main] name = MariaDB Server baseurl = https://archive.mariadb.org/mariadb-10.4.19/yum/centos7-amd64/ gpgkey = file:///etc/pki/rpm-gpg/MariaDB-Server-GPG-KEY gpgcheck = 1 enabled = 1
Этот шаг нужен для отслеживания состояния Galera-кластера. Поскольку выполнение какой-либо операции на одном узле, может привести к ошибкам на другом. tail-f /var/log/galera-error.log
В нашем случае, трафик шел только под одним пользователем и только удаленно. Зная это, мы ограничили удаленный доступ для этого пользователя во время операции, а также отключили активные соединения:
SELECT host, user FROM mysql.user WHERE user=’appuser’; +——+———+ | Host | User | +——+———+ | % | appuser | +——+———+ UPDATE mysql.user SET Host=’localhost’ WHERE User=’appuser’; SELECT host, user FROM mysql.user WHERE user=’appuser’; +————+———+ | Host | User | +————+———+ | localhost | appuser | +————+———+ FLUSH PRIVILEGES; SELECT concat(‘KILL ‘,id,’;’) FROM information_schema.processlist WHERE user=’appuser’ INTO OUTFILE’/tmp/terminate_appuser.txt’; SOURCE /tmp/terminate_appuser.txt; Процедура выполнялась на каждом сервере. Лучший способ сохранения номера последней совершенной транзакции — отключить трафик со стороны приложения. Именно этот метод мы использовали при обновлении версии на боевой среде. Во время операции трафик был перенаправлен на другую среду с такими же данными.
Непосредственное обновление версии начинается с этого этапа. Сначала отключаем сервис на одном узле и дожидаемся полной его остановки, проверяя журнал ошибок на наличие сообщений об успешном выключении: systemctl stop mariadb systemctl status mariadb После этого шага необходимо проверить синхронизацию двух других узлов:
SHOW GLOBAL STATUS WHERE VARIABLE_NAME IN (‘wsrep_cluster_size’, ‘wsrep_cluster_status’, ‘wsrep_evs_evict_list’, ‘wsrep_last_committed’, ‘wsrep_ready’, ‘wsrep_connected’, ‘wsrep_local_state_comment’); +—————————+————+ | Variable_name | Value | +—————————+————+ | wsrep_last_committed | 383462123 | | wsrep_local_state_comment | Synced | | wsrep_evs_evict_list | | | wsrep_cluster_size | 2 | | wsrep_cluster_status | Primary | | wsrep_connected | ON | | wsrep_ready | ON | +—————————+————+
Сейчас кластер состоит из двух синхронизированных узлов, что является ожидаемым.
Текущий список установленных пакетов, относящихся к MariaDB:
{ yum list installed | grep Mar yum list installed | grep gale } MariaDB-backup.x86_64 10.4.13-1.el7.centos @mariadb MariaDB-client.x86_64 10.4.13-1.el7.centos @mariadb MariaDB-common.x86_64 10.4.13-1.el7.centos @mariadb MariaDB-compat.x86_64 10.4.13-1.el7.centos @mariadb MariaDB-server.x86_64 10.4.13-1.el7.centos @mariadb MariaDB-shared.x86_64 10.4.13-1.el7.centos @mariadb galera-4.x86_64 26.4.4-1.rhel7.el7.centos @mariadb
Процесс обновления пакетов: sudo yum install MariaDB-server galera-4 MariaDB-client MariaDB-shared MariaDB-backup MariaDB-common MariaDB-compat
Новый список MariaDB-пакетов: { yum list installed | grep Mar yum list installed | grep gale } MariaDB-backup.x86_64 10.4.19-1.el7.centos @mariadb MariaDB-client.x86_64 10.4.19-1.el7.centos @mariadb MariaDB-common.x86_64 10.4.19-1.el7.centos @mariadb MariaDB-compat.x86_64 10.4.19-1.el7.centos @mariadb MariaDB-server.x86_64 10.4.19-1.el7.centos @mariadb MariaDB-shared.x86_64 10.4.19-1.el7.centos @mariadb galera-4.x86_64 26.4.8-1.el7.centos @mariadb
После установки новых пакетов, запускаем сервис. Важно убедиться в успешном запуске. systemctl start mariadb systemctl status mariadb После запуска проверим синхронизацию всего кластера:
SHOW GLOBAL STATUS WHERE VARIABLE_NAME IN (‘wsrep_cluster_size’, ‘wsrep_cluster_status’, ‘wsrep_evs_evict_list’, ‘wsrep_last_committed’, ‘wsrep_ready’, ‘wsrep_connected’,’wsrep_local_state_comment’); +—————————+————+ | Variable_name | Value | +—————————+————+ | wsrep_last_committed | 383462126 | | wsrep_local_state_comment | Synced | | wsrep_evs_evict_list | | | wsrep_cluster_size | 3 | | wsrep_cluster_status | Primary | | wsrep_connected | ON | | wsrep_ready | ON | +—————————+————+
Наблюдаем полную синхронизацию всех трех узлов.
На этом этапе обновятся системные таблицы в БД до последней версии, и выполнится проверка всех таблиц (проверка их версий). mysql_upgrade -u root —skip-write-binlog
Выполняем финальный перезапуск сервиса, проверяем успешность запуска и синхронизацию кластера:
systemctl restart mariadb systemctl status mariadb SHOW GLOBAL STATUS WHERE VARIABLE_NAME IN (‘wsrep_cluster_size’,’wsrep_cluster_status’, ‘wsrep_evs_evict_list’, ‘wsrep_last_committed’, ‘wsrep_ready’,’wsrep_connected’ ,’wsrep_local_state_comment’); +—————————+————+ | Variable_name | Value | +—————————+————+ | wsrep_last_committed | 383542049 | | wsrep_local_state_comment | Synced | | wsrep_evs_evict_list | | | wsrep_cluster_size | 3 | | wsrep_cluster_status | Primary | | wsrep_connected | ON | | wsrep_ready | ON | +—————————+————+ { mysql -uroot -e «SELECT VERSION();» mysql -uroot -e «SHOW GLOBAL STATUS LIKE ‘wsrep_provider_version’;» } +———————+ | VERSION() | +———————+ | 10.4.19-MariaDB-log | +———————+
+————————+——————+ | Variable_name | Value | +————————+——————+ | wsrep_provider_version | 26.4.8(r902dd26) | +————————+——————+
Вернем возможность удаленного доступа для пользователя приложения:
SELECT host,user FROM mysql.user WHERE user=’appuser’; +————+———+ | Host | User | +————+———+ | localhost | appuser | +————+———+ UPDATE mysql.user SET Host=’%’ WHERE User=’appuser’; SELECT host,user FROM mysql.user WHERE user=’appuser’; +——+———+ | Host | User | +——+———+ | % | appuser | +——+———+ FLUSH PRIVILEGES;
Подведем итог нашей работы: на выполнение всех операций мы потратили 45 минут, из них 15 минут на сервер. Объем данных составляет 350 ГБ. Версия Linux: CentOS Linux release 7.4.1708 (Core). В результате, мы избавились от утечек памяти и проблемы с page-файлами: Обновление версии любой СУБД является трудоемким и кропотливым процессом, требующим внимания к деталям, а также, опыта работы в данной сфере. В арсенале DBI собраны лучшие практики по обновлению, миграции и обслуживанию практически любых баз данных. На примере этой статьи можно наблюдать как тщательно мы прорабатываем алгоритм этого многоступенчатого процесса: от проверки журналов сервиса, до наличия информации у вендора.
Наш менеджер свяжется в течение 2х часов