Continuous DB migration based on carbon5 framework

40
Continuous DB migration Boris Trofimov @b0ris_1 www.btrofimoff.com

description

Talk on DB migration and Carbon 5 and flyway frameworks.

Transcript of Continuous DB migration based on carbon5 framework

Page 1: Continuous DB migration based on carbon5 framework

Continuous DB migration

Boris Trofimov

@b0ris_1

www.btrofimoff.com

Page 2: Continuous DB migration based on carbon5 framework

Agenda

Dealing with changes

Perfect solution or Continuous DB migration

Carbon5 Introduction

Maven-driven mode

Embedded mode

Pros/Cos and best practices

Page 3: Continuous DB migration based on carbon5 framework

Dealing with Changes

Applications evolve. God, bless bugs, refactoring and

business changes.

We love applications and configure CI, VCS in order to

track source code/application version.

But what’s about DB?

Page 4: Continuous DB migration based on carbon5 framework

Dealing with Schema Change

FACT: Some modifications might require changes in DB

schema.

Page 5: Continuous DB migration based on carbon5 framework

Dealing with Schema Change

FACT: Some modifications might require changes in DB

schema.

Changes are simple and risky.

Page 6: Continuous DB migration based on carbon5 framework

Dealing with Schema Change

FACT: Some modifications might require changes in DB

schema.

Changes are simple and risky.

Simple changes:

– add one more table

– add index

Page 7: Continuous DB migration based on carbon5 framework

Dealing with Schema Change

FACT: Some application modifications might require

changes in DB schema.

Changes are simple and risky.

Simple changes:

– add one more table

– add index

Risky changes:

– rename/add column

– change foreign key

– migrate data from one table/column to another

– denormalization on a fly

Page 8: Continuous DB migration based on carbon5 framework

Dealing with Schema Change

What’s about old apps upgrade and multiple schema changes?

App v1

App v10

Page 9: Continuous DB migration based on carbon5 framework

The Impact

Risks to lose data

Painful downtime

