The Economist, миграция в Drupal

Аватар пользователя Nikit Nikit 3 октября 2010 в 8:11


Никит: Занимался по проблеме передачи настроек (системные, модульные: views, cck,...) сайта на друпал между dev -> uat -> prod с выборочным обменом данных (node, user, blocks...) по требованию клиента. Универсального решения не нашел, придётся написать кастомный. В поисках наткнулся на свежую статью, оказалось не то, но сумбурный перевод прилагаю. Статья в кратце описывает действия с модулем Migration с некоторыми дифирамбами.

Источник
The Economist

moshe weitzman - 1 октября, 2010 - 13:43
Компания The Economist теперь использует Drupal 6 для обслуживания большинства страниц их основного сайта economist.com, со всеми статьями, каналами, комментариями, и т.д. Для начала The Economist рассмотрел несколько CMS с открытым исходным кодом, а также просто частные решения ориентированные на медийные издательства. В итоге, The Economist выбрал Drupal за его "живое" сообщество со своей "экосистемой" модулей.  The Economist планирует добавлять много социальных инструментов к сайту, которые превратили бы старую платформу в медленную систему.

Для миграции огромного количества постоянно меняющихся данных в Drupal The Economist наняли Cyrve. C финансовой поддержкой и со всякими поощрениями от The Economist (Никит: ну не только они), Cyrve разработал модуль migrate который является сердцем методики миграции. The Economist и Cyrve надеются что эта статья поможет многим мигрировать в Drupal.

Перед миграцией

  • Около 3-х миллионов зарегистрированных пользователей
  • Скорость постинга превышает 1 комментарий в минуту. (?)
  • Сайт работает на Cold Fusion, СУБД Oracle.

Обзор источника данных

Обычно начинается с обзора страницы и определения где какой кусок данных сохранён в исходной системе. Наиболее интересные моменты для the Economist :

  • Исходная схема пытается наложить объектно-ориентированный дизайн на реляционную базу. Все виды контента записаны в центральной таблице cms_object, с раздельным хранением специфичных данных до второго уровня вложенности, что означает сложные запросы, даже для простых вещей. (?)
  • Текстовые данные хранятся как объект NITF в базе данных, требующую XML-обработку для миграции в друпал.
  • Много повторяющейся работы по кодировке в UTF8 с использованием iconv().
  • www.economist.com очень много использует ссылочные поля "node reference". При миграции, вы должны ссылаться на статью которой еще нет в базе данных (например, статья, имеющая несколько ссылок на другие статьи). Модуль Migrate поддерживает такие отношения. Она создает мнимую ноду если ссылочная нода не существует. И эта мнимая нода будет заполнена соответствующей информацией позже.

Разделение проекта на несколько отдельных миграций

Миграция представляет собой передачу из одного множества источника данных (обычно результат запроса) в типы материалов Drupal. Приемник может включать ноды, термины таксономии, пользователей и их профили, комментарии, или сообщения. Разделение в The Economist следующее:

  • Статьи
  • Издания (периодические)
  • Газеты (наши разные издания)
  • Покупатели (пользователи)
  • Роли пользователей
  • Блоги

Написание кода

Обслуживающие файлы миграции включены как в примере migrate_example module согласно документации. Сейчас уже есть версия 2.x для Drupal 6 или Drupal 7. Сущностью класса миграции является выбор запроса SQL или другого метода выборки данных, а также определение соотношения (далее, маппинг) между полями источника и свойствами в обьектах Drupal: $node, $user, $comment, etc. Пример миграции:


/**
* 4 основных компонента для настройки конструктора:
*  $this->source - экземпляр класса MigrateSource, они обеспечивает выдачу данных с источника.
*  $this->destination - экземпляр класса MigrateDestination, она принимает данные полученные с источника и маппированнеы
*  классом Migration, а также создает объекты Drupal.
*  $this->map - экземпляр класса MigrateMap, она отслеживает
*    какая импортированная запись источника и какой объект приёмника соответствуют друг другу.
*  Маппирование - используйте $this->addFieldMapping чтобы сказать классу Migration class какие поля
*    источника соответствуют полям приемника, с дополнительной информацией о маппинге
*/

