Manual:External storage/cs
Externí úložiště je abstrakce pro ukládání obsahu wiki (tj. toho, co by se normálně vešlo do tabulky text ) mimo normální databázi, případně s použitím nějaké komprese. Některá rozšíření (například StructuredDiscussions ) mohou používat externí úložiště přímo pro ukládání jiných druhů dat.
Obsah externího úložiště je adresován URL ve tvaru <protokol>://<umístění>/<název objektu>
, přičemž protokol určuje, jaký typ úložiště má být použit.
Před verzí 1.32 byly tyto adresy URL uloženy v poli old_text
v tabulce text
, přičemž old_flags
bylo nastaveno na external
.
Od 1.32 jsou uloženy v poli content_address
tabulky content .
Výhody
Velikost tabulky text je obvykle největší ze všech tabulek.
Na wikinách s miliony úprav může mít text
tabulka velikost několika gigabajtů.
Vzhledem k tomu, že obsah tabulky text
nelze měnit (úpravy stránek vytvářejí nové revize a nové položky tabulky text
, ale staré položky nelze upravovat), poskytuje uložení obsahu do jiné databáze následující výhody:
- Rozdělené ukládací potřeby - namísto velké monolitické databáze může externí úložiště pokrývat několik serverů, což umožňuje snazší migraci a alokaci disků.
- Výkon databáze - databázový server pro externí úložiště má velmi nízké nároky na paměť a CPU, protože je to pouze úložiště a nepotřebuje příliš mnoho mezipaměti a nepotřebuje provádět složité dotazy. To umožňuje hlavnímu databázovému serveru využít veškerou dostupnou paměť pro ukládání do mezipaměti jiných tabulek, které by z toho profitovaly.
- Zálohy - zálohování velkých databází nějakou dobu trvá. Zálohování databáze externího úložiště lze provádět postupně, protože staré položky nelze měnit. Když se databáze externího úložiště dostatečně rozroste, lze vytvořit novou databázi pro nové externí úložiště a starou databázi lze umístit pouze pro čtení a odstranit z rutinních záloh (stále však musí být přístupná pro MediaWiki).
Kód
Hlavní třída pro interakci s externím úložištěm je ExternalStore.
Můžete použít insert
nebo (obvykleji) insertToDefault
k uložení části dat a obdržení adresy URL, na které byla uložena. Tuto adresu URL lze použít s fetchFromURL
k načtení dat.
Interně ExternalStore
interaguje s podtřídou ExternalStoreMedium odpovídající protokolu.
ExternalStoreDB
, který je běžně používaný, se liší od ostatních v tom, že poskytuje speciální manipulaci, když jsou uložená data serializovaná podtřída HistoryBlob. Takové objekty lze získat pomocí <protokol>://<umístění>/<jméno objektu>/<id položky>
, v takovém případě úložiště objekt deinializuje a získá příslušnou položku (zavoláním getItem
na něj).
V praxi byste se měli většinu času vyhnout přímému použití ExternalStorage
a místo toho použít SqlBlobStore (nebo ještě vyšší úroveň abstrakce, jako je RevisionStore).
Konfigurace
Například nastavení LocalSettings.php
:
$wgExternalStores = [ 'DB' ];
$wgExternalServers = [ 'demoCluster' => [
[ 'host' => 'primary.example.org', 'user' => 'userM', 'password' =>'pwdM', 'dbname' => 'dbM', 'type' => "mysql", 'load' => 1 ],
[ 'host' => 'replica1.example.org', 'user' => 'userS1', 'password' =>'pwdS1', 'dbname' => 'dbS1', 'type' => "mysql", 'load' => 1 ],
[ 'host' => 'replica2.example.org', 'user' => 'userS2', 'password' =>'pwdS2', 'dbname' => 'dbS2', 'type' => "mysql", 'load' => 1 ],
] ];
$wgDefaultExternalStore = [ 'DB://demoCluster' ];
- Řádek
$wgExternalStores
uvádí, že lze použít externí úložištěDB
. (ČástDB
není libovolný název, který lze upravit. Musí to býtDB
.) To odpovídá použité podtříděExternalStoreMedium
a protokolu adresy blob. - Řádek
$wgExternalServers
uvádí všechny použitelné clustery se všemi použitelnými uzly clusteru. Klíče pole nejvyšší úrovně označují název clusteru (Výše uvedený příklad definuje pouze jeden cluster. Má názevdemoCluster
). Hodnotou těchto klíčů jsou opět pole. Obsahují specifikace jednotlivých uzlů. První uzel je považován za primární. Všechny zápisy do databáze se provádějí přes tento primární uzel. Může následovat nula nebo více replikovaných uzlů. (Ve výše uvedeném příkladu najdete dva replikované uzly). Každý uzel může mít vlastníhost
,user
,password
,dbname
atype
, jak je znázorněno v příkladu. Parametrload
umožňuje určit, jak velká část zátěže by měla projít touto poznámkou. - Řádek
$wgDefaultExternalStore
obsahuje ta externí úložiště, které lze použít pro uložení nového textu. Pokud tento řádek vynecháte, externí úložiště bude pouze pro čtení a nové texty se přesunou do výchozí databáze (tj. do stejné databáze, revize, obrazových dat; nikoli do clusteru).
Pro nastavení multiprimární (dříve nazývané multi-master) wiki farmy (jako je Wikimedie) zvažte použití LBFactory_Multi
.
Nastavení databáze
Pro výše uvedený příklad konfigurace byste museli:
- Vytvořte databázi
dbM
na hostiteliprimary.example.org
- Spusťte
maintenance/storage/blobs.sql
SQL skript na v databázidbM
na hostiteliprimary.example.org
. Pro tento úkol nepoužívejtemaintenance/sql.php
, protože to přidá požadované tabulky do vaší výchozí databáze (tj.: stránka databáze, revize, obrazová data) a ne dodbM
. Pokud si nejste jisti, jak spustit SQL skript na databázidbM
na hostiteliprimary.example.org
, prostudujte si dokumentaci k databázi. - Nastavte replikaci (informace o nastavení replikace naleznete v dokumentaci k databázi) směrem k
dbS1
na hostitelireplica1.example.org
a - Nastavte replikaci směrem k
dbS2
na hostitelireplica2.example.org
.
Údržbářské skripty
Existuje několik skriptů údržby pro přesun obsahu do externího úložiště:
- moveToExternal.php - přesouvá staré revize do externího úložiště
- compressOld.php - komprimuje staré revize a případně je přesouvá do externího úložiště
- recompressTracked.php - přesouvá revize (nebo jiná data) z jednoho externího úložiště do druhého a během procesu je znovu zkomprimuje
- refreshImageMetadata.php - při použití s --force a
$wgLocalFileRepo
byl nakonfigurován s'useSplitMetadata' => true
.