Sèvi ak patisyon nan MySQL pou Zabbix ak yon gwo kantite objè siveyans

Pou kontwole sèvè ak sèvis, nou te itilize yon solisyon konbine ki baze sou Nagios ak Munin pou yon tan long, epi toujou avèk siksè. Sepandan, konbinezon sa a gen yon kantite dezavantaj, kidonk nou, tankou anpil moun, aktivman eksplwate Zabbix. Nan atik sa a nou pral pale sou ki jan, ak efò minim, ou ka rezoud yon pwoblèm pèfòmans lè ogmante kantite mezi yo pran ak ap grandi volim baz done MySQL.

Pwoblèm lè l sèvi avèk yon baz done MySQL ak Zabbix

Pandan ke baz done a te piti ak kantite mezi ki estoke nan li te piti, tout bagay te gwo. Pwosesis estanda pou mennaj la, ki te lanse pa Zabbix Server tèt li, avèk siksè efase dosye demode nan baz done a, anpeche li grandi. Sepandan, le pli vit ke kantite mezi yo te pran ogmante ak gwosè baz done a te rive nan yon sèten gwosè, bagay yo te vin pi mal. Houserkeeper te sispann kapab efase done nan entèval tan yo te bay li a, e ansyen done yo te kòmanse rete nan baz done a. Pandan ke mennaj t ap kouri, te gen yon chaj ogmante sou sèvè Zabbix, ki te kapab pèsiste pou yon tan long. Li te vin klè ke nou te bezwen yon jan kanmenm rezoud sitiyasyon aktyèl la.

Sa a se yon pwoblèm li te ye, prèske tout moun ki te travay ak gwo komèsan nan siveyans sou Zabbix te rankontre menm bagay la. Te gen tou plizyè solisyon: pou egzanp, ranplase MySQL ak PostgreSQL oswa menm Elasticsearch, men solisyon ki pi senp ak ki pi pwouve se te tranzisyon an nan tab patisyon ki estoke done mezi nan yon baz done MySQL. Nou deside ale egzakteman fason sa a.

Tranzisyon soti nan tab MySQL regilye pou ale nan tab ki divize yo

Zabbix byen dokimante ak tab kote li estoke mezi yo konnen. Sa yo se tab yo: history, kote valè flote yo estoke, history_str, kote valè kout fisèl yo estoke, history_text, kote valè tèks long yo estoke ak history_uint, kote valè nonb antye relatif yo estoke. Genyen tou yon tab trends, ki estoke dinamik chanjman yo, men nou deside pa manyen li, paske gwosè li piti epi nou pral retounen nan li yon ti kras pita.

An jeneral, li te klè ki tab yo te bezwen trete. Nou deside fè patisyon pou chak semèn, eksepte dènye a, ki baze sou nimewo mwa a, i.e. kat pakèt pa mwa: soti nan 1yèm rive 7yèm, soti nan 8yèm rive 14yèm, soti nan 15yèm rive 21yèm ak soti nan 22yèm rive 1yèm (nan pwochen mwa a). Difikilte a se te ke nou te bezwen vire tab yo nou te bezwen yo nan patisyon yo "sou vole a", san yo pa entèwonp operasyon an nan Zabbix Server ak koleksyon an nan metrik.

Etranj ase, estrikti done tab yo li menm te vin ede nou nan sa. Pou egzanp tab history gen estrikti sa a:

`itemid` bigint(20) unsigned NOT NULL,
`clock` int(11) NOT NULL DEFAULT '0',
`value` double(16,4) NOT NULL DEFAULT '0.0000',
`ns` int(11) NOT NULL DEFAULT '0',

pandan y ap

KEY `history_1` (`itemid`,`clock`)

Kòm ou ka wè, chak metrik finalman antre nan yon tablo ak de jaden trè enpòtan ak pratik pou nou. itemid и revèy. Kidonk, nou ka fasilman kreye yon tab tanporè, pou egzanp, ak non an history_tmp, mete kanpe patisyon pou li epi transfere tout done ki soti nan tab la historyepi apre sa chanje non tab la history в history_old, ak tab la history_tmp в history, ak Lè sa a, ajoute done yo ke nou pa te ranpli nan soti nan history_old в history epi retire history_old. Sa a ka fè konplètman san danje, nou pa pral pèdi anyen, paske jaden ki anwo yo itemid и revèy bay obligatwa nan yon metrik espesifik nan yon tan espesifik, epi yo pa nan kèk nimewo seri.

Pwosedi tranzisyon an tèt li

Atansyon! Li trè rekòmande, anvan ou kòmanse nenpòt aksyon, fè yon kopi backup konplè nan baz done a. Nou tout moun k ap viv epi nou ka fè yon erè nan seri kòmandman yo, ki ka mennen nan pèt done. Wi. Yon backup pa pral asire maksimòm ajou, men li pi bon pou gen youn pase okenn.

