summaryrefslogtreecommitdiff
path: root/docs/memcached.txt
blob: 16c57602f4272c6c4b69b41496868b44ee10ba44 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
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.

== Installation ==

Packages are available for Fedora, Debian, Ubuntu and probably other
Linux distributions. If you there's no package available for your 
distribution, you can compile it from source.

== Compilation ==

* 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 steal
passwords and email addresses, or to make themselves a sysop and 
install malicious javascript on the site. There may be other types 
of vulnerability, no audit has been done -- so be safe and keep it 
behind a firewall.
********************* W A R N I N G ! ! ! ! ! ***********************

== Setup ==

If you installed memcached using a distro, the daemon should be started
automatically using /etc/init.d/memcached.

To start the daemon manually, use something like:

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

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

In your LocalSettings.php file, set:

	$wgMainCacheType = CACHE_MEMCACHED;
	$wgMemCachedServers = array( "127.0.0.1:11211" );

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:11211", # one gig on this box
    array("192.168.0.1:11211", 2 ) # two gigs on the other box
  );

== PHP client for memcached ==

MediaWiki uses a fork of Ryan T. Dean's pure-PHP memcached client.
It also supports the PECL PHP extension for memcached.

MediaWiki uses three object for object caching:
* $wgMemc, controlled by $wgMainCacheType
* $parserMemc, controlled by $wgParserCacheType
* $messageMemc, controlled by $wgMessageCacheType
If you set CACHE_NONE to one of the three control variable, (default
value for $wgMainCacheType), MediaWiki 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.

By default, $wgMemc is used but when it is $parserMemc or $messageMemc
this is mentioned below.

== Keys used ==

(incomplete, out of date)

Date Formatter:
	key: $wgDBname:dateformatter
	ex: wikidb:dateformatter
	stores: a single instance of the DateFormatter class
	cleared by: nothing
	expiry: one hour

Difference Engine:
	key: $wgDBname:diff:version:{MW_DIFF_VERSION}:oldid:$old:newid:$new
	ex: wikidb:diff:version:1.11a:oldid:1:newid:2
	stores: body of a difference
	cleared by: nothing
	expiry: one week

Interwiki:
	key: $wgDBname:interwiki:$prefix
	ex: wikidb:interwiki:w
	stores: object from the interwiki table of the database
	expiry: $wgInterwikiExpiry
	cleared by: nothing

Lag time of the databases:
	key: $wgDBname:lag_times
	ex: wikidb:lag_times
	stores: array mapping the database id to its lag time
	expriy: 5 secondes
	cleared by: nothing

Localisation:
	key: $wgDBname:localisation:$lang
	ex: wikidb:localisation:de
	stores: array of localisation settings
	set in: Language::loadLocalisation()
	expiry: none
	cleared by: Language::loadLocalisation()

Message Cache:
	stored in: $messageMemc
	key: $wgDBname:messages, $wgDBname:messages-hash, $wgDBname:messages-status
	ex: wikidb:messages, wikidb:messages-hash, wikidb:messages-status
	stores: an array where the keys are DB keys and the values are messages
	set in: wfMessage(), Article::editUpdates() and Title::moveTo()
	expriy: $wgMsgCacheExpiry
	cleared by: nothing

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: 30 minutes

Parser Cache:
	stored in: $parserMemc
	controlled by: $wgEnableParserCache
	key: $wgDBname:pcache:idhash:$pageid-$renderkey!$hash
		$pageid: id of the page
		$renderkey: 1 if action=render, 0 otherwise
		$hash: hash of user options applied to the page, see ParserOptions::optionsHash()
	ex: wikidb:pcache:idhash:1-0!1!0!!en!2
	stores: ParserOutput object
	modified by: WikiPage::doEditUpdates() or PoolWorkArticleView::doWork()
	expiry: $wgParserCacheExpireTime or less if it contains short lived functions

	key: $wgDBname:pcache:idoptions:$pageid
	stores: CacheTime object with an additional list of used options for the hash,
    serves as ParserCache pointer.
	modified by: ParserCache::save()
	expiry: The same as the ParserCache entry it points to.

Ping limiter:
	controlled by: $wgRateLimits
	key: $wgDBname:limiter:action:$action:ip:$ip,
		$wgDBname:limiter:action:$action:user:$id,
		mediawiki:limiter:action:$action:ip:$ip and
		mediawiki:limiter:action:$action:subnet:$sub
	ex: wikidb:limiter:action:edit:ip:123.45.67.89,
		wikidb:limiter:action:edit:user:1012
		mediawiki:limiter:action:edit:ip:123.45.67.89 and
		mediawiki:limiter:action:$action:subnet:123.45.67
	stores: number of action made by user/ip/subnet
	cleared by: nothing
	expiry: expiry set for the action and group in $wgRateLimits


Proxy Check: (deprecated)
	key: $wgDBname:proxy:ip:$ip
	ex: wikidb:proxy:ip:123.45.67.89
	stores: 1 if the ip is a proxy
	cleared by: nothing
	expiry: $wgProxyMemcExpiry

Revision text:
	key: $wgDBname:revisiontext:textid:$id
	ex: wikidb:revisiontext:textid:1012
	stores: text of a revision
	cleared by: nothing
	expriry: $wgRevisionCacheExpiry

Sessions:
	controlled by: $wgSessionsInObjectCache
	key: $wgBDname:session:$id
	ex: wikidb:session:38d7c5b8d3bfc51egf40c69bc40f8be3
	stores: $SESSION, useful when using a multi-sever wiki
	expriy: one hour
	cleared by: session_destroy()

Sidebar:
	stored in: $parserMemc
	controlled by: $wgEnableSidebarCache
	key: $wgDBname:sidebar
	ex: wikidb:sidebar
	stores: the html output of the sidebar
	expriy: $wgSidebarCacheExpiry
	cleared by: MessageCache::replace()

Special:Allpages:
	key: $wgDBname:allpages:ns:$ns
	ex: wikidb:allpages:ns:0
	stores: array of pages in a namespace
	expiry: one hour
	cleared by: nothing

Special:Recentchanges (feed):
	stored in: $messageMemc
	key: $wgDBname:rcfeed:$format:$limit:$hideminor:$target and
		rcfeed:$format:timestamp
	ex: wikidb:rcfeed:rss:50:: and rcfeed:rss:timestamp
	stores: xml output of feed
	expiry: one day
	clear by: maintenance/rebuildrecentchanges.php script, or
	calling Special:Recentchanges?action=purge&feed=rss,
	Special:Recentchanges?action=purge&feed=atom,
	but note need $wgGroupPermissions[...]['purge'] permission.

Statistics:
	controlled by: $wgStatsMethod
	key: $wgDBname:stats:$key
	ex: wikibd:stats:request_with_session
	stores: counter for statistics (see maintenance/showCacheStats.php script)
	expiry: none (?)
	cleared by: maintenance/clearCacheStats.php script

User:
	key: $wgDBname:user:id:$sId
	ex: wikidb:user:id:51
	stores: instance of class User
	set in: User::saveToCache()
	cleared by: User::saveSettings(), User::clearSharedCache()
	
... more to come ...