Have you ever lived on a farm? Not the modern giant ones, but rather the traditional smaller ones where the land was tilled by humans, not tractors. You would have noticed that most traditional farms have a small number of domesticated animals that are owned and looked after by the farmer and his family.
While these animals serve a commercial purpose, that is, they are milked and sheared, and their produce then sold on the market, they are still considered as pets by the farmer’s family. Domestic animals such as these are looked after by the entire family. They are given the best food. When they get sick, they are taken care of. The farmer spares no expense in looking after the health of his animals. The farmer’s children play with these animals. They’re also given pet names by the family.
These traditional farms have been around for centuries. But in recent times, the farming industry has witnessed a tremendous change. The biggest farms today occupy thousands of acres of land, where instead of using traditional farming techniques, technology is used to make farming easier and more efficient. Also, the cattle and poultry industries today have been separated from the farming industry.
Gone are the days when domestic animals were considered as family pets. Today, they’re considered as resources that have to be kept efficient at all times in order to deliver the right amount of product to the market. Instead of giving names, animals are assigned number-tags. Only the most milk-producing cows are kept on the farm. The rest are discarded. And when one of the animals gets sick, they’re replaced by another animal immediately in order to fill in the gap and reach the targeted production for the customer.
Why the software infrastructure landscape is no different than modern cattle farms
You might be wondering why I’m sharing the evolution of the cattle industry with you. The reason is simple. I wanted to use this as an analogy to explain how the software infrastructure landscape works today. And mind you, I’m not the one who came up with this analogy. The credit actually goes to Randy Bias, who first published this analogy on a slide deck back in 2012.
Anyways, this analogy fits perfectly well with modern technology infrastructures. Previously, servers were installed and maintained like pet animals, and these servers had individual names, like Ares, Hades, Cerberus and so on. The way they were looked after was no different than how pets were treated by their owners. If one server had problems, it was looked after and fixed rather than discarded by the company. Instead of getting replaced, the same servers were upgraded by the company by installing more advanced components inside them.
But like the cattle industry, the entire server infrastructure evolved with time. New options emerged on the market that offered IaaS (Infrastructure as a Service) to companies. Most popular IaaS platforms are Amazon Web Services, Microsoft Azure, and Google Cloud Platform. Thus began the cloud age where instead of keeping stacks of servers self-managed, companies chose to use virtual servers that were offered by the platforms mentioned above.
Like in the modern cattle industry, the servers too are considered as disposable animals rather than pets. They’re no longer given individual names. And if one of the servers faces problems, it is immediately replaced by another stack of servers to fulfill the user requirements at that time. Also, as in the case of domesticated animals vs cattle, the cost per individual server is vastly reduced due to the economies of scale effect.
Today, most servers are considered disposable. They’re used when they’re most useful and discarded when a fault arises or when upgraded options are available.
How we do things at PureVPN
When we started migrating from pets to cattle, our choices mostly revolved around how our software would be deployed and what kind of an impact would the new infrastructure have on our application’s robustness, security and ability to scale.
PureVPN’s approach to cloud infrastructure revolved around naming conventions, immutable artifacts, and homogeneous server groups. Each application was composed of one or more server groups and all instances within that server group were made to run on an identical version of the application.
This gives us more control and better resource management. Server groups are named according to a convention that helps us organize them into clusters.
From Greek God names to cattle tags: Ares ⇒ ares-prod-api-v1
• Name is the initials of the application or service
• Stack is for environments such as production, staging, and testing
• Detail is to differentiate special-purpose server groups
• Version is a sequential cluster version number
Public clouds make the immutable server pattern widely accessible, which is why we quickly embraced this technology.
Instead of coordinating servers to install the latest application deployment or OS updates, new machine images are built from a base image (the base image usually contains the latest OS patches and foundational elements), upon which is added the version of an application to be deployed.
Whenever we wanted to deploy a new code, we just built a new image.
Every cluster typically has a different version of the application on it, and all instances within the cluster are identical and have the same machine image. Instances within a server group are interchangeable and disposable. Server groups are horizontally scalable to accommodate spikes in traffic. Instances that fail can automatically be replaced with new ones.
In a Nutshell…
Organizations that used to have pet servers are slowly moving their infrastructure towards a more cattle-like approach. And this doesn’t end here because new approaches are coming up and are being used in the cloud infrastructure industry. The cattle infrastructure is slowly moving towards a new model referred to as chickens. And many have even moved ahead of the chicken model and are now running as insects by decoupling their applications into individually executable components.
Running Cattle rather than Pets is a computing infrastructure best practice regardless of the layer of the stack. It provides customers with better service, reduces the time for recovery, and eliminates any lost revenue that occurs from production outages.