Professional Documents
Culture Documents
LevelDB:SSTableeestruturadearmazenamentodelogsiMasters
LevelDB:SSTablee
estruturade
armazenamentodelogs
IlyaGrigorik
emBancodeDados
SeProtocolBufferssoalnguafrancaderegistrosdedadosindividuais
noGoogle,entoaSortedStringTable(SSTable)umadassadasmais
comunsparaarmazenar,processaretrocarconjuntosdedados.Comoo
prprionomediz,umaSSTableumaabstraosimplesparaarmazenar
eficientementeumgrandenmerodeparesdechavevaloraomesmo
tempoemquesepriorizaumaaltavelocidadedesada(throughput)em
cargasdetrabalhosequenciaisdeleituraeescrita.
SSTable:SortedStringTable
Imaginequeprecisamosdeumaenormecargadetrabalhonaquala
entradafeitaemGigabytesouTerabytes.Almdisso,precisamos
realizarmuitospassosdeprocessamento,queprecisamserfeitospor
diferentesbinriosemoutraspalavras,imaginequeestamos
executandoumasequnciadetarefasdeMapReduce!Dadootamanho
doinput,lereescreverdadospodedominartodootempodeexecuo.
Portanto,leituraseescritasaleatriasnosoumaopoemvezdisso,
queremostransmitirosdadose,umavezqueterminarmos,gravamosde
voltanodiscocomoumaoperaodestreaming.Dessaforma,
podemosamortizaroscustosdeI/Odedisco.Nadarevolucionrio,ou
longedisso.
data:text/htmlcharset=utf8,%3Ch1%20class%3D%22title%22%20style%3D%22padding%3A%200px%2020px%3B%20margin%3A%200px%3B%20bord
1/7
08/07/2015
LevelDB:SSTableeestruturadearmazenamentodelogsiMasters
UmaSortedStringTable(TabelaOrdenadadePalavras,emtraduo
livre)exatamenteoqueparece,umarquivoquecontmumasriede
paresdechavevalorordenadosdeformaarbitrria.Chavesduplicadas
nosoumproblema,poisnohanecessidadedepreenchimentode
chavesouvalores,echavesevaloressopartculasarbitrrias.Leia
todooarquivosequencialmente,evocterumaespciedendice.
Opcionalmente,seoarquivoformuitogrande,podemosincluirnoincio
oucriarumndicekey:offsetseparadoparaacessorpido.Issotudo
queumaSSTable:umaformamuitosimples,mastambmmuitotil,
detrocargrandesporesdedadosordenados.
SSTableeBigTable:altavelocidadede
acesso?
UmavezqueaSSTableestivernodisco,sernaverdadeimutvel,
porqueinseriroudeletardadosdemandariaumagrandequantidadede
reescritadeI/Onoarquivo.Tendoditoisso,elaumatimasoluo
parandicesestticos:leiaondice,evocestarsempreaumabusca
dedistncia,ousimplesmentememmap(mapeie)todooarquivoparaa
memria.Leiturasaleatriassofceiserpidas.
Escritas,poroutrolado,somuitomaiscustosasedifceis,anoserque
todaatabelaestejanamemria,oque,nessecaso,significaestarmos
devoltasimplesmanipulaodeponteiros.Acontecequeesteo
grandeproblemaqueoBigTabledoGoogletentaresolver:altastaxasde
data:text/htmlcharset=utf8,%3Ch1%20class%3D%22title%22%20style%3D%22padding%3A%200px%2020px%3B%20margin%3A%200px%3B%20bord
2/7
08/07/2015
LevelDB:SSTableeestruturadearmazenamentodelogsiMasters
leitura/escritaparapetabytesdedados,comSSTablesnaretaguarda.
Comoelesfazemisso?
SSTableseLogStructuredMerge
Trees
QueremospreservarasaltastaxasdeleituraqueasSSTablesnos
oferecem,mastambmqueremosaltastaxasdeescrita.Acontecequej
temostodosospedaosnecessrios:escritaaleatriamaisrpida
quandoaSSTableestnamemria(vamoschamladeMemTable)e,
seatabelaimutvel,entoumaSSTablenodiscotambmrpida
paraserlida.Agoravamosintroduzirasseguintesconvenes:
1. ndicesdeSSTablesnodiscososemprecarregadosparaamemria
2. Todasasoperaesdeescritavodiretamenteparaosndices
daMemTable
3. LeituraschecamaMemTableprimeiroeentoconsultamondiceda
SSTable
4. Periodicamente,aMemTablegravadanodiscocomoumaSSTable
5. Periodicamente,SSTablesnodiscosounidas.
Oquefizemosaqui?Escritassosemprefeitasnamemriaeporisso
sosempremaisrpidas.UmavezqueaMemTableatingeumcerto
data:text/htmlcharset=utf8,%3Ch1%20class%3D%22title%22%20style%3D%22padding%3A%200px%2020px%3B%20margin%3A%200px%3B%20bord
3/7
08/07/2015
LevelDB:SSTableeestruturadearmazenamentodelogsiMasters
tamanho,elagravadanodiscocomoumaSSTableimutvel.De
qualquermaneira,manteremostodososndicesdaSSTablenamemria,
oquesignificaqueparaqualquerleiturapoderemoschecarprimeirona
MemTable,eentoseguirasequnciadaSSTableparaencontraros
nossosdados.OresultadoqueacabamosdereinventaroLog
StructuredMergeTree(LSMTree),descritoporPatrickONeil,eesse
exatamenteomesmomecanismoportrsdasTabelasBigTable.
LSMeSSTables:apagar,atualizare
manuteno
EssaarquiteturaLSMoferecealgumascaractersticasinteressantes:
operaesdeescritasosemprerpidas,independentementedo
tamanhodosdados(appendonly),eoperaesdeleituraaleatriasou
sofeitasapartirdamemriaounecessitamdeumarpidabuscaem
disco.Dequalquerforma,equantoaatualizaeseexcluses?
UmavezqueaSSTableestnodisco,elaimutvel,portanto
atualizaeseexclusesnopodemtocarosdados.Emvezdisso,no
casodeumaatualizaoocorrer,umvalormaisrecentesimplesmente
armazenadonaMemTable,eumregistrodemortosacrescentado
paraasexcluses.Porqueosndicessochecadosnasequncia,
leiturasfuturasiroencontraroregistrodemortosatualizadoantes
mesmodeatingiremosvaloresantigos!Finalmente,tercentenasde
SSTablesemdiscotambmnoumaboaideia,eporissovamos
executarperiodicamenteumprocessoparafundirasmudanasnas
SSTables,momentoemqueosregistrosatualizadosouremovidos
atualizaroosdadosantigos.
data:text/htmlcharset=utf8,%3Ch1%20class%3D%22title%22%20style%3D%22padding%3A%200px%2020px%3B%20margin%3A%200px%3B%20bord
4/7
08/07/2015
LevelDB:SSTableeestruturadearmazenamentodelogsiMasters
SSTableseLevelDB
PegueumaSSTable,acrescenteumaMemTableeapliqueumasriede
convenesdeprocessamentoeoquevocterserumabelabasede
dadosparacertostiposdetrabalhos.Naverdade,tantooBigTabledo
Google,quantooHbasedoHaddopeoCassandra,entreoutros,esto
utilizandoumavariaooucpiaidnticadessamesmaarquitetura.
Issosuperficialmente,pois,comodecostume,detalhesde
implementaofazemtodaadiferena.GraasaJeffDeaneaSanjay
Ghemawat,oscontribuintesoriginaisdaSSTableedainfraestruturado
BigTablenoGoogle,ocdigofontedoLevelDBfoiliberadonoinciodo
anopassado,quemaisoumenosumarplicaexatadaarquiteturaque
descrevemosacima:
SSTablesembaixodocap,MemTablesparaescritas
Chavesevaloressoarraysdebytesarbitrrios
SuporteparaoperaesdePut,GeteDelete
Iteraoforwardebackwarddedados
CompressoSnappyembutida
ProjetadoparaseromelhormecanismodeIndexDBnoWebKit(tambm
conhecidocomononavegador),elefcildeintegrar,rpidoe,o
melhordetudo,cuidadetodaagravaodeSSTableeMemTable,
mergingeoutrosdetalhesinconvenientes.
TrabalhandocomLevelDB:Ruby
data:text/htmlcharset=utf8,%3Ch1%20class%3D%22title%22%20style%3D%22padding%3A%200px%2020px%3B%20margin%3A%200px%3B%20bord
5/7
08/07/2015
LevelDB:SSTableeestruturadearmazenamentodelogsiMasters
LevelDBumabiblioteca,noumservidorouservioindependente
apesardevocpoderimplementarumfacilmentesobreele.Para
comear,pegueobindingdasualinguagemfavorita(ruby)evamosvero
quepodemosfazer:
require'leveldb'#geminstallleveldbruby
db=LevelDB::DB.new"/tmp/db"
db.put"b","bar"
db.put"a","foo"
db.put"c","baz"
putsdb.get"a"#=>foo
10
db.eachdo|k,v|
11
p[k,v]#=>["a","foo"],["b","bar"],["c","baz"]
12
end
13
14
db.to_a#=>[["a","foo"],["b","bar"],["c","baz"]]
Podemosarmazenarchaves,recuperlas,erealizarpesquisascom
data:text/htmlcharset=utf8,%3Ch1%20class%3D%22title%22%20style%3D%22padding%3A%200px%2020px%3B%20margin%3A%200px%3B%20bord
6/7
08/07/2015
LevelDB:SSTableeestruturadearmazenamentodelogsiMasters
apenasalgumaslinhasdecdigo.Amecnicademanteruma
MemTable,atualizarSSTables,etodoorestoficaporcontadoLevelDB
fcilesimples.
LevelDBnoWebKitealm
SSTablessoestruturasdedadosbastantesimpleseteisumbelo
formatodeentrada/sadadelargaescala.Entretanto,oquetornaas
SSTablesrpidas(ordenadaseimutveis)tambmoqueexpesuas
muitaslimitaes.Pararesolverisso,introduzimosoconceitode
MemTableeumconjuntodeestruturasdeprocessamentodelogpara
administrarasSSTables.
Soregrassimples,mas,comosempre,detalhesdeimplementao
fazemtodaadiferena,oquetornaoLevelDBumgrandeganhoparao
conjuntodemecanismosdebasesdedadosdecdigoaberto.Hboas
chancesdequevocvsedepararcomoLevelDBembutidonoseu
navegador,noseuaparelhodetelefoneeemoutroslugares.Duma
olhadanocdigofontedoLevelDB,leiaadocumentaoeexperimente.
***
ArtigotraduzidopelaRedaoiMasters,comautorizaodoautor.
Publicadooriginalmenteemhttp://www.igvita.com/2012/02/06/sstable
andlogstructuredstorageleveldb/
data:text/htmlcharset=utf8,%3Ch1%20class%3D%22title%22%20style%3D%22padding%3A%200px%2020px%3B%20margin%3A%200px%3B%20bord
7/7