Se konsa, nou pa fèmen anyen oswa sispann anyen. Bagay pwensipal lan se ke sèvè MySQL nan tèt li gen yon kantite ase espas ki gen kapasite gratis, sa vle di. se konsa ke pou chak nan tablo ki nan lis pi wo a history, history_text, history_str, history_uint, nan yon minimòm, te gen ase espas yo kreye yon tab ak sifiks "_tmp la", paske li pral menm gwosè ak tab orijinal la.

Nou pa pral dekri tout bagay plizyè fwa pou chak nan tablo ki anwo yo epi nou pral konsidere tout bagay lè l sèvi avèk egzanp sèlman youn nan yo - tab la. history.

Se konsa, an n kreye yon tab vid history_tmp baze sou estrikti tab la history.

CREATE TABLE `history_tmp` LIKE `history`;

Nou kreye patisyon nou bezwen yo. Pa egzanp, ann fè sa pou yon mwa. Chak patisyon kreye baze sou yon règ patisyon ki baze sou valè jaden an revèy, ke nou konpare ak timestamp la:

ALTER TABLE `history_tmp` PARTITION BY RANGE( clock ) (
PARTITION p20190201 VALUES LESS THAN (UNIX_TIMESTAMP("2019-02-01 00:00:00")),
PARTITION p20190207 VALUES LESS THAN (UNIX_TIMESTAMP("2019-02-07 00:00:00")),
PARTITION p20190214 VALUES LESS THAN (UNIX_TIMESTAMP("2019-02-14 00:00:00")),
PARTITION p20190221 VALUES LESS THAN (UNIX_TIMESTAMP("2019-02-21 00:00:00")),
PARTITION p20190301 VALUES LESS THAN (UNIX_TIMESTAMP("2019-03-01 00:00:00"))
);

Operatè sa a ajoute patisyon pou tab nou kreye a history_tmp. Se pou nou klarifye done ki gen valè jaden revèy mwens pase "2019-02-01 00:00:00" yo pral enkli nan pakèt la p20190201, Lè sa a, done ki gen valè jaden revèy plis pase "2019-02-01 00:00:00" men mwens pase "2019-02-07 00:00:00" nan patisyon an. p20190207 ak sou sa.

Nòt enpòtan: Kisa k ap pase si nou gen done nan tab la patisyon ki gen valè nan jaden an revèy ki pi gran pase oswa egal a "2019-03-01 00:00:00"? Depi pa gen okenn patisyon apwopriye pou done sa yo, li pa pral parèt nan tablo a epi yo pral pèdi. Se poutèt sa, ou bezwen sonje kreye patisyon adisyonèl nan yon fason apwopriye yo nan lòd pou fè pou evite pèt done sa yo (jan yo diskite anba a).

Se konsa, tab la tanporè prepare. Ranpli done yo. Pwosesis la ka pran yon bon bout tan, men erezman li pa bloke okenn lòt demann, kidonk ou jis bezwen pasyan:

INSERT IGNORE INTO `history_tmp` SELECT * FROM history;

Mo kle IGNORE a pa obligatwa pandan premye ranpli a, paske pa gen okenn done nan tablo a de tout fason, men w ap bezwen li lè w ajoute done. Anplis de sa, li ka itil si, pandan w ap telechaje done, ou te oblije entèwonp pwosesis sa a epi kòmanse ankò.

Se konsa, apre kèk tan (petèt menm kèk èdtan), premye telechaje done a te pran plas. Kòm ou konprann, kounye a tab la history_tmp pa genyen tout done ki nan tablo a history, men se sèlman moun ki te ladan l nan moman demann lan te kòmanse. Isit la ou aktyèlman gen yon chwa: swa nou fè yon lòt pas (si pwosesis ranpli a te pran yon tan long), oswa nou imedyatman kontinye chanje non tab yo, ki te diskite pi wo a. Ann pale sou dezyèm pas la an premye. Premyèman, nou bezwen konprann lè dènye dosye ki te antre nan history_tmp:

SELECT max(clock) FROM history_tmp;

Ann di ou te resevwa: 1551045645. Koulye a, nou itilize valè a ki kapab lakòz nan dezyèm pas nan ranpli done:

INSERT IGNORE INTO `history_tmp` SELECT * FROM history WHERE clock>=1551045645;

Pasaj sa a ta dwe fini pi vit. Men, si premye pas la te pran èdtan pou konplete, ak dezyèm lan tou te pran yon bon bout tan, li ka kòrèk pou fè yon twazyèm pas, ki fèt egzakteman menm jan ak dezyèm lan.

