Искусственный жемчуг: Perl и «облачные вычисления» Amazon. Часть 1

Изучаем основы служб Amazon S3 и SimpleDB на примере разработки простого фотохостинга

Эта серия из пяти статей познакомит вас с созданием простого фотохостинга при помощи Perl и Apache c использованием служб Amazon Simple Storage Service (S3; Служба простого хранения) и SimpleDB. В этом разделе будет рассказано о преимуществах и недостатках S3 и SimpleDB, об их архитектуре и начата разработка фотохостинга.

Теодор Златанов, программист, Gold Software Systems

Теодор Златанов (Teodor Zlatanov) получил диплом магистра по вычислительной технике в Boston University в 1999. Он работает программистом с 1992, используя Perl, Java, C, и C++. Он интересуется работами с открытым исходным кодом по синтаксическому анализу текста, трехуровневыми архитектурами клиент-серверных баз данных, системным администрированием UNIX, CORBA и управлением проектами.



02.07.2009

Итак, вы хотите узнать о двух Web-службах Amazon: S3 (Simple Storage Service) и SimpleDB. Что может быть лучше, чем обучение на практике? В данном случае вы создадите простой фотохостинг.

Создание сайта с проработанным дизайном не является нашей целью, на это понадобится слишком много времени. Кроме того, создание сайта – сложное дело, и техническая сторона - только часть уравнения, поэтому, пожалуйста, не присылайте мне жалобы типа: «чувак, твоя инструкция отстой», если ваш сайт выйдувполесконем точка ком не принес вам миллион за первую неделю. (Но если все же принес, вспомните того, кто вас этому научил.)

Чтобы получить больше от этой серии статей

Эта серия требует начальных знаний о HTTP и HTML, а также знаний среднего уровня о JavaScript и Perl (в составе модуля Apache mod_perl). Вам пригодятся знания о реляционных базах данных, дисковых системах хранения и работе сети. Следующие статьи серии будут все в большей степени техническими, поэтому если вам необходима помощь в этих темах, обратитесь к разделу Ресурсы.

Я буду использовать в этой серии статей share.lifelogs.com в качестве имени домена. Итак, давайте познакомимся с Amazon S3.

Обзор Amazon S3

Сейчас я ненадолго стану администратором UNIX® и расскажу вам, что резервное копирование и хранение файлов - это не просто службы. Радуйтесь, если такие аббревиатуры как SAN, NAS, LUN, LVM, RAID, JBOD, IDE и SCSI, для вас ничего не означают. В противном случае вам несомненно доводилось утираться за обедом заплаканным платочком с верой в лучший способ управления данными после, скажем, трех месяцев восстановления DLT-архивов четырехлетней давности. Хотя и мне этого делать не приходилось.

IBM и Web-службы Amazon

«Облачные» вычисления предоставляют способ разработки приложений в виртуальной среде, в которой вычислительные возможности, пропускная способность, безопасность и надежность не представляют проблем, потому что вам не нужно устанавливать программное обеспечение на свой компьютер. В виртуальной вычислительной среде вы можете разрабатывать приложения, разворачивать их и управлять ими, оплачивая только время и используемые ресурсы, увеличивая и уменьшая их потребление в соответствии изменением потребностей или требованиями бизнеса.

IBM в сотрудничестве c Amazon предоставляет доступ к своим программным продуктам в виртуальной среде Amazon Elastic Compute Cloud (EC2). В EC2 имеется доступ к следующим программам IBM:

  • DB2® Express-C 9.5
  • Informix® Dynamic Server Developer Edition 11.5
  • WebSphere® Portal Server and Lotus® Web Content Management Standard Edition
  • WebSphere sMash

Это полноценный продукт, поддерживающий все функции и параметры. Получить дополнительную информацию и загрузить образы Amazon Machine Images для этих продуктов можно в разделе сайта IBM developerWorks Ресурсном центре облачных вычислений(EN). Там же можно найти дополнительную информацию об облачных вычислениях.

Служба Amazon S3 представляет собой распределенную систему хранения. Если вы готовы доверить Amazon свои данные, она сделает жизнь в целом немного проще. Разумеется, для полной уверенности вы всегда можете выполнять резервное копирование своими средствами. Еще одна возможная проблема - требования безопасности: размещение данных в S3 подразумевает использование системы управления доступом S3, которая может не удовлетворять вашим требованиями к аутентификации и авторизации. Подробности можно узнать в документации по S3, приведенной в разделе Ресурсы.

Как работает S3? Для предоставления доступа к файлам S3 использует ключ пользователя (длинная строка произвольного содержания) и пароль пользователя (другая строка произвольного содержания). Оплата производится согласно прайсу Amazon S3, который можно найти на их сайте. Это не слишком дорого, по сравнению со стоимостью содержания собственных NAS, SAN или локальных дисков цены на услуги S3 весьма разумные.

