Difference between revisions of "MemCached.doc (MediaWiki)"

from HTYP, the free directory anyone can edit if they can prove to me that they're not a spambot
Jump to navigation Jump to search
 
m (pasted original contents from hypertwiki, I think)
Line 1: Line 1:
[[Techniques]]:
+
{{web software|MediaWiki}}: [[MediaWiki Developer Documents|Developer Documents]]: [[MemCached.doc]]
Software: [[MediaWiki]]: [[MediaWikiDoc:Developer Documents|Developer
+
 
Documents]]: [[MediaWikiDoc:MemCached.doc|MemCached.doc]]
 
 
==Text==
 
==Text==
===memcached support for MediaWiki=== From ca August 2003, MediaWiki
+
===memcached support for MediaWiki===
has optional support for memcached, a "high-performance, distributed
+
memory object caching system". For general information on it, see:
+
From ca August 2003, MediaWiki has optional support for memcached, a "high-performance, distributed memory object caching system". For general information on it, see: http://www.danga.com/memcached/
http://www.danga.com/memcached/ Memcached is likely more trouble than a
+
small site will need, but for a larger site with heavy load, like
+
Memcached is likely more trouble than a small site will need, but for a larger site with heavy load, like Wikipedia, it should help lighten the load on the database servers by caching data and objects in memory.  
Wikipedia, it should help lighten the load on the database servers by
+
caching data and objects in memory. ====Requirements==== * PHP must be
+
====Requirements====
compiled with --enable-sockets * libevent:
+
http://www.monkey.org/~provos/libevent/ *:(as of 2003-08-11, 0.7a is
+
* PHP must be compiled with --enable-sockets  
current) * optionally, epoll-rt patch for Linux kernel:
+
* libevent: http://www.monkey.org/~provos/libevent/  
*:http://www.xmailserver.org/linux-patches/nio-improve.html *
+
*:(as of 2003-08-11, 0.7a is current)  
memcached: http://www.danga.com/memcached/download.bml *:(as of this
+
* optionally, epoll-rt patch for Linux kernel:  
writing, 1.1.9 is current) Memcached and libevent are under BSD-style
+
*:http://www.xmailserver.org/linux-patches/nio-improve.html  
licenses. The server should run on Linux and other Unix-like systems...
+
* memcached: http://www.danga.com/memcached/download.bml  
you can run multiple servers on one machine or on multiple machines on
+
*:(as of this writing, 1.1.9 is current)  
a network; storage can be distributed across multiple servers, and
+
multiple web servers can use the same cache cluster.
+
Memcached and libevent are under BSD-style licenses.  
 +
 +
The server should run on Linux and other Unix-like systems... you can run multiple servers on one machine or on multiple machines on a network; storage can be distributed across multiple servers, and multiple web servers can use the same cache cluster.  
 +
 +
 
 
<center><nowiki>
 
<center><nowiki>
********************* W A R N I N G ! ! ! ! ! ***********************
+
********************* W A R N I N G ! ! ! ! ! ***********************  
 
</nowiki></center>
 
</nowiki></center>
Memcached has no security or authentication. Please ensure that your
+
Memcached has no security or authentication. Please ensure that your server is appropriately firewalled, and that the port(s) used for memcached servers are not publicly accessible. Otherwise, anyone on the internet can put data into and read data from your cache.  
server is appropriately firewalled, and that the port(s) used for
+
memcached servers are not publicly accessible. Otherwise, anyone on the
+
An attacker familiar with MediaWiki internals could use this to give themselves developer access and delete all data from the wiki's database, as well as getting all users' password hashes and e-mail addresses.  
internet can put data into and read data from your cache. An attacker
 
familiar with MediaWiki internals could use this to give themselves
 
developer access and delete all data from the wiki's database, as well
 
as getting all users' password hashes and e-mail addresses.
 
 
<center><nowiki>
 
<center><nowiki>
********************* W A R N I N G ! ! ! ! ! ***********************
+
********************* W A R N I N G ! ! ! ! ! ***********************  
</nowiki></center> ====Setup====
+
</nowiki></center>
If you want to start small, just run one memcached on your web server:
+
memcached -d -l 127.0.0.1 -p 11000 -m 64 (to run in daemon mode,
+
====Setup====
accessible only via loopback interface, on port 11000, using up to 64MB
+
If you want to start small, just run one memcached on your web server:  
of memory) In your LocalSettings.php file, set: $wgUseMemCached = true;
+
$wgMemCachedServers = array( "127.0.0.1:11000" ); The wiki should then
+
  memcached -d -l 127.0.0.1 -p 11000 -m 64  
