A storia di sguassà fisicamente 300 milioni di dischi in MySQL

Introduzione

Bonghjornu. Sò ningenMe, sviluppatore web.

Cum'è u titulu dice, a mo storia hè a storia di sguassà fisicamente 300 million records in MySQL.

Mi sò interessatu in questu, cusì decisu di fà un ricordu (istruzzioni).

Casa - Alerta

U servore batch chì aghju utilizatu è mantene hà un prucessu regulare chì raccoglie e dati di l'ultimu mese da MySQL una volta à ghjornu.

Di solitu stu prucessu hè cumpletu in circa 1 ora, ma sta volta ùn hè micca finitu per 7 o 8 ore, è l'alerta ùn hà micca cessatu di spuntà ...

Circà una ragione

Aghju pruvatu à riavvia u prucessu è fighjulà i logs, ma ùn aghju vistu nunda di male.
A dumanda hè stata indexata currettamente. Ma quandu aghju pensatu à ciò chì andava male, aghju realizatu chì a dimensione di a basa di dati hè abbastanza grande.

hoge_table | 350'000'000 |

350 milioni di dischi. L'indicizzatura pareva funziona bè, solu assai lentu.

A raccolta di dati necessaria per mese era di circa 12 000 000 record. Sembra chì u cumandamentu di selezzione hà pigliatu assai tempu è a transazzione ùn hè stata eseguita per un bellu pezzu.

DB

Hè essenzialmente una tavola chì cresce da circa 400 000 entrate ogni ghjornu. A basa di dati duverebbe cullà e dati solu per l'ultimu mese, per quessa, era previstu chì resiste esattamente questa quantità di dati, ma, sfurtunatamenti, l'operazione di rotazione ùn era micca inclusa.

Questa basa di dati ùn hè micca stata sviluppata da mè. L'aghju pigliatu da un altru sviluppatore, cusì si sentia sempre cum'è un debitu tecnicu.

Ci hè ghjuntu un puntu quandu u voluminu di dati inseriti ogni ghjornu hè diventatu grande è infine hà righjuntu u so limitu. Hè assuciatu chì quandu u travagliu cù una quantità cusì grande di dati, saria necessariu di separà, ma questu, sfurtunatamenti, ùn hè micca fattu.

È dopu sò ghjuntu in azzione.

Currezzione

Era più raziunale per riduce a dimensione di a basa di dati stessu è riduce u tempu per u processu di cambià a logica stessu.

A situazione duveria cambià significativamente s'ellu sguassate 300 milioni di dischi, cusì aghju decisu di fà cusì... Eh, aghju pensatu chì questu funzionava definitivamente.

Azzione 1

Dopu avè preparatu una copia di salvezza affidativa, aghju finalmente cuminciatu à mandà richieste.

「Mandà una dumanda」

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

"…"

"…"

"Hmm... Nisuna risposta. Forse u prucessu dura assai tempu? - Pensu, ma in casu, aghju fighjatu à grafana è aghju vistu chì a carica di u discu cresce assai rapidamente.
"Periculu", aghju pensatu di novu è immediatamente cessatu a dumanda.

Azzione 2

Dopu avè analizatu tuttu, aghju capitu chì u voluminu di dati era troppu grande per sguassà tuttu in una volta.

Aghju decisu di scrive un script chì puderia sguassà circa 1 records è lanciatu.

「Implementu u script」

"Avà questu funzionerà definitivamente", aghju pensatu.

Azzione 3

U secunnu metudu hà travagliatu, ma hè statu assai intensivu di travagliu.
Per fà tuttu cù cura, senza nervi innecessarii, piglià circa duie simane. Ma sempre, stu scenariu ùn hà micca scuntratu i bisogni di u serviziu, cusì avemu avutu à alluntanassi da ellu.

Allora eccu ciò chì aghju decisu di fà:

Copia a tavula è cambia u nome

Da u passu precedente, aghju realizatu chì l'eliminazione di una quantità cusì grande di dati crea una carica ugualmente grande. Allora aghju decisu di creà una nova tavola da zero usendu l'inserimentu è movendu i dati chì aghju da sguassà in questu.

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

Se fate a nova tavula a stessa dimensione cum'è sopra, a vitezza di trasfurmazioni di dati deve ancu diventà 1/7 più veloce.

Dopu avè creatu a tavola è rinominà, aghju cuminciatu à aduprà cum'è a tavola maestra. Avà s'ellu abbandunò a tavula cù 300 milioni di dischi tuttu deve esse bè.
Aghju scupertu chì truncate o drop crea menu overhead di sguassà è decisu di utilizà stu metudu.

Rendimentu

「Mandà una dumanda」

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

"…"
"…"
"Em...?"

Azzione 4

Pensu chì l'idea previa funziona, ma dopu avè mandatu a dumanda di inserimentu, parechji errori apparsu. MySQL ùn hè micca perdona.

Eru digià tantu stancu chì aghju cuminciatu à pensà chì ùn vulia più fà questu.

Aghju pusatu è pensatu è capitu chì forse ci era troppu dumande di inserimentu per una volta...
Aghju pruvatu à mandà una dumanda di inserimentu per a quantità di dati chì a basa di dati duverà processà in 1 ghjornu. Accadutu!

Ebbè, dopu cuntinuemu à mandà dumande per a listessa quantità di dati. Siccomu avemu bisognu di caccià u valore di un mese di dati, ripetemu sta operazione circa 35 volte.

Rinominazione di una tavola

Quì a furtuna era da a mo parte: tuttu hè andatu bè.

L'alerta hè sparita

A velocità di trasfurmazioni in batch hè aumentata.

Prima stu prucessu durava circa una ora, ora dura circa 2 minuti.

Dopu chì era sicuru chì tutti i prublemi sò stati risolti, aghju abbandunatu 300 milioni di dischi. Aghju sguassatu a tavola è mi sentu rinascita.

Riassuntu

Aghju realizatu chì u prucessu di rotazione mancava in u processu batch, è questu era u prublema principali. Stu tipu d'errore architetturale porta à una perdita di tempu.

Pensate à a carica durante a replicazione di dati quandu sguassate i registri da a basa di dati? Ùn circhemu micca MySQL.

Quelli chì sò bè ​​versatu in basa di dati certamenti ùn scontru micca un tali prublema. Per u restu di voi, spergu chì questu articulu hè stata utile.

Grazie per a lettura!

Saremu assai felici se ci dite s'ellu vi piace stu articulu, s'ellu a traduzzione hè chjara, s'ellu hè stata utile per voi?

Source: www.habr.com

Add a comment