SlideShare a Scribd company logo
1 of 32
Download to read offline
APACHE SLING & FRIENDS TECH MEETUP
BERLIN, 25-27 SEPTEMBER 2017
Robert Munteanu, Tomek Rękawek @ Adobe
0DT deployments for Sling-based apps
Agenda
● Motivation
● Concepts
● Usage
● Demo
● Wrap-up
Motivation
Clustered deployments
Standalone deployments
Concepts
Separate content from code
Oak Composite NodeStore
Oak Composite NodeStore
● Manages a number of 1 to n NodeStores
● Always has a global NodeStore, holding the content not
claimed by other NodeStores
● Multiple mounted NodeStores, owning content for certain
paths, for instance /libs and /apps
● Certain paths in the global mount can be claimed by mounts
– Looks for a :oak:mount- prefx in node names and matches them with mounts
– Currently implemented for indexes
Typical confguraton
Note: for your viewing pleasure, not an actual config file
/ <default> # global mount
/libs libs # read-only mount
/apps libs # read-only mount
Following paths also belong to the libs mount:
●
/oak:index/uuid/:oak:mount-libs-index ( and others )
● /jcr:system/rep:permissionStore/oak:mount-libs-
default
Oak composite store with Sling / AEM
● Two repositories:
– /apps & /libs - stored in a separate, read-only
repository-libs,
– other data - stored in the normal repository (Segment,
Mongo or RDB).
● The first one has to be created before starting
the instance.
Limitatons
● Mounts are always read-only
– Atomic state changes non trivial to get right, fast, scalable
– Write support requires additonal change to multple Oak subsystems
– No observaton events generated
● Referenceable nodes are not suported in non-default
NodeStores
● Versionable nodes are not supported in non-default
NodeStores
Ensuring consistency
● Mount-time checks
– No versionable nodes in non-default NodeStores
– No referenceable nodes in non-default NodeStoress
– No duplicate entries in unique indexes amongst all NodeStores
– Node type defnitons from mounts consistent with the global node type
registry
– Namespace usage in mounts consistent with the global namespace registry
● Run-time checks
– No cross-mount references may be created at run-tme
Applicaton-level changes
● No run-time changes under /libs or /apps
– Usually fne or applicatons
– More painful for testng
● Read-only status exposed via
Session.hasCapability, not
Session.hasPermission
Usage
Running instance in the composite mode
●
We need to have two repositories in the composite mode:
– one for the applicaton (/apps and /libs),
– one for the content (everything else).
● When running the instance in the composite mode, the
application part is read-only
– so it's not possible to install the applicaton from the content packages, as usual.
● Therefore, using composite mode involves two-step process:
– start instance without the composite node store, to create the applicaton repository,
– start instance with the composite node store.
Building and startng composite instance
Building the composite-enabled instance
●
First, the instance is started without the composite node store.
●
The composite-init.jar waits until the instance is ready:
– start level 30,
– no indexing jobs in progress.
●
Then it stops the instance.
● The created repository is renamed to repository-libs.
●
It's a completely initialized repository:
– /apps, /libs will be used for the composite node store mount,
– other content will be used to pre-populate the default node store when running the instance.
Startng the quickstart in composite mode
● The instance is configured with two node stores: the default one and
the repository-libs.
● They are combined together with composite node store.
● If the instance is started for the first time:
– the default store is empty, so the composite node store pre-populates it with the content from
the repository-libs,
– it copies everything except the apps-related data,
– once the inital pre-populaton is done, the instance startup will carry on.
● If the instance references an existing default repository:
– the startup proceeds, with the new /apps and /libs part.
Customer applicaton integraton
●
The customer application can't be installed in the instance runtime.
●
It has to be integrated with the Sling/AEM code.
●
Sling Provisioning Model:
[artifacts startLevel=20]
com.acme.site/com.acme.site.content/1.0.0/zip
com.acme.site/com.acme.site.core/1.0.0
com.acme.site/com.acme.site.email/1.0.0
com.acme.site/com.acme.site.templating/1.0.0
[configurations]
com.acme.site.core.AcmeService
enabled=B"true"
path="/home/acme"
Composite mode with Docker
● This 2-stage process needs to be automated.
●
Docker is a perfect tool for the task - it allows to
encapsulate both logic and data:
– Dockerfile can be used to orchestrate the required steps,
– the created Docker image embedds the artfacts and
repository-libs.
●
A separate image for author and publish.
Dockerizing the composite instance
Running the container
● The container uses an external storage for the
non-application content.
● Either VOLUME for the TarMK or a Mongo
instance.
● The /apps and /libs are served from the
embedded repository-libs.
Docker setup summary
Deployment scenarios
Blue-green deployments
Blue green deployments
●
Now we have the whole application code enclosed in the container.
● While the other data (/content) is stored externally.
● This allows to perform a blue-green deployment.
●
Blue container is the one running the older version of code.
●
Without disabling it, we're creating a green container, running the newer code.
● They are both using the same content, but their /apps subtrees and bundles
are different.
● Now we can switch the load balancer to point the green container.
●
The blue one can be shut down.
Incompatble content changes
●
The assumption is that the green container doesn't introduce incomatible
changes.
●
Otherwise the blue may break.
●
In AEM context: eg. no new components should be added if the older version
doesn't support them.
●
If the property name changes, the new version should fallback to reading the
older name as well.
●
If the content schema changes, a script may be used to update the content
after switching the load balancer,
– the new applicaton should allow to read the older schema too.
Demo
Zero downtme demo
● Start a Dockerized, Mongo-based AEM instance with
application v1.
● Start the second container, with application v2,
connecting to the same MongoDB.
● Confirm it contains a new "video" component.
● Switch the load balancer.
● Destroy the old instance.
Wrap-up
Resources
● https://jackrabbit.apache.org/oak/docs/node
store/compositens.html