class BeerTermMigration extends BasicExampleMigration {
  public function __construct() {
    parent::__construct();
    $this->description = t('Миграция стилей из базы источника в термины таксономии');

    // Создает объект map отслевиающий изменения между записями источника
    // и их результирующими объектами Drupal.
    $this->map = new MigrateSQLMap($this->machineName,
        array(
          'style' => array('type' => 'varchar',
                           'length' => 255,
                           'not null' => TRUE,
                           'description' => 'Topic ID',
                          )
        ),
        MigrateDestinationTerm::getKeySchema()
      );

   // Наш запрос
    $query = db_select('migrate_example_beer_topic', 'met')
             ->fields('met', array('style', 'details', 'style_parent', 'region', 'hoppiness'))
             // This sort assures that parents are saved before children.
             ->orderBy('style_parent', 'ASC');

    // Создаети объект MigrateSource, который управляет данными источника.
    $this->source = new MigrateSourceSQL($this, $query);

    // Настраиваем наш приемник  - термины словаря migrate_example_beer_styles
    $this->destination = new MigrateDestinationTerm('Migrate Example Beer Styles');

    // Ставим в соответствие К полям приемника ИЗ полей источника.
    $this->addFieldMapping('name', 'style');
    $this->addFieldMapping('description', 'details');

    // Документирование облегчает команде
    // на какой стадии находиться миграционный процесс.
    $this->addFieldMapping('parent_name', 'style_parent')
         ->description(t('The incoming style_parent field is the name of the term parent'));

    // Для открытых задач маппинга могут быть заданы приоритеты
    // (по-умолчанию MigrateFieldMapping::ISSUE_PRIORITY_OK). Если вы используете
    // систему управления проектами, и определили issuePattern (см. ExampleMigration)
    // вы можете назначить тикет в системе, а migrate_ui соединит её с папкой.
    $this->addFieldMapping(NULL, 'region')
         ->description('Will a field be added to the vocabulary for this?')
         ->issueGroup(t('Client Issues'))
         ->issuePriority(MigrateFieldMapping::ISSUE_PRIORITY_MEDIUM)
         ->issueNumber(770064);
  }
}
?>

Для миграции The Economist была использована Migrate 1, но мы изменили примеры и обсуждения этого поста применительно к Migrate 2.

Обработка данных

Данные в любом случае должны быть обработаны перед миграцией в друпал. Просто пример - конвертация DateTime в unix timestamp используемый в Drupal. Класс миграции обеспечивает следующий код для трансформации:
public function prepare(stdClass $account, stdClass $row) {
// Даты источника записаны в формате ISO.
$account->created = strtotime($account->created);
}
?>

Запуск миграции снова, и снова, и снова...

Для улучшения маппинга и трансформации, вы можете запускать миграцию снова и снова. Ключевая выгода модуля миграции- она делает этот процесс быстрее и не требует никаких усилий. Далее приведен пример обычной последовательности команд, где мы делаем импорт и откатываем изменения несколько раз.

drush migrate-import NAME --itemlimit=10
... смотрим на данные и страницы. записываем и фиксируем ошибки в коде ...
drush migrate-rollback NAME

drush migrate-import NAME --itemlimit=10
... смотрим на данные и страницы. записываем и фиксируем ошибки в коде ...
drush migrate-rollback NAME

drush migrate-import NAME --itemlimit=10
... вроде нормально, мигрируем остальные данные...
drush migrate-import NAME

Команды отката работают так свободно, потому что модуль migrate хранить соотношения между ID источника и ID объекта Drupal. С таким соотношением, мы можем удалить только нужные nodes/users/terms и т.д. созданные этой миграцией и не более. Также запомните, что мы можем ограничить миграцию 10 записями. Это немного быстрее чем запуск 3 миллионов или руками чистить прерванную миграцию. Альтернативой откатов и импорта является обновление на месте: drush migrate-import articles --updates. Мы использовали это когда откат удалил бы важные данные (например, откат ноды удалил бы его комментарии).

