Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
To a thousand servers and beyond: scaling a mas...
Search
Nikolay Bachiyski
February 25, 2012
Programming
1.5k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
To a thousand servers and beyond: scaling a massive PHP application
Stories of abstraction and scaling WordPress.com. And what they have in common.
Nikolay Bachiyski
February 25, 2012
More Decks by Nikolay Bachiyski
See All by Nikolay Bachiyski
React.js for WordPress Developers
nb
0
290
Building Calypso-like Applications
nb
3
870
Else Considered Harmful
nb
2
1.1k
On Learning
nb
2
820
WordPress: To OOP or not to OOP
nb
4
8.1k
On Creeds and Manifestos
nb
2
230
Welcome to the Chaos – The Distributed Workplace
nb
3
240
Взимане на продуктови решения (Making product decisions)
nb
0
170
Other Decks in Programming
See All in Programming
【SRE NEXT 2026 Lunch Session】一人目専任SREの立ち上げを加速する ― AIと進めたオンボーディングで2分を0.04秒にした話
pkshadeck
PRO
0
2.9k
AIエージェントで 変わるAndroid開発環境
takahirom
2
700
全PRの83%がAIレビューだけでマージできるようになった開発組織はその後どうなったか
athug
0
280
1年で人数1.5倍、PR数5.5倍増。 品質とアウトカムはどうなったか、 何が効いたか
ike002jp
0
140
FDEが実現するAI駆動経営の現在地
gonta
2
200
【やさしく解説 設計編・中級 #4】ルールの寿命と、システムの年輪
panda728
PRO
2
160
【やさしく解説 設計編・中級 #1】一つの車に、運転手は一人 ~ある倉庫システムの事例から~
panda728
PRO
0
190
Built Our Own Background Agent at LayerX #aidevex_findy
layerx
PRO
8
3k
鹿野さんに聞く!『TypeScriptコードレシピ集』で磨く実践力
tonkotsuboy_com
4
1.1k
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
140
継続モナドとリアクティブプログラミング
yukikurage
3
620
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
150
Featured
See All Featured
[SF Ruby Conf 2025] Rails X
palkan
2
1.2k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
The untapped power of vector embeddings
frankvandijk
2
1.8k
A designer walks into a library…
pauljervisheath
211
24k
Done Done
chrislema
186
16k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
10k
Ruling the World: When Life Gets Gamed
codingconduct
0
290
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
730
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2.1k
The agentic SEO stack - context over prompts
schlessera
0
850
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.8k
Testing 201, or: Great Expectations
jmmastey
46
8.2k
Transcript
To 1000 servers and beyond Nikolay Bachiyski PHPUK 2012
http://extrapolate.me/ @nikolayb
None
None
None
Stinson Beach, July 2007
Budapest, Oct 2011
Jul, 2007 65MM Feb, 2011 800MM PV
2 stories
Story #1
Deep Pink Meet
Don’t like?
Beer Beheader =
None
None
Abstraction
None
Beer Theory
None
Want to be better?
Get to know the abstraction below
Servers are below
Story #2 Scaling WordPress.com
None
X
Deep Pink SAD
None
X
Deep Pink SAD
None
None
Users Blogs Blogs
No joins :(
None
SELECT * FROM wp_users WHERE id=43315 SELECT * FROM wp_posts
LIMIT 10
HyperDB
None
SELECT * FROM wp_users WHERE id=43315
Query parsing
add_db_table('user', 'wp_users') Dataset Table name
add_db_server('user', 0, 1, 0,
'db42.wordpress.com',…) Dataset Partition Read Write Slave
Failover X
Can work without
http://wordpress.org/extend/plugins/hyperdb/
None
None
C C C C
$count = wp_cache_get('posts', 'counts'); if ( false !== $count )
return $count; $count = $wpdb-‐>get_results($complex_query);
Output caching
10% 90% reads writes
C C C C
C C C C
Deep Pink SAD
Datacenter
C C sane sane
C C crazy sane Update
C C crazy sane Stale!
C C crazy crazy
Deploy
trunk/
Branch in code
~100 commits a day
~100 deploys a day
to ~1000 servers
One-click
None
Fast!
wpdev@nikolay:~$ deploy wpcom Going to update from 47127 to 47128
Syncing wpcom SVN Mirrors ORD (0s)... LUV (0s)... SAT (0s)... Deploying wpcom revision 47128 ORD (3s)... SAT (5s)... LUV (6s)... Revision 47128 successfully deployed (8s)
None
None
Yeah, immediately!
Push to twitter
Push to Facebok
Stats
Spam checks
Index for search
Invalidate caches
Publish the post
ASYNC JOBS
None
$job_id = queue_async_job($data, 'encode_video');
Priorities
Deferred jobs
None
PHP & MySQL
http://code.trac.wordpress.org/wiki/JobsDocs http://code.trac.wordpress.org/browser/jobs
Integration
Hacking
None