Preskočiť na obsah

Delenie na časti

DocStore zapisuje jeden súbor pre každý záznam. Bez delenia by sa pri veľkej kolekcii všetky súbory hromadili v jednom adresári a operácie s adresárom by sa spomaľovali s rastúcim počtom položiek. Preto storh rozdeľuje súbory záznamov do priečinkov podľa dvoch znakov z ID záznamu:

Text
pages/data/2d/018bcfe5-6800-7000-8000-2d5dba6274da.jsonc

Priečinok sa určuje podľa začiatku UUID poslednej skupiny (znaky 24 a 25), ktorá obsahuje náhodnú entropiu. Dva hexadecimálne znaky dávajú 256 priečinkov, takže v kolekcii so 100-tisíc záznamami pripadá v priemere menej než 400 súborov na adresár.

Prečo koniec a nie začiatok

ID UUIDv7 sa začínajú 48-bitovou časovou pečiatkou v milisekundách, takže ID vytvorené krátko po sebe majú spoločné úvodné znaky. Delenie podľa predpony by posielalo každú vlnu zápisov do toho istého vyťaženého adresára a priečinky by sa menili až postupom času. Koncové bajty sú pre každý záznam náhodné, preto sa zápisy rovnomerne rozložia už od prvého záznamu.

Delenie je pri čítaní a dotazoch neviditeľné: get() vypočíta priečinok podľa ID a stream() vracia záznamy zoradené podľa ID naprieč všetkými priečinkami, takže stránkovanie kurzorom sa správa, akoby kolekcia tvorila jeden zoradený zoznam.

Vo veľkom meradle

Počet priečinkov sa nikdy nezvyšuje: dva hexadecimálne znaky znamenajú 256 adresárov bez ohľadu na veľkosť kolekcie. Zvyšuje sa počet súborov v jednotlivých priečinkoch:

Záznamy Súbory na priečinok
10k ~40
100k ~390
1M ~3,900
10M ~39,000

Moderné súborové systémy indexujú položky adresárov, takže niekoľko tisíc súborov v priečinku umožňuje rýchle vyhľadanie konkrétneho záznamu; milión záznamov bez problémov zvládajú get() a indexované dotazy. Otvorenie úložiska trvá konštantný čas bez ohľadu na veľkosť kolekcie: osirelé dočasné súbory sa vyhľadávajú a odstraňujú iba vtedy, keď značka neaktívneho zapisovača signalizuje, že predchádzajúci proces spadol počas zápisu. S rastom sa predlžujú operácie nad celou kolekciou: neindexované skenovania, reindex() a verify() prechádzajú všetky súbory záznamov, preto ich plánujte ako dávkové úlohy. Pri viac než približne 10 miliónoch záznamov v kolekcii začína záležať na počte záznamov v jednotlivých priečinkoch aj na celkovom využití inode: rozdeľte kolekcie alebo použite segmentovaný denník pre údaje určené na skenovanie, ktorý už svojím návrhom udržiava nízky počet súborov.

Ostatné moduly

SegmentedLog a Queue nerozdeľujú údaje na časti, pretože nevytvárajú samostatný súbor pre každý záznam. Denník pridáva záznamy do súborov segmentov v segments/ s limitom max_segment_bytes (predvolene 1 MiB) a front pridáva udalosti do jedného queue.log. Počet súborov je preto vždy nízky.