use memcached to cache various data. To use multiple servers
+
(to run in daemon mode, accessible only via loopback interface, on port 11000, using up to 64MB of memory)  
(physically separate boxes or multiple caches on one machine on a
+
large-memory x86 box), just add more items to the array. To increase
+
In your LocalSettings.php file, set:  
the weight of a server (say, because it has twice the memory of the
+
others and you want to spread usage evenly), make its entry a subarray:
+
  $wgUseMemCached = true;  
<pre> $wgMemCachedServers = array( "127.0.0.1:11000", # one gig
+
  $wgMemCachedServers = array( "127.0.0.1:11000" );  
on this box array("192.168.0.1:11000", 2) # two gigs on the other box
+
The wiki should then use memcached to cache various data. To use multiple servers (physically separate boxes or multiple caches on one machine on a large-memory x86 box), just add more items to the array. To increase the weight of a server (say, because it has twice the memory of the others and you want to spread usage evenly), make its entry a subarray:  
);
+
 
</pre> ====PHP client for memcached====
+
<pre>
As of this writing, MediaWiki includes version 1.0.10 of the PHP
+
  $wgMemCachedServers = array(  
memcached client by Ryan Gilfether <hotrodder@rocketmail.com>.
+
    "127.0.0.1:11000", # one gig on this box  
You'll find some documentation for it in the 'php-memcached'
+
    array("192.168.0.1:11000", 2) # two gigs on the other box  
subdirectory under the present one. We intend to track updates, but if
+
  );
you want to check for the lastest released version, see
+
</pre>
http://www.danga.com/memcached/apis.bml If you don't set
+
$wgUseMemCached, we still create a MemCacheClient, but requests to it
+
====PHP client for memcached====
are no-ops and we always fall through to the database. If the cache
+
As of this writing, MediaWiki includes version 1.0.10 of the PHP memcached client by Ryan Gilfether <hotrodder@rocketmail.com>. You'll find some documentation for it in the 'php-memcached' subdirectory under the present one.  
daemon can't be contacted, it should also disable itself fairly
+
smoothly. ====Keys used====
+
We intend to track updates, but if you want to check for the lastest released version, see http://www.danga.com/memcached/apis.bml  
*User: *:key: $wgDBname:user:id:$sId *:ex: wikidb:user:id:51 *:stores:
+
instance of class User *:set in: User::loadFromSession() *:cleared by:
+
If you don't set $wgUseMemCached, we still create a MemCacheClient, but requests to it are no-ops and we always fall through to the database. If the cache daemon can't be contacted, it should also disable itself fairly smoothly.  
User::saveSettings(), UserTalkUpdate::doUpdate() *Newtalk: *:key:
+
$wgDBname:newtalk:ip:$ip *:ex: wikidb:newtalk:ip:123.45.67.89 *:stores:
+
====Keys used====
integer, 0 or 1 *:set in: User::loadFromDatabase() *:cleared by:
+
*User:  
User::saveSettings() # ? *:expiry set to 30 minutes *LinkCache: *:key:
+
*:key: $wgDBname:user:id:$sId  
$wgDBname:lc:title:$title *:ex:
+
*:ex: wikidb:user:id:51  
wikidb:lc:title:Wikipedia:Welcome,_Newcomers! *:stores: cur_id of page,
+
*:stores: instance of class User  
or 0 if page does not exist *:set in: LinkCache::addLink()  
+
*:set in: User::loadFromSession()  
 +
*:cleared by: User::saveSettings(), UserTalkUpdate::doUpdate()  
 +
 +
*Newtalk:  
 +
*:key: $wgDBname:newtalk:ip:$ip  
 +
*:ex: wikidb:newtalk:ip:123.45.67.89  
 +
*:stores: integer, 0 or 1  
 +
*:set in: User::loadFromDatabase()  
 +
*:cleared by: User::saveSettings() # ?  
 +
*:expiry set to 30 minutes  
 +
 +
*LinkCache:  
 +
*:key: $wgDBname:lc:title:$title  
 +
*:ex: wikidb:lc:title:Wikipedia:Welcome,_Newcomers!  
 +
*:stores: cur_id of page, or 0 if page does not exist  
 +
*:set in: LinkCache::addLink()  
 
*:cleared by: LinkCache::clearBadLink()
 