По состоянию на начало 2009 года данные S3 хранились в двух центрах обработки данных Amazon (в США и Европе) с хорошим подключением к сети. Если вы хотите предоставлять доступ к данным большому количеству пользователей за пределами США и Европы, вам лучше использовать такие службы, как Gomez или Keynote, созданные для обработки запросов по всему миру. Но даже если вы находитесь в США или Европе, но ваш бизнес зависит от быстрой и надежной обработки данных, необходимо проводить ежедневные тесты производительности используемой службы.

Основной проблемой при использовании распределенной системы хранения является задержка обновления. Это промежуток времени между операцией над данными, выполняемой пользователем, и ее реализацией. Само по себе время между действием и его исполнением не является причиной для беспокойства, проблема в том, что задержка исполнения может быть неравномерной, поэтому в одно и то же время пользователи могут видеть разное содержимое. Amazon гарантирует корректность данных на сервере; это означает, что пользователи не увидят поврежденные данные, но при использовании S3 необходимо принимать во внимание возможные нюансы. Когда вы загружаете, изменяете или удаляете изображение, не рассчитывайте, что изменения вступят в силу немедленно.

В архиве CPAN имеются библиотеки Perl для доступа к S3 (см. раздел Ресурсы). Хорошим выбором является Net::Amazon::S3, но на странице ресурсов Amazon S3 перечислены и многие другие варианты. Нам они не понадобятся, поскольку наша интеграция и S3 при загрузке содержимого использует функции S3 в обход кода Perl. Кроме того, существует много хороших средств для доступа к S3, которые легко и удобно управляют вашими данными без использования Perl, - например, JungleDisk или расширение S3Fox для Firefox.


Пример использования Amazon S3

Теперь перейдем к тому, что можно сделать при помощи S3. Файлы (называемые в S3 объектами) хранятся в блоках. Для каждого блока имя файла (его ключ) является уникальным. Вы можете присваивать файлам атрибуты, такие как «цвет» или «язык», но они не будут являться частью имени файла.

Например, вы храните изображение флага США в файле "images/flag.png" блока "us.images.share.lifelogs.com" и изображение флага Германии в файле "images/flag.png" блока "de.images.share.lifelogs.com" (одинаковые имена, но разные блоки). Пользователи могут загрузить флаг США по ссылке http://us.images.share.lifelogs.com.s3.amazonaws.com/images/flag.png, а флаг Германии по ссылке http://de.images.share.lifelogs.com.s3.amazonaws.com/images/flag.png. Кроме того, мы можем задать в DNS псевдоним alias de.images.share.lifelogs.com для de.images.share.lifelogs.com.s3.amazonaws.com (и аналогично для us.images.share.lifelogs.com), поэтому пользователю для получения изображений флагов достаточно будет запросить http://us.images.share.lifelogs.com/images/flag.png или http://de.images.share.lifelogs.com/images/flag.png.

Обратите внимание, что имена блоков должны быть уникальны для всех учетных записей Amazon S3, поэтому названия типа "test" и "default" не подходят. По возможности присваивайте блокам имя, включающее полное имя домена. Это упрощает идентификацию блоков и их использование в DNS. Кроме того, для имен блоков существует ряд ограничений, поэтому не пытайтесь впихнуть в имя целый роман. Используйте символы, разрешенные для использования в имени домена.

S3 является сложной службой, поэтому я советую вам до начала работы посетить домашнюю страницу S3.


Обзор Amazon SimpleDB

На этом разделе профессиональные лекторы и институтские преподаватели громко произносят специальную фразу, чтобы разбудить храпящих парней в первом ряду, накануне налегавших на текилу до 3 часов ночи: БАЗЫ ДАННЫХ – ЭТО ВАЖНО!!!

Вы проснулись?

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

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

Таблица 1. Таблица todo_foreign
ЗаданиеКод статуса
(Внешний ключ для статуса, код статуса,
по умолчанию 0)
Позвонить маме0
Позвонить в налоговую2
Купить молоко1
Таблица 2. Таблица статусов
Код статусаОписание статуса
0активно
1готово
2удалено

Вы скажите: «Погодите! А как же данные о том, что задание было завершено или удалено, кто его изменил и какие типы данных используются? В конце концов, именно для этого мы готовим мудрых и могучих администраторов баз данных. Они знают все о нормальных формах, внешних ключах и SQL. Вам наверняка понадобится администратор, чтобы присматривать за вашей системой, не так ли?»

