Deploying Perl apps on dotCloud


Published on

Perl Mongers presentation on deploying Perl web applications on dotCloud. Examples use a minimal Mojolicious::Lite app.

Published in: Self Improvement, Technology
  • Be the first to comment

No Downloads
Total views
On SlideShare
From Embeds
Number of Embeds
Embeds 0
No embeds

No notes for slide

Deploying Perl apps on dotCloud

  1. 1. dotCloud,use Perl;
  2. 2. 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.
  3. 3. 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.
  4. 4. Services Perl Python Ruby NodeJS Redis MySQL PostgreSQL SSL WebSocket Java PHP MongoDB Static RabbitMQ ApacheSolr SMTP Opa Custom
  5. 5. 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
  6. 6. Custom Stacks● Web/Database ● Select stack – Perl components to match the – PostgreSQL applications needs. – SSL ● As many or as few as – Redis necessary.
  7. 7. 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.
  8. 8. 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.
  9. 9. 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.
  10. 10. 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.
  11. 11. 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.
  12. 12. 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.
  13. 13. 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!
  14. 14. 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.
  15. 15. 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.
  16. 16. 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.
  17. 17. 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
  18. 18. 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
  19. 19. Prepare the configuration files● Makefile.PL PREREQ_PM => { Test::More => 0, YAML => 0, Mojolicious => 3.0, Plack => 0.9974, };
  20. 20. Configuration files● app.psgi $ENV{MOJO_MODE} = production require;● dotcloud.yml www: type: perl
  21. 21. Deploy!$ dotcloud push myapp myapp/– dotcloud command name pathDeployment finished successfully. Yourapplication is available at thefollowing URLswww:
  22. 22. 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.
  23. 23. 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.
  24. 24. A simple directory structureproject_root/ dotcloud.yml app_root/ app.psgi Makefile.PL static/ ...
  25. 25. A more scalable directory structureproject_root/ dotcloud.yml dotcloud.yml database_init.sql www: myapp/ type: perl app.psgi approot: myapp Makefile.PL db: myapp.conf type: mysql lib/ Model/ Controller/ app.psgi log/ public/ $ENV{MOJO_MODE} = production; script/ require script/; t/ templates/
  26. 26. 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.
  28. 28. environment.json simplified● DotCloud::Environment – Easy handling of environment in dotcloud. ● (In case a simple JSON file isnt simple enough.)
  29. 29. Other dotcloud.yml optionswww: type: perl approot: helloperl requirements: config: perl_version: v5.16.x uwsgi_memory_report: true uwsgi_buffer_size: 8192 uwsgi_processes: 4 prebuild: ./ postbuild: ./postbuild.plworker: type: perl-worker …
  30. 30. 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.
  31. 31. The CLI tool$ dotcloud create myapp$ dotcloud create myapp -f live$ dotcloud info myapp.www$ dotcloud push myapp$ dotcloud stats myapp.www$ dotcloud scale myapp db:instances=2$ dotcloud scale myapp www:instances=4$ dotcloud scale myapp www:memory=512M$ dotcloud destroy myapp$ dotcloud logs myapp.www$ dotcloud run myapp.db -- single-command$ dotcloud ssh myapp.worker
  32. 32. 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. ;)
  33. 33. Communications● @dotcloudstatus – Exceptional events and are tweeted out. – Get used to “Scaled applications were unaffected...”● – The same as the tweets.● – A quick overview of cluster status.● $ dotcloud status myapp.www● irc://● – Real (useful) replies within a few hours – No dialog script.●●
  34. 34. 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.
  35. 35. A Working Example● The Perl Regex Tester – – 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:
  36. 36. David Oswald davido@cpan.org
  37. 37. Experiment! Play! $ dotcloud push my_cool_ideaNext month lets look at what you deployed to dotCloud.