Очистка, оптимизация, настройка mysql базы Zabbix

Thank you for reading this post, don't forget to subscribe!

Чаще все­го хва­та­ет дефолт­ных настро­ек, поэто­му како­го-то осо­бен­но­го вни­ма­ния бд я не уделял.

Если вы актив­но исполь­зу­е­те zabbix и внед­ря­е­те его повсе­мест­но во все исполь­зу­е­мые систе­мы, то вы рано или позд­но столк­не­тесь с вопро­сом про­из­во­ди­тель­но­сти систе­мы мони­то­рин­га и раз­ме­ра базы дан­ных zabbix.

Тема про­из­во­ди­тель­но­сти zabbix очень инди­ви­ду­аль­ная. Она напря­мую зави­сит от того, как вы его исполь­зу­е­те, а схе­мы мони­то­рин­га могут быть очень раз­ные. Одно дело мони­то­рить несколь­ко сер­ве­ров, а дру­гое дело нагру­жен­ные сви­чи на 48 пор­тов со съе­мом мет­рик с каж­до­го пор­та раз в 30 секунд.

Что­бы помочь вам разо­брать­ся в этой теме и при­ки­нуть, к чему гото­вить­ся, я поде­люсь с вами сво­им опы­том экс­плу­а­та­ции заб­бик­са, его нагруз­ки, про­из­во­ди­тель­но­сти и обслу­жи­ва­ния базы дан­ных mysql. Рас­ска­жу, как мож­но умень­шить раз­мер базы.

Как спланировать нагрузку на Zabbix

Под неболь­шой струк­ту­рой, упо­мя­ну­той в нача­ле, я под­ра­зу­ме­ваю 50-100 узлов (не сете­вое обо­ру­до­ва­ние с десят­ка­ми пор­тов) сети на мони­то­рин­ге и при­мер­но 2000-4000 актив­ных эле­мен­тов дан­ных, кото­рые запи­сы­ва­ют 20-40 новых зна­че­ний в секун­ду. Под такую сеть вам будет доста­точ­но неболь­шой вир­ту­аль­ной маши­ны с 2 ядра­ми и 4 гб памя­ти. База дан­ных на пре­иму­ще­ствен­но стан­дарт­ных шаб­ло­нах будет рас­ти при­мер­но на 2-4 Гб в год. Даль­ше еще мень­ше, так как будет авто­ма­ти­че­ски очищаться.

Для мони­то­рин­га такой сети мож­но вооб­ще не выпол­нять ника­ких допол­ни­тель­ных настро­ек. Мони­то­ринг будет вполне нор­маль­но рабо­тать. Если же нагруз­ка нач­нет рас­ти, то пер­вое, с чем вы столк­не­тесь - это с раз­ме­ром и про­из­во­ди­тель­но­стью базы дан­ных. База zabbix будет рас­ти про­пор­ци­о­наль­но под­клю­че­нию к ней хостов. И с этим при­дет­ся что-то делать.

Для реше­ния вопро­са про­из­во­ди­тель­но­сти нуж­но будет дви­гать­ся в двух направлениях:

  1. Очист­ка базы от ненуж­ных данных.
  2. Уве­ли­че­ние про­из­во­ди­тель­но­сти сер­ве­ра mysql.

Каж­дый из ука­зан­ных вопро­сов мно­го­гра­нен. Далее мы частич­но их рас­смот­рим и выпол­ним наи­бо­лее про­стые, оче­вид­ные и резуль­та­тив­ные изменения.

Очистка и уменьшение mysql базы zabbix