Да, благодарю вас, г-н Умник, но оставьте в покое мой простой пример. Утешитесь попозже, обнявшись с книжкой «Секреты богов SQL и СУБД для чайников».

Amazon SimpleDB является распределенной базой данных с поддержкой ключей и атрибутов. Она определенно подходит не для всякого бизнеса и имеет жесткие ограничения по производительности и масштабируемости. Атрибуты ограничены размером в 1 КБ, поэтому названия ваших заданий не могут превышать это значение.

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

Упомянутая проблема с задержками S3 в равной степени относится и к SimpleDB. Изменения могут применяться неравномерно.

Нашему простому примеру базы данных будет соответствовать следующая структура SimpleDB:

Таблица 3. Структура SimpleDB todo
ЗаданиеСтатус
Позвонить мамеактивно
Позвонить в налоговуюудалено
Купить молокоготово

Пока все идет нормально. Это проще чем первый пример, не так ли? Давайте добавим еще одно задание:

Купить мясаактивно

Вы видите, что статус дублируется? Слово активно теперь хранится в базе данных дважды. При больших таблицах это может быть накладно с точки зрения хранения и производительности. Зато мы сделали каждую строку SimpleDB автономной. Получая эту строку, вы получаете все, что в ней хранится. Вам не нужно искать описание статуса. Это существенно, учитывая задержки обновления SimpleDB.


Дополняем список заданий SimpleDB

Предположим, что вы добавили новый код статуса waituntiltomorrow (отложить до завтра), и применили его к одному заданию в таблице todo_foreign (таблица 1 с внешними ключами). Таким образом, у вас два обновления (таблицы статусов и todo_foreign). Если обновление таблицы статусов (таблица 2) произойдет после обновления todo_foreign, вы получите несогласованные данные. Помните, что SimpleDB не гарантирует немедленное вступление в силу обновлений в порядке их внесения, поэтому, кроме проблем с производительностью, вы столкнетесь с двумя табличными поисками (один для задания и другой для описания статуса) и можете получить несовместимые данные.

В этом заключается ключ к пониманию SimpleDB, забудьте о столбцах в todo_simple (таблица 2). В SimpleDB нет столбцов! Она содержит атрибуты для каждой строки. Эти атрибуты не являются статическими, вы можете добавлять или удалять их как угодно. Вам нужно, чтобы у заданий были даты создания и удаления? Просто добавьте им нужные атрибуты. В todo_foreign потребуются два столбца. Дата удаления может быть пустой, что означает, что задание еще активно. Давайте добавим дополнительный столбец для даты завершения задания. Или, может быть, нужно добавить только код статуса и использовать дату удаления в качестве даты завершения. Что делать?

Метод SimpleDB заключается в том, чтобы просто делать то, что нам нужно. Вам нужна дата создания? Добавьте атрибут created_date (дата создания). Дата удаления? Присвойте этот атрибут только удаленным заданиям. Само наличие атрибута говорит нам, что он применим к данному объекту.

Перестаньте думать о столбцах. Строки SimpleDB скорее похожи на хэши Perl. Все ключи являются строками. Все значения являются строками или массивами строк. Давайте снова вернемся к нашей разработке.

Листинг 1. todo_freeform
{ item: "call Mom" }
{ item: "call IRS", deleted_date: "2009-03-01" }
{ item: "get milk", done_date: "2009-03-02" }

Обратите внимание, что SimpleDB имеет неявный ключ ItemName, который в данном случае является значением списка заданий в виде строки:

Листинг 2. список заданий в SimpleDB
"call Mom" {  }
"call IRS" { deleted_date: "2009-03-01" }
"get milk" { done_date: "2009-03-02" }

SimpleDB не поддерживает объекты без атрибутов, поэтому присвоим всем объектам атрибут created_date attribute, like so:

Листинг 3. список заданий в SimpleDB с добавленным атрибутом created_date
"call Mom" { created_date: "2009-02-01" }
"call IRS" { created_date: "2009-02-01", deleted_date: "2009-03-01" }
"get milk" { created_date: "2009-02-01", done_date: "2009-03-02" }

Вы воскликнете: «Как! Действительно все является строками? Данные не типизированы строго? Ааааа! Ужас!»

Да. Все является строками. Разве это не прекрасно?

Поэтому вы можете добавить атрибут deletereason (причина удаления) для любого удаленного задания в этой таблице через три месяца после того, как таблицу создали. Это ничего не нарушает, и только новый код, который знает об этом атрибуте, сможет его использовать.

Здесь я для драматизма сделаю паузу, во время которой администраторы баз данных могут принять аспирин. В это время программисты на Perl подадут им стакан воды, просто потому, что мы классные парни.