*:cleared by: LinkCache::clearBadLink()
 
*::should be cleared on page deletion and rename  
 
*::should be cleared on page deletion and rename  

Revision as of 18:47, 14 October 2005

computing: software: web: MediaWiki: Developer Documents: MemCached.doc

Text

memcached support for MediaWiki

From ca August 2003, MediaWiki has optional support for memcached, a "high-performance, distributed memory object caching system". For general information on it, see: http://www.danga.com/memcached/

Memcached is likely more trouble than a small site will need, but for a larger site with heavy load, like Wikipedia, it should help lighten the load on the database servers by caching data and objects in memory.

Requirements

Memcached and libevent are under BSD-style licenses.

The server should run on Linux and other Unix-like systems... you can run multiple servers on one machine or on multiple machines on a network; storage can be distributed across multiple servers, and multiple web servers can use the same cache cluster.


********************* W A R N I N G ! ! ! ! ! ***********************

Memcached has no security or authentication. Please ensure that your server is appropriately firewalled, and that the port(s) used for memcached servers are not publicly accessible. Otherwise, anyone on the internet can put data into and read data from your cache.

An attacker familiar with MediaWiki internals could use this to give themselves developer access and delete all data from the wiki's database, as well as getting all users' password hashes and e-mail addresses.

********************* W A R N I N G ! ! ! ! ! ***********************

Setup

If you want to start small, just run one memcached on your web server:

 memcached -d -l 127.0.0.1 -p 11000 -m 64 

(to run in daemon mode, accessible only via loopback interface, on port 11000, using up to 64MB of memory)

In your LocalSettings.php file, set:

 $wgUseMemCached = true; 
 $wgMemCachedServers = array( "127.0.0.1:11000" ); 

The wiki should then use memcached to cache various data. To use multiple servers (physically separate boxes or multiple caches on one machine on a large-memory x86 box), just add more items to the array. To increase the weight of a server (say, because it has twice the memory of the others and you want to spread usage evenly), make its entry a subarray:

  $wgMemCachedServers = array( 
    "127.0.0.1:11000", # one gig on this box 
    array("192.168.0.1:11000", 2) # two gigs on the other box 
  );

PHP client for memcached

As of this writing, MediaWiki includes version 1.0.10 of the PHP memcached client by Ryan Gilfether <hotrodder@rocketmail.com>. You'll find some documentation for it in the 'php-memcached' subdirectory under the present one.

We intend to track updates, but if you want to check for the lastest released version, see http://www.danga.com/memcached/apis.bml

If you don't set $wgUseMemCached, we still create a MemCacheClient, but requests to it are no-ops and we always fall through to the database. If the cache daemon can't be contacted, it should also disable itself fairly smoothly.

Keys used

  • User:
    key: $wgDBname:user:id:$sId
    ex: wikidb:user:id:51
    stores: instance of class User
    set in: User::loadFromSession()
    cleared by: User::saveSettings(), UserTalkUpdate::doUpdate()
  • Newtalk:
    key: $wgDBname:newtalk:ip:$ip
    ex: wikidb:newtalk:ip:123.45.67.89
    stores: integer, 0 or 1
    set in: User::loadFromDatabase()
    cleared by: User::saveSettings() # ?
    expiry set to 30 minutes
  • LinkCache:
    key: $wgDBname:lc:title:$title
    ex: wikidb:lc:title:Wikipedia:Welcome,_Newcomers!
    stores: cur_id of page, or 0 if page does not exist
    set in: LinkCache::addLink()
    cleared by: LinkCache::clearBadLink()
    should be cleared on page deletion and rename
  • MediaWiki namespace:
    key: $wgDBname:messages
    ex: wikidb:messages
    stores: an array where the keys are DB keys and the values are messages
    set in: wfMsg(), Article::editUpdates() both call wfLoadAllMessages()
    cleared by: nothing
  • Watchlist:
    key: $wgDBname:watchlist:id:$userID
    ex: wikidb:watchlist:id:4635
    stores: HTML string
    cleared by: nothing, expiry time $wgWLCacheTimeout (1 hour)
    note: emergency optimisation only
  • IP blocks:
    key: $wgDBname:ipblocks
    ex: wikidb:ipblocks
    stores: array of arrays, for the BlockCache class
    cleared by: BlockCache:clear()

... more to come ...

Edit Log

  • 2005-06-13 Transcribed from docs for MediaWiki version 1.4.5