What is dotCloud?● Platform as a Service – Computing Platform – Solution Stack – Horizontally and vertically scalable● Sane defaults in a configurable platform.● Rapid deployment – From create to live in a couple of minutes.● Hot-patching – Changes can be pushed with zero-downtime.● Complexity and Reliability management. – So you can sleep at night.
Why use a Cloud platform service?● Developers dont have to pretend to be system administrators.● Clients dont have to maintain an infrastructure or expand the IT department.● Start-ups dont have to waste limited funds on hardware and fiber into their garage.● Quickly and easily scale to meet popular demand.● Reliability, Availability.
dotCloud services● Service types include – Web services (Served by nginx) ● Perl, Python, PHP, Ruby, Java, Opa, NodeJS (sans nginx), and static. – Worker services – Data services ● MySQL, PostgreSQL, MongoDB, redis. – Other services ● Apache Solr, RabbitMQ, SSL, SMTP, WebSocket
Custom Stacks● Web/Database ● Select stack – Perl components to match the – PostgreSQL applications needs. – SSL ● As many or as few as – Redis necessary.
A dotCloud stack...● Mix and match services as you see fit. – Were here to talk about Perl.● Hosted on EC2. – Scaled apps get multiple availability zones.● Stack components fit together like building blocks.● Add or remove components as the application evolves.
A typical Perl stack...● A Perl web service. – Plack sits on nginx. Your framework sits on Plack. ● Catalyst, Dancer, Mojolicious, bare Plack... anything that can ride on Plack.● A database? – MySQL, MongoDB, PostgreSQL, Redis. – Multiple if necessary.● A “Perl Worker”? – Daemons, and long-running processes. – Custom webservers. ● Websocket support.● Maybe an SSL service with custom domain.● Its up to you, and you can change at any time.
Perl services...● Web or worker.● Perl web services spawn four processes. – If a process dies it is re-spawned. – If an EC2 instance goes wonky dotCloud reboots it and restores from backup. – “Scaled applications were not affected...”● Perl worker service is for long-running services that dont need nginx/Plack.
What is Scaling?● Horizontal – Concurrency – Handle more requests. – Redundancy – High availability. – Master/Slave – Database Replication.● Vertical – Memory – Breathing room. – Storage – Persistent data. – Processing – More CPU.
Horizontal Scaling with dotCloud● Horizontal: – Multiple Perl services under the same application ● Multiple EC2 availability zones: Automatic. ● Load balancing: Automatic. ● Failover: Automatic. ● Dedicated cluster. – Multiple Database Services ● Multiple EC2 availability zones. ● Replication: Automatic. ● Failover and re-syncing: Automatic.
Vertical Scaling with dotCloud● Vertical scaling reserves more memory and storage. – Scale memory in 32MB increments. – Storage is allocated as 10x the RAM allotment.● Examples: – A Perl service that needs 256MB to breathe in, and 2GB storage: Scale to 256MB. – A database that needs 4GB storage: Scale to 416MB RAM.● CPU scaling isnt featured at this time.
What does it cost? – Sandbox● Sandbox Applications – FREE. – dotCloud clearly wants to be friendly to developers. ● Non-scaled applications without custom domains are free. ● RAM, availability, and bandwidth are on a “best effort” basis. ● Piggyback SSL is free. ● Develop for free. ● Test for free. ● Deploy and use for free. ● No time limitations. ● No limited introductory periods. ● Even multi-service stacks are free.● PLAY, enjoy!
What does it cost? – Live● When you need.... – Horizontal or vertical scaling. – Reliability and performance guarantees. – Custom domains. – CA-certificate SSL.● $4.32/month per service-instance per 32MB RAM.
Pricing – Example● A Perl web service that needs 64MB RAM: $8.64/month. – Four processes are spawned. An app consuming 16MB deploys in 64MB RAM after four workers spawn.● Horizontally scale that same service to two service-instances for reliability and load balancing: – $17.28.● Add a horizontally scaled (master/slave) database with 640MB storage allocation: – Total cost: $34.56/month.● More breathing room: – Scale Perl to 128MB and database to 1GB storage: $69.12/month.
Scale as needed● Hit by a swarm? – Up-scale to as many as five Perl service-instances (20 total processes). – Higher scaling levels are available by explicit arrangement.● Nobody clicks at night/weekends? – Down-scale during low-volume times.● Usage is measured hourly.● Scaling adjustments are “one liners” with the CLI.● Nearly instant spin-up.
Getting started● Create an account● Download and configure the CLI $ sudo easy_install pip && sudo pip install dotcloud ● Ubuntu required sudo apt-get install python- setuptools first... bleah! ● Windows and MacOS versions also exist. $ dotcloud ● Enter the API key from http://www.dotcloud.com/account/settings
Create an application● Set up a local application directory. $ mkdir myapp $ cd myapp● Well use a Mojolicious “Lite-App”. $ mojo generate lite_app myapp● Plan, program,test, etc...● Initialize the dotCloud repo. $ dotcloud create myapp
Deploy!$ dotcloud push myapp myapp/– dotcloud command name pathDeployment finished successfully. Yourapplication is available at thefollowing URLswww: http://myapp-daoswald.dotcloud.com/
What just happened?● Relevant files were uploaded. – “rsync” “mercurial”, or “git push”. – You do have some control over this process if necessary: ● dotcloud push –all ● .gitignore ● .dotcloudignore● cpanm pulls in all dependencies.● Application is built per Makefile.PL.● A supervisor starts Plack and spawns the workers.● Zero-downtime upgrades.
dotcloud.yml● List all the services. – Give each a unique name.● List dependencies that dont fit Makefile.PL. – cpanm used internally. ● Even pull tarballs by URL and build them out.● List an application root directory (per service) – Useful for apps that reside in a more scalable directory structure.● Set environment variables.● Define prebuild and postbuild actions.
The database connection● dotcloud.yml: www: type: Perl approot: myapp db: type: mysql● environment.json – Readable by the application. – Contains database host, port, login, password info, custom variables, etc. ● Inside my app, I merge its contents into my configuration data-structure. $ dotcloud info myapp.db – View service parameters. $ dotcloud run myapp.db – mysql – Get a mysql> prompt.
Odds and ends● Static content will be served out of static/● nginx.conf: override the default nginx configuration.● Crontabs may be set in the Perl service, in a separate worker service, even in a database service. – Beware of horizontal scaling and crontabs.● Off-site backups scheduled via crontabs.● dotCloud is the first PaaS with WebSocket support. – Mojolicious is also WebSocket friendly.
A sample use-case● Client requires high availability web, and database redundancy: – Perl web service scaled to two 256MB instances. ● Load balancing, automatic failover, separate availability zones. ● 4 processes of 64MB each per service instance. – Enough for Mojolicious, DBIx::Class, Moose, and some breathing room. – Database scaled to two instances of 512MB (5GB storage). ● Replication/syncing, automatic failover, separate availability zones. – A single 64MB Perl worker for cron jobs (backups, etc.)● Cost: $216/month.● A custom domain with SSL certificate, add $21.60/month: total, $237.60. – DotCloud configures a dedicated load balancer instance (since SSL requires at least one IP address per domain, or more accurately, per certificate).● Client and developer each get to sleep at night: Priceless. – Sorry IT department – nothing to see here. ;)
Communications● @dotcloudstatus – Exceptional events and are tweeted out. – Get used to “Scaled applications were unaffected...”● http://status.dotcloud.com – The same as the tweets.● http://platform-status.dotcloud.com – A quick overview of cluster status.● $ dotcloud status myapp.www● irc://irc.freenode.net#dotcloud● email@example.com – Real (useful) replies within a few hours – No dialog script.● http://support.dotcloud.com● http://help.dotcloud.com
Conclusions● Much more than bare EC2.● Supportive of the developer community.● Can-do attitude.● Innovative.● Reliable.● Its easy.● Deploying an application takes minutes.● Hot-patches take seconds, with no downtime.
A Working Example● The Perl Regex Tester – http://retester-daoswald.dotcloud.com – Uses a single dotCloud Perl service and less than 96MB RAM. ● Deployed as a “Sandbox” app. ● Configured for two uwsgi processes (low volume, so conserve memory) ● If deployed “Live”, it would cost abpit $13/month. – A Mojolicious::Lite application. – Includes the application script, a model module, Twitter Bootstrap CSS/JS. – Pulls in many CPAN dependencies (mostly to handle the paranoia of executing user-supplied regexes). – Source on Github: https://github.com/daoswald/retester.git
David Oswald firstname.lastname@example.org email@example.com://www.slideshare.net/daoswald/deploying-perl-apps-on-dotcloud
Experiment! Play! $ dotcloud push my_cool_ideaNext month lets look at what you deployed to dotCloud.