Migrations Automating Drupal · migration in this presentation, most if not all of these ideas...

38
Automating Drupal Migrations How to go from an Estimated One Week to Two Minutes Down Time

Transcript of Migrations Automating Drupal · migration in this presentation, most if not all of these ideas...

Page 1: Migrations Automating Drupal · migration in this presentation, most if not all of these ideas presented here should work for any Drupal to Drupal migration. Overview: Initial Plan/Estimates

Automating Drupal Migrations

How to go from an Estimated One Week to Two Minutes Down Time

Page 2: Migrations Automating Drupal · migration in this presentation, most if not all of these ideas presented here should work for any Drupal to Drupal migration. Overview: Initial Plan/Estimates

About Dan Harris

● Founder Webdrips.com ○ Drupal-based web design and development shop ○ Founded in July, 2011. ○ Nine years Drupal experience○ 21 years professional experience.

● Twitter @webdrips● Email [email protected]

Page 3: Migrations Automating Drupal · migration in this presentation, most if not all of these ideas presented here should work for any Drupal to Drupal migration. Overview: Initial Plan/Estimates

Note About the Migration Process

Although we’re covering a Drupal 6 to 7 migration in this presentation, most if not all of these ideas presented here should work for any Drupal to Drupal migration.

Page 4: Migrations Automating Drupal · migration in this presentation, most if not all of these ideas presented here should work for any Drupal to Drupal migration. Overview: Initial Plan/Estimates

Overview: Initial Plan/Estimates

● Initial estimate: one week of downtime● SQL queries would be used to export/import

when coverage was limited with Drupal Migrate

● Only automation provided by Migrate Modules● Existing Drupal 7 Architecture

Page 5: Migrations Automating Drupal · migration in this presentation, most if not all of these ideas presented here should work for any Drupal to Drupal migration. Overview: Initial Plan/Estimates

Overview: Updated Plan

● Virtually zero downtime ○ Intermediate: asking for one day down time or less

● Complete migration in one business day● Over 99% automated ● D7 site to be built during migration from

scratch

Page 6: Migrations Automating Drupal · migration in this presentation, most if not all of these ideas presented here should work for any Drupal to Drupal migration. Overview: Initial Plan/Estimates

About the Drupal 6 Site

● Architecturally, was a mess (Frankensite)○ Migration provided chance to clean up architecture

and code● Six custom themes (1 custom/5 subthemes)● 35 custom modules● 151 contributed modules

Page 7: Migrations Automating Drupal · migration in this presentation, most if not all of these ideas presented here should work for any Drupal to Drupal migration. Overview: Initial Plan/Estimates

About the Drupal 6 Site

● 1000 privileged users● About 400k non-privileged users● 25 Content Types, including Webforms● Over 2,500 pages

Page 8: Migrations Automating Drupal · migration in this presentation, most if not all of these ideas presented here should work for any Drupal to Drupal migration. Overview: Initial Plan/Estimates

About the Drupal 7 Site

● 106 Modules ● Bootstrap Primary Theme● One Bootstrap subtheme, Four sub-

subthemes ● Six content types only● 11 Features provided architecture

Page 9: Migrations Automating Drupal · migration in this presentation, most if not all of these ideas presented here should work for any Drupal to Drupal migration. Overview: Initial Plan/Estimates

Automated Migration Process

Requirements● Migrate modules: migrate, migrate_extras, migrate_d2d,

migrate_webform● Import modules: menu_import, path_redirect_import● Four custom modules● Scripts migration and deployment● Fast server with SSD

Page 10: Migrations Automating Drupal · migration in this presentation, most if not all of these ideas presented here should work for any Drupal to Drupal migration. Overview: Initial Plan/Estimates

Migration Script OverviewRequirements:● Create new Drupal D7 site● Build out site architecture with features● Enable Modules● Migrate D6 to D7● Import items that couldn’t be migratedThis provided for a repeatable/reliable process

