Good presentation of the stages a typical the successful website goes through:
Stage 1 - The Beginning
- Firewall and load balancer
- A pair of web servers
- Database server
- Internal storage.
Low complexity and overhead means quick development and lots of features, fast.
No redundancy, low operational cost.
Stage 2 - More of the same, just bigger.
Stage 3 - The Pain Begins
publicity hits. Use a reverse proxy, cache static content, load balancers, more databases, re-coding.
Stage 4 - The Pain Intensifies
Caching with Memcached writes overload and replication takes too long, start database partitioning, shared storage makes sense for content, significant re-architecting for DB.
Stage 5 - This Really Hurts!
Rethink entire application, the partition on geography user ID, etc, creates user clusters, using a hashing scheme for locating which the user belongs to which cluster.
Stage 6 - Getting a little less painful
Scalable application and database architecture, acceptable performance, starting to add new features again, optimizing some code, still growing but manageable.
Stage 7 - Entering the unknown
Where are the remaining bottlenecks (power, space, bandwidth, CDN, firewall, load balancer, storage, people, process, database), all eggs in one basket (single data center, a single instance of data).