Заинтересованные стороны

Также очень полезным в модуле migrate являются страницы администриирования, который показывают клиентам и разработчикам что было приведено в соответствие, а что нет. Далее, открытые задачи о полях могут быть назначены клиентам или менеджеру миграции. Эти задачи могут быть соединены с системой управления проектами (см. рисунок).
Slideshows
Эти страницы облегчают страхи клиента перед импортом в Drupal. Миграция работающего сайта, такой как economist.com в новую платформу похожа на операцию на открытом сердце над твоим бизнесом. Cyrve и модуль migrate очень много работали чтобы сделать этот процесс обычным, надежным и повторяющимся.

Гарантии

Таблицы соответствия, дающие возможность отката, являются также ключом к аудиту данных. Процессы аудита могут быть выполнены для автоматического сравнения между записями источника и результирующих объектов Drupal, потому что мы точно знаем какой объект Drupal получился из заданного источника данных.

Производительность

Миграция тонны данных, такой как в www.economist.com, приводит нас к оптимизации вставки данных. Хорошим инструментом поиска замедлений является xhprof. Devel, drush и xhprof очень хорошо работают вместе, т.к. drush выдает URL на профилирующий отчет в конце каждого запуска. Используйте этот отчёт чтобы определить медленный код и удалите/оптимизируйте её. У нас в итоге получилось отключить модуль token.

Хранение изменений - инкрементная миграция

Большой бизнес, такой как The Economist, подходит с большой осторожностью при смене платформы. Чтобы минимизировать риски клиента и менеджеров миграции, модуль migrate поддерживает инкрементную миграцию в дополнение к миграции "всё за один раз". Инкрементная миграция импортирует только те записи, которые были добавлены или изменены после последнего запуска миграции. Эти записи определяются поддержкой "точкой предела" для каждой миграции, который задается первичным ключом или полями типа datetime в источнике данных. Модуль Migrate автоматически изменяет точку предела как только был произведен импорт. The Economist очень часто использовал эту возможность.

Запуск в интернет

Как только инкрементная миграция начала нормально работать, The Economist видел сайт Drupal на "стадии завершении разработки" с новыми содержимым/пользователями и т.д. Drupal был синхронизирован, отставание от реального сайта составляла 5 минут. Синхронизированный сайт был хорошим местом для определения багов дополнительно к багам импорта. Истинная красота в том как разработанный сайт запускается в интернет. Все что нужно - это сменить DNS старого сайта Cold Fusion на новый в Drupal.

$ nslookup economist.com
Non-authoritative answer:
Name: economist.com
Address: 64.14.173.20

Заметки

0 Thanks

Комментарии

Аватар пользователя Nikit Nikit 3 октября 2010 в 11:51

читаем статью: модуль токен был отключен из-за тормозов, возможно батчем запускают алиасы потихому, у некоторых уже есть нормальный алиас...

Аватар пользователя argon argon 3 октября 2010 в 12:07

Мне кажется с жиру бесятся - нафига нам сео-адекватные урлы... мы и так крутые

Аватар пользователя axel axel 3 октября 2010 в 18:28
argon wrote:

Мне кажется с жиру бесятся - нафига нам сео-адекватные урлы... мы и так крутые

Вот никак не возьму в толк, чем урлы вида example.com/novost-o-kakoy-to-figne лучше урлов вида example.com/node/123? Запоминать длинный заголовок не многим проще чем числовой nid. Да и ссылки копипастить на пару строк никак не удобнее, чем короткие строки с нидами.

Аватар пользователя Anton L. Safin Anton L. Safin 4 октября 2010 в 19:15

Каждая страница должна иметь уникальный адрес (URL). Желательно, чтобы вид URL давал представление о том, что содержится на соответствующей странице. Использование транслитерации в адресах страниц также позволит роботу понять, о чем может быть страница. Например, один только URL http://download.yandex.ru/company/experience/Baitin_Korrekciya%20gramotn... дает поисковому роботу множество информации о документе: его можно скачать; формат, скорее всего, PDF; документ, вероятно, релевантен запросу «коррекция грамотности» и так далее.