More Related Content

What's hot

What's hot (20)

Introduction to Atomic: Tailoring a Trusted OS for Containers
Introduction to Atomic: Tailoring a Trusted OS for ContainersIntroduction to Atomic: Tailoring a Trusted OS for Containers
Introduction to Atomic: Tailoring a Trusted OS for Containers
 
Thoughts on heptio's ark - Contributors Meet 21st Sept 2018
Thoughts on heptio's ark - Contributors Meet 21st Sept 2018Thoughts on heptio's ark - Contributors Meet 21st Sept 2018
Thoughts on heptio's ark - Contributors Meet 21st Sept 2018
 
Magnum first-class-resource
Magnum first-class-resourceMagnum first-class-resource
Magnum first-class-resource
 
Gluster Containerized Storage for Cloud Applications
Gluster Containerized Storage for Cloud ApplicationsGluster Containerized Storage for Cloud Applications
Gluster Containerized Storage for Cloud Applications
 
Persistent Storage in Openshift using GlusterFS
Persistent Storage in Openshift using GlusterFSPersistent Storage in Openshift using GlusterFS
Persistent Storage in Openshift using GlusterFS
 
Gluster containers!
Gluster containers!Gluster containers!
Gluster containers!
 
Bug smash day magnum
Bug smash day magnumBug smash day magnum
Bug smash day magnum
 
Container (Docker) Orchestration Tools
Container (Docker) Orchestration ToolsContainer (Docker) Orchestration Tools
Container (Docker) Orchestration Tools
 
OpenStack Magnum
OpenStack MagnumOpenStack Magnum
OpenStack Magnum
 
Elasticsearch Monitoring in Openshift
Elasticsearch Monitoring in OpenshiftElasticsearch Monitoring in Openshift
Elasticsearch Monitoring in Openshift
 
An Open Source Story: Open Containers & Open Communities
An Open Source Story: Open Containers & Open CommunitiesAn Open Source Story: Open Containers & Open Communities
An Open Source Story: Open Containers & Open Communities
 
Monitoring Kubernetes with Prometheus
Monitoring Kubernetes with PrometheusMonitoring Kubernetes with Prometheus
Monitoring Kubernetes with Prometheus
 
Bug smash day magnum
Bug smash day magnumBug smash day magnum
Bug smash day magnum
 
Kubernetes and OpenStack at Scale
Kubernetes and OpenStack at ScaleKubernetes and OpenStack at Scale
Kubernetes and OpenStack at Scale
 
