SlideShare a Scribd company logo
REAL WORLD ELIXIR
DEPLOYMENT
Empire City Elixir | 2016-05-21
pete gamache | pete@gamache.org | @gamache
Hi!
Summary
• Elixir and Erlang make a rock-solid platform
• Erlang excels at long-lived clusters
• "Modern" deployment practices do not take
advantage of Erlang core features
• Deploying Elixir can be painful, but if you are
taking advantage of platform, can be worth it
Let's talk about an
ideal platform
Platform Desirables
• Horizontal scalability
• Fault tolerance
• Zero-downtime upgrades and rollbacks
• Stability and performance
• Ease of administration and maintenance
Let's talk about an
average platform
Devops 2010
• Fleets of ephemeral, stateless servers
• Load-balancer or shared work queue
• All message passing happens externally
• All state held externally
Devops 2010, cont.
• Upgrade: Start new servers, add to pool,
remove old servers from pool, kill old servers
• Rollback: either same as above, or hot/cold
a.k.a. blue/green deployment
• Many moving parts -- provisioning, load
balancer, connection draining
Devops 2016
• Mostly like that
• Something something Docker
• Heavily automated
• Far-out stuff: virtualized resource pools, e.g.
Mesos
Desirables Achieved?
• Horizontal scalability and fault tolerance, check
• Zero-downtime upgrades and rollbacks, mostly
• Stability and performance, yeah sure
• Ease of maintenance, not so sure
Let's talk about the
Erlang platform
Things Erlang Does
• Extreme fault tolerance
• Simple scalability to dozens of server nodes
• Zero-downtime upgrades/rollbacks (and fast)
• Stability and performance
Things Elixir Helps With
• Ease of administration and maintenance
Erlang Clustering
• Designed for long-lived server clusters
• Treat OTP apps like microservices, and you get
a free resource pool
• Postpone sharding
• Postpone outboard message passing
Erlang vs The World
• Erlang doesn't look like Devops 2010, but
delivers much of Devops 2016
• Go with the flow of the platform
• Startups love time-to-market advantages
Real Talk
• Don't use Elixir in prod just because it's shiny
• Evaluate advantages and disadvantages
• If Elixir and Erlang have the features to get you to
market faster or better, consider it
• Also consider Erlang + Devops 2016 if that works
for your use case
• Nothing's free in the long run -- scale hurts
Deployment
• The sum of tools and topology
• Topology is a big topic, so here I will
abbreviate to "at least two of everything"
• Now let's discuss deployment tools on the
Erlang/Elixir platform
In the Beginning...
Source: http://learnyousomeerlang.com/relups
exrm
• Elixir Release Manager
• Handles most of steps 1-25 in previous slide
• Generates Erlang releases
• Then you like, put them on servers or
something? lol
edeliver
• Based on deliver, a bash-based deploy tool
• Works with rebar, mix, relx, exrm
• Handles builds, deployment, versioning
• Actively developed
• https://github.com/boldpoker/edeliver
How to edeliver
• Add edeliver as a dependency/app in mix.exs
• Create and configure .deliver/config file
• Set up servers, logins, dirs, and configs
• Use git tags to mark mix.exs versions
• Run mix tasks, make money
Real World Elixir Deployment
Real World Elixir Deployment
Real World Elixir Deployment
edeliver Directories
• Don't create $BUILD_AT, $TEST_AT,
$DELIVER_TO yourself
• config/*.secret.exs, etc. go in $CONFIG_AT
• *.vm.args files handle node names, clustering
• Normal Unix permissions rules apply
How to Clustering
• name and setcookie params in vm.args
• sync_nodes_mandatory/sync_nodes_optional
in :kernel config
• http://erlang.org/doc/design_principles/
distributed_applications.html
Real World Elixir Deployment
Real World Elixir Deployment
edeliver and Versions
• edeliver has some new features around auto-
versioning
• I do not recommend using them (yet)
• Just stick to git tags named exactly like the
mix.env version (i.e., "0.0.1" not "v0.0.1")
Let's take edeliver

out for a spin
Build a release
Real World Elixir Deployment
Deploy the first
release
Real World Elixir Deployment
Real World Elixir Deployment
Build a hot upgrade
Real World Elixir Deployment
Real World Elixir Deployment
Real World Elixir Deployment
Deploy a hot upgrade
Real World Elixir Deployment
Hot upgrades
are cool
Real World Elixir Deployment
Real World Elixir Deployment
But they don't always work
• Sometimes it's a matter of hand-editing appups
and relups
• Sometimes packages are not in a position to be
hot-upgraded (e.g., Cowboy)
• Sometimes f^@% you
So, What Now?
• Rolling upgrades are your best fallback
• Necessitates more than one server
• Write your code so that function signatures
don't change
• Above technique is good for DB migrations too!
Rolling Upgrade
• Build release
• Deploy release without --start-deploy
• Execute on each server:
cd $DELIVER_TO/your_app_name

releases/X.Y.Z/your_app_name.sh restart
Rollbacks
• Rollbacks are just upgrades
• If you could upgrade version X to Y, you can
rollback Y to X just as quickly
Real World Elixir Deployment
Database Migrations
• edeliver now has a migration feature
• http://blog.plataformatec.com.br/2016/04/
running-migration-in-an-exrm-release/
• I usually just log into the build server and:
cd $BUILD_AT/prod

MIX_ENV=prod mix ecto.migrate
Gotcha!
Gotcha! Ulimit
• a.k.a. EFILE, Too many open files
• Erlang rules at using file descriptors
• It rules so hard that Unix thinks something went
wrong and must be contained
• Be sure and set ulimit very high/infinite
• Set -env ERL_MAX_PORTS very high in vm.args
Gotcha! Exceptions
• Too many exceptions too fast, and the Erlang
VM will ragequit
• Band-aid Solution 1: -heart in vm.args
• Band-aid Solution 2: bin/myapp start in cron
• Real Solution: fix your shit
Gotcha! Segfaults
• The Erlang VM is not supposed to segfault
• How adorable
• Same instructions as previous slide
Gotcha! Cached Release
• Example: you build an upgrade from X to Z
• You then build an upgrade from Y to Z
• If you had copied X-to-Z to your servers, you
can't perform the upgrade Y-to-Z
• Solution: Blow away $DELIVER_TO/myapp/
releases/Z before building/deploying Y-to-Z
Gotcha! Websockets
• Unexplained client 400s can be due to load
balancer issues
• Amazon ELB: use "TCP"/"SSL" settings, not
"HTTP"/"HTTPS"
• Nginx:

proxy_set_header Upgrade $http_upgrade;

proxy_set_header Connection "upgrade";
Gotcha! Git Problems
Finding a Git Solution
in edeliver/libexec/erlang
Real World Elixir Deployment
Real World Elixir Deployment
Another Summary
• Erlang and Elixir deployment shouldn't look like
less-powerful platforms'
• edeliver automates most of the deployment
process, mostly. Let's say 90% of the time
• Taken next to the platform's advantages, the
gotchas aren't so bad
• 2016 is early in the Elixir Deployment timeline
Questions?
Thanks!
https://twitter.com/gamache
https://engineering.appcues.com
http://www.slideshare.net/petegamache/real-world-elixir-deployment
Ad

More Related Content

What's hot (20)

Akka.net versus microsoft orleans
Akka.net versus microsoft orleansAkka.net versus microsoft orleans
Akka.net versus microsoft orleans
Bill Tulloch
 
Open stack and_vagrant-os-meetup-2015
Open stack and_vagrant-os-meetup-2015Open stack and_vagrant-os-meetup-2015
Open stack and_vagrant-os-meetup-2015
yfauser
 
Learning Elixir as a Rubyist
Learning Elixir as a RubyistLearning Elixir as a Rubyist
Learning Elixir as a Rubyist
Alex Kira
 
Debugging ansible modules
Debugging ansible modulesDebugging ansible modules
Debugging ansible modules
aleonhardt
 
NCUG 2019: Spring forward: an introduction to Spring boot and Thymeleaf for (...
NCUG 2019: Spring forward: an introduction to Spring boot and Thymeleaf for (...NCUG 2019: Spring forward: an introduction to Spring boot and Thymeleaf for (...
NCUG 2019: Spring forward: an introduction to Spring boot and Thymeleaf for (...
Frank van der Linden
 
Introduction to Phoenix Web Framework
Introduction to Phoenix Web FrameworkIntroduction to Phoenix Web Framework
Introduction to Phoenix Web Framework
Riza Fahmi
 
Ansible Best Practices - July 30
Ansible Best Practices - July 30Ansible Best Practices - July 30
Ansible Best Practices - July 30
tylerturk
 
ElasticBeanstalk で新規事業を爆速ローンチする
ElasticBeanstalk で新規事業を爆速ローンチするElasticBeanstalk で新規事業を爆速ローンチする
ElasticBeanstalk で新規事業を爆速ローンチする
Ryo Shibayama
 
Amazon inspector で自動セキュリティ診断
Amazon inspector で自動セキュリティ診断Amazon inspector で自動セキュリティ診断
Amazon inspector で自動セキュリティ診断
Ryo Shibayama
 
App::RemoteCommand
App::RemoteCommandApp::RemoteCommand
App::RemoteCommand
Shoichi Kaji
 
Presentation about Overthere for J-Fall 2011
Presentation about Overthere for J-Fall 2011Presentation about Overthere for J-Fall 2011
Presentation about Overthere for J-Fall 2011
Vincent Partington
 
Working Well Together: How to Keep High-end Game Development Teams Productive
Working Well Together: How to Keep High-end Game Development Teams ProductiveWorking Well Together: How to Keep High-end Game Development Teams Productive
Working Well Together: How to Keep High-end Game Development Teams Productive
Perforce
 
When Tools Attack
When Tools AttackWhen Tools Attack
When Tools Attack
Perforce
 
Phoenix Framework
Phoenix FrameworkPhoenix Framework
Phoenix Framework
Pivorak MeetUp
 
Ansible training | redhat Ansible 2.5 Corporate course - GOT
Ansible training | redhat Ansible 2.5 Corporate course - GOTAnsible training | redhat Ansible 2.5 Corporate course - GOT
Ansible training | redhat Ansible 2.5 Corporate course - GOT
keerthi124
 
Introduction to Ansible - Jan 28 - Austin MeetUp
Introduction to Ansible - Jan 28 - Austin MeetUpIntroduction to Ansible - Jan 28 - Austin MeetUp
Introduction to Ansible - Jan 28 - Austin MeetUp
tylerturk
 
Symfony Live San Francisco 2017 - Symfony @ OpenSky
Symfony Live San Francisco 2017 - Symfony @ OpenSkySymfony Live San Francisco 2017 - Symfony @ OpenSky
Symfony Live San Francisco 2017 - Symfony @ OpenSky
Pablo Godel
 
The Actor Model - Towards Better Concurrency
The Actor Model - Towards Better ConcurrencyThe Actor Model - Towards Better Concurrency
The Actor Model - Towards Better Concurrency
Dror Bereznitsky
 
Nice performance using Sf2 cache wrapping Sf1 application
Nice performance using Sf2 cache wrapping Sf1 applicationNice performance using Sf2 cache wrapping Sf1 application
Nice performance using Sf2 cache wrapping Sf1 application
Marc Weistroff
 
Elixir intro
Elixir introElixir intro
Elixir intro
Anton Mishchuk
 
Akka.net versus microsoft orleans
Akka.net versus microsoft orleansAkka.net versus microsoft orleans
Akka.net versus microsoft orleans
Bill Tulloch
 
Open stack and_vagrant-os-meetup-2015
Open stack and_vagrant-os-meetup-2015Open stack and_vagrant-os-meetup-2015
Open stack and_vagrant-os-meetup-2015
yfauser
 
Learning Elixir as a Rubyist
Learning Elixir as a RubyistLearning Elixir as a Rubyist
Learning Elixir as a Rubyist
Alex Kira
 
Debugging ansible modules
Debugging ansible modulesDebugging ansible modules
Debugging ansible modules
aleonhardt
 
NCUG 2019: Spring forward: an introduction to Spring boot and Thymeleaf for (...
NCUG 2019: Spring forward: an introduction to Spring boot and Thymeleaf for (...NCUG 2019: Spring forward: an introduction to Spring boot and Thymeleaf for (...
NCUG 2019: Spring forward: an introduction to Spring boot and Thymeleaf for (...
Frank van der Linden
 
Introduction to Phoenix Web Framework
Introduction to Phoenix Web FrameworkIntroduction to Phoenix Web Framework
Introduction to Phoenix Web Framework
Riza Fahmi
 
Ansible Best Practices - July 30
Ansible Best Practices - July 30Ansible Best Practices - July 30
Ansible Best Practices - July 30
tylerturk
 
ElasticBeanstalk で新規事業を爆速ローンチする
ElasticBeanstalk で新規事業を爆速ローンチするElasticBeanstalk で新規事業を爆速ローンチする
ElasticBeanstalk で新規事業を爆速ローンチする
Ryo Shibayama
 
Amazon inspector で自動セキュリティ診断
Amazon inspector で自動セキュリティ診断Amazon inspector で自動セキュリティ診断
Amazon inspector で自動セキュリティ診断
Ryo Shibayama
 
App::RemoteCommand
App::RemoteCommandApp::RemoteCommand
App::RemoteCommand
Shoichi Kaji
 
Presentation about Overthere for J-Fall 2011
Presentation about Overthere for J-Fall 2011Presentation about Overthere for J-Fall 2011
Presentation about Overthere for J-Fall 2011
Vincent Partington
 
Working Well Together: How to Keep High-end Game Development Teams Productive
Working Well Together: How to Keep High-end Game Development Teams ProductiveWorking Well Together: How to Keep High-end Game Development Teams Productive
Working Well Together: How to Keep High-end Game Development Teams Productive
Perforce
 
When Tools Attack
When Tools AttackWhen Tools Attack
When Tools Attack
Perforce
 
Ansible training | redhat Ansible 2.5 Corporate course - GOT
Ansible training | redhat Ansible 2.5 Corporate course - GOTAnsible training | redhat Ansible 2.5 Corporate course - GOT
Ansible training | redhat Ansible 2.5 Corporate course - GOT
keerthi124
 
Introduction to Ansible - Jan 28 - Austin MeetUp
Introduction to Ansible - Jan 28 - Austin MeetUpIntroduction to Ansible - Jan 28 - Austin MeetUp
Introduction to Ansible - Jan 28 - Austin MeetUp
tylerturk
 
Symfony Live San Francisco 2017 - Symfony @ OpenSky
Symfony Live San Francisco 2017 - Symfony @ OpenSkySymfony Live San Francisco 2017 - Symfony @ OpenSky
Symfony Live San Francisco 2017 - Symfony @ OpenSky
Pablo Godel
 
The Actor Model - Towards Better Concurrency
The Actor Model - Towards Better ConcurrencyThe Actor Model - Towards Better Concurrency
The Actor Model - Towards Better Concurrency
Dror Bereznitsky
 
Nice performance using Sf2 cache wrapping Sf1 application
Nice performance using Sf2 cache wrapping Sf1 applicationNice performance using Sf2 cache wrapping Sf1 application
Nice performance using Sf2 cache wrapping Sf1 application
Marc Weistroff
 

Viewers also liked (20)

Bottleneck in Elixir Application - Alexey Osipenko
 Bottleneck in Elixir Application - Alexey Osipenko  Bottleneck in Elixir Application - Alexey Osipenko
Bottleneck in Elixir Application - Alexey Osipenko
Elixir Club
 
Build Your Own Real-Time Web Service with Elixir Phoenix
Build Your Own Real-Time Web Service with Elixir PhoenixBuild Your Own Real-Time Web Service with Elixir Phoenix
Build Your Own Real-Time Web Service with Elixir Phoenix
Chi-chi Ekweozor
 
Flowex: Flow-Based Programming with Elixir GenStage - Anton Mishchuk
Flowex: Flow-Based Programming with Elixir GenStage - Anton MishchukFlowex: Flow-Based Programming with Elixir GenStage - Anton Mishchuk
Flowex: Flow-Based Programming with Elixir GenStage - Anton Mishchuk
Elixir Club
 
Manchester Social Media Surgery Events: an Introduction
Manchester Social Media Surgery Events: an IntroductionManchester Social Media Surgery Events: an Introduction
Manchester Social Media Surgery Events: an Introduction
Chi-chi Ekweozor
 
Talking to your organization about Elixir
Talking to your organization about ElixirTalking to your organization about Elixir
Talking to your organization about Elixir
Brandon Richey
 
ELIXIR Webinar: Introducing TeSS
ELIXIR Webinar: Introducing TeSSELIXIR Webinar: Introducing TeSS
ELIXIR Webinar: Introducing TeSS
Niall Beard
 
Spark as a distributed Scala
Spark as a distributed ScalaSpark as a distributed Scala
Spark as a distributed Scala
Alex Fruzenshtein
 
Big Data eBook
Big Data eBookBig Data eBook
Big Data eBook
Cece Salomon-Lee
 
WEB MINING: PATTERN DISCOVERY ON THE WORLD WIDE WEB - 2011
WEB MINING: PATTERN DISCOVERY ON THE WORLD WIDE WEB - 2011WEB MINING: PATTERN DISCOVERY ON THE WORLD WIDE WEB - 2011
WEB MINING: PATTERN DISCOVERY ON THE WORLD WIDE WEB - 2011
Mustafa TURAN
 
Magic Clusters and Where to Find Them 2.0 - Eugene Pirogov
Magic Clusters and Where to Find Them 2.0 - Eugene Pirogov Magic Clusters and Where to Find Them 2.0 - Eugene Pirogov
Magic Clusters and Where to Find Them 2.0 - Eugene Pirogov
Elixir Club
 
나프다 웨비너 1604: Elixir와 함수형 프로그래밍을 이용한 웹 개발
나프다 웨비너 1604: Elixir와 함수형 프로그래밍을 이용한 웹 개발나프다 웨비너 1604: Elixir와 함수형 프로그래밍을 이용한 웹 개발
나프다 웨비너 1604: Elixir와 함수형 프로그래밍을 이용한 웹 개발
Changwook Park
 
Control flow in_elixir
Control flow in_elixirControl flow in_elixir
Control flow in_elixir
Anna Neyzberg
 
Spring IO for startups
Spring IO for startupsSpring IO for startups
Spring IO for startups
Alex Fruzenshtein
 
Phoenix: Inflame the Web - Alex Troush
Phoenix: Inflame the Web - Alex TroushPhoenix: Inflame the Web - Alex Troush
Phoenix: Inflame the Web - Alex Troush
Elixir Club
 
GenStage and Flow - Jose Valim
GenStage and Flow - Jose Valim GenStage and Flow - Jose Valim
GenStage and Flow - Jose Valim
Elixir Club
 
Distributed system in Elixir
Distributed system in ElixirDistributed system in Elixir
Distributed system in Elixir
Changwook Park
 
Elixir & Phoenix 推坑
Elixir & Phoenix 推坑Elixir & Phoenix 推坑
Elixir & Phoenix 推坑
Chao-Ju Huang
 
Proteome array - antibody based proteome arrays
Proteome array - antibody based proteome arrays Proteome array - antibody based proteome arrays
Proteome array - antibody based proteome arrays
saraswathi rajakumar
 
Anatomy of an elixir process and Actor Communication
Anatomy of an elixir process and Actor CommunicationAnatomy of an elixir process and Actor Communication
Anatomy of an elixir process and Actor Communication
Mustafa TURAN
 
Play vs Rails
Play vs RailsPlay vs Rails
Play vs Rails
Daniel Cukier
 
Bottleneck in Elixir Application - Alexey Osipenko
 Bottleneck in Elixir Application - Alexey Osipenko  Bottleneck in Elixir Application - Alexey Osipenko
Bottleneck in Elixir Application - Alexey Osipenko
Elixir Club
 
Build Your Own Real-Time Web Service with Elixir Phoenix
Build Your Own Real-Time Web Service with Elixir PhoenixBuild Your Own Real-Time Web Service with Elixir Phoenix
Build Your Own Real-Time Web Service with Elixir Phoenix
Chi-chi Ekweozor
 
Flowex: Flow-Based Programming with Elixir GenStage - Anton Mishchuk
Flowex: Flow-Based Programming with Elixir GenStage - Anton MishchukFlowex: Flow-Based Programming with Elixir GenStage - Anton Mishchuk
Flowex: Flow-Based Programming with Elixir GenStage - Anton Mishchuk
Elixir Club
 
Manchester Social Media Surgery Events: an Introduction
Manchester Social Media Surgery Events: an IntroductionManchester Social Media Surgery Events: an Introduction
Manchester Social Media Surgery Events: an Introduction
Chi-chi Ekweozor
 
Talking to your organization about Elixir
Talking to your organization about ElixirTalking to your organization about Elixir
Talking to your organization about Elixir
Brandon Richey
 
ELIXIR Webinar: Introducing TeSS
ELIXIR Webinar: Introducing TeSSELIXIR Webinar: Introducing TeSS
ELIXIR Webinar: Introducing TeSS
Niall Beard
 
Spark as a distributed Scala
Spark as a distributed ScalaSpark as a distributed Scala
Spark as a distributed Scala
Alex Fruzenshtein
 
WEB MINING: PATTERN DISCOVERY ON THE WORLD WIDE WEB - 2011
WEB MINING: PATTERN DISCOVERY ON THE WORLD WIDE WEB - 2011WEB MINING: PATTERN DISCOVERY ON THE WORLD WIDE WEB - 2011
WEB MINING: PATTERN DISCOVERY ON THE WORLD WIDE WEB - 2011
Mustafa TURAN
 
Magic Clusters and Where to Find Them 2.0 - Eugene Pirogov
Magic Clusters and Where to Find Them 2.0 - Eugene Pirogov Magic Clusters and Where to Find Them 2.0 - Eugene Pirogov
Magic Clusters and Where to Find Them 2.0 - Eugene Pirogov
Elixir Club
 
나프다 웨비너 1604: Elixir와 함수형 프로그래밍을 이용한 웹 개발
나프다 웨비너 1604: Elixir와 함수형 프로그래밍을 이용한 웹 개발나프다 웨비너 1604: Elixir와 함수형 프로그래밍을 이용한 웹 개발
나프다 웨비너 1604: Elixir와 함수형 프로그래밍을 이용한 웹 개발
Changwook Park
 
Control flow in_elixir
Control flow in_elixirControl flow in_elixir
Control flow in_elixir
Anna Neyzberg
 
Phoenix: Inflame the Web - Alex Troush
Phoenix: Inflame the Web - Alex TroushPhoenix: Inflame the Web - Alex Troush
Phoenix: Inflame the Web - Alex Troush
Elixir Club
 
GenStage and Flow - Jose Valim
GenStage and Flow - Jose Valim GenStage and Flow - Jose Valim
GenStage and Flow - Jose Valim
Elixir Club
 
Distributed system in Elixir
Distributed system in ElixirDistributed system in Elixir
Distributed system in Elixir
Changwook Park
 
Elixir & Phoenix 推坑
Elixir & Phoenix 推坑Elixir & Phoenix 推坑
Elixir & Phoenix 推坑
Chao-Ju Huang
 
Proteome array - antibody based proteome arrays
Proteome array - antibody based proteome arrays Proteome array - antibody based proteome arrays
Proteome array - antibody based proteome arrays
saraswathi rajakumar
 
Anatomy of an elixir process and Actor Communication
Anatomy of an elixir process and Actor CommunicationAnatomy of an elixir process and Actor Communication
Anatomy of an elixir process and Actor Communication
Mustafa TURAN
 
Ad

Similar to Real World Elixir Deployment (20)

What we talk about when we talk about DevOps
What we talk about when we talk about DevOpsWhat we talk about when we talk about DevOps
What we talk about when we talk about DevOps
Ricard Clau
 
Build software like a bag of marbles, not a castle of LEGO®
Build software like a bag of marbles, not a castle of LEGO®Build software like a bag of marbles, not a castle of LEGO®
Build software like a bag of marbles, not a castle of LEGO®
Hannes Lowette
 
Introduction to Docker
Introduction to DockerIntroduction to Docker
Introduction to Docker
Alan Forbes
 
Journey to Docker Production: Evolving Your Infrastructure and Processes - Br...
Journey to Docker Production: Evolving Your Infrastructure and Processes - Br...Journey to Docker Production: Evolving Your Infrastructure and Processes - Br...
Journey to Docker Production: Evolving Your Infrastructure and Processes - Br...
Docker, Inc.
 
Build software like a bag of marbles, not a castle of LEGO®
Build software like a bag of marbles, not a castle of LEGO®Build software like a bag of marbles, not a castle of LEGO®
Build software like a bag of marbles, not a castle of LEGO®
Hannes Lowette
 
eZ Publish 5: from zero to automated deployment (and no regressions!) in one ...
eZ Publish 5: from zero to automated deployment (and no regressions!) in one ...eZ Publish 5: from zero to automated deployment (and no regressions!) in one ...
eZ Publish 5: from zero to automated deployment (and no regressions!) in one ...
Gaetano Giunta
 
Stackato
StackatoStackato
Stackato
Jonas Brømsø
 
C# Async/Await Explained
C# Async/Await ExplainedC# Async/Await Explained
C# Async/Await Explained
Jeremy Likness
 
Eclipse OMR: a modern, open-source toolkit for building language runtimes
Eclipse OMR: a modern, open-source toolkit for building language runtimesEclipse OMR: a modern, open-source toolkit for building language runtimes
Eclipse OMR: a modern, open-source toolkit for building language runtimes
Dev_Events
 
Managing ejabberd Platforms with Docker - ejabberd Workshop #1
Managing ejabberd Platforms with Docker - ejabberd Workshop #1Managing ejabberd Platforms with Docker - ejabberd Workshop #1
Managing ejabberd Platforms with Docker - ejabberd Workshop #1
Mickaël Rémond
 
9: OllyDbg
9: OllyDbg9: OllyDbg
9: OllyDbg
Sam Bowne
 
An introduction to configuring Domino for Docker
An introduction to configuring Domino for DockerAn introduction to configuring Domino for Docker
An introduction to configuring Domino for Docker
Gabriella Davis
 
Achieving Agility with Code Repositories
Achieving Agility with Code RepositoriesAchieving Agility with Code Repositories
Achieving Agility with Code Repositories
Scrum User Group South Africa
 
Using Apache Camel as AKKA
Using Apache Camel as AKKAUsing Apache Camel as AKKA
Using Apache Camel as AKKA
Johan Edstrom
 
Working With Concurrency In Java 8
Working With Concurrency In Java 8Working With Concurrency In Java 8
Working With Concurrency In Java 8
Heartin Jacob
 
Handling 1 Billion Requests/hr with Minimal Latency Using Docker
Handling 1 Billion Requests/hr with Minimal Latency Using DockerHandling 1 Billion Requests/hr with Minimal Latency Using Docker
Handling 1 Billion Requests/hr with Minimal Latency Using Docker
Matomy
 
August Webinar - Water Cooler Talks: A Look into a Developer's Workbench
August Webinar - Water Cooler Talks: A Look into a Developer's WorkbenchAugust Webinar - Water Cooler Talks: A Look into a Developer's Workbench
August Webinar - Water Cooler Talks: A Look into a Developer's Workbench
Howard Greenberg
 
CNIT 126 Ch 9: OllyDbg
CNIT 126 Ch 9: OllyDbgCNIT 126 Ch 9: OllyDbg
CNIT 126 Ch 9: OllyDbg
Sam Bowne
 
Stackato v6
Stackato v6Stackato v6
Stackato v6
Jonas Brømsø
 
DSpace UI prototype dsember
DSpace UI prototype dsemberDSpace UI prototype dsember
DSpace UI prototype dsember
Bram Luyten
 
What we talk about when we talk about DevOps
What we talk about when we talk about DevOpsWhat we talk about when we talk about DevOps
What we talk about when we talk about DevOps
Ricard Clau
 
Build software like a bag of marbles, not a castle of LEGO®
Build software like a bag of marbles, not a castle of LEGO®Build software like a bag of marbles, not a castle of LEGO®
Build software like a bag of marbles, not a castle of LEGO®
Hannes Lowette
 
Introduction to Docker
Introduction to DockerIntroduction to Docker
Introduction to Docker
Alan Forbes
 
Journey to Docker Production: Evolving Your Infrastructure and Processes - Br...
Journey to Docker Production: Evolving Your Infrastructure and Processes - Br...Journey to Docker Production: Evolving Your Infrastructure and Processes - Br...
Journey to Docker Production: Evolving Your Infrastructure and Processes - Br...
Docker, Inc.
 
Build software like a bag of marbles, not a castle of LEGO®
Build software like a bag of marbles, not a castle of LEGO®Build software like a bag of marbles, not a castle of LEGO®
Build software like a bag of marbles, not a castle of LEGO®
Hannes Lowette
 
eZ Publish 5: from zero to automated deployment (and no regressions!) in one ...
eZ Publish 5: from zero to automated deployment (and no regressions!) in one ...eZ Publish 5: from zero to automated deployment (and no regressions!) in one ...
eZ Publish 5: from zero to automated deployment (and no regressions!) in one ...
Gaetano Giunta
 
C# Async/Await Explained
C# Async/Await ExplainedC# Async/Await Explained
C# Async/Await Explained
Jeremy Likness
 
Eclipse OMR: a modern, open-source toolkit for building language runtimes
Eclipse OMR: a modern, open-source toolkit for building language runtimesEclipse OMR: a modern, open-source toolkit for building language runtimes
Eclipse OMR: a modern, open-source toolkit for building language runtimes
Dev_Events
 
Managing ejabberd Platforms with Docker - ejabberd Workshop #1
Managing ejabberd Platforms with Docker - ejabberd Workshop #1Managing ejabberd Platforms with Docker - ejabberd Workshop #1
Managing ejabberd Platforms with Docker - ejabberd Workshop #1
Mickaël Rémond
 
An introduction to configuring Domino for Docker
An introduction to configuring Domino for DockerAn introduction to configuring Domino for Docker
An introduction to configuring Domino for Docker
Gabriella Davis
 
Using Apache Camel as AKKA
Using Apache Camel as AKKAUsing Apache Camel as AKKA
Using Apache Camel as AKKA
Johan Edstrom
 
Working With Concurrency In Java 8
Working With Concurrency In Java 8Working With Concurrency In Java 8
Working With Concurrency In Java 8
Heartin Jacob
 
Handling 1 Billion Requests/hr with Minimal Latency Using Docker
Handling 1 Billion Requests/hr with Minimal Latency Using DockerHandling 1 Billion Requests/hr with Minimal Latency Using Docker
Handling 1 Billion Requests/hr with Minimal Latency Using Docker
Matomy
 
August Webinar - Water Cooler Talks: A Look into a Developer's Workbench
August Webinar - Water Cooler Talks: A Look into a Developer's WorkbenchAugust Webinar - Water Cooler Talks: A Look into a Developer's Workbench
August Webinar - Water Cooler Talks: A Look into a Developer's Workbench
Howard Greenberg
 
CNIT 126 Ch 9: OllyDbg
CNIT 126 Ch 9: OllyDbgCNIT 126 Ch 9: OllyDbg
CNIT 126 Ch 9: OllyDbg
Sam Bowne
 
DSpace UI prototype dsember
DSpace UI prototype dsemberDSpace UI prototype dsember
DSpace UI prototype dsember
Bram Luyten
 
Ad

Recently uploaded (20)

Adobe Illustrator Crack FREE Download 2025 Latest Version
Adobe Illustrator Crack FREE Download 2025 Latest VersionAdobe Illustrator Crack FREE Download 2025 Latest Version
Adobe Illustrator Crack FREE Download 2025 Latest Version
kashifyounis067
 
Explaining GitHub Actions Failures with Large Language Models Challenges, In...
Explaining GitHub Actions Failures with Large Language Models Challenges, In...Explaining GitHub Actions Failures with Large Language Models Challenges, In...
Explaining GitHub Actions Failures with Large Language Models Challenges, In...
ssuserb14185
 
How to Optimize Your AWS Environment for Improved Cloud Performance
How to Optimize Your AWS Environment for Improved Cloud PerformanceHow to Optimize Your AWS Environment for Improved Cloud Performance
How to Optimize Your AWS Environment for Improved Cloud Performance
ThousandEyes
 
Adobe Lightroom Classic Crack FREE Latest link 2025
Adobe Lightroom Classic Crack FREE Latest link 2025Adobe Lightroom Classic Crack FREE Latest link 2025
Adobe Lightroom Classic Crack FREE Latest link 2025
kashifyounis067
 
Proactive Vulnerability Detection in Source Code Using Graph Neural Networks:...
Proactive Vulnerability Detection in Source Code Using Graph Neural Networks:...Proactive Vulnerability Detection in Source Code Using Graph Neural Networks:...
Proactive Vulnerability Detection in Source Code Using Graph Neural Networks:...
Ranjan Baisak
 
Designing AI-Powered APIs on Azure: Best Practices& Considerations
Designing AI-Powered APIs on Azure: Best Practices& ConsiderationsDesigning AI-Powered APIs on Azure: Best Practices& Considerations
Designing AI-Powered APIs on Azure: Best Practices& Considerations
Dinusha Kumarasiri
 
Top 10 Client Portal Software Solutions for 2025.docx
Top 10 Client Portal Software Solutions for 2025.docxTop 10 Client Portal Software Solutions for 2025.docx
Top 10 Client Portal Software Solutions for 2025.docx
Portli
 
Interactive odoo dashboards for sales, CRM , Inventory, Invoice, Purchase, Pr...
Interactive odoo dashboards for sales, CRM , Inventory, Invoice, Purchase, Pr...Interactive odoo dashboards for sales, CRM , Inventory, Invoice, Purchase, Pr...
Interactive odoo dashboards for sales, CRM , Inventory, Invoice, Purchase, Pr...
AxisTechnolabs
 
Secure Test Infrastructure: The Backbone of Trustworthy Software Development
Secure Test Infrastructure: The Backbone of Trustworthy Software DevelopmentSecure Test Infrastructure: The Backbone of Trustworthy Software Development
Secure Test Infrastructure: The Backbone of Trustworthy Software Development
Shubham Joshi
 
TestMigrationsInPy: A Dataset of Test Migrations from Unittest to Pytest (MSR...
TestMigrationsInPy: A Dataset of Test Migrations from Unittest to Pytest (MSR...TestMigrationsInPy: A Dataset of Test Migrations from Unittest to Pytest (MSR...
TestMigrationsInPy: A Dataset of Test Migrations from Unittest to Pytest (MSR...
Andre Hora
 
Salesforce Data Cloud- Hyperscale data platform, built for Salesforce.
Salesforce Data Cloud- Hyperscale data platform, built for Salesforce.Salesforce Data Cloud- Hyperscale data platform, built for Salesforce.
Salesforce Data Cloud- Hyperscale data platform, built for Salesforce.
Dele Amefo
 
Exploring Code Comprehension in Scientific Programming: Preliminary Insight...
Exploring Code Comprehension  in Scientific Programming:  Preliminary Insight...Exploring Code Comprehension  in Scientific Programming:  Preliminary Insight...
Exploring Code Comprehension in Scientific Programming: Preliminary Insight...
University of Hawai‘i at Mānoa
 
Exploring Wayland: A Modern Display Server for the Future
Exploring Wayland: A Modern Display Server for the FutureExploring Wayland: A Modern Display Server for the Future
Exploring Wayland: A Modern Display Server for the Future
ICS
 
Download Wondershare Filmora Crack [2025] With Latest
Download Wondershare Filmora Crack [2025] With LatestDownload Wondershare Filmora Crack [2025] With Latest
Download Wondershare Filmora Crack [2025] With Latest
tahirabibi60507
 
Who Watches the Watchmen (SciFiDevCon 2025)
Who Watches the Watchmen (SciFiDevCon 2025)Who Watches the Watchmen (SciFiDevCon 2025)
Who Watches the Watchmen (SciFiDevCon 2025)
Allon Mureinik
 
The Significance of Hardware in Information Systems.pdf
The Significance of Hardware in Information Systems.pdfThe Significance of Hardware in Information Systems.pdf
The Significance of Hardware in Information Systems.pdf
drewplanas10
 
Why Orangescrum Is a Game Changer for Construction Companies in 2025
Why Orangescrum Is a Game Changer for Construction Companies in 2025Why Orangescrum Is a Game Changer for Construction Companies in 2025
Why Orangescrum Is a Game Changer for Construction Companies in 2025
Orangescrum
 
FL Studio Producer Edition Crack 2025 Full Version
FL Studio Producer Edition Crack 2025 Full VersionFL Studio Producer Edition Crack 2025 Full Version
FL Studio Producer Edition Crack 2025 Full Version
tahirabibi60507
 
Exceptional Behaviors: How Frequently Are They Tested? (AST 2025)
Exceptional Behaviors: How Frequently Are They Tested? (AST 2025)Exceptional Behaviors: How Frequently Are They Tested? (AST 2025)
Exceptional Behaviors: How Frequently Are They Tested? (AST 2025)
Andre Hora
 
Douwan Crack 2025 new verson+ License code
Douwan Crack 2025 new verson+ License codeDouwan Crack 2025 new verson+ License code
Douwan Crack 2025 new verson+ License code
aneelaramzan63
 
Adobe Illustrator Crack FREE Download 2025 Latest Version
Adobe Illustrator Crack FREE Download 2025 Latest VersionAdobe Illustrator Crack FREE Download 2025 Latest Version
Adobe Illustrator Crack FREE Download 2025 Latest Version
kashifyounis067
 
Explaining GitHub Actions Failures with Large Language Models Challenges, In...
Explaining GitHub Actions Failures with Large Language Models Challenges, In...Explaining GitHub Actions Failures with Large Language Models Challenges, In...
Explaining GitHub Actions Failures with Large Language Models Challenges, In...
ssuserb14185
 
How to Optimize Your AWS Environment for Improved Cloud Performance
How to Optimize Your AWS Environment for Improved Cloud PerformanceHow to Optimize Your AWS Environment for Improved Cloud Performance
How to Optimize Your AWS Environment for Improved Cloud Performance
ThousandEyes
 
Adobe Lightroom Classic Crack FREE Latest link 2025
Adobe Lightroom Classic Crack FREE Latest link 2025Adobe Lightroom Classic Crack FREE Latest link 2025
Adobe Lightroom Classic Crack FREE Latest link 2025
kashifyounis067
 
Proactive Vulnerability Detection in Source Code Using Graph Neural Networks:...
Proactive Vulnerability Detection in Source Code Using Graph Neural Networks:...Proactive Vulnerability Detection in Source Code Using Graph Neural Networks:...
Proactive Vulnerability Detection in Source Code Using Graph Neural Networks:...
Ranjan Baisak
 
Designing AI-Powered APIs on Azure: Best Practices& Considerations
Designing AI-Powered APIs on Azure: Best Practices& ConsiderationsDesigning AI-Powered APIs on Azure: Best Practices& Considerations
Designing AI-Powered APIs on Azure: Best Practices& Considerations
Dinusha Kumarasiri
 
Top 10 Client Portal Software Solutions for 2025.docx
Top 10 Client Portal Software Solutions for 2025.docxTop 10 Client Portal Software Solutions for 2025.docx
Top 10 Client Portal Software Solutions for 2025.docx
Portli
 
Interactive odoo dashboards for sales, CRM , Inventory, Invoice, Purchase, Pr...
Interactive odoo dashboards for sales, CRM , Inventory, Invoice, Purchase, Pr...Interactive odoo dashboards for sales, CRM , Inventory, Invoice, Purchase, Pr...
Interactive odoo dashboards for sales, CRM , Inventory, Invoice, Purchase, Pr...
AxisTechnolabs
 
Secure Test Infrastructure: The Backbone of Trustworthy Software Development
Secure Test Infrastructure: The Backbone of Trustworthy Software DevelopmentSecure Test Infrastructure: The Backbone of Trustworthy Software Development
Secure Test Infrastructure: The Backbone of Trustworthy Software Development
Shubham Joshi
 
TestMigrationsInPy: A Dataset of Test Migrations from Unittest to Pytest (MSR...
TestMigrationsInPy: A Dataset of Test Migrations from Unittest to Pytest (MSR...TestMigrationsInPy: A Dataset of Test Migrations from Unittest to Pytest (MSR...
TestMigrationsInPy: A Dataset of Test Migrations from Unittest to Pytest (MSR...
Andre Hora
 
Salesforce Data Cloud- Hyperscale data platform, built for Salesforce.
Salesforce Data Cloud- Hyperscale data platform, built for Salesforce.Salesforce Data Cloud- Hyperscale data platform, built for Salesforce.
Salesforce Data Cloud- Hyperscale data platform, built for Salesforce.
Dele Amefo
 
Exploring Code Comprehension in Scientific Programming: Preliminary Insight...
Exploring Code Comprehension  in Scientific Programming:  Preliminary Insight...Exploring Code Comprehension  in Scientific Programming:  Preliminary Insight...
Exploring Code Comprehension in Scientific Programming: Preliminary Insight...
University of Hawai‘i at Mānoa
 
Exploring Wayland: A Modern Display Server for the Future
Exploring Wayland: A Modern Display Server for the FutureExploring Wayland: A Modern Display Server for the Future
Exploring Wayland: A Modern Display Server for the Future
ICS
 
Download Wondershare Filmora Crack [2025] With Latest
Download Wondershare Filmora Crack [2025] With LatestDownload Wondershare Filmora Crack [2025] With Latest
Download Wondershare Filmora Crack [2025] With Latest
tahirabibi60507
 
Who Watches the Watchmen (SciFiDevCon 2025)
Who Watches the Watchmen (SciFiDevCon 2025)Who Watches the Watchmen (SciFiDevCon 2025)
Who Watches the Watchmen (SciFiDevCon 2025)
Allon Mureinik
 
The Significance of Hardware in Information Systems.pdf
The Significance of Hardware in Information Systems.pdfThe Significance of Hardware in Information Systems.pdf
The Significance of Hardware in Information Systems.pdf
drewplanas10
 
Why Orangescrum Is a Game Changer for Construction Companies in 2025
Why Orangescrum Is a Game Changer for Construction Companies in 2025Why Orangescrum Is a Game Changer for Construction Companies in 2025
Why Orangescrum Is a Game Changer for Construction Companies in 2025
Orangescrum
 
FL Studio Producer Edition Crack 2025 Full Version
FL Studio Producer Edition Crack 2025 Full VersionFL Studio Producer Edition Crack 2025 Full Version
FL Studio Producer Edition Crack 2025 Full Version
tahirabibi60507
 
Exceptional Behaviors: How Frequently Are They Tested? (AST 2025)
Exceptional Behaviors: How Frequently Are They Tested? (AST 2025)Exceptional Behaviors: How Frequently Are They Tested? (AST 2025)
Exceptional Behaviors: How Frequently Are They Tested? (AST 2025)
Andre Hora
 
Douwan Crack 2025 new verson+ License code
Douwan Crack 2025 new verson+ License codeDouwan Crack 2025 new verson+ License code
Douwan Crack 2025 new verson+ License code
aneelaramzan63
 

Real World Elixir Deployment

  • 1. REAL WORLD ELIXIR DEPLOYMENT Empire City Elixir | 2016-05-21 pete gamache | [email protected] | @gamache
  • 2. Hi!
  • 3. Summary • Elixir and Erlang make a rock-solid platform • Erlang excels at long-lived clusters • "Modern" deployment practices do not take advantage of Erlang core features • Deploying Elixir can be painful, but if you are taking advantage of platform, can be worth it
  • 4. Let's talk about an ideal platform
  • 5. Platform Desirables • Horizontal scalability • Fault tolerance • Zero-downtime upgrades and rollbacks • Stability and performance • Ease of administration and maintenance
  • 6. Let's talk about an average platform
  • 7. Devops 2010 • Fleets of ephemeral, stateless servers • Load-balancer or shared work queue • All message passing happens externally • All state held externally
  • 8. Devops 2010, cont. • Upgrade: Start new servers, add to pool, remove old servers from pool, kill old servers • Rollback: either same as above, or hot/cold a.k.a. blue/green deployment • Many moving parts -- provisioning, load balancer, connection draining
  • 9. Devops 2016 • Mostly like that • Something something Docker • Heavily automated • Far-out stuff: virtualized resource pools, e.g. Mesos
  • 10. Desirables Achieved? • Horizontal scalability and fault tolerance, check • Zero-downtime upgrades and rollbacks, mostly • Stability and performance, yeah sure • Ease of maintenance, not so sure
  • 11. Let's talk about the Erlang platform
  • 12. Things Erlang Does • Extreme fault tolerance • Simple scalability to dozens of server nodes • Zero-downtime upgrades/rollbacks (and fast) • Stability and performance
  • 13. Things Elixir Helps With • Ease of administration and maintenance
  • 14. Erlang Clustering • Designed for long-lived server clusters • Treat OTP apps like microservices, and you get a free resource pool • Postpone sharding • Postpone outboard message passing
  • 15. Erlang vs The World • Erlang doesn't look like Devops 2010, but delivers much of Devops 2016 • Go with the flow of the platform • Startups love time-to-market advantages
  • 16. Real Talk • Don't use Elixir in prod just because it's shiny • Evaluate advantages and disadvantages • If Elixir and Erlang have the features to get you to market faster or better, consider it • Also consider Erlang + Devops 2016 if that works for your use case • Nothing's free in the long run -- scale hurts
  • 17. Deployment • The sum of tools and topology • Topology is a big topic, so here I will abbreviate to "at least two of everything" • Now let's discuss deployment tools on the Erlang/Elixir platform
  • 18. In the Beginning... Source: http://learnyousomeerlang.com/relups
  • 19. exrm • Elixir Release Manager • Handles most of steps 1-25 in previous slide • Generates Erlang releases • Then you like, put them on servers or something? lol
  • 20. edeliver • Based on deliver, a bash-based deploy tool • Works with rebar, mix, relx, exrm • Handles builds, deployment, versioning • Actively developed • https://github.com/boldpoker/edeliver
  • 21. How to edeliver • Add edeliver as a dependency/app in mix.exs • Create and configure .deliver/config file • Set up servers, logins, dirs, and configs • Use git tags to mark mix.exs versions • Run mix tasks, make money
  • 25. edeliver Directories • Don't create $BUILD_AT, $TEST_AT, $DELIVER_TO yourself • config/*.secret.exs, etc. go in $CONFIG_AT • *.vm.args files handle node names, clustering • Normal Unix permissions rules apply
  • 26. How to Clustering • name and setcookie params in vm.args • sync_nodes_mandatory/sync_nodes_optional in :kernel config • http://erlang.org/doc/design_principles/ distributed_applications.html
  • 29. edeliver and Versions • edeliver has some new features around auto- versioning • I do not recommend using them (yet) • Just stick to git tags named exactly like the mix.env version (i.e., "0.0.1" not "v0.0.1")
  • 36. Build a hot upgrade
  • 40. Deploy a hot upgrade
  • 45. But they don't always work • Sometimes it's a matter of hand-editing appups and relups • Sometimes packages are not in a position to be hot-upgraded (e.g., Cowboy) • Sometimes f^@% you
  • 46. So, What Now? • Rolling upgrades are your best fallback • Necessitates more than one server • Write your code so that function signatures don't change • Above technique is good for DB migrations too!
  • 47. Rolling Upgrade • Build release • Deploy release without --start-deploy • Execute on each server: cd $DELIVER_TO/your_app_name
 releases/X.Y.Z/your_app_name.sh restart
  • 48. Rollbacks • Rollbacks are just upgrades • If you could upgrade version X to Y, you can rollback Y to X just as quickly
  • 50. Database Migrations • edeliver now has a migration feature • http://blog.plataformatec.com.br/2016/04/ running-migration-in-an-exrm-release/ • I usually just log into the build server and: cd $BUILD_AT/prod
 MIX_ENV=prod mix ecto.migrate
  • 52. Gotcha! Ulimit • a.k.a. EFILE, Too many open files • Erlang rules at using file descriptors • It rules so hard that Unix thinks something went wrong and must be contained • Be sure and set ulimit very high/infinite • Set -env ERL_MAX_PORTS very high in vm.args
  • 53. Gotcha! Exceptions • Too many exceptions too fast, and the Erlang VM will ragequit • Band-aid Solution 1: -heart in vm.args • Band-aid Solution 2: bin/myapp start in cron • Real Solution: fix your shit
  • 54. Gotcha! Segfaults • The Erlang VM is not supposed to segfault • How adorable • Same instructions as previous slide
  • 55. Gotcha! Cached Release • Example: you build an upgrade from X to Z • You then build an upgrade from Y to Z • If you had copied X-to-Z to your servers, you can't perform the upgrade Y-to-Z • Solution: Blow away $DELIVER_TO/myapp/ releases/Z before building/deploying Y-to-Z
  • 56. Gotcha! Websockets • Unexplained client 400s can be due to load balancer issues • Amazon ELB: use "TCP"/"SSL" settings, not "HTTP"/"HTTPS" • Nginx:
 proxy_set_header Upgrade $http_upgrade;
 proxy_set_header Connection "upgrade";
  • 58. Finding a Git Solution in edeliver/libexec/erlang
  • 61. Another Summary • Erlang and Elixir deployment shouldn't look like less-powerful platforms' • edeliver automates most of the deployment process, mostly. Let's say 90% of the time • Taken next to the platform's advantages, the gotchas aren't so bad • 2016 is early in the Elixir Deployment timeline