http://help.yandex.ru/webmaster/?id=1108946

Аватар пользователя argon argon 3 октября 2010 в 12:15

Чето не верится что у них раньше структура /node/ была - я не уверен конечно - но все равно это % 99 что новая

Зы. Думаете они прямо адресацию сохранили?

Аватар пользователя Valeratal Valeratal 3 октября 2010 в 13:17

таки global rediret

p.s. 17 лимонов нод впечатляет

у мну почти 38к и уже складывается впечатление, что тормоза из-за количества нод

Аватар пользователя Nikit Nikit 3 октября 2010 в 14:57

argon а то, знаешь как падает чсв применительно к сео когда меняется адрес :)

Аватар пользователя Valeratal Valeratal 3 октября 2010 в 15:22

хм, пример?, посещаемость
и чего у меня тогда тормозит :)

Имею в виду следующее
на hr-portale, 38к нод, добавление очередной идет долго (иногда более 30с)
на судбомене или на другом, нулевом сайте, на этом же VPS, все практически летает. Ноды добавляются быстро, всяки батчи (типа убрать с главной кучу нод) тоже быстро

Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 3 октября 2010 в 15:32
"Valeratal" wrote:

хм, пример?, посещаемость
и чего у меня тогда тормозит :)

Пример дать не могу, ибо проект сео-шный эксперимент.

почему тормозит хз, в каждом отдельном случае нужно разбираться, 38 000 нод это ниочём

Аватар пользователя Sinkora Sinkora 3 октября 2010 в 17:46
"RxB" wrote:

ниразу. 10 000 000 на шареде и всё чотко.

Ага, когда 1 юзер в онлайне (сам админ)!

Аватар пользователя Sinkora Sinkora 3 октября 2010 в 19:44
"Valeratal" wrote:

ну так ЧПУ
кинули ссылку, а по ссылке понятно о чем речь

А если название публикации поменяется? Менять урл или оставаться с прежним? Мое мнение - уникальные числовые идентификаторы лучше (например, 123, 03-10-2010-123 и т.п).

Аватар пользователя Sinkora Sinkora 3 октября 2010 в 19:44
"Valeratal" wrote:

ну так ЧПУ
кинули ссылку, а по ссылке понятно о чем речь

А если название публикации поменяется? Менять урл или оставаться с прежним? Мое мнение - уникальные числовые идентификаторы лучше (например, 123, 03-10-2010-123 и т.п).

Аватар пользователя Valeratal Valeratal 3 октября 2010 в 20:03

а если, а если
с какого должны адреса менятся?

ставите новый, модуль global redirect сам перенаправит (насколько я знаю)

Еще какие плюсы
в токены можно забивать тип публикаций, таким образом в ссылке получается виртуальный каталог - можно в статистике видеть какой тип публикаций более популярный.
Еще, для новостных сайтов, можно забивать и дату публикации. Тоже ихмо полезная штука

а node/123 это для программеров и для сайтов - грабберов контента (забил первую и последнию ноду и пошел выкачивать)

кстати, скачать что ли экономиста (шутка) :)

Аватар пользователя Sinkora Sinkora 3 октября 2010 в 20:21
"Valeratal" wrote:

а если, а если
с какого должны адреса менятся?

Пользователи любят менять названия своих публикаций.

"Valeratal" wrote:

в токены можно забивать тип публикаций, таким образом в ссылке получается виртуальный каталог

Такой вариант хорош:

news/123
forum/123
blog/123

в отличие от:

news/segodnya-pod-mostom-nashli-cherepahu-tartillu-s-bolshim-hvostom
forum/segodnya-pod-mostom-nashli-cherepahu-tartillu-s-bolshim-hvostom
blog/segodnya-pod-mostom-nashli-cherepahu-tartillu-s-bolshim-hvostom