Using Docker with OpenStack - Hands On!
 Using Docker with OpenStack - Hands On! Using Docker with OpenStack - Hands On!
Using Docker with OpenStack - Hands On!
 
Introduction to Kubernetes
Introduction to KubernetesIntroduction to Kubernetes
Introduction to Kubernetes
 
Let's Try Every CRI Runtime Available for Kubernetes
Let's Try Every CRI Runtime Available for KubernetesLet's Try Every CRI Runtime Available for Kubernetes
Let's Try Every CRI Runtime Available for Kubernetes
 
Extended and embedding: containerd update & project use cases
Extended and embedding: containerd update & project use casesExtended and embedding: containerd update & project use cases
Extended and embedding: containerd update & project use cases
 
Devoxx 2016: A Developer's Guide to OCI and runC
Devoxx 2016: A Developer's Guide to OCI and runCDevoxx 2016: A Developer's Guide to OCI and runC
Devoxx 2016: A Developer's Guide to OCI and runC
 
FOSDEM 2019: A containerd Project Update
FOSDEM 2019: A containerd Project UpdateFOSDEM 2019: A containerd Project Update
FOSDEM 2019: A containerd Project Update
 

Similar to Zero downtime deployments for the Sling-based apps using Docker

01 web-apps
01 web-apps01 web-apps
01 web-apps
snopteck
 

Similar to Zero downtime deployments for the Sling-based apps using Docker (20)

Migraine Drupal - syncing your staging and live sites
Migraine Drupal - syncing your staging and live sitesMigraine Drupal - syncing your staging and live sites
Migraine Drupal - syncing your staging and live sites
 
Java 9 Features
Java 9 FeaturesJava 9 Features
Java 9 Features
 
Mule scopes&amp;error handling
Mule scopes&amp;error handlingMule scopes&amp;error handling
Mule scopes&amp;error handling
 
Node JS - A brief overview on building real-time web applications
Node JS - A brief overview on building real-time web applicationsNode JS - A brief overview on building real-time web applications
Node JS - A brief overview on building real-time web applications
 
Node js Global Packages
Node js Global PackagesNode js Global Packages
Node js Global Packages
 
Open Dayligth usando SDN-NFV
Open Dayligth usando SDN-NFVOpen Dayligth usando SDN-NFV
Open Dayligth usando SDN-NFV
 
System software module 3 presentation file
System software module 3 presentation fileSystem software module 3 presentation file
System software module 3 presentation file
 
System software module 3 presentation file
System software module 3 presentation fileSystem software module 3 presentation file
System software module 3 presentation file
 
Essential applications management with Tiny Puppet
Essential applications management with Tiny PuppetEssential applications management with Tiny Puppet
Essential applications management with Tiny Puppet
 
Webpack: from 0 to 2
Webpack: from 0 to 2Webpack: from 0 to 2
Webpack: from 0 to 2
 
Overview of Node JS
Overview of Node JSOverview of Node JS
Overview of Node JS
 
Carbon and OSGi Deep Dive
Carbon and OSGi Deep DiveCarbon and OSGi Deep Dive
Carbon and OSGi Deep Dive
 
Extending OpenShift Origin: Build Your Own Cartridge with Bill DeCoste of Red...
Extending OpenShift Origin: Build Your Own Cartridge with Bill DeCoste of Red...Extending OpenShift Origin: Build Your Own Cartridge with Bill DeCoste of Red...
Extending OpenShift Origin: Build Your Own Cartridge with Bill DeCoste of Red...
 
Eclipse Training - Introduction
Eclipse Training - IntroductionEclipse Training - Introduction
Eclipse Training - Introduction
 
CD in kubernetes using helm and ksonnet. Stas Kolenkin
CD in kubernetes using helm and ksonnet. Stas KolenkinCD in kubernetes using helm and ksonnet. Stas Kolenkin
CD in kubernetes using helm and ksonnet. Stas Kolenkin
 
Introduction to node.js
Introduction to node.jsIntroduction to node.js
Introduction to node.js
 
