Professional Documents
Culture Documents
http://www.mrkirkland.com/prepare-for-web-application-scalability/
Skip to content Follow: RSS Twitter Mr Kirkland Your all singing and breakdancing CEO Home About Contact Tags application, mysql, scalability
by Mr Kirkland on May 11th, 2010 Congratulations, your server is melting. This is a good problem to have (server heat is proportional to # of users). And its not so difficult to deal with if make a few preparations in advance. After launching a number of web services and viral social media apps, some of which grew to hundreds of concurrent users and zillions of hits within days, Ive had to learn on the job about scaling websites. Here I present to you my thoughts and some simple suggestions on how you can prepare ahead of time.
Really the most important principal to take on board is modular design. If you look at any high volume platform youll quickly see evidence of how the components of the service are split up into separate independent units. Wikipedia is classic example of this, cheek out the architecture behind wikipedia. If you can separate all the different components of your website/web app, then you can easily apply more resources where they are needed. Just upgrading to a bigger server wont get you far, long term you need to be able to identify where the bottle necks are and apply resources efficiently. In fact even identifying the bottlenecks can be surprisingly hard, modular design makes this much easier.
1 of 11
1/24/2012 12:20 AM
http://www.mrkirkland.com/prepare-for-web-application-scalability/
Spilt services into independent modules, its much more efficient to scale them individually So some examples of the typical components your website/web app will be using: media, images, static files (javascript, css etc) db server mail batch processing (webstats, image resizing etc.) front end (normal user area) back end (control panel) Separating these components neednt be rocket science, heres some simple examples of how you could apply modularity to the components above: media -> move all media and static files on a dedicated domain/subdomain (or better still in a CDN) e.g. <img src=http://media-server.mydomain.com /> db server -> always use a central config file for db settings, so you can easily change the hostname when the time comes to use a dedicated db server: $db_hostname = mydomain.com -> $db_hostname = dbserver.mydomain.com; mail -> again make sure mail settings are in a central config and ideally use a framework/library that allows you to change to an external SMTP server/service batch processing -> create an independent system for any batch processes, for example use a standalone phpthumb installation for image resizing. separate front end / back end -> make use of different a domain for control panels e.g. www.mydomain.com and controlpanel.mydomain.com, so later on itll be easy to move these onto different servers In addition to thinking modular, always be monitoring and profiling your systems then you know exactly where the bottlenecks are and can deal with them more effectively.
2 of 11
1/24/2012 12:20 AM
http://www.mrkirkland.com/prepare-for-web-application-scalability/
1. Queuing/Batching
Queuing prevents a server being overloaded all of a sudden Typically there may be parts of your application that involve heavy processing. If these dont need to be real time, or can tolerate slight delays then separate the processes and make use of queuing/batching so your web application isnt held up. Google Analytics is a good example of this, generally theres no need to have real time webstats, so the collected stats are batch processed at regular intervals. Another example could be image processing, Ive written about this in more detail here.
2. Partitioning
Taking modularization a step further and we have partitioning i.e. splitting data up in to smaller manageable chunks which can be stored/operated on separately. If you have a multi user system you could split users across servers, so for example your could have 1000 users per server, or split users by user id odd/even, divisible by X etc. Again you could do this ahead of time with subdomains:
3 of 11
1/24/2012 12:20 AM
http://www.mrkirkland.com/prepare-for-web-application-scalability/
Another example of partitioning is database partitioning, heres a quick introduction, but this would come way later, having a dedicated db server or db cluster will scale you a long way.
4 of 11
1/24/2012 12:20 AM
http://www.mrkirkland.com/prepare-for-web-application-scalability/
users machine. However this is no trivial task and requires a full understanding of how browsers respond to HTTP cache headers, heres more info on the subject
Within 10 mins his app was performing about 10 50 times faster. All I did was add a few basic indexes.
With a simple change to your DB config this allows you to instantly use a master/slave(s) setup to spread the load on your database.
1/24/2012 12:20 AM
http://www.mrkirkland.com/prepare-for-web-application-scalability/
//hand coded (not recommended) <img src="http://images.mywebsite.com/images/1234_an_image.jpg" / > //simple variable <img src="<?php echo $image_server; ?>/images/1234_an_image.jpg" / > //or full managed image urls using a special class to generate urls <img src="<?php echo $this->images->get_image_url($image_id); ?>" />
5. Mail Config
If your application sends emails, make sure the mail config can be changed easily and can use SMTP. Part of modularizing + queuing would involve having a separate server for sending, its most likely youll connect to this from your app via SMTP. Particularly now as there are a number of 3rd party SMTP services that can reduce the increasing headache of reliably sending mail. If you are using a standard mail library like phpmailer, or as part of a framework, then this is probably set up already see the docs. if you have your own DIY mail functions, its probably best to swap to some established library (e.g. phpmailer) anyway, no need to re-invent the wheel.
6 of 11
1/24/2012 12:20 AM
http://www.mrkirkland.com/prepare-for-web-application-scalability/
7. Efficient Backups
Large backups can really slow down or even stop a server (particularly large DB backups), but chances are you could significantly reduce this load by Not backing up temp/cache files Using git/svn etc. and backing up the repository not the web application docroot Database dumps/snapshots using a slave, so write locks will not affect your DB server For your data storage use a filesystem/system that support snapshots (e.g. ZFS)
1/24/2012 12:20 AM
http://www.mrkirkland.com/prepare-for-web-application-scalability/
Scalr.net, Google App Engine to name a few that offer automatic scalability. If you are able to work within their constraints (for example App Engine only supports Python + Java) then they can be a very attractive offering. Google App Engine: Automatic scaling is built in with App Engine, all you have to do is write your application code and well do the rest.
As technology advances, a lot of scalability issues become easier to solve or disappear we have cloud computing, easy to use CDNs and services like Google App Engine. However until we have the Holodeck, Im pretty confident most of the principles Ive raised today will still be important in your design considerations. oh and hopefully your server has stopped melting now.
8 of 11
1/24/2012 12:20 AM
http://www.mrkirkland.com/prepare-for-web-application-scalability/
Check out a real world example, wikimedia: http://meta.wikimedia.org/wiki/Wikimedia_servers highscalability.com has some good resources: http://highscalability.com/blog/category/blog
Tweets
1. mrkirkland (mrkirkland) says: May 13, 2010 at 1:24 am my new article on scaling websites/web apps http://bit.ly/bRLT0Y 2. craigmod (Craig Mod) says: May 13, 2010 at 1:45 pm Goldmine of website sever scaling tricks by @mrkirkland http://bit.ly/bRLT0Y 3. damiengiard (Giard Damien) says: May 13, 2010 at 1:48 pm RT @craigmod: Goldmine of website sever scaling tricks by @mrkirkland http://bit.ly/bRLT0Y 4. DavidAndGoliath (David McKendrick) says: May 13, 2010 at 1:49 pm RT @craigmod: Goldmine of website sever scaling tricks by @mrkirkland http://bit.ly/bRLT0Y 5. joedevon (Joe Devon) says: May 13, 2010 at 1:49 pm RT @craigmod: Goldmine of website sever scaling tricks by @mrkirkland http://bit.ly/bRLT0Y Leave a Reply
Name: (required): Email: (required): Website:
9 of 11
1/24/2012 12:20 AM