И минус еще в том, что иногда заголовок материала может превышать допустимый размер для урла, тогда остается вариант усечения... Но это ж минус тоже.

А также минус в лишних дерганиях в базу для поиска каждого алиаса...

И еще, почему мне не нравятся алиасы. А что если возникнет необходимость переименовать/перетасовать разделы на сайте? В таком случае много проблем будет...

"Valeratal" wrote:

а node/123 это для программеров и для сайтов - грабберов контента (забил первую и последнию ноду и пошел выкачивать)

Ну, закачать граббером можно практически любой сайт, независимо от названия урлов;)

"Valeratal" wrote:

ставите новый, модуль global redirect сам перенаправит (насколько я знаю)

Не очень такое нравится...

А вообще, конечно, тут спорить нет смысла, кто как хочет - так и делает:)

Аватар пользователя Valeratal Valeratal 3 октября 2010 в 21:46

Ок
Зашли Вы в статистику
Видите что сеодня мегапопулярна страница news/1256

О чем это Вам скажет, кроме того, что это новость

Или, Вы кинули ссылку по аське кому нибудь - реципиенту тоже - только новость и все

То есть до перехода на сайт неочевидно - о чем эта публикация

Я надеюсь понятно разъяснил аббревиатуру ЧПУ.

p.s. У мну юзеры не меняют. А если меняют - то это как говорится не мои уже проблемы

Аватар пользователя Sinkora Sinkora 3 октября 2010 в 21:48
"Valeratal" wrote:

Ладно, каждому свое, спорить нет смысла. Но если брать мой случай, то для меня ЧПУ - большое зло.

Аватар пользователя Sinkora Sinkora 3 октября 2010 в 21:49
"Valeratal" wrote:

То есть до перехода на сайт неочевидно - о чем эта публикация

Обычно когда оставляют ссылку, то дают объяснение к ней;)

Аватар пользователя argon argon 4 октября 2010 в 8:14
"axel" wrote:

Вот никак не возьму в толк, чем урлы вида example.com/novost-o-kakoy-to-figne лучше урлов вида example.com/node/123? Запоминать длинный заголовок не многим проще чем числовой nid. Да и ссылки копипастить на пару строк никак не удобнее, чем короткие строки с нидами.

Тут какая ситуация - кроме чисто юзерского удобства (всетаки чпу видно до нажатия и примерно понятно куда идешь по ссылке) года 2 назад я делал эксперимент (вернее был свидетелем) с яндексом на тему его (яндекса) умения обратно переводить текст из транслитерации - обратно - и получил тогда весомые (имхо кончно) доказательства что все-таки наличие транслит-ключевиков имеет вес - в яндексе. Я не говорю что для всех сайтов это важно - допустим тот-же drupal.ru может без этого прекрасно обходиться - но для комм.сайтов - которые торгуют и у которых высокая конкуренция по запросам - я как правило ставлю транслитерацию имени и типа материала

ЗЫ. Попытался вспомнить как именно проверял адекватность яндекса на обратную транслитерацию... и не смог ))) забыл что именно делал. Но впрочем все сеошники и так твердят об этом постоянно..

Аватар пользователя WiseMan WiseMan 6 октября 2010 в 1:48

ЧПУ вида news/segodnya-pod-mostom-nashli-cherepahu-tartillu-s-bolshim-hvostom дают ощутимое преимущество при продвижении, в т.ч. в яндексе. Если в ЧПУ содержится транслитерация ключевика. Навпример, как выше "черепаха тартилла" )))

Специально проверял. Сейчас один из сайтов с ЧПУ с ключевиками горяздо лучше чебя чувствует чем тот где вроде ЧПУ, но ключевиков в ссылках нет.

Попробуйте поискать и по ряду запросов увидите что даже в ссылке в сниппетах подсвечивается ключевик. Будь он в транскрипции или на русском.

Правда на русском для пользователей жутко не практично, ИМХО. Т.к. копипаститься "некоректно" и т.п.

