SlideShare a Scribd company logo
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

PPTX
Deep-dive into cloud-native AEM deployments based on Kubernetes
PDF
client-go: The Good, The Bad and The Ugly
PPTX
Introduction to Helm
PDF
Securing Containerized Applications: A Primer
PDF
Cloud Native TLV Meetup: Securing Containerized Applications Primer
PDF
Containerd Project Update: FOSDEM 2018
PDF
Enabling Security via Container Runtimes
PDF
Docker London Meetup: Docker Engine Evolution
Deep-dive into cloud-native AEM deployments based on Kubernetes
client-go: The Good, The Bad and The Ugly
Introduction to Helm
Securing Containerized Applications: A Primer
Cloud Native TLV Meetup: Securing Containerized Applications Primer
Containerd Project Update: FOSDEM 2018
Enabling Security via Container Runtimes
Docker London Meetup: Docker Engine Evolution

What's hot (20)

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

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

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

More from Tomasz Rękawek (8)

PDF
Radio ad blocker
PDF
Emulating Game Boy in Java
PDF
CRX2Oak - all the secrets of repository migration
PDF
SlingQuery
PPTX
Code metrics
PDF
Inter-Sling communication with message queue
PDF
Sling Dynamic Include
PPTX
Shooting rabbits with sling
Radio ad blocker
Emulating Game Boy in Java
CRX2Oak - all the secrets of repository migration
SlingQuery
Code metrics
Inter-Sling communication with message queue
Sling Dynamic Include
Shooting rabbits with sling

Recently uploaded (20)

PPTX
history of c programming in notes for students .pptx
PDF
Addressing The Cult of Project Management Tools-Why Disconnected Work is Hold...
PDF
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
PDF
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
PDF
Digital Strategies for Manufacturing Companies
PPTX
Transform Your Business with a Software ERP System
PDF
Wondershare Filmora 15 Crack With Activation Key [2025
PDF
top salesforce developer skills in 2025.pdf
PDF
EN-Survey-Report-SAP-LeanIX-EA-Insights-2025.pdf
PDF
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
PDF
medical staffing services at VALiNTRY
PPTX
L1 - Introduction to python Backend.pptx
PPTX
CHAPTER 2 - PM Management and IT Context
PDF
Navsoft: AI-Powered Business Solutions & Custom Software Development
PDF
System and Network Administraation Chapter 3
PDF
How to Choose the Right IT Partner for Your Business in Malaysia
PDF
Odoo Companies in India – Driving Business Transformation.pdf
PDF
Adobe Illustrator 28.6 Crack My Vision of Vector Design
PDF
Nekopoi APK 2025 free lastest update
PDF
Claude Code: Everyone is a 10x Developer - A Comprehensive AI-Powered CLI Tool
history of c programming in notes for students .pptx
Addressing The Cult of Project Management Tools-Why Disconnected Work is Hold...
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
Digital Strategies for Manufacturing Companies
Transform Your Business with a Software ERP System
Wondershare Filmora 15 Crack With Activation Key [2025
top salesforce developer skills in 2025.pdf
EN-Survey-Report-SAP-LeanIX-EA-Insights-2025.pdf
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
medical staffing services at VALiNTRY
L1 - Introduction to python Backend.pptx
CHAPTER 2 - PM Management and IT Context
Navsoft: AI-Powered Business Solutions & Custom Software Development
System and Network Administraation Chapter 3
How to Choose the Right IT Partner for Your Business in Malaysia
Odoo Companies in India – Driving Business Transformation.pdf
Adobe Illustrator 28.6 Crack My Vision of Vector Design
Nekopoi APK 2025 free lastest update
Claude Code: Everyone is a 10x Developer - A Comprehensive AI-Powered CLI Tool

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.