Stāsts par 300 miljonu ierakstu fizisku dzÄ“Å”anu pakalpojumā MySQL

Ievads

Sveiki. Es esmu ningenMe, tīmekļa izstrādātājs.

Kā saka virsraksts, mans stāsts ir stāsts par 300 miljonu ierakstu fizisku dzÄ“Å”anu pakalpojumā MySQL.

Mani tas sāka interesēt, tāpēc nolēmu uztaisīt atgādinājumu (instrukciju).

Sākums ā€” brÄ«dinājums

PakeÅ”serverim, kuru izmantoju un uzturu, ir regulārs process, kas reizi dienā apkopo pēdējā mēneÅ”a datus no MySQL.

Parasti Å”is process tiek pabeigts aptuveni 1 stundas laikā, taču Å”oreiz tas netika pabeigts 7 vai 8 stundas, un brÄ«dinājums nepārstāja parādÄ«ties...

Meklē iemeslu

Es mēģināju atsākt procesu un apskatīt žurnālus, bet es neredzēju neko sliktu.
Vaicājums tika indeksēts pareizi. Bet, domājot par to, kas notiek nepareizi, es sapratu, ka datu bāzes apjoms ir diezgan liels.

hoge_table | 350'000'000 |

350 miljoni ierakstu. Å Ä·ita, ka indeksÄ“Å”ana darbojas pareizi, tikai ļoti lēni.

NepiecieÅ”amā datu vākÅ”ana mēnesÄ« bija aptuveni 12 000 000 ierakstu. Izskatās, ka atlases komanda aizņēma ilgu laiku un transakcija netika izpildÄ«ta ilgu laiku.

DB

BÅ«tÄ«bā tā ir tabula, kas katru dienu pieaug par aptuveni 400 000 ierakstu. Datu bāzei bija paredzēts apkopot datus tikai par pēdējo mēnesi, tāpēc bija paredzēts, ka tā izturēs tieÅ”i Ŕādu datu apjomu, taču diemžēl rotācijas darbÄ«ba netika iekļauta.

Šo datu bāzi neesmu izstrādājis es. Es to pārņēmu no cita izstrādātāja, tāpēc tas joprojām likās kā tehniskais parāds.

Pienāca brÄ«dis, kad katru dienu ievietoto datu apjoms kļuva liels un beidzot sasniedza savu robežu. Tiek pieļauts, ka, strādājot ar tik lielu datu apjomu, bÅ«tu nepiecieÅ”ams tos atdalÄ«t, taču tas diemžēl netika izdarÄ«ts.

Un tad es sāku darboties.

Korekcija

Bija racionālāk samazināt paŔas datu bāzes lielumu un samazināt tās apstrādes laiku, nevis mainīt paŔu loģiku.

Situācijai vajadzētu būtiski mainīties, ja izdzēsīsiet 300 miljonus ierakstu, tāpēc es nolēmu to darīt... Eh, es domāju, ka tas noteikti darbosies.

1. darbība

Sagatavojis uzticamu dublējumu, beidzot sāku sūtīt pieprasījumus.

''Pieprasījuma sūtīŔana''

DELETE FROM hoge_table WHERE create_time <= 'YYYY-MM-DD HH:MM:SS';

"ā€¦"

"ā€¦"

ā€œHmm... Nav atbildes. VarbÅ«t process aizņem ilgu laiku?ā€ ā€” nodomāju, bet katram gadÄ«jumam paskatÄ«jos uz grafānu un ieraudzÄ«ju, ka diska noslodze ļoti strauji aug.
"Bīstami," es vēlreiz nodomāju un nekavējoties pārtraucu pieprasījumu.

2. darbība

Izanalizējot visu, es sapratu, ka datu apjoms ir pārāk liels, lai izdzēstu visu uzreiz.

Es nolēmu uzrakstīt skriptu, kas varētu dzēst apmēram 1 000 000 ierakstu, un palaidu to.

"Es Ä«stenoju skriptu"

"Tagad tas noteikti darbosies," es domāju.

3. darbība