Tips and Tricks for the Advanced Mule Developer with Tesla and Twitter
Tips and Tricks for the Advanced Mule Developer with Tesla and Twitter Tips and Tricks for the Advanced Mule Developer with Tesla and Twitter
Tips and Tricks for the Advanced Mule Developer with Tesla and Twitter
 
Efficient development workflows with composer
Efficient development workflows with composerEfficient development workflows with composer
Efficient development workflows with composer
 
Organizing JavaScript
Organizing JavaScriptOrganizing JavaScript
Organizing JavaScript
 
01 web-apps
01 web-apps01 web-apps
01 web-apps
 

More from Tomasz Rękawek

More from Tomasz Rękawek (8)

Radio ad blocker
Radio ad blockerRadio ad blocker
Radio ad blocker
 
Emulating Game Boy in Java
Emulating Game Boy in JavaEmulating Game Boy in Java
Emulating Game Boy in Java
 
CRX2Oak - all the secrets of repository migration
CRX2Oak - all the secrets of repository migrationCRX2Oak - all the secrets of repository migration
CRX2Oak - all the secrets of repository migration
 
SlingQuery
SlingQuerySlingQuery
SlingQuery
 
Code metrics
Code metricsCode metrics
Code metrics
 
Inter-Sling communication with message queue
Inter-Sling communication with message queueInter-Sling communication with message queue
Inter-Sling communication with message queue
 
Sling Dynamic Include
Sling Dynamic IncludeSling Dynamic Include
Sling Dynamic Include
 
Shooting rabbits with sling
Shooting rabbits with slingShooting rabbits with sling
Shooting rabbits with sling
 

Recently uploaded

Recently uploaded (20)

Malaysia E-Invoice digital signature docpptx
Malaysia E-Invoice digital signature docpptxMalaysia E-Invoice digital signature docpptx
Malaysia E-Invoice digital signature docpptx
 
IT Software Development Resume, Vaibhav jha 2024
IT Software Development Resume, Vaibhav jha 2024IT Software Development Resume, Vaibhav jha 2024
IT Software Development Resume, Vaibhav jha 2024
 
Microsoft365_Dev_Security_2024_05_16.pdf
Microsoft365_Dev_Security_2024_05_16.pdfMicrosoft365_Dev_Security_2024_05_16.pdf
Microsoft365_Dev_Security_2024_05_16.pdf
 
Sourcing Success - How to Find a Clothing Manufacturer
Sourcing Success - How to Find a Clothing ManufacturerSourcing Success - How to Find a Clothing Manufacturer
Sourcing Success - How to Find a Clothing Manufacturer
 
Microsoft 365 Copilot; An AI tool changing the world of work _PDF.pdf
Microsoft 365 Copilot; An AI tool changing the world of work _PDF.pdfMicrosoft 365 Copilot; An AI tool changing the world of work _PDF.pdf
Microsoft 365 Copilot; An AI tool changing the world of work _PDF.pdf
 
The mythical technical debt. (Brooke, please, forgive me)
The mythical technical debt. (Brooke, please, forgive me)The mythical technical debt. (Brooke, please, forgive me)
The mythical technical debt. (Brooke, please, forgive me)
 
Lessons Learned from Building a Serverless Notifications System.pdf
Lessons Learned from Building a Serverless Notifications System.pdfLessons Learned from Building a Serverless Notifications System.pdf
Lessons Learned from Building a Serverless Notifications System.pdf
 
A Deep Dive into Secure Product Development Frameworks.pdf
A Deep Dive into Secure Product Development Frameworks.pdfA Deep Dive into Secure Product Development Frameworks.pdf
A Deep Dive into Secure Product Development Frameworks.pdf
 
AI Hackathon.pptx
AI                        Hackathon.pptxAI                        Hackathon.pptx
AI Hackathon.pptx
 
Workforce Efficiency with Employee Time Tracking Software.pdf
Workforce Efficiency with Employee Time Tracking Software.pdfWorkforce Efficiency with Employee Time Tracking Software.pdf
Workforce Efficiency with Employee Time Tracking Software.pdf
 
