Kafka、MySQL、TiDB、そしてSolanaバリデータの台帳。その足元で同じ部品が動いています。文章は最小限、図とアニメで動かしながら理解しましょう。 Kafka, MySQL, TiDB, and every Solana validator's ledger run on the same part underneath. Minimal text — learn it by moving the diagrams.Kafka, MySQL, TiDB y el libro mayor de cada validador de Solana funcionan sobre la misma pieza. Texto mínimo: apréndelo moviendo los diagramas.Kafka, MySQL, TiDB e o ledger de cada validador Solana rodam sobre a mesma peça por baixo. Texto mínimo — aprenda movendo os diagramas.Kafka, MySQL, TiDB, 그리고 모든 Solana 검증자의 원장이 그 아래 같은 부품 위에서 돌아갑니다. 글은 최소한으로 — 다이어그램을 움직이며 배워 보세요.
RocksDBに接続するプロセスも、開くポートも、覚えるクエリ言語もありません。アプリの中で直接動き、ローカルのディスクを読み書きします。まずはその「速さの正体」を体感しましょう。 There's no process to connect to, no port to open, no query language to learn. It runs inside your app and reads/writes local disk. Let's feel where its speed comes from.No hay proceso al que conectarse, ni puerto que abrir, ni lenguaje de consulta que aprender. Corre dentro de tu app y lee/escribe en el disco local. Sintamos de dónde viene su velocidad.Não há processo para conectar, nem porta para abrir, nem linguagem de consulta para aprender. Ele roda dentro do seu app e lê/escreve no disco local. Vamos sentir de onde vem sua velocidade.연결할 프로세스도, 열 포트도, 배울 쿼리 언어도 없습니다. 앱 안에서 돌며 로컬 디스크를 읽고 씁니다. 그 속도의 정체를 느껴 봅시다.
RocksDBは「データベース」ではなく、「データベースの心臓」。 RocksDB isn't a database — it's the heart inside one.RocksDB no es una base de datos: es el corazón que llevan dentro.RocksDB não é um banco de dados — é o coração dentro de um.RocksDB는 데이터베이스가 아니라, 그 안의 심장입니다. レプリケーションもシャーディングもクエリ言語も持ちません。あえて最小限。その上に載せる仕組みは、作る側が決めます。 No replication, no sharding, no query language — minimal on purpose. Whatever sits on top is yours to build.Sin replicación, sin sharding, sin lenguaje de consulta: mínimo a propósito. Lo que va encima lo construyes tú.Sem replicação, sem sharding, sem linguagem de consulta — mínimo de propósito. O que fica por cima é você quem constrói.복제도, 샤딩도, 쿼리 언어도 없습니다 — 일부러 최소화했습니다. 그 위에 올릴 것은 여러분이 만듭니다.
🤔 同じ1件を読むとき、いちばん時間を食うのはどこ? When reading one record, what usually costs the most time?Al leer un registro, ¿qué suele costar más tiempo?Ao ler um registro, o que costuma custar mais tempo?레코드 하나를 읽을 때 보통 가장 시간을 잡아먹는 것은?
カードをタップして、中身を見てみましょう。 Tap a card to look inside.Toca una tarjeta para mirar dentro.Toque num cartão para olhar dentro.카드를 눌러 안을 들여다보세요.
👆 これが「組み込み(embedded)」— サーバーを立てず、アプリの一部として同居しますThis is what "embedded" means — no server to run; it lives as part of the appEsto es lo que significa «embebido»: no hay servidor que ejecutar; vive como parte de la appÉ isto que "embutido" significa — nenhum servidor para rodar; ele vive como parte do app이것이 "임베디드"의 뜻입니다 — 돌릴 서버가 없고, 앱의 일부로 존재합니다
LevelDBを、サーバー用に鍛え直したのがRocksDB。チップをタップすると一言で分かります。 RocksDB is LevelDB, hardened for servers. Tap a chip for a one-line explainer.RocksDB es LevelDB, endurecido para servidores. Toca una ficha para una explicación de una línea.O RocksDB é o LevelDB, reforçado para servidores. Toque numa ficha para uma explicação de uma linha.RocksDB는 서버용으로 강화된 LevelDB입니다. 칩을 눌러 한 줄 설명을 보세요.
1件の書き込みは、いきなりディスクの奥へ沈むのではありません。まず「速さ担当」と「消えない担当」の2か所へ同時に届きます。動かして確かめましょう。 A write doesn't sink straight to disk. It lands in two places at once — one for speed, one for durability. Run it and watch.Una escritura no cae directa al disco. Aterriza en dos sitios a la vez: uno para velocidad, otro para durabilidad. Ejecútalo y observa.Uma escrita não afunda direto no disco. Ela pousa em dois lugares ao mesmo tempo — um para velocidade, outro para durabilidade. Rode e observe.쓰기는 곧바로 디스크로 가라앉지 않습니다. 한 번에 두 곳에 도착합니다 — 하나는 속도용, 하나는 내구성용. 실행해서 보세요.
書き込みは、memtable と WAL へ同時に。 Simultaneously to the memtable and the WAL.Al mismo tiempo a la memtable y al WAL.Ao mesmo tempo na memtable e no WAL.memtable과 WAL에 동시에. memtable=メモリ上で速い。WAL=ディスク上で消えない。速さと安全を、2か所で同時に手に入れます。 The memtable (in memory) is fast; the WAL (on disk) survives crashes. Speed and safety, captured in parallel.La memtable (en memoria) es rápida; el WAL (en disco) sobrevive a caídas. Velocidad y seguridad, capturadas en paralelo.A memtable (em memória) é rápida; o WAL (no disco) sobrevive a falhas. Velocidade e segurança, capturadas em paralelo.memtable(메모리)은 빠르고, WAL(디스크)은 장애에서 살아남습니다. 속도와 안전을 병렬로 잡습니다.
書き込みは一本道でした。読み取りは逆に「探索」です。新しい場所から古い場所へ、見つかるまで降りていきます。ひとつだけクセがあります。 Writing was a straight line. Reading is a search — from newest to oldest, descending until the key turns up. There's one quirk.Escribir fue una línea recta. Leer es una búsqueda: del más nuevo al más viejo, bajando hasta que aparece la clave. Hay una peculiaridad.Escrever foi uma linha reta. Ler é uma busca — do mais novo ao mais antigo, descendo até a chave aparecer. Há uma peculiaridade.쓰기는 직선이었습니다. 읽기는 탐색입니다 — 최신에서 오래된 것까지, 키가 나올 때까지 내려갑니다. 한 가지 묘한 점이 있습니다.
L0 だけは、全ファイルを調べる。 At L0, you must check every fileEn L0 hay que revisar todos los archivosNo L0, é preciso checar todos os arquivosL0에서는 모든 파일을 확인해야 합니다 L0のファイルはキー範囲が重なり合うため、範囲だけでは絞れません。L1以降は重ならないので、範囲から1ファイルだけを選べます。 L0 files have overlapping key ranges, so ranges can't narrow it down. From L1 down they don't overlap — so one file per level is enough.Los archivos de L0 tienen rangos de clave solapados, así que el rango no basta para acotar. De L1 hacia abajo no se solapan, así que un archivo por nivel es suficiente.Os arquivos do L0 têm faixas de chave sobrepostas, então a faixa não ajuda a restringir. Do L1 para baixo não se sobrepõem — então um arquivo por nível basta.L0 파일들은 키 범위가 겹치므로 범위로 좁힐 수 없습니다. L1 아래로는 겹치지 않으므로 — 레벨당 파일 하나면 충분합니다.
[a‑g] はそのファイルが含みうる範囲です。
Red line = position of the key "p" (same across all levels). A file's [a‑g] is the range it may hold.Línea roja = posición de la clave "p" (igual en todos los niveles). El [a‑g] de un archivo es el rango que podría contener.Linha vermelha = posição da chave "p" (igual em todos os níveis). O [a‑g] de um arquivo é a faixa que ele pode conter.빨간 선 = 키 "p"의 위치(모든 레벨에서 동일). 파일의 [a‑g]는 담고 있을 수 있는 범위입니다.
[a‑p] は「入っているかもしれない目安」で、範囲に入る=必ずある、ではありません。探すキーはずっと "p" のまま。変わるのは各レベルでの区切り方だけで、L1では [o‑u]、L2では [m‑r] と、同じ "p" でも入るファイルが違います。L0は重なるので全ファイル、L1以降は1ファイルだけを見ます。
A read descends memtable → L0 → L1 → … and stops the moment it hits. A range like [a‑p] only means "might be here" — being in range does not guarantee the key is present. The key stays "p"; what changes per level is the file boundaries: "p" lands in [o‑u] at L1 but [m‑r] at L2. L0 needs every file; from L1 down, just one.Una lectura baja memtable → L0 → L1 → … y para en cuanto acierta. Un rango como [a‑p] solo significa «podría estar aquí»: estar en el rango no garantiza que la clave exista. La clave sigue siendo "p"; lo que cambia por nivel son los límites de los archivos: "p" cae en [o‑u] en L1 pero en [m‑r] en L2. L0 necesita todos los archivos; de L1 hacia abajo, solo uno.Uma leitura desce memtable → L0 → L1 → … e para no instante em que acerta. Uma faixa como [a‑p] só significa "pode estar aqui" — estar na faixa não garante que a chave exista. A chave continua "p"; o que muda por nível são os limites dos arquivos: "p" cai em [o‑u] no L1, mas em [m‑r] no L2. O L0 precisa de todos os arquivos; do L1 para baixo, apenas um.읽기는 memtable → L0 → L1 → …로 내려가다 적중하는 순간 멈춥니다. [a‑p] 같은 범위는 "여기 있을 수도"라는 뜻일 뿐 — 범위 안에 있다고 키가 있다는 보장은 아닙니다. 키는 "p" 그대로이고, 레벨마다 바뀌는 것은 파일 경계입니다: "p"는 L1에서는 [o‑u], L2에서는 [m‑r]에 속합니다. L0는 모든 파일이 필요하고, L1 아래로는 하나면 됩니다.第1章の「積む」形も、第2章の「探索」も、正体は LSMツリー。 The “stacking” from ch.1 and the “search” from ch.2 are both one design: the LSM-treeEl «apilado» del cap.1 y la «búsqueda» del cap.2 son un mismo diseño: el árbol LSMO «empilhamento» do cap.1 e a «busca» do cap.2 são um só design: a árvore LSM1장의 «쌓기»와 2장의 «탐색»은 하나의 설계입니다: LSM 트리 世の中の多くのDB(MySQLなど)は B-tree という別設計。両者は得意が逆です — どちらが上、ではありません。 Many databases (e.g. MySQL) use a different design, the B-tree. Their strengths are opposite — neither is simply “better.”Muchas bases de datos (p. ej. MySQL) usan otro diseño, el árbol B. Sus fortalezas son opuestas: ninguno es sin más «mejor».Muitos bancos (p. ex. MySQL) usam outro design, a árvore B. Suas forças são opostas — nenhum é simplesmente «melhor».많은 DB(예: MySQL)는 다른 설계인 B 트리를 씁니다. 둘의 강점은 정반대라 — 어느 쪽도 그냥 «더 낫다»고 할 수 없습니다.
その違いを、同じ鍵 x を3回書き換えて読むだけで確かめます。
See the difference by overwriting one key x three times, then reading it.Ve la diferencia sobrescribiendo una clave x tres veces y luego leyéndola.Veja a diferença sobrescrevendo uma chave x três vezes e depois lendo-a.키 x를 세 번 덮어쓴 뒤 읽어서 차이를 보세요.
x を書き換えていきますPress “Next” to overwrite xPulsa «Siguiente» para sobrescribir xToque em «Próximo» para sobrescrever x«다음»을 눌러 x를 덮어쓰세요
左=B-tree、右=LSM。同じ操作で「鍵の在りか」がどう増えるかを見ます。Left = B-tree, right = LSM. Watch how many places the key ends up in.Izquierda = árbol B, derecha = LSM. Observa en cuántos sitios acaba la clave.Esquerda = árvore B, direita = LSM. Veja em quantos lugares a chave acaba.왼쪽 = B 트리, 오른쪽 = LSM. 키가 몇 군데에 남는지 보세요.
速い書き込み・速い読み取り・小さい容量。この3つは、同時に全部は手に入りません。RocksDBのチューニングは、結局この綱引きです。 Fast writes, fast reads, small footprint — you can't have all three at once. Tuning RocksDB is really this tug-of-war.Escrituras rápidas, lecturas rápidas, poco espacio: no puedes tener los tres a la vez. Ajustar RocksDB es en realidad este tira y afloja.Escritas rápidas, leituras rápidas, pouco espaço — não dá para ter os três ao mesmo tempo. Ajustar o RocksDB é realmente este cabo de guerra.빠른 쓰기, 빠른 읽기, 작은 용량 — 셋을 동시에 가질 수는 없습니다. RocksDB 튜닝은 사실 이 줄다리기입니다.
同じデータを何度も書き直す。それが「増幅」。 The same data gets rewritten many times. That's amplificationLos mismos datos se reescriben muchas veces. Eso es amplificaciónOs mesmos dados são reescritos muitas vezes. Isso é amplificação같은 데이터가 여러 번 다시 쓰입니다. 그것이 증폭입니다 Write(書き込み)・Read(読み取り)・Space(容量)の3つの増幅。どれか2つを小さくすると、残り1つが必ず膨らみます。 Three of them — Write, Read, Space. Shrink any two and the third always swells.Tres tipos: Escritura, Lectura, Espacio. Reduce dos cualesquiera y el tercero siempre crece.São três — Escrita, Leitura, Espaço. Reduza dois quaisquer e o terceiro sempre incha.세 가지 — 쓰기, 읽기, 공간. 둘을 줄이면 나머지 하나가 늘 부풀어 오릅니다.
1+2+10+10+10 ≈ 33。つまり1バイト書くとディスクには約33バイト。これがLeveled方式の代償で、だから次の「方式選び」が効いてきます。
Each lower level is ~10× bigger, so moving down rewrites the byte alongside a lot of other data. The total is 1+2+10+10+10 ≈ 33 — write 1 byte, the disk writes ~33. That's the cost of the Leveled style, which is why the next demo (picking a style) matters.Cada nivel inferior es ~10× más grande, así que bajar reescribe el byte junto a muchos otros datos. El total es 1+2+10+10+10 ≈ 33: escribes 1 byte y el disco escribe ~33. Ese es el coste del estilo Leveled, y por eso importa la siguiente demo (elegir estilo).Cada nível inferior é ~10× maior, então descer reescreve o byte junto de muitos outros dados. O total é 1+2+10+10+10 ≈ 33 — escreve 1 byte e o disco escreve ~33. Esse é o custo do estilo Leveled, e por isso a próxima demo (escolher um estilo) importa.각 하위 레벨은 ~10배 크므로, 아래로 내려가면 그 바이트가 다른 많은 데이터와 함께 다시 쓰입니다. 합계는 1+2+10+10+10 ≈ 33 — 1바이트를 쓰면 디스크는 ~33을 씁니다. 이것이 Leveled 방식의 비용이며, 그래서 다음 데모(방식 고르기)가 중요합니다.ここまで見た仕組みは、実世界の大物たちの足元で動いています。最後に、いちばん過酷な使い手 — Solanaのバリデータ — を覗きます。 Everything so far runs underneath some heavyweight systems. Let's end with its most punishing user — a Solana validator.Todo lo anterior corre bajo algunos sistemas de peso. Terminemos con su usuario más exigente: un validador de Solana.Tudo até aqui roda sob alguns sistemas de peso. Vamos terminar com seu usuário mais exigente — um validador Solana.지금까지의 모든 것은 몇몇 무거운 시스템의 밑에서 돕니다. 가장 혹독한 사용자 — Solana 검증자로 끝맺읍시다.
「使い手」を選ぶと、何を保存しているかが分かります。 Tap a user to see what it stores in RocksDB.Toca un usuario para ver qué guarda en RocksDB.Toque num usuário para ver o que ele guarda no RocksDB.사용자를 눌러 RocksDB에 무엇을 저장하는지 보세요.
1つのRocksDBを、用途別の カラムファミリー(独立・個別調整できるキー空間)に区切っています。まずブロックを届けて、次にタップして中身を見ましょう。 One RocksDB, split into column families — independent, individually tunable keyspaces. Deliver a block, then tap to look inside.Un RocksDB, dividido en familias de columnas: espacios de clave independientes y ajustables por separado. Entrega un bloque y luego toca para mirar dentro.Um RocksDB, dividido em famílias de colunas — keyspaces independentes e ajustáveis individualmente. Entregue um bloco e depois toque para olhar dentro.하나의 RocksDB를 컬럼 패밀리로 나눕니다 — 독립적이고 개별로 튜닝 가능한 키스페이스. 블록을 전달한 뒤, 눌러서 안을 보세요.
WriteBatch でまとめて一貫性を保ちます(途中でクラッシュしても中途半端になりません)。未剪定の台帳は数百TB、年に数十TB増えます。
They're split because each behaves differently: shreds and erasure codes are written on arrival in slot order, statuses after execution, indexes are queried later. Each column family is tuned separately, and when one insert touches several of them, a WriteBatch keeps them consistent together (no half-written state on a crash). An unpruned ledger exceeds hundreds of TB and grows tens of TB/year.Se separan porque cada una se comporta distinto: los shreds y los códigos de corrección se escriben al llegar en orden de slot, los estados tras la ejecución, y los índices se consultan después. Cada familia de columnas se ajusta por separado, y cuando una inserción toca varias, un WriteBatch las mantiene consistentes en conjunto (sin estados a medio escribir tras una caída). Un libro mayor sin podar supera cientos de TB y crece decenas de TB al año.Elas são separadas porque cada uma se comporta de modo diferente: shreds e códigos de correção são escritos na chegada em ordem de slot, os status após a execução, e os índices são consultados depois. Cada família de colunas é ajustada separadamente, e quando uma inserção toca várias delas, um WriteBatch as mantém consistentes juntas (sem estado pela metade numa falha). Um ledger não podado passa de centenas de TB e cresce dezenas de TB/ano.나뉜 이유는 각자 동작이 다르기 때문입니다: shred와 소거 코드는 슬롯 순서로 도착 시 쓰이고, 상태는 실행 후, 색인은 나중에 조회됩니다. 각 컬럼 패밀리는 따로 튜닝되며, 한 번의 삽입이 여러 개를 건드릴 때 WriteBatch가 함께 일관되게 유지합니다(장애 시 반만 쓰인 상태 없음). 정리되지 않은 원장은 수백 TB를 넘고 매년 수십 TB씩 늘어납니다.fifo option 廃止(v2.2)option gone (v2.2)opción eliminada (v2.2)opção removida (v2.2)옵션 삭제 (v2.2)L0→L1の並列化など)で不要になり、Agaveの --rocksdb-shred-compaction fifo オプションが廃止。※数値は概念用の例です。
FIFO existed to dodge write stalls (Leveled falling behind and halting writes). Leveled improved (e.g. parallel L0→L1) until it was unnecessary, and Agave's --rocksdb-shred-compaction fifo option was dropped. Figures are illustrative.FIFO existía para esquivar los bloqueos de escritura (Leveled quedándose atrás y deteniendo las escrituras). Leveled mejoró (p. ej. L0→L1 en paralelo) hasta hacerlo innecesario, y se eliminó la opción --rocksdb-shred-compaction fifo de Agave. Las cifras son ilustrativas.O FIFO existia para evitar travas de escrita (o Leveled ficando para trás e parando as escritas). O Leveled melhorou (p. ex. L0→L1 em paralelo) até se tornar desnecessário, e a opção --rocksdb-shred-compaction fifo do Agave foi removida. Os números são ilustrativos.FIFO는 쓰기 정체(Leveled가 뒤처져 쓰기를 멈추는 것)를 피하려고 존재했습니다. Leveled가 개선되어(예: L0→L1 병렬) 불필요해질 때까지, 그리고 Agave의 --rocksdb-shred-compaction fifo 옵션이 삭제되었습니다. 수치는 예시입니다.Solanaを速くする層は、役割分担で成り立っています。RocksDB はその「記録」担当。 Solana's speed comes from a division of layers. RocksDB is the "recording" one.La velocidad de Solana viene de una división de capas. RocksDB es la de «registro».A velocidade da Solana vem de uma divisão de camadas. O RocksDB é a de "gravação".Solana의 속도는 계층의 분담에서 나옵니다. RocksDB는 "기록" 담당입니다.
最後に、ここまでの歩みを一望し、「自分の仕事にRocksDBは合うか?」を確かめます。万能ではありません。形の合う仕事に、意図して選ぶ部品です。 Finally, a look back at the journey — and a check: is RocksDB right for your job? It's not universal. It's a part you choose deliberately, for work of the right shape.Por último, una mirada atrás al camino, y una comprobación: ¿es RocksDB adecuado para tu trabajo? No es universal. Es una pieza que se elige a conciencia, para trabajos con la forma adecuada.Por fim, um olhar para trás na jornada — e uma verificação: o RocksDB é certo para o seu trabalho? Ele não é universal. É uma peça que se escolhe deliberadamente, para trabalhos com o formato certo.끝으로 지나온 길을 돌아보고 — 확인해 봅시다: RocksDB가 당신의 일에 맞을까요? 만능이 아닙니다. 형태가 맞는 일에 의도적으로 고르는 부품입니다.
いちばん近いワークロードを選んでみてください。 Pick the workload that's closest to yours.Elige la carga de trabajo más parecida a la tuya.Escolha a carga de trabalho mais próxima da sua.가장 가까운 워크로드를 골라 보세요.
RocksDBは「万能」ではなく、「形の合う仕事に選ぶ」部品。 RocksDB isn't universal — it's a part you choose for the right-shaped jobRocksDB no es universal: es una pieza que eliges para el trabajo con la forma adecuadaO RocksDB não é universal — é uma peça que você escolhe para o trabalho com o formato certoRocksDB는 만능이 아니라 — 형태가 맞는 일에 고르는 부품입니다 書き込みを速くする代わりに読み取りは探索(第2章)、増幅はトレードオフ(第3章)、運用機能は自作(この章)。それでも用途が合えば、Kafkaから Solana まで世界の足元を支えます。おつかれさまでした! Fast writes at the cost of search on reads (ch.2), amplification trade-offs (ch.3), operations you build yourself (this ch.). When the shape fits, it holds up the world from Kafka to Solana. Thanks for reading!Escrituras rápidas a cambio de búsqueda en las lecturas (cap.2), compromisos de amplificación (cap.3) y operaciones que construyes tú (este cap.). Cuando la forma encaja, sostiene el mundo desde Kafka hasta Solana. ¡Gracias por leer!Escritas rápidas ao custo de busca nas leituras (cap.2), compromissos de amplificação (cap.3) e operações que você mesmo constrói (este cap.). Quando o formato encaixa, ele sustenta o mundo de Kafka a Solana. Obrigado por ler!읽기에서의 탐색을 대가로 한 빠른 쓰기(2장), 증폭의 트레이드오프(3장), 직접 얹는 운영 기능(이 장). 형태가 맞으면 Kafka부터 Solana까지 세상의 밑을 떠받칩니다. 읽어 주셔서 감사합니다!