Performance, scalability, and reliability are important attributes of any enterprise application. Although there are many ways to increase performance and improve reliability, this patterns cluster focuses how to combine multiple systems that serve any number of applications or users for greater scalability and improved availability. The patterns in this chapter provide a basis to effectively adapt to changes in load and peak traffic, and to increase availability.
Today’s enterprise applications have to meet ever-increasing operational demands, including higher availability, improved performance, and the ability to maintain these demands as the load on applications increases. This creates the need for application and supporting infrastructure designs that maximize scalability and availability.
Scalability is the ability of a system or systems to handle increasing demands while maintaining acceptable performance levels. To scale a system effectively, you must identify the nature of the increasing demand and understand its impact on the various system components. After you identify the limiting component, you can either scale up or scale out.
Scaling up is a strategy that increases the capacity of a resource (for example, processor, memory, or storage) in a single server to handle load. For example, you can scale up a database cluster that is built on a multiprocessor operating system by increasing the number of processors or memory.
Scaling out is the strategy that increases the capacity of an infrastructure tier to handle load by adding servers, thereby increasing the aggregate capacity of those servers.
Availability is the measurable run time of a server, the software running on a server, or an application and depends on careful design and operational discipline, including change controls, rigorous testing, and quick upgrade and fallback mechanisms. To achieve the highest levels of availability, it is important to isolate all single points of failure in the design. A highly available design process should analyze each component of the architecture to verify that overall system performance does not depend on any single piece of hardware or software performing a specific function or providing access to a specific piece of information.