Нач­нем с очист­ки базы дан­ных zabbix от ненуж­ных дан­ных. Рас­смот­рим по пунк­там в той после­до­ва­тель­но­сти, в кото­рой это нуж­но делать.

  1. Пер­вым делом надо вни­ма­тель­но про­смот­реть все исполь­зу­е­мые шаб­ло­ны и отклю­чить там все, что вам не нуж­но. Напри­мер, если вам не нужен мони­то­ринг сете­вых соеди­не­ний windows, обя­за­тель­но отклю­чи­те авто­об­на­ру­же­ние сете­вых интер­фей­сов. Оно само по себе нахо­дит десят­ки вир­ту­аль­ных соеди­не­ний, кото­рые воз­вра­ща­ют нули при опро­се и не пред­став­ля­ют ника­кой цен­но­сти. Тем не менее, все эти дан­ные соби­ра­ют­ся и хра­нят­ся, созда­вая лиш­нюю нагруз­ку. Если же вам нужен мони­то­ринг сети в windows, зай­ди­те в  каж­дый хост и отклю­чи­те рука­ми лиш­ние адап­те­ры, кото­рые будут най­де­ны. Этим вы суще­ствен­но умень­ши­те нагруз­ку. По мое­му опы­ту, в стан­дарт­ных шаб­ло­нах windows мони­то­ринг всех сете­вых интер­фей­сов дает при­мер­но 2/3 всей нагруз­ки этих шаблонов.
  2. Отре­дак­ти­руй­те в исполь­зу­е­мых стан­дарт­ных шаб­ло­нах вре­мя опро­са и хра­не­ния дан­ных. Воз­мож­но вам не нуж­на та часто­та опро­са и вре­мя хра­не­ния, кото­рые зада­ны. Там доста­точ­но боль­шие интер­ва­лы хра­не­ния. Чаще все­го их мож­но умень­шить. В целом, не забы­вай­те в сво­их шаб­ло­нах ста­вить адек­ват­ные реаль­ной необ­хо­ди­мо­сти пара­мет­ры. Не нуж­но хра­нить года­ми инфор­ма­цию, кото­рая теря­ет акту­аль­ность уже через неделю.
  3. После отклю­че­ния лиш­них эле­мен­тов в шаб­ло­нах, нуж­но очи­стить базу дан­ных от зна­че­ний неак­тив­ных ите­мов. По-умол­ча­нию, они там оста­ют­ся. Мож­но их очи­стить через web интер­фейс, но это пло­хая идея, так как неудоб­но и очень дол­го. Чаще все­го попыт­ки очи­стить 50-100 эле­мен­тов за раз будут сопро­вож­дать­ся ошиб­ка­ми тай­мау­та или зави­са­ни­ем web интер­фей­са. Далее рас­ска­жу, как это сде­лать эффективнее.

Для очист­ки базы дан­ных zabbix от зна­че­ний неак­тив­ных ите­мов, мож­но вос­поль­зо­вать­ся сле­ду­ю­щи­ми запро­са­ми. Запус­кать их мож­но как в кон­со­ли mysql сер­ве­ра (мак­си­маль­но быст­рый вари­ант), так и в phpmyadmin, кому как удобнее.

Дан­ны­ми запро­са­ми мож­но при­ки­нуть, сколь­ко дан­ных будет очищено:

Если запро­сы нор­маль­но отра­ба­ты­ва­ют и воз­вра­ща­ют счет­чик дан­ных, кото­рые будут уда­ле­ны, даль­ше може­те их уда­лять из базы сле­ду­ю­щи­ми sql запросами.

Дан­ны­ми запро­са­ми вы очи­сти­те базу дан­ных zabbix от зна­че­ний неак­тив­ных эле­мен­тов дан­ных. Но реаль­но раз­мер базы дан­ных у вас не умень­шит­ся, пото­му что в дефолт­ной настрой­ке базы дан­ных исполь­зу­ет­ся фор­мат innodb. Все дан­ные хра­нят­ся в фай­ле ibdata1, кото­рый авто­ма­ти­че­ски не очи­ща­ет­ся после уда­ле­ния дан­ных из базы.

Адми­ни­стри­ро­вать такую базу неудоб­но. Нуж­но как мини­мум настро­ить хра­не­ние каж­дой таб­ли­цы в отдель­ном фай­ле. Этим мы далее и зай­мем­ся, а заод­но обно­вим сер­вер базы дан­ных до све­жей вер­сии mariadb и реаль­но очи­стим базу, умень­шив ее размер.