GraphSummit Stockholm - Neo4j - Knowledge Graphs and Product Updates
GraphSummit Stockholm - Neo4j - Knowledge Graphs and Product UpdatesGraphSummit Stockholm - Neo4j - Knowledge Graphs and Product Updates
GraphSummit Stockholm - Neo4j - Knowledge Graphs and Product Updates
 
Workshop: Enabling GenAI Breakthroughs with Knowledge Graphs - GraphSummit Milan
Workshop: Enabling GenAI Breakthroughs with Knowledge Graphs - GraphSummit MilanWorkshop: Enabling GenAI Breakthroughs with Knowledge Graphs - GraphSummit Milan
Workshop: Enabling GenAI Breakthroughs with Knowledge Graphs - GraphSummit Milan
 
Food Delivery Business App Development Guide 2024
Food Delivery Business App Development Guide 2024Food Delivery Business App Development Guide 2024
Food Delivery Business App Development Guide 2024
 
How to install and activate eGrabber JobGrabber
How to install and activate eGrabber JobGrabberHow to install and activate eGrabber JobGrabber
How to install and activate eGrabber JobGrabber
 
Salesforce Introduced Zero Copy Partner Network to Simplify the Process of In...
Salesforce Introduced Zero Copy Partner Network to Simplify the Process of In...Salesforce Introduced Zero Copy Partner Network to Simplify the Process of In...
Salesforce Introduced Zero Copy Partner Network to Simplify the Process of In...
 
Automate your OpenSIPS config tests - OpenSIPS Summit 2024
Automate your OpenSIPS config tests - OpenSIPS Summit 2024Automate your OpenSIPS config tests - OpenSIPS Summit 2024
Automate your OpenSIPS config tests - OpenSIPS Summit 2024
 
Optimizing Operations by Aligning Resources with Strategic Objectives Using O...
Optimizing Operations by Aligning Resources with Strategic Objectives Using O...Optimizing Operations by Aligning Resources with Strategic Objectives Using O...
Optimizing Operations by Aligning Resources with Strategic Objectives Using O...
 
Crafting the Perfect Measurement Sheet with PLM Integration
Crafting the Perfect Measurement Sheet with PLM IntegrationCrafting the Perfect Measurement Sheet with PLM Integration
Crafting the Perfect Measurement Sheet with PLM Integration
 
Community is Just as Important as Code by Andrea Goulet
Community is Just as Important as Code by Andrea GouletCommunity is Just as Important as Code by Andrea Goulet
Community is Just as Important as Code by Andrea Goulet
 
The Evolution of Web App Testing_ An Ultimate Guide to Future Trends.pdf
The Evolution of Web App Testing_ An Ultimate Guide to Future Trends.pdfThe Evolution of Web App Testing_ An Ultimate Guide to Future Trends.pdf
The Evolution of Web App Testing_ An Ultimate Guide to Future Trends.pdf
 

