Manual:Memcached/cs

memcached je úložiště objektů v paměti, které může MediaWiki použít pro hodnoty ukládání do mezipaměti, aby se snížila potřeba provádět náročné výpočty a snížilo zatížení databázových serverů.



Kdy použít
Pro malý web hostovaný jediným serverem nemusí instalace Memcached stát za potíže. V takových případech zvažte konfiguraci MediaWiki tak, aby místo hlavního úložiště objektů používala APCu PHP. Pro velké webové stránky, jako je Wikipedie a obecně pro wikiny hostované více webovými servery, je Memcached běžnou volbou pro mezipaměť objektů MediaWiki.

Další informace o možnostech ukládání do mezipaměti v MediaWiki naleznete na stránce Příručka:Ladění výkonu § Ukládání objektů do mezipaměti



Jak nainstalovat Memcached
Většina správců balíčků pro Linux a macOS má k dispozici balíčky připravené k použití pro Memcached (včetně Debianu, Fedory a Ubuntu).

Pokud pro vaši distribuci není k dispozici žádný balíček, možná jej budete muset zkompilovat ze zdroje stažením z memcached.org. Ke kompilaci ze zdroje budete také potřebovat libevent. Memcached a libevent jsou projekty s otevřeným zdrojovým kódem vydané pod licencemi ve stylu BSD.

Pro více informací o Memcached obecně viz také "Memcached" na Wikipedii.

Zabezpečení
Memcached nemá žádné zabezpečení ani ověřování. Ujistěte se prosím, že váš server je správně zabezpečen firewallem a že porty používané pro servery s memcachingem nejsou veřejně přístupné. Jinak může kdokoli na internetu vkládat data do vaší mezipaměti a číst je.

Útočník obeznámený s interními informacemi MediaWiki by toho mohl využít k tomu, aby si udělil přístup pro vývojáře a smazal všechna data z databáze wiki a také získal hash hesel všech uživatelů a e-mailové adresy.



PHP klient pro Memcached
V době psaní tohoto článku (MediaWiki 1.27) používá MediaWiki čistě PHP klienta memcached (na základě práce Ryana T. Deana). Podporuje také rozšíření PECL php-memcached. Chcete-li používat Memcached s MediaWiki, PHP musí být zkompilováno s  (toto je výchozí nastavení).

Chcete-li si přečíst více o tom, jak vybrat Memcached jako backend pro různé části MediaWiki, viz Příručka:Ukládání do mezipaměti.

Nastavení
Pokud chcete začít v malém, stačí spustit jeden memcached na vašem webovém serveru: memcached -d -l 127.0.0.1 -p 11211 -m 64

(pro spuštění v režimu daemon, přístupné pouze přes rozhraní zpětné smyčky, na portu 11211, s využitím až 64 MB paměti)

V souboru LocalSettings.php nastavte:

Wiki by pak měla používat memcached k ukládání různých dat do mezipaměti. Chcete-li použít více serverů (fyzicky oddělené boxy nebo více mezipamětí na jednom počítači na x86 / Power box s velkou pamětí), stačí přidat do pole více položek. Chcete-li zvýšit váhu serveru (řekněme proto, že má dvojnásobnou paměť než ostatní a chcete rovnoměrně rozložit využití), udělejte z jeho položky podpole:

SELinux
Pro systémy se SELinuxem existuje několik zásad pro Memcached. Chcete-li povolit Apache (httpd) přístup k Memcached, musíte nastavit následující zásady:

setsebool -P httpd_can_network_memcache 1

Řešení problémů


Ztráta dat relace při ukládání
Pokud ukládáte data relace do memcached a uživatelům se při pokusu o uložení úprav občas zobrazí tato zpráva:

Pak jeden nebo více vašich serverů memcached může mít špatně nakonfigurovaný soubor. Na každém z vašich serverů memcached se ujistěte, že je vlastní název hostitele serveru namapován na localhost:

127.0.0.1 servername.here localhost localhost.localdomain ...