Что касается изменения пользователями текстов и титлов, так с этим только мириться. Пользователи в люьом случае не будут писасть оптимизированные статьи :)

Аватар пользователя orangeudav orangeudav 9 октября 2010 в 1:20

"облегчают страхи клиента" - это хорошо, это в цитатник. буду облегчать страхи..
было интересно почитать!

Аватар пользователя Dan Dan 29 октября 2010 в 13:14
"Valeratal" wrote:

на hr-portale, 38к нод, добавление очередной идет долго (иногда более 30с)

Ну и что? О чём это говорил? О том что друпал тяжёлая херня? Или о том, что ты сделал друпал таким? Или может о том, что у тебя супер-хостинг.
Пример трёхдневной давности. Знакомый попросил оптимизировать сайт, который был о-о-о-очень медленный (из под зарегенного юзера открытие страницы порядка 30 сек). Просмотрел всё что только можно - ничего. Вроде по частям всё работает хорошо - запросы обрабатываются более-менее быстро, БД тоже не тормозит. Потом уже полез смотреть как работает сам сервак (это ВДС был). Оказалось, постоянно висит какой-то процесс, который отнимает 30% CPU! На моё замечание об этом процессе, знакомый ответил "Да, знаю. Хз что такое. Хостер этот процесс найти и обезвредить не может" (хостинг hc.ru - страна должна знать героев). Разбираться я не стал (судя по всему у них там руткит) и предложил сменить хостинг. Переехали для тестов на патруль за 100 рублей - сайт летает.
Есть и другой пример, когда хостинг был хорош, но обилие модулей (200 штук!) и кривой код сделали из сайта черепашку (не ниндзя, просто черепашку). Хотя хозяин вовсю костерил хостинг.
Вывод: прежде чем хаять друпал - проверьте хостинг и прежде чем хаять хостинг - проверьте друпал.

"Anton L. Safin" wrote:

Например, один только URL http://download.yandex.ru/company/experience/Baitin_Korrekciya%20gramotn... дает поисковому роботу множество информации о документе: его можно скачать;

Смотри, твой URL обрезался, какой от него толк? Да и выглядит он ужасно. А с учётом распространения сокращателей ссылок, ЧПУ вообще становятся только ненужной обузой, которую юзают только поисковики.
Вердикт: ЧПУ для СЕО-дрочеров.

Аватар пользователя Sinkora Sinkora 29 октября 2010 в 22:53
"Dan" wrote:

хостинг hc.ru - страна должна знать героев

Ну, не знаю. Мне нравится их хостинг, проблем не бывает:)

Аватар пользователя Dan Dan 30 октября 2010 в 9:10

Ну, знакомого хостинг тоже всем устраивал. У него претензии-то были к сайту, который тормозит, а не к хостингу.

Аватар пользователя petrovnn petrovnn 30 октября 2010 в 17:03
"Sinkora" wrote:

Ну, не знаю. Мне нравится их хостинг, проблем не бывает:)

эээ... ты держишь на этом хосте сайты на друпале??? виртуальный сервер или шаред?

А то я одному клиенту поставил два магазина с посещалкой 30 чел. в день, кеш включил, объединение файлов включил, лишних модулей нет, точнее вообще почти нет кроме уберкарта (ну views, cck, pathauto считаю стандартом). товаров-то не много - пару десятков на каждом.

И вот этот хостер через некоторое время стал пищать что мол "превышен лимит операций ввода-вывода". Нужно уточнить, что это spb.hc.ru - возможно другой дата-центр, или вообще какой-нить перекупленый HC питерского разлива и работающий теперь под их брендом.

Quote:

Превышен лимит на число операций ввода-вывода.
Использовано 456921 из 400000.

Правда за какой период это число я не понял из их мутного письма. Конечно может у меня частный случай, но прецедент был. Впрочем наверное у Dan-а тоже частный случай ;)

Аватар пользователя Nikit Nikit 18 августа 2012 в 6:31

ну вроде старая статья. Читая это сейчас, ужасаюсь своему переводу :)