- ўвядзенне
- Як спланаваць нагрузку на Zabbix
- Ачыстка і памяншэнне mysql базы zabbix
- Абнаўленне і настройка сервера mysql
- заключэнне
- Дапамагла артыкул? ёсць магчымасць аддзячыць аўтара
- Онлайн курс "DevOps практыкі і інструменты"
Я працую з серверамі малога і сярэдняга бізнесу, невялікіх кампаній, дзе патрабаванні да аб'ёму і прадукцыйнасці базы дадзеных не высокія. Часцей за ўсё хапае дэфолтных налад, таму нейкага асаблівага увагі БД я не надаваў. Але сёння я разбяру пытанне вялікага памеру базы дадзеных zabbix, распавяду як яе паменшыць і як аптымізаваць яе працу для павелічэння хуткадзейнасці.
Калі ў вас ёсць жаданне навучыцца будаваць і падтрымліваць высокодоступная і надзейныя сістэмы, рэкамендую пазнаёміцца з онлайн-курсам «DevOps практыкі і інструменты» ў OTUS. Курс не для пачаткоўцаў, для паступлення трэба прайсці.
ўвядзенне
У сваёй інструкцыі па ўсталёўцы і наладзе zabbix я наогул не кранаю пытанне базы дадзеных mysql або прадукцыйнасці сервера ў цэлым. Я проста бяру дэфолтныя налады mariadb, якія ідуць з усталяваннем і выкарыстоўваю іх. Калі ў вас не вельмі вялікая інфраструктура на маніторынгу гэтага цалкам дастаткова, каб нармальна карыстацца сістэмай.
Калі вы актыўна карыстаецеся zabbix і ўкараняе яго паўсюдна ва ўсе выкарыстоўваюцца сістэмы (а я рэкамендую так рабіць), то вы рана ці позна сутыкнецеся з пытаннем прадукцыйнасці сістэмы маніторынгу і памеру базы дадзеных zabbix.
Тэма прадукцыйнасці zabbix вельмі індывідуальная. Яна наўпрост залежыць ад таго, як вы яго выкарыстоўваеце, а схемы маніторынгу могуць быць вельмі розныя. Адна справа маніторыць некалькі сервераў, а іншая справа нагружаныя Сьвяча на 48 партоў са з'ем метрык з кожнага порта раз у 30 секунд.
Каб дапамагчы вам разабрацца ў гэтай тэме і прыкінуць, да чаго рыхтавацца, я падзялюся з вамі сваім вопытам эксплуатацыі заббикса, яго нагрузкі, прадукцыйнасці і абслугоўвання базы дадзеных mysql. Распавяду, як можна паменшыць памер базы.
Як спланаваць нагрузку на Zabbix
Пад маленькай структурай, згаданай у пачатку, я маю на ўвазе 50-100 вузлоў (не сеткавае абсталяванне з дзесяткамі партоў) сеткі на маніторынгу і прыкладна 2000-4000 актыўных элементаў дадзеных, якія запісваюць 20-40 новых значэнняў у секунду. Пад такую сетку вам будзе дастаткова невялікі віртуальнай машыны з 2 ядрамі і 4 гб памяці. База дадзеных на пераважна стандартных шаблонах будзе расці прыкладна на 2-4 Гб у год. Далей яшчэ менш, так як будзе аўтаматычна ачышчацца.
Для маніторынгу такой сеткі можна наогул не выконваць ніякіх дадатковых настроек. Маніторынг будзе цалкам нармальна працаваць. Калі ж нагрузка пачне расці, то першае, з чым вы сутыкнецеся - гэта з памерам і прадукцыйнасцю базы дадзеных. База zabbix будзе расці прапарцыйна падключэнню да яе хастоў. І з гэтым прыйдзецца нешта рабіць.
Для вырашэння пытання прадукцыйнасці трэба будзе рухацца ў двух кірунках:
- Ачыстка базы ад непатрэбных дадзеных.
- Павелічэнне прадукцыйнасці сервера mysql.
Кожны з названых пытанняў шматгранны. Далей мы часткова іх разгледзім і выканаем найбольш простыя, відавочныя і выніковыя змены.
Ачыстка і памяншэнне mysql базы zabbix
Пачнем з ачысткі базы дадзеных zabbix ад непатрэбных дадзеных. Разгледзім па пунктах ў той паслядоўнасці, у якой гэта трэба рабіць.
- Перш за ўсё трэба ўважліва праглядзець усе выкарыстоўваныя шаблоны і адключыць там усё, што вам не трэба. Напрыклад, калі вам не патрэбен маніторынг сеткавых злучэнняў windows, абавязкова адключыце автообнаружение сеткавых інтэрфейсаў. Яно само па сабе знаходзіць дзясяткі віртуальных злучэнняў, якія вяртаюць нулі пры апытанні і не ўяўляюць аніякай каштоўнасці. Тым не менш, усе гэтыя дадзеныя збіраюцца і захоўваюцца, ствараючы лішнюю нагрузку. Калі ж вам патрэбен маніторынг сеткі ў windows, зайдзіце ў кожны хост і адключыце рукамі лішнія адаптары, якія будуць знойдзеныя. Гэтым вы істотна паменшыце нагрузку. На маю вопыту, у стандартных шаблонах windows маніторынг ўсіх сеткавых інтэрфейсаў дае прыкладна 2/3 ўсёй нагрузкі гэтых шаблонаў.
- Адрэдагуйце ў выкарыстоўваных стандартных шаблонах час апытання і захоўвання дадзеных. Магчыма вам не патрэбна тая частата апытання і час захоўвання, якія зададзены. Там дастаткова вялікія інтэрвалы захоўвання. Часцей за ўсё іх можна паменшыць. У цэлым, не забывайце у сваіх шаблонах ставіць адэкватныя рэальнай неабходнасці параметры. Не трэба захоўваць гадамі інфармацыю, якая губляе актуальнасць ўжо праз тыдзень.
- Пасля адключэння лішніх элементаў у шаблонах, трэба ачысціць базу дадзеных ад значэнняў неактыўных итемов. Па-змаўчанні, яны там застаюцца. Можна іх ачысціць праз web інтэрфейс, але гэта дрэнная ідэя, так як нязручна і вельмі доўга. Часцей за ўсё спробы ачысціць 50-100 элементаў за раз будуць суправаджацца памылкамі таймаўту або завісаннем web інтэрфейсу. Далей распавяду, як гэта зрабіць больш эфектыўна.
Для ачысткі базы дадзеных zabbix ад значэнняў неактыўных итемов, можна скарыстацца наступнымі запытамі. Запускаць іх можна як у кансолі mysql сервера (максімальна хуткі варыянт), так і ў phpmyadmin, каму як зручней.
Дадзенымі запытамі можна прыкінуць, колькі дадзеных будзе ачышчана:
SELECT count (itemid) AS history FROM history WHERE itemid NOT IN (SELECT itemid FROM items WHERE status = '0'); SELECT count (itemid) AS history_uint FROM history_uint WHERE itemid NOT IN (SELECT itemid FROM items WHERE status = '0'); SELECT count (itemid) AS history_str FROM history_str WHERE itemid NOT IN (SELECT itemid FROM items WHERE status = '0'); SELECT count (itemid) AS history_text FROM history_text WHERE itemid NOT IN (SELECT itemid FROM items WHERE status = '0'); SELECT count (itemid) AS history_log FROM history_log WHERE itemid NOT IN (SELECT itemid FROM items WHERE status = '0'); SELECT count (itemid) AS trends FROM trends WHERE itemid NOT IN (SELECT itemid FROM items WHERE status = '0'); SELECT count (itemid) AS trends_uint FROM trends_uint WHERE itemid NOT IN (SELECT itemid FROM items WHERE status = '0');
Калі запыты нармальна адпрацоўваюць і вяртаюць лічыльнік дадзеных, якія трэба выдаліць, далей можаце іх выдаляць з базы наступнымі sql запытамі.
DELETE FROM history WHERE itemid NOT IN (SELECT itemid FROM items WHERE status = '0'); DELETE FROM history_uint WHERE itemid NOT IN (SELECT itemid FROM items WHERE status = '0'); DELETE FROM history_str WHERE itemid NOT IN (SELECT itemid FROM items WHERE status = '0'); DELETE FROM history_text WHERE itemid NOT IN (SELECT itemid FROM items WHERE status = '0'); DELETE FROM history_log WHERE itemid NOT IN (SELECT itemid FROM items WHERE status = '0'); DELETE FROM trends WHERE itemid NOT IN (SELECT itemid FROM items WHERE status = '0'); DELETE FROM trends_uint WHERE itemid NOT IN (SELECT itemid FROM items WHERE status = '0');
Дадзенымі запытамі вы ачысціце базу дадзеных zabbix ад значэнняў неактыўных элементаў дадзеных. Але рэальна памер базы дадзеных у вас не паменшыцца, таму што ў дэфолтны наладзе базы дадзеных выкарыстоўваецца фармат innodb. Усе дадзеныя захоўваюцца ў файле ibdata1, які аўтаматычна не чысціцца пасля выдалення дадзеных з базы.
Адміністраваць такую базу нязручна. Трэба як мінімум наладзіць захоўванне кожнай табліцы ў асобным файле. Гэтым мы далей і зоймемся, а заадно абновім сервер базы дадзеных да свежай версіі mariadb і рэальна ачысьцім базу, паменшыўшы яе памер.
Абнаўленне і настройка сервера mysql
У дадзеным прыкладзе я выкарыстоўваю сервер CentOS 7. З стандартных рэпазітароў усталёўваецца досыць старая версія MariaDB 5.5. Для пачатку абновім яе да апошняй стабільнай на момант напісання артыкула версіі 10.2. Перад гэтым зробім поўны бэкап базы дадзеных zabbix, папярэдне спыніўшы сервер.
# Systemctl stop zabbix-server # / usr / bin / mysqldump --opt -v --databases zabbix -uzabbix -ppassword> /root/zabbix.sql
Цяпер выдалім з сервера mysql ўсе базы дадзеных, акрамя сістэмных.
# Mysql -uroot -ppassword> show databases; + -------------------- + | Database | + -------------------- + | information_schema | | mysql | | performance_schema | | zabbix | + -------------------- +> drop database zabbix; > Drop database performance_schema;
Выдаляем старыя файлы базы zabbix.
# Rm / var / lib / mysql / ibdata1 # rm / var / lib / mysql / ib_logfile0 # rm / var / lib / mysql / ib_logfile1
Пачынаем абнаўляць сервер. Дадаем рэпазітар MariaDB ў сістэму. Для гэтага ствараем файл /etc/yum.repos.d/mariadb.repo наступнага зместу:
[Mariadb] name = MariaDB baseurl = http://yum.mariadb.org/10.2/centos7-amd64 gpgkey = https: //yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck = 1
Усталёўваем абнаўленне:
# Yum install MariaDB-server MariaDB-client
Далей прапаную свой варыянт конфігу для mysql сервера. Пакладзеце яго ў дырэкторыю /etc/my.cnf.d.
# Cat /etc/my.cnf.d/zabbix.cnf [client] port = 3306 socket = /var/lib/mysql/mysql.sock default-character-set = utf8 [mysqld] character_set_server = utf8 collation-server = utf8_bin init_connect = "SET NAMES utf8 collate utf8_bin" port = 3306 socket = /var/lib/mysql/mysql.sock back_log = 50 skip-networking max_connections = 100 max_connect_errors = 10 table_open_cache = 2048 max_allowed_packet = 16M binlog_cache_size = 2M max_heap_table_size = 64M read_buffer_size = 4M read_rnd_buffer_size = 32M sort_buffer_size = 16M join_buffer_size = 16M thread_cache_size = 4 ft_min_word_len = 4 memlock default-storage-engine = InnoDB thread_stack = 240K transaction_isolation = REPEATABLE-READ tmp_table_size = 128M log-bin = mysql-bin binlog_format = mixed expire_logs_days = 5 log_warnings slow_query_log long_query_time = 10 server-id = 1 innodb_file_per_table = 1 innodb_file_format = barracuda innodb_buffer_pool_size = 4G # ўвагу на параметр! ўсталяваць прыкладна ў 2 разы менш за аб'ём аператыўнай памяці сервера innodb_buffer_pool_instances = 2 innodb_flush_log_at_trx_commit = 0 innodb_log_file_size = 512M innodb_log_files_in_group = 3 innodb_flush_method = O_DSYNC innodb_lock_wait_timeout = 120 [mysqldump] quick max_allowed_packet = 16M [mysql] no-auto-rehash safe-updates [myisamchk] key_buffer_size = 512M sort_buffer_size = 512M read_buffer = 8M write_buffer = 8M [mysqlhotcopy] interactive-timeout [mysqld_safe] open-files-limit = 8192
Адразу папярэджваю, што універсальных налад для mariadb не існуе. Я не вялікі спецыяліст па тонкай наладзе mysql і дэталёва не ўнікаў у аптымізацыю працы з zabbix. І тым больш не тэставаў прадукцыйнасць з рознымі параметрамі. Дадзены прыклад гэта набор рэкамендацый, атрыманых з розных крыніц. Я сам выкарыстоўваю гэты конфіг і нейкіх нараканняў да яго ў мяне няма, таму дзялюся з вамі. Магчыма, тут ёсць нешта, што зусім не падыходзіць і трэба памяняць. Калі вы ўбачыце такое, прашу падзяліцца інфармацыяй.
Будзе наогул выдатна, калі хтосьці прапануе свой больш аптымальны конфіг для zabbix. Хоць я разумею, што налады будуць моцна залежаць ад параметраў сервера (памяць і cpu у асноўным). Іх трэба падбіраць у кожным канкрэтным выпадку. У сітуацыі са стандартнай устаноўкай zabbix, калі магутнасці сістэмы няма, мне не хочацца гэтым займацца.
Запускаем сервер mariadb.
# Systemctl start mariadb
Калі сервер не стартуе, а ў логу / var / log / messages памылка:
[ERROR] Aria engine is not enabled or did not start. The Aria engine must be enabled to continue as mysqld was configured with --with-aria-tmp-tables
Выдаліце файлы aria_log.
# Rm /var/lib/mysql/aria_log.00000001 # rm / var / lib / mysql / aria_log_control
І зноў запускайце mariadb. Праверыць статус запуску можна камандай:
# Systemctl status mariadb
Сервер запусціўся. Ёсць пару заўваг, мы іх пазней выправім. Цяпер аднаўляем базу дадзеных zabbix з выгрузкі.
# Mysql -uroot -ppassword </root/zabbix.sql
Запускаем утыліту mysql_upgrade для генерацыі новай базы performance_schema.
# Mysql_upgrade -uroot -ppassword --force
Перазапускаем mariadb.
# Systemctl restart mariadb
Запускаем сервер zabbix.
# Systemctl start zabbix-server
Правяраем працу. Па ідэі, усё павінна быць у парадку. Цяпер база дадзеных zabbix захоўваецца ў дырэкторыі / var / lib / mysql / zabbix. Яна паменшылася ў памеры, і кожная табліца захоўваецца ў асобным файле.
заключэнне
Не спадабаўся артыкул і хочаш навучыць мяне адміністраваць? Калі ласка, я люблю вучыцца. Каментары ў тваім распараджэнні. Раскажы, як зрабіць правільна!
Я апісаў просты спосаб ачысткі і невялікага павелічэння прадукцыйнасці базы zabbix. Кардынальна гэтае пытанне вырашаюць з дапамогай партицирования базы дадзеных mysql. Больш падрабязна пра гэта можна пачытаць на сайце заббикса ў wiki ў раздзеле howto . Нічога складанага ў гэтым няма, прыкладаў у сеткі шмат, але асабіста я сам не настройваў ніколі, не было неабходнасці.
Дапамагла артыкул? ёсць магчымасць аддзячыць аўтара
Онлайн курс "DevOps практыкі і інструменты"
Калі ў вас ёсць жаданне навучыцца будаваць і падтрымліваць высокодоступная і надзейныя сістэмы, навучыцца бесперапыннай пастаўшчык ПА, маніторынгу і лагаванне web прыкладанняў, рэкамендую пазнаёміцца з онлайн-курсам «DevOps практыкі і інструменты» ў OTUS. Курс не для пачаткоўцаў, для паступлення патрэбныя базавыя веды па сетках і ўсталёўцы Linux на виртуалку. Навучанне доўжыцца 5 месяцаў, пасля чаго паспяховыя выпускнікі курса змогуць прайсці сумоўя ў партнёраў. Праверце сябе на ўступным цесцю і глядзіце праграму дэталёва па.
Дапамагла артыкул?