Finalman, nou ankò fè operasyon an nan jwenn tan an nan ensèsyon an dènye nan yon dosye nan history_tmppa kouri:

SELECT max(clock) FROM history_tmp;

Ann di ou te resevwa 1551085645. Sove valè sa a - nou pral bezwen li pou ranpli.

Epi, koulye a, aktyèlman, lè ranpli inisyal la nan done nan history_tmp fini, ann kòmanse chanje non tab yo:

BEGIN;
RENAME TABLE history TO history_old;
RENAME TABLE history_tmp TO history;
COMMIT;

Nou fèt blòk sa a kòm yon sèl tranzaksyon pou evite mete done nan yon tablo ki pa egziste, paske apre premye RENAME jiskaske dezyèm RENAME egzekite, tab la. history pap egziste. Men, menm si ant RENOME operasyon sou tab la history kèk done pral rive, men tab la li menm pap egziste ankò (akòz chanje non), nou pral resevwa yon ti kantite erè ensèsyon ki ka neglije (nou gen siveyans, pa yon bank).

Koulye a, nou gen yon nouvo tab history ak patisyon, men li manke done ki te resevwa pandan dènye pas la nan mete done nan tab la history_tmp. Men, nou gen done sa yo nan tablo a history_old epi kounye a nou pral tèt yo soti nan la. Pou fè sa, nou bezwen valè ki te deja sove 1551085645. Poukisa nou te sove valè sa a epi nou pa itilize tan maksimòm ranpli nan tablo aktyèl la. history? Paske nouvo done yo deja antre nan li epi nou pral jwenn move moman an. Se konsa, an n ajoute done yo:

INSERT IGNORE INTO `history` SELECT * FROM history_old WHERE clock>=1551045645;

Apre operasyon sa a fini, nan nouvo tab nou an, divize history gen tout done ki te nan ansyen an, plis sa yo ki te deja rive apre yo fin chanje non tab la. Tablo history_old nou pa bezwen li ankò. Ou ka efase li imedyatman, oswa ou ka fè yon kopi backup nan li anvan efase li (si ou se paranoya).

Tout pwosesis la pi wo a bezwen repete pou tab yo history_str, history_text и history_uint.

Ki sa ki bezwen korije nan anviwònman sèvè Zabbix

Koulye a, antretyen baz done an tèm de istwa done tonbe sou zepòl nou. Sa vle di ke Zabbix pa oblije efase ansyen done ankò - nou pral fè sa nou menm. Pou anpeche Zabbix Server eseye efase done tèt li, ou bezwen ale nan koòdone entènèt Zabbix, chwazi "Administrasyon" nan meni an, Lè sa a, sou-menu "Jeneral" a, epi chwazi "Klè istwa" nan lis deroulant ki sou la. dwa. Nan paj ki parèt la, ou bezwen dezaktive tout bwat yo pou gwoup "Istwa" a epi klike sou bouton "Mizajou". Sa ap anpeche nou netwaye tab san nesesite history* atravè mennaj.

Nan menm paj la, peye atansyon sou gwoup "Dinamik Chanjman yo". Sa a se jis yon tab trends, kote nou te pwomèt pou n retounen. Si li te vin twò gwo tou epi li bezwen patisyon, dezaktive kare yo nan gwoup sa a, epi trete tab sa a menm jan ou te fè pou tab yo. history*.

Pli lwen antretyen baz done

Jan sa te ekri pi bonè, pou operasyon nòmal sou tab patisyon, li nesesè yo kreye patisyon alè. Ou ka fè li konsa:

ALTER TABLE `history` ADD PARTITION (PARTITION p20190307 VALUES LESS THAN (UNIX_TIMESTAMP("2019-03-07 00:00:00")));

Anplis de sa, depi nou te kreye tab patisyon yo ak entèdi Zabbix Server soti nan netwaye yo, efase ansyen done se kounye a enkyetid nou an. Erezman, pa gen okenn pwoblèm isit la ditou. Sa a se fè tou senpleman pa efase patisyon an ki gen done nou pa bezwen ankò.

Pou egzanp:

ALTER TABLE history DROP PARTITION p20190201;

Kontrèman ak deklarasyon DELETE FROM ki gen yon entèval dat, DROP PARTITION pran kèk segond pou konplete epi li dechaje nèt. sèvè epi li fonksyone menm jan san pwoblèm lè w ap itilize replikasyon MySQL.

Konklizyon

Solisyon ki dekri a te teste tan. Volim nan done ap grandi, men pa gen okenn ralentissement aparan nan pèfòmans.

Sous: www.habr.com

Achte hosting serye pou sit ki gen pwoteksyon DDoS, sèvè VPS VDS 🔥 Achte yon hébergement sit entènèt serye ak pwoteksyon DDoS, sèvè VPS VDS | ProHoster