Risks to break application (see #1 and #2)

Resources, efforts and budget

Page 10: Continuous DB migration based on carbon5 framework

Friday’s deployment in some teams

Page 11: Continuous DB migration based on carbon5 framework

How people solve it

Deny Friday’s deployments

Manual deployment

Hibernate-like schema update + SQLexec

Self-developed tools based on version number approach

Page 12: Continuous DB migration based on carbon5 framework

Perfect solution

Dedicated reusable framework

Every Feature request leads to separated SQL migration script.

Framework tracks which changes were not applied and applies

them.

Configurable time to launch apply procedure

Prevent Double changes

Have Change Log

Simple integration to existent project

Page 13: Continuous DB migration based on carbon5 framework

Continuous DB Migration approach

min + automatic migration = Continuous DB Migration

Page 14: Continuous DB migration based on carbon5 framework

Carbon V

Page 15: Continuous DB migration based on carbon5 framework

Why Carbon V

DB-migration framework

Open Source project

Lightweight framework

Simple usage

Page 16: Continuous DB migration based on carbon5 framework

How it works

Dedicated project folder for SQL migration scripts. This folder

should be available when framework takes control.

Each SQL migration script is pure SQL/DDL file with migration

SQL code for specific feature

Each Delta file should have name

YYYYMMDDHHMMSS_<FEATURE>.sql

When framework take control it checks and applies only new

changes.

C5 uses own JDBC connection.

Way to re-usue existent DataSources with connection params

Page 17: Continuous DB migration based on carbon5 framework

No magic, just…

C5 creates own table “schema_version” inside your database

C5 controls this table by itself (no needs to create or update).

sql_file_name date duration

201405170900_user_auth.sql 2014-05-17 13:00:00

8 sec

201404130400_award_4565.sql 2014-04-14 14:00:00

6 sec

Page 18: Continuous DB migration based on carbon5 framework

When to initiate migration procedure?

Maven-driven approach

Embedded mode

Page 19: Continuous DB migration based on carbon5 framework

Maven-driven mode

Page 20: Continuous DB migration based on carbon5 framework

Maven-driven mode

Page 21: Continuous DB migration based on carbon5 framework

Configure Maven project

Update POM definition

Configure Explicit DB connection

Can be configured depending on specific maven profiles

(staging, production)

Page 22: Continuous DB migration based on carbon5 framework

Add SQL migration files

Use Project/src/main/db/migrations directory

Page 23: Continuous DB migration based on carbon5 framework

Launch it

performs migration

$ mvn db-migration:migrate

resets migration

$ mvn db-migration:reset

check if DB is up to date

$ mvn db-migration:validate

create new feature

$ mvn db-migration:new -Dname=new_feature

Page 24: Continuous DB migration based on carbon5 framework

Use cases

Manual runs from developer machine

Part of Continuous Deivery process – Add just one more Maven action inside specific CI configuration before

deployment action

Page 25: Continuous DB migration based on carbon5 framework

Embedded mode

Page 26: Continuous DB migration based on carbon5 framework

Embedded mode

Schema Check is constituent part of application.

SQL changes are built-in into the application

Any checks and possible DB migration is performed every time

when application launches.

Dedicated bean to carry out this responsibility

Page 27: Continuous DB migration based on carbon5 framework

Create application bean import com.carbonfive.db.migration.DataSourceMigrationManager;

import com.carbonfive.db.migration.DriverManagerMigrationManager;

import com.carbonfive.db.migration.MigrationManager;

import com.carbonfive.db.migration.ResourceMigrationResolver;

public class DBMigratorImpl {

DataSource dataSource;

...

public void init(){

DataSourceMigrationManager migrationManager = new

DataSourceMigrationManager(dataSource);

migrationManager.setMigrationResolver(new

ResourceMigrationResolver("classpath:/db/migrations"));

migrationManager.migrate();

}

}

Page 28: Continuous DB migration based on carbon5 framework

Inject the bean into application context

Seamless integrated with Spring DI It is possible to initialize ResourceMigrationResolver

DataSourceMigrationManager directly though Spring DI without any line of code

Two places where bean might be integrated inside Spring context Before Persistent beans

After Persistent beans

Page 29: Continuous DB migration based on carbon5 framework

Embedded vs maven driven

E: Consistent and grace application upgrade

E: No delays between deployment and schema upgrade

M: Simple integration with CI

M: External commands like validate & reset

M: Quick manual migrations (hotfixes for instance)

Page 30: Continuous DB migration based on carbon5 framework

Carbon5 Benefits

Lightweight framework

Brilliant extensibility (thanks to reasonable design)

Support many DBMS in unofficial mode

Simple integration

Real continuous DB migration

Page 31: Continuous DB migration based on carbon5 framework

Need more features?

Page 32: Continuous DB migration based on carbon5 framework
Page 33: Continuous DB migration based on carbon5 framework

Flyway framework

Rich support for different build tools

The same integration approach on Carbon V

Pluggable architecture

Java-based migrations (two options: through JDBC Connection &

Spring JDBCTemplate)

Extended service table

Page 34: Continuous DB migration based on carbon5 framework

Best practices

Feature driven development (each SQL feature change in own

file)

Make sql files safe in order to prevent it from double execution

Keep database connection settings in single place (use shared

DataSource)

Do not make structure changes to the DB outside of your

framework

Page 35: Continuous DB migration based on carbon5 framework

What’s about schemaless

?

Page 36: Continuous DB migration based on carbon5 framework
Page 37: Continuous DB migration based on carbon5 framework

NoSQL migration approach

No dedicated explicit migration procedure (solved on business

level in case of needs)

No shutdown or downtime

Rolling update – Every domain entity has version number

– your v2 application should handle the v1 db format

– Write code to convert entity to v2 on a fly (repository level)

– Write modified entities to v2 on demand

Some DBs like RavenDB are able to perform auto-migration

Page 39: Continuous DB migration based on carbon5 framework

Presentation in a nutshell

Keep in mind this problem

Do not invent wheels, use external frameworks/techniques

And do not be afraid of Friday’s deployment then.

Page 40: Continuous DB migration based on carbon5 framework

Thank you!

Q&A