Вернемся к нашему примеру. Мы переходим к важному разделу, в котором рассказывается о запросах, которые выводят активные, удаленные или выполненные задания. Это действительно просто, все параметры запросов вы можете найти в документации SimpleDB. Мы будем использовать оператор SELECT. Кроме того, существует оператор QUERY, но SELECT ближе к SQL и, соответственно, понятней для большинства читателей.

Листинг 4. Запросы к todo_freeform
-- get active
select * from todo_freeform where done_date is null and deleted_date is null
-- get deleted
select * from todo_freeform where deleted_date is not null
-- get done
select * from todo_freeform where done_date is not null

Двинемся дальше. Теперь давайте свяжем вместе SimpleDB и S3.


Интеграция Web-служб и фотохостинга

Следующий вопрос, который вы, вероятно, зададите: «Как мне связать SimpleDB и S3?» (Они не связаны по умолчанию, за исключением используемой модели управления доступом.) Это легко: можно просто хранить название блока и имя объекта S3 в SimpleDB. В любом случае хватит о списке заданий, давайте приступим к созданию фотохостинга.

Для нашего сайта необходимо хранить фотографии в S3, а комментарии пользователей в SimpleDB. Как быть с учетными записями пользователей? Нам нужно свыкнуться с распределенной природой SimpleDB, которая означает, что иногда придется сталкиваться с неисправными аккаунтами (например, когда пользователь не вышел из сеанса, но в базе данных хранится информация о том, что он вышел). Тем не менее мы будем хранить учетные данные в SimpleDB. Это позволяет не зависеть от любых внешних баз данных, поскольку в данном случае целью является побыстрее создать сайт, используя в качестве связующего только немного кода Perl, исполняемого модулем mod_perl, и выполняя все основные операции средствами S3 и SimpleDB.

Для начала нам понадобится таблица для фотографий. Записи могут выглядеть следующим образом:

Листинг 5. Таблица записей для фотографий share_photos
"http://developer.amazonwebservices.com/connect/images/amazon/logo_aws.gif" 
{ user: "ted", name: "Amazon Logo"}

"http://images.share.lifelogs.com/funny.jpg" 
{ user: "bob", name: "Funny Picture",  s3bucket: "images.share.lifelogs.com" }

Теперь таблица пользователей:

Листинг 6. Таблица пользователей share_users
"ted" { given: "Ted", family: "Zlatanov" }
"bob" { given: "Bob", family: "Leech" }

И комментарии:

Листинг 7. Комментарии share_comments
"random-string"
{ 
 url: "http://images.share.lifelogs.com/funny.jpg",
 comment: "Ha ha", 
 posted_when: "2009-03-01T19:00:00+05" 
}

"random-string2"
{ 
 user: "ted",
 url: "http://developer.amazonwebservices.com/connect/images/amazon/logo_aws.gif", 
 comment: "No it doesn't", 
 posted_when: "2009-03-01T20:00:01+05" 
}

"random-string3"
{ 
 url: "http://developer.amazonwebservices.com/connect/images/amazon/logo_aws.gif", 
 comment: "No it doesn't", 
 reply_to: "random-string2", 
 posted_when: "2009-03-01T20:00:01+05" 
}

Важное примечание

Мы будем создавать комментарии при помощи ключа reply_to (ответить). Каждый ответ будет иметь в качестве уникального ключа случайную строку (random string).

Обратите внимание, что мы соблюдаем ряд соглашений:

  • Отсутствие атрибута user обозначает анонимный комментарий.
  • URL-адрес фотографии объединяет все комментарии, поэтому изменять его нельзя.
  • Объекты S3 также имеют URL-адреса, содержащие имена блоков, чтобы обозначить их в качестве объектов S3.
  • Повторение URL-адресов не разрешается, потому что URL-адрес является ключом объекта.

Это не окончательная версия дизайна таблицы (напоминаю вам, что SimpleDB очень гибка), но этого достаточно для начала.


Заключение

Вы познакомились с некоторыми достоинствами и недостатками S3 и SimpleDB. Не претендуя на полноту, это руководство тем не менее должно помочь вам решить, подходят ли Amazon S3 и SimpleDB для вашего проекта.

Сначала мы создали в SimpleDB простой список заданий, а потом показали, как начать создавать таблицы для размещения данных, фотографий, пользователей и комментариев. Во второй части я настрою Web-сайт (Apache с mod_perl) и библиотеки для работы с S3 и SimpleDB.

Ресурсы

Научиться

Получить продукты и технологии

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Linux, Open source
ArticleID=405937
ArticleTitle=Искусственный жемчуг: Perl и «облачные вычисления» Amazon. Часть 1
publish-date=07022009