Перенос базы zabbix на другой диск
Опустим долгое вступление о необходимости резервного копирования данных. Все мы знаем, что бэкапы нужно делать. Те, кто активно использует Zabbix, тоже задумываются о возможности восстановления базы в случае её повреждения либо переноса на новый сервер и т.д. Понятно, что оптимальным вариантом для этого является репликация, но далеко не каждая организация может себе это позволить. Я покажу, каким образом проблема резервного копирования Zabbix решена у нас. Если кому-то интересно, прошу под кат.
Предупреждение: я не считаю представленную ниже схему идеальной, поэтому статья написана не в качестве образца, а с целью получения конструктивной критики и полезных советов по улучшению.
Когда передо мной встала необходимость резервного копирования базы данных Zabbix, я не пошёл далеко и решил использовать проверенное средство: mysqldump. Он хорошо зарекомендовал себя при использовании с базами других веб-сервисов, таких как redmine, glpi, drupal и других, но в случае с Zabbix оказался абсолютно непригодным. Резервные копии делались, ошибок не возникало, но однажды настал чёрный день, когда бэкап потребовалось восстановить. На выгрузку из дампа сравнительно небольшой базы ушло около двух суток. Учитывая, что база данных на тот момент была, можно сказать, в зачаточном состоянии, время простоя в будущем увеличилось бы в разы. Это было абсолютно неприемлемо. Тогда-то мой взгляд и упал на Percona XtraBackup.
Дальше я подумал, каким должен быть идеальный бэкап для меня. И понял, что лучший бэкап — это тот, о котором не беспокоишься, но знаешь что он выполняется. Мне удалось добиться такого результата: я не беспокоюсь о резервных копиях. Я не захожу каждое утро на сервер, скрестив пальцы, и не проверяю лог, размер файла и оставшееся место на разделе. Но я знаю, что бэкапы делаются, потому что всю необходимую информацию получаю по электронной почте. В этом мне помогает довольно простой скрипт, который я и хочу вынести на суд общественности. Возможно, с ним есть какие-то проблемы, о которых я не подозреваю?
В Zabbix у нас настроены уведомления по e-mail. Для этого используется ssmtp. Инструкций в интернете достаточно, к тому же тема рассматривается совсем иная, так что не буду на этом останавливаться. Кроме Percona и ssmtp ничего специфического не используется: tar, gzip, sed и find есть в каждом дистрибутиве. Для надёжности файлы резервных копий дублируются на удалённый сервер по NFS.
Система, на которой это используется:
Файлы из каталогов /etc/zabbix и /usr/share/zabbix копируются с целью сохранения настроек и дополнительных скриптов, используемых в Zabbix.
Для восстановления базы из полученной копии достаточно остановить mysqld, заменить каталог на извлечённый из архива и вновь запустить демон MySQL. Считайте сами, сколько у вас на это уйдёт времени, но я думаю, намного меньше двух суток.
Всем рабочих бэкапов и стабильной работы всех систем.
База данных MySQL 8 при установке на Ubuntu по умолчанию пишется в папку /var/lib/mysql. Со временем база растёт и поднимается вопрос переноса её на другой раздел диска. Перенесём базу данных в /u01/mysql/mysql.
Требования
- ОС Ubuntu 18.04 LTS. Или Ubuntu 16.04.
- Работаем из-под root.
- Сервер MySQL 8
Подготовка
Проверим где находится текущая БД MySQL.
Видим, что файлы базы находятся в /var/lib/mysql/. Чтобы закрыть командную строку MySQL, введите exit.
Останавливаем сервер MySQL:
Проверяем статус, мы должны убедиться, что сервер MySQL остановлен:
Видим — Status: "Server shutdown complete".
Перемещаем каталог данных MySQL
Создадим папку /u01/mysql, в неё будем переносить папку с данными MySQL.
С помощью rsync переносим MySQL в другую папку:
Флаг –a сохраняет привилегии и другие свойства каталога. Флаг –v предоставляет подробный вывод. Теперь внимание, папка /var/lib/mysql теперь находится по адресу /u01/mysql/mysql (ну так мне было нужно).
Переименуем старую папку /var/lib/mysql, сохраним её на случай сбоя:
По умолчанию путь настроен в файле /etc/mysql/mysql.conf.d/mysqld.cnf, редактируем.
Найдите строку datadir= и укажите в ней путь к новому каталогу данных /u01/mysql/mysql.
AppArmor
Настроим AppArmor, чтобы предоставить MySQL право на изменение нового каталога. Редактируем файл /etc/apparmor.d/tunables/alias:
Если этого не сделать, то получим ошибку:
Перезапуск MySQL
MySQL при запуске проверяет наличие директории /var/lib/mysql/mysql (ЗАЧЕМ?). Чтобы он не ругался, создадим пустую папку:
Пришла задачка установить Zabbix, устанавливаю и параллельно пишу эту статью. Устанавливать будем на сервер Ubuntu 18.04 (Bionic). База данных PostgreSQL 10. Веб сервер Nginx.
Инструкция есть на официальном сайте, моя будет более подробная.
Я подготовил виртуальную машину с 4 CPU, 4 Гб ОЗУ и отдельным диском на 100 Гб. Установил Ubuntu 18.04.
Работаем под рутом.
Устанавка репозитория Zabbix
Сначала добавим репозиторий заббикса. Если устанавливать заббикс из других репозиториев, то может чего-то не хватить.
После выполнение кода в /etc/apt/source.list.d появляется файл zabbix.list.
Устанавка Zabbix сервера, веб-интерфейса и агента
apt install zabbix-server-pgsql zabbix-frontend-php php7.2-pgsql zabbix-nginx-conf zabbix-agent
Установка PostgreSQL 10
В официальной инструкции этого не сказано, но нужно установить PostgreSQL. Я уже раньше писал инструкции:
Не забываем при установке перенести всё на отдельный диск в /opt.
Создание базы данных Zabbix
При этом нас попросят указать пароль от пользователя zabbix, придумываем и запоминаем. Укажем пароль в конфигурационном файле /etc/zabbix/zabbix_server.conf :
где вместо "password" пишем пароль.
Импортируем схему БД.
Настроим Nginx
Редактируем файл /etc/zabbix/nginx.conf , раскомментируем и настроим директивы 'listen' и 'server_name'.
Редактируем файл /etc/zabbix/php-fpm.conf, раскомментируем строку и укажем свой часовой пояс:
Первый запуск
Запустим процессы Zabbix сервера и агента, настроим их запуск при загрузке ОС.
systemctl restart zabbix-server zabbix-agent nginx php7.2-fpm
systemctl enable zabbix-server zabbix-agent nginx php7.2-fpm
Убеждаемся, что всё OK. Next step.
Указываем настройки для базы данных и пароль. Next step.
Настраиваю сервер. Next step.
Убеждаемся, что всё указали верно. Next step.
Фронтенд настроили. Finish.
При первом входе используем логин " Admin ", пароль " zabbix ".
Интерфейс заработал, база подцепилась.
Дополнительные настройки
Cannot adopt OID
Ошибки в логах zabbix-сервера на Ubuntu:
В процессе работы мне понадобилось сконвертировать цепочку P7B в PEM.
Создаём папку /etc/zabbix/ssl для хранения ключей, в ней размещаем файлы ключа и приватного сертификата:
Содержимое сертификата zabbix.pem и ключа zabbix.key копируем в созданные файлы zabbix-cert.pem и zabbix-key.pem.
Поскольку центр сертификации корпоративный, понадобится добавить корневые сертификаты на Zabbix сервер:
Правим конфигурационный файл /etc/zabbix/nginx.conf :
ssl_certificate /etc/zabbix/ssl/zabbix-cert.pem;
ssl_certificate_key /etc/zabbix/ssl/zabbix-key.pem;
location = /favicon.ico log_not_found off;
>
location / try_files $uri $uri/ =404;
>
location /assets access_log off;
expires 10d;
>
location ~ /\.ht deny all;
>
location ~ /(api\/|conf[^\.]|include|locale) deny all;
return 404;
>
location ~ [^/]\.php(/|$) fastcgi_pass unix:/var/run/php/zabbix.sock;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_index index.php;
fastcgi_param DOCUMENT_ROOT /usr/share/zabbix;
fastcgi_param SCRIPT_FILENAME /usr/share/zabbix$fastcgi_script_name;
fastcgi_param PATH_TRANSLATED /usr/share/zabbix$fastcgi_script_name;
include fastcgi_params;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_intercept_errors on;
fastcgi_ignore_client_abort off;
fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
>
>
Перенос перенос базы данных средства мониторинга Zabbix 2.4 под Oracle Database 11.2.0.4.
Перенос перенос базы данных средства мониторинга Zabbix 2.4 из MySQL на Oracle Database 11.2.0.4.
Zabbix поддерживает работу с базами данных MySQL, PostgeSQL, Oracle и некоторыми другими СУБД.
Ранее мы использовали Zabbix совместно с MySQL, но база данных стала сильно разрастаться, а мы более компетентны в БД Oracle, по этой причине и решили перенести БД Zabbix-а под Oracle, там нам проще управлять БД.
Итак, мы имеем Zabbix-server 2.4.7 работающий под Debain в связке с MySQL. Требуется получить работающий Zabbix, хранящий данные в Oracle Database.
Сначала подготовим БД для Zabbix:
1. Создаем БД с параметрами кодировки
2. Создаем табличное пространство для данных
3. Создаем пользователя ZABBIX указав по умолчанию ранее созданное табличное пространство.
create user ZABBIX
default tablespace ZABBIX
temporary tablespace TEMP
profile DEFAULT
identified by pass_word
;
-- Grant/Revoke role privileges
grant connect to ZABBIX;
grant resource to ZABBIX;
-- Grant/Revoke system privileges
grant create any directory to ZABBIX;
grant drop any directory to ZABBIX;
grant unlimited tablespace to ZABBIX;
4. Создаем объекты схемы, скрипт для создания таблиц можно взять с оффициального сайта zabbix, скачав исходники.
Скрипт находится в каталоге database/oracle/schema.sql. Нужно выполнить только создание обьектов схемы, внешние ключи создавать пока не нужно.
5. Загружаем данные из MySQL в Oracle. Это можно сделать несколькими способами. Я пользовался следующим методом:
- делаем бекап средствами mysql (mysqldump). Бекапим все таблицы, кроме таблиц hystory* и trends*.
- заменяем в бекапе символы переноса \r\n на '|| chr(13) || chr(10) ||' и двойной слэш "\\" на одинарный "\". С этой проблемой я столкнулся уже после того как загрузил данные.
- загружаем данные в oracle через sqlplus. Поскольку mysql делает бекап как текстовый файл с операторми insert, то с этим проблем нет.
SQL> Set define off;
SQL> Set nls_lang=American_america.al32UTF8 --очень важно, иначе будут проблемы с кириллицей
SQL> @;
- загружаем изображения, для чего нужно скопировать каталог misc\images\png_modern из архива с исходниками в любой каталог на сервере БД и выполнить скрипт из исходников database\oracle\images.sql предварительно поправив в строке "CREATE OR REPLACE DIRECTORY image_dir AS ''"
6. выполняем оставшуюся часть скрипта schema.sql.
7. В базе данных устанавливаем параметр cursor_sharing в FORCE. Дело в том, что Zabbix присылает непараметризированные запросы.
Подготовка Zabbix-Server
8. Устанавливаем oracle client. Под Ubuntu можно так. А вообще, вот тут.
В нашем случае использовался apache в связке с php-5.4.1.
1. Включаем поддержку oci8
2. В параметрах конфигурации php.ini прописываем extension = oci8.so
3. Перезагружаем apache и прверяем подтянулась ли библиотека oci8 в php
1. Собираем и устанавливаем zabbix из пакетов с параметрами
./configure --enable-server --enable-agent --with-net-snmp --with-libcurl --with-libxml2 --with-ssh2 --with-ldap --with-jabber --with-openipmi --with-unixodbc --with-oracle --with-oracle-include=/usr/include/oracle/12.1/client64/ --with-oracle-lib=/usr/lib/oracle/12.1/client64/lib
Ключи могут разные понадобиться.
make может отработать с ошибками, читать тут
2. Копируем из каталога с исходниками содержимое frontends/php в каталог веб-сервера.
3. Правим файл include/db.inc.php
Перед строкой подключения к oracle
Господа, в скором времени предстоит переезд Zabbix 3.2 с базой ~250Gb. Дело осложняется не только размером базы, но и тем, что SSD (RAID1) переезжают в новый сервер - сейчас рейд собран через контроллер, а в новом сервере будет mdadm.
Посоветуйте пожалуйста как переехать с сохранением всех настроек (что куда копировать) и с минимальным простоем.
Адрес нового сервера будет такой же как у старого, клиенты перенастраивать не придется.
Средний 1 комментарий
План переезда по личному опыту - я возил 3 раза большие базы zabbix в mysql от 300гб и больше.
1 Устанавливаете zabbix и mysql идентичных версий на новом сервере
2 останавливаете zabbix на новом сервере
3 при помощи percona-toolsделаете бекап базы и везете его на новый сервер
4 поднимаете mysql репликацию с старого на новый
5 добавляете хостнейм/ип нового сервера в конфиги всех агентов
6 стопаете myql и заббикс на старом
7 убираете репликацию на новом
8 запускаете заббикс на новом
9 убираете ип старого на всех агентах
Итого даунтайм не больше 5 минут.
ky0, от этого процедура не меняется -- данные в БД синхронизируются репликацией, потом старый сервер стопится, новый делается мастером, переносится старый IP на новый сервак и запускается сам Zabbix-сервер с отреплицированной БД.
Итак, что в итоге сделано для успешного переноса Zabbix.
1) На новом сервере развернул Zabbix той же версии.
-скопированы конфиги, алерт-скрипты, внешние скрипты
-"стандартная" база данных развернута на системных HDD, по стандартному пути /var/lib/mysql
2) На старом сервере сделал бекапы через innobackupex, mysqldump.
3) На обоих серверах остановил mysql, файлы из /var/lib/mysql старого сервера скопировал в ту же папку на новом сервере.
4) Запустил на новом сервере mysql. Запустился. Делаю mysql_upgrade - утилита менее чем за минуту проверила все таблицы базы на совместимость с новой версией MariaDB (на старом была 10.0, на новом 10.1). Отлично
5) Перенес SSD из старого сервера в новый, собрал из них RAID1 (на старом сервере HP контроллер, на новом mdadm).
6) Смонтировал RAID в папку (/srv/ssd, можно в любую пустую), скопировал в /srv/ssd/mysql "проверенные" данные из /var/lib/mysql.
7) Очистил /var/lib/mysql, примонтировал туда /srv/ssd/mysql.
6) Запустил mysql - работает.
7) Остановил старый сервер, назначил новому серверу ip старого, чтобы не перенастраивать тысячи zabbix-агентов.
8) PROFIT!
Читайте также: