Deploying Highly-Available Architecture with a Pinch of Salt
This is the story of a .NET guy's Python development journey to deploy a medium-sized system to AWS using bleeding edge deployment tools and trying to design for high-availability.
MyNames is a bulk .CO.ZA domain management system designed to be eventually consistent in managing domain name registrations and renewals via a rate-limited external service. We use TeamCity for continuous integration and testing, and Saltstack for deployment.
Saltstack is a Python-based client/server deployment system akin to Chef that targets and deploys our various worker roles via ZeroMQ to a small fleet of EC2 instances.
I will detail the architectural problems we are solving when dealing with a bottle-necked external service and give an overview of Saltstack.
The MyNames Stack
- EC2 workers running Ubuntu 12.04 LTS
- Route53 for customers' DNS
- ELB for load balancing API requests
- SQS for queuing synchronisation tasks
- RDS for really expensive MySQL database hosting
- Twisted Web for RESTful API calls
- Flask for more RESTful API calls
- SQLAlchemy as an ORM, based on Hibernate
- Alembic for database migrations
- TeamCity for automated continuous integration and testing
- Saltstack for command-and-control targeting and deployment
- Nginx for serving static front-end HTML
- CoffeeScript compiles down to JS
- AngularJS as front-end framework
- Restangular to talk to our API
- Bootstrap 3 for CSS structure