Otrā metode darbojās, taču izrādījās ļoti darbietilpīga.
Lai visu izdarÄ«tu uzmanÄ«gi, bez liekiem nerviem, bÅ«tu vajadzÄ«gas kādas divas nedēļas. Bet tomēr Å”is scenārijs neatbilda apkalpoÅ”anas prasÄ«bām, tāpēc nācās no tā atteikties.

Lūk, ko es nolēmu darīt:

Kopējiet tabulu un pārdēvējiet to

No iepriekŔējā soļa sapratu, ka tik liela datu apjoma dzÄ“Å”ana rada tikpat lielu slodzi. Tāpēc es nolēmu izveidot jaunu tabulu no jauna, izmantojot ievietoÅ”anu, un pārvietot tajā datus, ko gatavojos dzēst.

| hoge_table     | 350'000'000|
| tmp_hoge_table |  50'000'000|

Ja jauno tabulu veidojat tāda paÅ”a izmēra kā iepriekÅ”, arÄ« datu apstrādes ātrumam vajadzētu kļūt par 1/7 ātrākam.

Pēc tabulas izveidoÅ”anas un pārdēvÄ“Å”anas es sāku to izmantot kā galveno tabulu. Tagad, ja es nomestu tabulu ar 300 miljoniem ierakstu, visam vajadzētu bÅ«t kārtÄ«bā.
Es uzzināju, ka saÄ«sināŔana vai nomeÅ”ana rada mazāk papildu izdevumu nekā dzÄ“Å”ana, un nolēmu izmantot Å”o metodi.

Piepildījums

''Pieprasījuma sūtīŔana''

INSERT INTO tmp_hoge_table SELECT FROM hoge_table create_time > 'YYYY-MM-DD HH:MM:SS';

"ā€¦"
"ā€¦"
"Em...?"

4. darbība

Es domāju, ka iepriekŔējā ideja darbosies, bet pēc ievietoÅ”anas pieprasÄ«juma nosÅ«tÄ«Å”anas parādÄ«jās vairākas kļūdas. MySQL nav piedodoÅ”s.

Es jau biju tik nogurusi, ka sāku domāt, ka vairs negribu to darīt.

Sēdēju un domāju un sapratu, ka varbūt vienu reizi bija pārāk daudz ieliktņu vaicājumu...
Es mēģināju nosÅ«tÄ«t ievietoÅ”anas pieprasÄ«jumu par datu apjomu, kas datu bāzei jāapstrādā 1 dienas laikā. Notika!

Nu, pēc tam mēs turpinām sÅ«tÄ«t pieprasÄ«jumus par tādu paÅ”u datu apjomu. Tā kā mums ir jānoņem mēneÅ”a dati, mēs atkārtojam Å”o darbÄ«bu aptuveni 35 reizes.

Tabulas pārdēvÄ“Å”ana

Šeit veiksme bija manā pusē: viss noritēja gludi.

Brīdinājums pazudis

PakeŔu apstrādes ātrums ir palielinājies.

IepriekÅ” Å”is process ilga apmēram stundu, tagad tas aizņem apmēram 2 minÅ«tes.

Kad biju pārliecināts, ka visas problēmas ir atrisinātas, es samazināju 300 miljonus ierakstu. Izdzēsu tabulu un jutos atdzimusi.

Kopsavilkums

Es sapratu, ka pakeÅ”u apstrādē trÅ«kst rotācijas apstrādes, un tā bija galvenā problēma. Šāda veida arhitektÅ«ras kļūda noved pie laika izŔķieÅ”anas.

Vai, dzÄ“Å”ot ierakstus no datu bāzes, domājat par slodzi datu replikācijas laikā? Nepārslogosim MySQL.

Tie, kas labi pārzina datubāzes, noteikti nesaskarsies ar Ŕādu problēmu. Pārējiem, es ceru, ka Å”is raksts bija noderÄ«gs.

Paldies, ka izlasījāt!

Mēs bÅ«sim ļoti priecÄ«gi, ja pastāstÄ«sit, vai jums patika Å”is raksts, vai tulkojums ir skaidrs, vai tas jums bija noderÄ«gs?

Avots: www.habr.com

Pievieno komentāru