сентября 8 2012 05:06 пп

Обновление системы мониторинга Zabbix до версии 2.*

Итак, наша цель — проапгрейдить БД Zabbix с минимальным даунтаймом при сохранении информации. Это справедливо, если нам необходима история и тренды и их у нас много.

Executive summary
==> Даунтайм

  • 0- Апгрейд бинарников сервера и агента
  • 1- Остановка zabbix_server
  • 2- Дамп схемы и конфига из базы ‘zabbix’ в базу ‘zabbix2’
  • 3- Создать фейковые NextIDs в базе ‘zabbix2’
  • 4- Проапгрейдить БД ‘zabbix2’
  • 5- Построить новые правила секционирования и механизм управления секционированием
  • 5- Стартануть Zabbix на БД ‘zabbix2’
  • ==> Конец даунтайма. Перелив данных.
  • 7- Проапгрейдить БД ‘zabbix’, содержащую всё, это может занять много времени
  • 8- Смержить хистори из БД ‘zabbix’ в ‘zabbix2’
  • 9- Очистить фейковые NextIDs в ‘zabbix2’
  • 10- Поставить новый фронтенд

==> PROFIT

Step 0 : Компилим бинарники последнего Zabbix. В данном конкретно взятом случае — это 2.0.2

# cp /path/to/binaries/zabbix* /path/to/backups
# cd /path/to/src
# wget http://sourceforge.net/projects/zabbix/files/ZABBIX%20Latest%20Stable/2.0.2/zabbix-2.0.2.tar.gz/download
# tar -xvf zabbix-2.0.2.tar.gz
# cd zabbix-2.0.2.tar.gz
# ./configure \
--sysconfdir=/etc/zabbix \
--enable-server \
--enable-agent \
--enable-java \
--with-mysql \
--with-netsnmp \
--with-ipmi \
--with-ssh2 \
--with-telnet \
--with-odbc
# make install

Вышеуказаный шаг почти полностью расписан в руководстве. Кроме примечательной опции sysconfdir. Дело в том, что начиная с версии 2.0 конфиги хранятся в /usr/local/etc, что нам нужно поменять, дабы не менять привычный уклад и не запускать постоянно сервер с ключом «-c».

Step 1 : Остановка демона Zabbix Server/Agent

# service zabbix_server stop
# service zabbix_agentd stop
# cp misc/init.d/your_distributive/zabbix_* /etc/init.d/

Step 2 : Дамп конфига из БД ‘zabbix’ в ‘zabbix2’

mysqladmin create zabbix2
# import data structure
mysqldump -B "zabbix" --no-data | sed 's/\(^CREATE DATABASE \|^USE \)/-- &/' | mysql zabbix2
# import config
mysqldump -B "zabbix" --single-transaction --no-create-info --no-create-db \
--ignore-table="zabbix.acknowledges" \
--ignore-table="zabbix.alerts" \
--ignore-table="zabbix.auditlog" \
--ignore-table="zabbix.auditlog_details" \
--ignore-table="zabbix.escalations" \
--ignore-table="zabbix.events" \
--ignore-table="zabbix.history" \
--ignore-table="zabbix.history_log" \
--ignore-table="zabbix.history_str" \
--ignore-table="zabbix.history_str_sync" \
--ignore-table="zabbix.history_sync" \
--ignore-table="zabbix.history_text" \
--ignore-table="zabbix.history_uint" \
--ignore-table="zabbix.history_uint_sync" \
--ignore-table="zabbix.trends" \
--ignore-table="zabbix.trends_uint" \
| sed 's/\(^CREATE DATABASE \|^USE \)/-- &/' \
| mysql zabbix2

Step 3 : создание фейковых NextIDs в БД ‘zabbix2’
Необходимо, чтобы получить при старте верные NextIDs, дабы избежать проблем и коллизий при мерже баз.