Page 11: Migrations Automating Drupal · migration in this presentation, most if not all of these ideas presented here should work for any Drupal to Drupal migration. Overview: Initial Plan/Estimates

Migration Script Highlights (Review)

Build the site:drush site-install

Enable features and modules:drush en feature_name -y

Migrate each entity:drush mi entity

Page 12: Migrations Automating Drupal · migration in this presentation, most if not all of these ideas presented here should work for any Drupal to Drupal migration. Overview: Initial Plan/Estimates

Custom Migration Modules

1. Disable “edits” to the D6 sitea. Basically re-direct webform pages, admin pages,

and paths like node/add, node/edit, etc.2. Views (implemented with features) only for

migration status and post-processing3. Migrate_d2d module4. CSV-based Migration

Page 13: Migrations Automating Drupal · migration in this presentation, most if not all of these ideas presented here should work for any Drupal to Drupal migration. Overview: Initial Plan/Estimates

Drupal Migrate/D2D/Extras

● Handled most of the heavy lifting○ Everything except menu links, path redirects, and

slide shows● Extensive drush support ● Plenty of methods available to massage data● D2D: simplifies migration code

Page 14: Migrations Automating Drupal · migration in this presentation, most if not all of these ideas presented here should work for any Drupal to Drupal migration. Overview: Initial Plan/Estimates

Migrating Users

Challenges● Nearly 400K unprivileged users● Needed to assign users to organic groups

○ Based on how webform questions answered● Had to fix user passwords

○ Fixed by writing directly to the user table inside the migration

Page 15: Migrations Automating Drupal · migration in this presentation, most if not all of these ideas presented here should work for any Drupal to Drupal migration. Overview: Initial Plan/Estimates

Migrate Users Code

Unprivileged vs. Privileged was a simple query:class NvidiaPrivilegedUserMigration extends NvidiaUserMigration {

protected function query() {

$query = parent::query();

$query->condition('u.mail', '%nvidia.com', 'LIKE/NOT LIKE');

return $query;

}

}

Page 16: Migrations Automating Drupal · migration in this presentation, most if not all of these ideas presented here should work for any Drupal to Drupal migration. Overview: Initial Plan/Estimates

Migrate Users Code

Fix the password:public function complete($account, $row) {

parent::complete($account, $row);

$account->pass = $row->pass;

db_update('users')

->fields(array('pass' => $account->pass))

->condition('uid', $account->uid)

->execute();

$this->nvidia_memberships($row);

}

Page 17: Migrations Automating Drupal · migration in this presentation, most if not all of these ideas presented here should work for any Drupal to Drupal migration. Overview: Initial Plan/Estimates

