132 lines
4.4 KiB
Text
132 lines
4.4 KiB
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 ==
|
|
|
|
* PHP must be compiled with --enable-sockets
|
|
|
|
* libevent: http://www.monkey.org/~provos/libevent/
|
|
(as of 2003-08-11, 0.7a is current)
|
|
|
|
* optionally, epoll-rt patch for Linux kernel:
|
|
http://www.xmailserver.org/linux-patches/nio-improve.html
|
|
|
|
* memcached: http://www.danga.com/memcached/download.bml
|
|
(as of this writing, 1.1.9 is current)
|
|
|
|
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 ...
|