cat << 'EOF' | mysql zabbix2 -- OLD DATABASE use zabbix -- temp tables for nexids drop table zabbix2.tmp_nextids; create table zabbix2.tmp_nextids ( `field_name` varchar(255) NOT NULL, `id` bigint(20) unsigned NOT NULL ); -- find nextids INSERT INTO zabbix2.tmp_nextids SELECT 'eventid', max(eventid)+1 FROM `events` ; INSERT INTO zabbix2.tmp_nextids SELECT 'acknowledgeid', max(acknowledgeid)+1 FROM `acknowledges`; INSERT INTO zabbix2.tmp_nextids SELECT 'alertid', max(alertid)+1 FROM `alerts`; INSERT INTO zabbix2.tmp_nextids SELECT 'auditid', max(auditid)+1 FROM `auditlog`; INSERT INTO zabbix2.tmp_nextids SELECT 'auditdetailid', max(auditdetailid)+1 FROM `auditlog_details`; INSERT INTO zabbix2.tmp_nextids SELECT 'escalationid', max(escalationid)+1 FROM `escalations`; -- NEW DATABASE use zabbix2 -- get one eventid for constraints SELECT id into @eventid FROM tmp_nextids where field_name='eventid' limit 1; -- get first userid for constraints SELECT userid into @userid FROM users order by userid asc limit 1; -- get first media for constraints SELECT mediatypeid into @mediatypeid FROM media_type order by mediatypeid asc limit 1; -- get first action for constraints SELECT actionid into @actionid FROM actions order by actionid asc limit 1; -- get one auditlog for constraints SELECT id into @auditid FROM tmp_nextids where field_name='auditid' limit 1; -- Create Fake data INSERT INTO `events` (eventid) SELECT id FROM tmp_nextids where field_name='eventid' ; INSERT INTO `acknowledges` (acknowledgeid,eventid,userid, message) SELECT id, @eventid, @userid, 'Fake ack for 1.8 => 2.0 Migration'
FROM tmp_nextids
where field_name='acknowledgeid' ;

INSERT INTO `alerts` ( alertid, actionid, eventid, userid, mediatypeid, message)
SELECT id, @actionid, @eventid, @userid, @mediatypeid, 'Fake alert for 1.8 => 2.0 Migration'
FROM tmp_nextids
where field_name='alertid' ;

INSERT INTO `auditlog` ( auditid, userid, details)
SELECT id, @userid, 'Faked auditlogs for 1.8 => 2.0 Migration'
FROM tmp_nextids
where field_name='auditid' ;

INSERT INTO `auditlog_details` ( auditdetailid, auditid, oldvalue, newvalue)
SELECT id, @auditid, '', 'Faked audit for 1.8 => 2.0 Migration'
FROM tmp_nextids
where field_name='auditdetailid' ;

INSERT INTO `escalations` (escalationid, actionid)
SELECT id, @actionid
FROM tmp_nextids
where field_name='escalationid';

EOF

Step 4 : апгрейд БД ‘zabbix2’.

# cd /path/to/src/zabbix-2.0.2/upgrades/dbpatches/2.0/mysql/
# ./upgrade zabbix2 -pzabbix -pzabbixpassword

Step 5 : Подготовка секционирования таблиц в БД ‘zabbix2’, если вы не используете стандартный housekeeper.

http://www.zabbix.com/wiki/non-english/ru/partitioning_in_mysql#таблица_настроек_секционирования

Step 6 : Запрет писать в таблицу housekeeper БД ‘zabbix2’, если вы не используете станартный housekeeper.
Это нужно, чтобы снизить нагрузку, так как даже при отключенном housekeeper в таблицу все равно пишутся данные.

#cat << "ALTER TABLE `housekeeper` ENGINE = BLACKHOLE;" | mysql zabbix2

Step 7 : Установка нового фронтенда. Варианта два. Опишу один, на мой взгляд, самый оптимальный.

# mkdir /path/to/www/zabbix-2.0
# ln -s /path/to/www/zabbix-2.0 /path/to/www/zabbix
# cp -r /path/to/sources/frontend/php/ /path/to/www/zabbix-2.0

Step 8 : Старт нового сервера на БД ‘zabbix2’
Не забыть проверить права юзера ‘zabbix’ на базу ‘zabbix2’, поменять значения в конфиге и фронтенде.

Step 8 : Апгрейд БД ‘zabbix’, в которой содержатся исторические данные.

# cd /path/to/src/zabbix-2.0.2/upgrades/dbpatches/2.0/mysql/
# ./upgrade zabbix -pzabbix -pzabbixpassword