Assign Users to Groups (Review) public function nvidia_memberships($row) {

$membership_query = Database::getConnection('default', 'd6source')->select('webform_submissions', 'ws');

$membership_query->join('webform_submitted_data', 'wd', 'wd.sid = ws.sid');

$membership_query->fields('wd', array('cid'));

$membership_query->fields('ws', array('nid'));

$membership_query->addExpression('group_concat(data)', 'data');

$membership_query->groupBy('ws.sid');

$membership_query->groupBy('cid');

$membership_query->condition('ws.uid', $row->uid);

$membership_query->condition('ws.nid', array(1234567,2345678,3456789,4567890,5678901), 'IN');

$membership_id = nvidia_og_membership_associate_user_with_program();

Page 18: Migrations Automating Drupal · migration in this presentation, most if not all of these ideas presented here should work for any Drupal to Drupal migration. Overview: Initial Plan/Estimates

Node Migration Challenges

● Body images & links with absolute paths● Empty fields sometimes caused display issues● Had to deal with “interesting” architecture

decisions on the D6 site● Moved larger files to the cloud● Reduced the number of content types

Page 19: Migrations Automating Drupal · migration in this presentation, most if not all of these ideas presented here should work for any Drupal to Drupal migration. Overview: Initial Plan/Estimates

Node Migration Code

Dealing with textarea images:● Needed to use Simple HTML DOM Parser● Code Review

Page 20: Migrations Automating Drupal · migration in this presentation, most if not all of these ideas presented here should work for any Drupal to Drupal migration. Overview: Initial Plan/Estimates

How a Strange Dev. Decision can Affect a Migration

D6 product page and dB variables table (review) led to the following code$variable_name = 'nvidia_product_disable_product_image_'.$row->nid;

// drush_print_r($variable_name);

$query = Database::getConnection('default', 'd6source')

->select('variable', 'v')

->fields('v', array('name', 'value'))

->condition('v.name', $variable_name, '=')

->execute()

->fetchAll();

$product_image_disabled = $query[0]->value;

if ($product_image_disabled == 'i:1;') {

$row->field_inline_image = NULL;

}

Page 21: Migrations Automating Drupal · migration in this presentation, most if not all of these ideas presented here should work for any Drupal to Drupal migration. Overview: Initial Plan/Estimates

Remove Empty Textarea Fieldspublic function prepare($entity, stdClass $row) {

foreach ($row as $key => $value) {

if (!isset($row->$key) || $row->$key === null) {

$entity->$key = NULL;

}

}

}

Page 22: Migrations Automating Drupal · migration in this presentation, most if not all of these ideas presented here should work for any Drupal to Drupal migration. Overview: Initial Plan/Estimates

“Non-Standard” Entity Migrations (Review)

● D2D handles established Drupal entities well○ nodes, users, taxonomy, etc.

● But what if you want to migrate block content to an entity?○ CSV Migration to the rescue

Page 23: Migrations Automating Drupal · migration in this presentation, most if not all of these ideas presented here should work for any Drupal to Drupal migration. Overview: Initial Plan/Estimates

Challenges

● Biggest challenge was reducing the migration time○ The original estimate just for migrating users was

over 40h○ Eventually that time was reduced to ~ 3 hours○ We tweaked my.cnf, php.ini, drush.ini○ Got a really fast server with Intel Xeon processors,

fast RAM, and a SSD

Page 24: Migrations Automating Drupal · migration in this presentation, most if not all of these ideas presented here should work for any Drupal to Drupal migration. Overview: Initial Plan/Estimates

Challenges

● Installation of modules in order○ circular dependencies○ features that add fields need to be installed before

migration● Relationships between content

○ Both nodes need to exist before creating a relationship

○ “Parent” content that did not exist in original site

Page 25: Migrations Automating Drupal · migration in this presentation, most if not all of these ideas presented here should work for any Drupal to Drupal migration. Overview: Initial Plan/Estimates

Migration timeline● -7days to release: Content freeze● -2days: Automated rebuild, content migration

and editorial approval.● -8h: Registration lockdown and migration

start● -2h: Batch processing of content by editors

and final tests

Page 26: Migrations Automating Drupal · migration in this presentation, most if not all of these ideas presented here should work for any Drupal to Drupal migration. Overview: Initial Plan/Estimates

Accelerating migration

● Use Drush● Single pass for each item

○ Migration objects are big and slow○ Don’t load an object from DB twice

● Multithreading○ https://www.deeson.co.uk/labs/multi-processing-part-2-how-make-migrate-move

Page 27: Migrations Automating Drupal · migration in this presentation, most if not all of these ideas presented here should work for any Drupal to Drupal migration. Overview: Initial Plan/Estimates

Add multithreading to a working migration class

● Not very portable○ needs a Drush extension○ needs to run on the ‘fast’ server

● Very effective

Page 28: Migrations Automating Drupal · migration in this presentation, most if not all of these ideas presented here should work for any Drupal to Drupal migration. Overview: Initial Plan/Estimates

Add multithreading to a working migration class● Sub-class the migration● Make all the sub-migrations use the same

index● Make the sub-migration work on a small

‘chunk’ of the index● Break the migration in parts and send

chunks of it to multiple threads

Page 29: Migrations Automating Drupal · migration in this presentation, most if not all of these ideas presented here should work for any Drupal to Drupal migration. Overview: Initial Plan/Estimates

Add multithreading to a working migration class<?php

class NVMultiThread extends NvidiaUnprivilegedUserMigration {

public function __construct($args) {

$args += array(

'source_connection' => NVIDIA_MIGRATE_SOURCE_DATABASE,

'source_version' => 6,

'format_mappings' => array(

'1' => 'filtered_html',

'2' => 'full_html',

'3' => 'plain_text',

'4' => 'full_html',

),

'description' => t('Multithreaded Migration of users from Drupal 6'),

'role_migration' => 'Role',

);

This is boilerplate needed by D2D

Page 30: Migrations Automating Drupal · migration in this presentation, most if not all of these ideas presented here should work for any Drupal to Drupal migration. Overview: Initial Plan/Estimates

Add multithreading to a working migration class

parent::__construct($args);

$this->limit = empty($args['limit']) ? 100 : $args['limit'];

$this->offset = empty($args['offset']) ? 0 : $args['offset'];

$this->map = new MigrateSQLMap('nvidiaunprivilegeduser',

array(

'uid' => array(

'type' => 'int',

'unsigned' => TRUE,

'not null' => TRUE,

'description' => 'User migration reference',

),

),

MigrateDestinationUser::getKeySchema()

);

}

map/index table

index definition

Page 31: Migrations Automating Drupal · migration in this presentation, most if not all of these ideas presented here should work for any Drupal to Drupal migration. Overview: Initial Plan/Estimates

Add multithreading to a working migration class

protected function query() {

$query = parent::query();

$query->range($this->arguments['offset'], $this->arguments['limit']);

return $query;

}

}

Modify original query to limit the number of items to work on

Page 32: Migrations Automating Drupal · migration in this presentation, most if not all of these ideas presented here should work for any Drupal to Drupal migration. Overview: Initial Plan/Estimates

Measuring the improvement

● Same server● Restore destination DB from backup after

each run● Same source DB● Both DBs in the same server● MySQL optimizations for concurrency issues

Page 33: Migrations Automating Drupal · migration in this presentation, most if not all of these ideas presented here should work for any Drupal to Drupal migration. Overview: Initial Plan/Estimates

Measuring the improvement

1000 rows, 100 per threadThreads Time Speed

1 71s 845/min

2 60s 1000/min

3 54s 1111/min

Page 34: Migrations Automating Drupal · migration in this presentation, most if not all of these ideas presented here should work for any Drupal to Drupal migration. Overview: Initial Plan/Estimates

Measuring the improvement

10,000 rows, 1000 per threadThreads Time Speed

1 707s 848/min

2 303s 1980/min

3 300s 2000/min

4 291s 2061/min

5 351s 1709/min

Page 35: Migrations Automating Drupal · migration in this presentation, most if not all of these ideas presented here should work for any Drupal to Drupal migration. Overview: Initial Plan/Estimates

Measuring the improvement

50,000 rows, 5000 per threadThreads Time Speed

3 1990s 1507/min

4 1562s 1920/min

5 1303s 2302/min

6 1637s 1832/min

Page 36: Migrations Automating Drupal · migration in this presentation, most if not all of these ideas presented here should work for any Drupal to Drupal migration. Overview: Initial Plan/Estimates

Conclusion

● Drop DNS TTL to 1 minute days before launch

● Repeatability is key● Migration is very powerful but can be slow● Automation helps drop downtime close to

zero

Page 37: Migrations Automating Drupal · migration in this presentation, most if not all of these ideas presented here should work for any Drupal to Drupal migration. Overview: Initial Plan/Estimates

Conclusion

● Ask for help● There’s many ways to use Migration, if one

way is not working drop it and use it differently○ CSV vs direct read from DB

● Weird things happen with orphaned fields