On taking a more nuanced approach to Cloud services.

Although it makes a lot of sense for an IT department to use the Cloud where possible instead of using its own IT infrastructure, you can’t just move everything and expect to be left with no task more taxing than twiddling a big dial marked ‘scale’.

Whereas the cloud works well with stateless, process-heavy, application servers that can be easily scaled horizontally, databases aren’t so amenable to this form of scaling. The Cloud finds it trickier to deal with the scaling of singleton-type usage, call-back statefulness, audit information and transactionality. In addition, the performance and scalability of databases depends on a complex combination of factors, including design, CPU, Memory and disk performance. Any experienced administrator is, for example, likely to be very interested in waits and what causes them; it is a struggle with hardware in which much of the fight is in the detail; finding the best hardware RAID 10 configuration to provide low random seek times, for example, or the best-performing load-balancer or firewall. This can be abstracted safely into a cloud service only if performance isn’t critically important. Every level of abstraction or virtualization brings with it a performance penalty. We can disguise this fact in our application with tricks such as using memory-mapped files, but there is no cost-free virtualization. With cloud platforms there are only a few knobs to twiddle, and none as cost-effective as minimizing the time taken to write data to disk.

Some people have blamed the relational model and have dabbled in many systems that promise horizontal scaling. Some are good, because they have the advantage of casting off the baggage of backwards compatibility, transactional integrity, or open standards, but not because they are intrinsically better at scaling.

Were I planning a corporate IT strategy, I’d be considering hybrid approach that considered the requirements of the individual applications, and took advantage of the obvious advantages of Cloud for application servers, and less performance-critical database servers, but kept the corporate databases in on-premise AlwaysOn clusters. Would you?