Step 9 : Интегрирование данных из БД ‘zabbix’ в ‘zabbix2’
Возможна маленькая проблема : появятся перерывы в данных, из за перегруженности БД.

# cat <events
INSERT INTO events SELECT * FROM zabbix.events;

INSERT INTO acknowledges SELECT * FROM zabbix.acknowledges;
INSERT INTO alerts SELECT * FROM zabbix.alerts;

-- auditlog_detail -> auditlog
INSERT INTO auditlog SELECT * FROM zabbix.auditlog;
INSERT INTO auditlog_details SELECT * FROM zabbix.auditlog_details;

INSERT INTO escalations SELECT * FROM zabbix.escalations;

alter table history add unique _u_history (itemid,clock);
insert ignore into history SELECT * FROM zabbix.history;
alter table history drop index _u_history;

alter table history_log add unique _u_history_log (itemid,clock);
insert ignore into history_log SELECT * FROM zabbix.history_log;
alter table history_log drop index _u_history_log;

alter table history_str add unique _u_history_str (itemid,clock);
insert ignore into history_str SELECT * FROM zabbix.history_str;
alter table history_str drop index _u_history_str;

alter table history_str_sync add unique _u_history_str_sync (itemid,clock);
insert ignore into history_str_sync SELECT * FROM zabbix.history_str_sync;
alter table history_str_sync drop index _u_history_str_sync;

alter table history_sync add unique _u_history_sync (itemid,clock);
insert ignore into history_sync SELECT * FROM zabbix.history_sync;
alter table history_sync drop index _u_history_sync;

alter table history_text add unique _u_history_text (itemid,clock);
insert ignore into history_text SELECT * FROM zabbix.history_text;
alter table history_text drop index _u_history_text;

alter table history_uint add unique _u_history_uint (itemid,clock);
insert ignore into history_uint SELECT * FROM zabbix.history_uint;
alter table history_uint drop index _u_history_uint;

alter table history_uint_sync add unique _u_history_uint_sync (itemid,clock);
insert ignore into history_uint_sync SELECT * FROM zabbix.history_uint_sync;
alter table history_uint_sync drop index _u_history_uint_sync;

alter table trends add unique _u_trends (itemid,clock);
insert ignore into trends SELECT * FROM zabbix.trends;
alter table trends drop index _u_trends;

alter table trends_uint add unique _u_trends_uint (itemid,clock);
insert ignore into trends_uint SELECT * FROM zabbix.trends_uint;
alter table trends_uint drop index _u_trends_uint;

EOF

Step 10 : Очистка фейковых NextIDs

# cat <delete t FROM acknowledges t, tmp_nextids n
where t.acknowledgeid=n.id
and n.field_name='acknowledgeid';

delete t FROM events t, tmp_nextids n
where t.eventid=n.id
and n.field_name='eventid';

delete t FROM alerts t, tmp_nextids n
where t.alertid=n.id
and n.field_name='alertid';

delete t FROM auditlog_details t, tmp_nextids n
where t.auditdetailid=n.id
and n.field_name='auditdetailid';

delete t FROM auditlog t, tmp_nextids n
where t.auditid=n.id
and n.field_name='auditid';

delete t FROM escalations t, tmp_nextids n
where t.escalationid=n.id
and n.field_name='escalationid';

drop table `tmp_nextids`;

EOF

PROFIT!

Постовой

Любой строительный и специальный крепеж Саморезы, дюбели, анкера и прочие виды расходников.




2 комментария »


2 комментария to “Обновление системы мониторинга Zabbix до версии 2.*”

  1. freejoins on 04 Окт 2012 at 16:16 #

    Застрял на шаге Step 3 : создание фейковых NextIDs в БД ‘zabbix2′, это все нужно вбивать в консоль или все это делается shell скриптом или еще как? Статья очень полезная, пытаюсь по ней сделать переход с 1.8 до 2.0

  2. Максим Степанов on 01 Ноя 2012 at 13:28 #

    Попробуйте выдрать просто mysql команды, вот и все

Trackback URI | Comments RSS

Leave a Reply

You must be logged in to post a comment.


« | »

  • Реклама

  • Ссылки



  • Теги



Server load average: 0.00, 0.00, 0.00
Server uptime: 474 days, 2:24
Your IP is: 54.162.154.91.