V opačném případě se server nemusí být schopen připojit ke svému vlastnímu procesu v memcached.



Použití memcached ve vašem kódu
Pokud píšete rozšíření, které provádí náročné databázové dotazy, může být užitečné ukládat data do mezipaměti v memcached. Existuje několik hlavních způsobů, jak získat rukojeť pro memcached:


 * ...použijte toto, pokud chcete sdílenou mezipaměť založenou na paměti s explicitní schopností čištění za účelem ukládání hodnot odvozených z trvalých zdrojů
 * ...toto použijte, pokud chcete pomíjivé úložiště založené na paměti, které není sdíleno mezi datovými centry
 * ...toto použijte, pokud chcete dočasnou mezipaměť založenou na paměti, která není sdílena mezi webovými servery
 * ...toto použijte, pokud chcete jakoukoli dostupnou mezipaměť, která může nebo nemusí být pro jednotlivá datacentra, dokonce i emulovaná, která používá databázi SQL. Všimněte si, že tyto mohou vracet ovladače, které místo toho komunikují s Redis, APC, MySQL nebo jinými místy. Použití slova "memcached" je historicky způsobeno tím, že API je definováno kolem jednoduchých příkazů, které memcached podporuje, a skutečnosti, že k dnešnímu dni je memcached obvykle nejlepším univerzálním úložištěm mezipaměti.

Rozšíření, která mají specifické potřeby (např. persistence), by měla definovat nová nastavení konfigurace, jako je nebo. Kód využívající mezipaměti je může předat na  a , v tomto pořadí.

Následující úryvek kódu ukazuje, jak uložit výsledky databázového dotazu do mezipaměti do memcached po dobu 15 minut a nejprve se dotazovat memcached na výsledky místo do databáze.

Abstraktní třídy BagOStuff a WANObjectCache definují a dokumentují všechny dostupné funkce:





Staré vývojové poznámky
Obecně řečeno, rádi bychom mohli ukládat velké množství dat do mezipaměti, používat je, kdykoli je to možné, a automaticky vypršet, když jsou provedeny změny.



Model vypršení platnosti

 * Explicitní časy vypršení platnosti: memcached nám umožňuje nastavit čas vypršení platnosti objektu, když jej ukládáme. Po uplynutí času další požadavek na objekt zjistí, že jeho platnost vypršela, a nic nám nevrátí.
 * pro: last-ditch fallback, který umožňuje, aby data, která "by mohla" být špatně aktualizována, nakonec vypadla z mezipaměti
 * con: musíme vědět předem, kdy přestane být neplatný. Těžko dělat, když máme co do činění s uživatelskými úpravami!


 * odstraní objekty uložené v mezipaměti, když víme, že děláme něco, co způsobí, že budou neplatné, ale nejsme schopni je aktualizovat, když už jsme u toho
 * pro: poměrně jednoduché; položka bude znovu načtena z databáze a znovu načtena, až bude příště potřeba
 * con: pokud to ovlivní velký počet souvisejících položek (například vytvoření nebo smazání stránky znehodnotí tabulky odkazů/přerušených odkazů a vykreslenou mezipaměť HTML stránek, které odkazují na tuto stránku), možná je budeme muset všechny vyhledat a provést spoustu aktualizací


 * zahrnout časová razítka do objektů uložených v mezipaměti a provést vlastní expirace na základě závislostí
 * pro: může vypršet platnost mnoha objektů najednou aktualizací jednoho uzlu, na kterém závisí
 * con: more things to load; multiple dependencies could be trickier to work with

Questions & Answers
Q: Can I search on part of a key or a regular expression on a Memcached server?

A: No, you can only search for an exact key if you need more information on what you could possibly do you can check out the Memcached protocol

Q: Can I have multiple wikis point to the same Memcached server?

A: Yes, as long as each have different wiki-ids ($wgDBname). Certain cache keys are intentionally shared in such a scenario, such as rate limiting stuff.