Обновление и настройка сервера mysql

В дан­ном при­ме­ре я исполь­зую сер­вер CentOS 7. Из стан­дарт­ных репо­зи­то­ри­ев уста­нав­ли­ва­ет­ся доста­точ­но ста­рая вер­сия MariaDB 5.5. Для нача­ла обно­вим ее до послед­ней ста­биль­ной на момент напи­са­ния ста­тьи вер­сии 10.2. Перед этим сде­ла­ем пол­ный бэкап базы дан­ных zabbix, пред­ва­ри­тель­но оста­но­вив сервер.

Теперь уда­лим с сер­ве­ра mysql все базы дан­ных, кро­ме системных.

# mysql -uroot -ppassword

Уда­ля­ем ста­рые фай­лы базы zabbix.

Начи­на­ем обнов­лять сер­вер. Добав­ля­ем репо­зи­то­рий MariaDB в систе­му. Для это­го созда­ем файл /etc/yum.repos.d/mariadb.repo сле­ду­ю­ще­го содержания:

Уста­нав­ли­ва­ем обновление:

Далее пред­ла­гаю свой вари­ант кон­фи­га для mysql сер­ве­ра. Поло­жи­те его в дирек­то­рию /etc/my.cnf.d.

# cat /etc/my.cnf.d/zabbix.cnf

Сра­зу пре­ду­пре­ждаю, что уни­вер­саль­ных настро­ек для mariadb не суще­ству­ет. Я не боль­шой спе­ци­а­лист по тон­кой настрой­ке mysql и деталь­но не вни­кал в опти­ми­за­цию рабо­ты с zabbix. И тем более не тести­ро­вал про­из­во­ди­тель­ность с раз­ны­ми пара­мет­ра­ми. Дан­ный при­мер это набор реко­мен­да­ций, полу­чен­ных из раз­ных источ­ни­ков. Я сам исполь­зую этот кон­фиг и каких-то наре­ка­ний к нему у меня нет, поэто­му делюсь с вами. Воз­мож­но, тут есть что-то, что совер­шен­но не под­хо­дит и надо поме­нять. Если вы уви­ди­те такое, про­шу поде­лить­ся информацией.

Будет вооб­ще здо­ро­во, если кто-то пред­ло­жит свой более опти­маль­ный кон­фиг для zabbix. Хотя я пони­маю, что настрой­ки будут силь­но зави­сеть от пара­мет­ров сер­ве­ра (память и cpu в основ­ном). Их нуж­но под­би­рать в каж­дом кон­крет­ном слу­чае. В ситу­а­ции со стан­дарт­ной уста­нов­кой zabbix, когда про­блем с про­из­во­ди­тель­но­стью нет, мне не хочет­ся этим заниматься.

Запус­ка­ем сер­вер mariadb.

Если сер­вер не стар­ту­ет, а в логе /var/log/messages ошибка:

Уда­ли­те фай­лы aria_log.

И сно­ва запус­кай­те mariadb. Про­ве­рить ста­тус запус­ка мож­но командой:

# systemctl status mariadb

Сер­вер запу­стил­ся. Есть пару заме­ча­ний, мы их поз­же испра­вим. Теперь вос­ста­нав­ли­ва­ем базу дан­ных zabbix из выгрузки.

Запус­ка­ем ути­ли­ту mysql_upgrade для гене­ра­ции новой базы performance_schema.

Пере­за­пус­ка­ем mariadb.

Запус­ка­ем сер­вер zabbix.

Про­ве­ря­ем рабо­ту. По идее, все долж­но быть в поряд­ке. Теперь база дан­ных zabbix хра­нит­ся в дирек­то­рии /var/lib/mysql/zabbix. Она умень­ши­лась в раз­ме­ре, и каж­дая таб­ли­ца хра­нит­ся в отдель­ном файле.