Zero downtime deployments for the Sling-based apps using Docker

  • 1. APACHE SLING & FRIENDS TECH MEETUP BERLIN, 25-27 SEPTEMBER 2017 Robert Munteanu, Tomek Rękawek @ Adobe 0DT deployments for Sling-based apps
  • 2. Agenda ● Motivation ● Concepts ● Usage ● Demo ● Wrap-up
  • 9. Oak Composite NodeStore ● Manages a number of 1 to n NodeStores ● Always has a global NodeStore, holding the content not claimed by other NodeStores ● Multiple mounted NodeStores, owning content for certain paths, for instance /libs and /apps ● Certain paths in the global mount can be claimed by mounts – Looks for a :oak:mount- prefx in node names and matches them with mounts – Currently implemented for indexes
  • 10. Typical confguraton Note: for your viewing pleasure, not an actual config file / <default> # global mount /libs libs # read-only mount /apps libs # read-only mount Following paths also belong to the libs mount: ● /oak:index/uuid/:oak:mount-libs-index ( and others ) ● /jcr:system/rep:permissionStore/oak:mount-libs- default
  • 11. Oak composite store with Sling / AEM ● Two repositories: – /apps & /libs - stored in a separate, read-only repository-libs, – other data - stored in the normal repository (Segment, Mongo or RDB). ● The first one has to be created before starting the instance.
  • 12. Limitatons ● Mounts are always read-only – Atomic state changes non trivial to get right, fast, scalable – Write support requires additonal change to multple Oak subsystems – No observaton events generated ● Referenceable nodes are not suported in non-default NodeStores ● Versionable nodes are not supported in non-default NodeStores
  • 13. Ensuring consistency ● Mount-time checks – No versionable nodes in non-default NodeStores – No referenceable nodes in non-default NodeStoress – No duplicate entries in unique indexes amongst all NodeStores – Node type defnitons from mounts consistent with the global node type registry – Namespace usage in mounts consistent with the global namespace registry ● Run-time checks – No cross-mount references may be created at run-tme
  • 14. Applicaton-level changes ● No run-time changes under /libs or /apps – Usually fne or applicatons – More painful for testng ● Read-only status exposed via Session.hasCapability, not Session.hasPermission
  • 15. Usage
  • 16. Running instance in the composite mode ● We need to have two repositories in the composite mode: – one for the applicaton (/apps and /libs), – one for the content (everything else). ● When running the instance in the composite mode, the application part is read-only – so it's not possible to install the applicaton from the content packages, as usual. ● Therefore, using composite mode involves two-step process: – start instance without the composite node store, to create the applicaton repository, – start instance with the composite node store.
  • 17. Building and startng composite instance
  • 18. Building the composite-enabled instance ● First, the instance is started without the composite node store. ● The composite-init.jar waits until the instance is ready: – start level 30, – no indexing jobs in progress. ● Then it stops the instance. ● The created repository is renamed to repository-libs. ● It's a completely initialized repository: – /apps, /libs will be used for the composite node store mount, – other content will be used to pre-populate the default node store when running the instance.
  • 19. Startng the quickstart in composite mode ● The instance is configured with two node stores: the default one and the repository-libs. ● They are combined together with composite node store. ● If the instance is started for the first time: – the default store is empty, so the composite node store pre-populates it with the content from the repository-libs, – it copies everything except the apps-related data, – once the inital pre-populaton is done, the instance startup will carry on. ● If the instance references an existing default repository: – the startup proceeds, with the new /apps and /libs part.
  • 20. Customer applicaton integraton ● The customer application can't be installed in the instance runtime. ● It has to be integrated with the Sling/AEM code. ● Sling Provisioning Model: [artifacts startLevel=20] com.acme.site/com.acme.site.content/1.0.0/zip com.acme.site/com.acme.site.core/1.0.0 com.acme.site/com.acme.site.email/1.0.0 com.acme.site/com.acme.site.templating/1.0.0 [configurations] com.acme.site.core.AcmeService enabled=B"true" path="/home/acme"
  • 21. Composite mode with Docker ● This 2-stage process needs to be automated. ● Docker is a perfect tool for the task - it allows to encapsulate both logic and data: – Dockerfile can be used to orchestrate the required steps, – the created Docker image embedds the artfacts and repository-libs. ● A separate image for author and publish.
  • 23. Running the container ● The container uses an external storage for the non-application content. ● Either VOLUME for the TarMK or a Mongo instance. ● The /apps and /libs are served from the embedded repository-libs.
  • 27. Blue green deployments ● Now we have the whole application code enclosed in the container. ● While the other data (/content) is stored externally. ● This allows to perform a blue-green deployment. ● Blue container is the one running the older version of code. ● Without disabling it, we're creating a green container, running the newer code. ● They are both using the same content, but their /apps subtrees and bundles are different. ● Now we can switch the load balancer to point the green container. ● The blue one can be shut down.
  • 28. Incompatble content changes ● The assumption is that the green container doesn't introduce incomatible changes. ● Otherwise the blue may break. ● In AEM context: eg. no new components should be added if the older version doesn't support them. ● If the property name changes, the new version should fallback to reading the older name as well. ● If the content schema changes, a script may be used to update the content after switching the load balancer, – the new applicaton should allow to read the older schema too.
  • 29. Demo
  • 30. Zero downtme demo ● Start a Dockerized, Mongo-based AEM instance with application v1. ● Start the second container, with application v2, connecting to the same MongoDB. ● Confirm it contains a new "video" component. ● Switch the load balancer. ● Destroy the old instance.