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.

The abstract BagOStuff and WANObjectCache classes define and document all of the available functions:



Old Development Notes
Broadly speaking, we'd like to be able to dump lots of data in the cache, use it whenever we can, and automatically expire it when changes are made.

Expiration model

 * explicit expiration times: memcached lets us set an expiration time on an object when we store it. After the time is up, another request for the object will find that it has expired and return nothing to us.
 * pro: last-ditch fallback to let data that could be updated badly eventually fall out of the cache
 * con: we have to know ahead of time when it will cease to be invalid. hard to do when we're dealing with user edits!


 * delete cached objects when we know we're doing something that will cause them to be invalid but are not in a position to update them while we're at it
 * pro: fairly simple; the item will be reloaded from the database and recached when it's next needed
 * con: if this will affect a large number of related items (for instance, creating or deleting a page invalidates the links/brokenlinks tables and rendered HTML cache of pages that link to that page) we may have to hunt them all down and do a lot of updating


 * include timestamps on cached objects and do our own expiries based on dependencies
 * pro: can expire many objects at once by updating a single node they depend on
 * 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.