 | Уровень сложности: средний Теодор Златанов, программист, Gold Software Systems
02.07.2009 Эта серия из пяти статей познакомит вас с созданием простого фотохостинга при помощи Perl и Apache c использованием служб Amazon Simple Storage Service (S3; Служба простого хранения) и SimpleDB. В этом разделе будет рассказано о преимуществах и недостатках S3 и SimpleDB, об их архитектуре и начата разработка фотохостинга.
Итак, вы хотите узнать о двух 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"
}
|
 |
Важное примечание Несколько похожих служб предлагает Google. В этой серии статей не делается никого сравнения между Web-сервисами от Amazon и Google. Множество таких сравнений можно найти в Интернете. В этой серии статей также не обсуждаются другие службы Amazon, такие как Elastic Compute Cloud (EC2), хотя они являются интересными и полезными и, безусловно, могли бы помочь в создании Web-сайта. Наконец, существуют другие распределенные базы данных с поддержкой ключевых значений, такие как CouchDB, в некоторых отношениях превосходящие SimpleDB.
Я настоятельно рекомендую вам познакомиться и с ними тоже. |
|
Мы будем создавать комментарии при помощи ключа reply_to (ответить). Каждый ответ будет иметь в качестве уникального ключа случайную строку (random string).
Обратите внимание, что мы соблюдаем ряд соглашений:
- Отсутствие атрибута
user обозначает анонимный комментарий.
- URL-адрес фотографии объединяет все комментарии, поэтому изменять его нельзя.
- Объекты S3 также имеют URL-адреса, содержащие имена блоков, чтобы обозначить их в качестве объектов S3.
- Повторение URL-адресов не разрешается, потому что URL-адрес является ключом объекта.
Это не окончательная версия дизайна таблицы (напоминаю вам, что SimpleDB очень гибка), но этого достаточно для начала.
Заключение
Вы познакомились с некоторыми достоинствами и недостатками S3 и SimpleDB. Не претендуя на полноту, это руководство тем не менее должно помочь вам решить, подходят ли Amazon S3 и SimpleDB для вашего проекта.
Сначала мы создали в SimpleDB простой список заданий, а потом показали, как начать создавать таблицы для размещения данных, фотографий, пользователей и комментариев. Во второй части я настрою Web-сайт (Apache с
mod_perl) и библиотеки для работы с S3 и SimpleDB.
Ресурсы Научиться
Получить продукты и технологии
Обсудить
Об авторе  | |  | Теодор Златанов (Teodor Zlatanov) получил диплом магистра по вычислительной технике в Boston University в 1999. Он работает программистом с 1992, используя Perl, Java, C, и C++. Он интересуется работами с открытым исходным кодом по синтаксическому анализу текста, трехуровневыми архитектурами клиент-серверных баз данных, системным администрированием UNIX, CORBA и управлением проектами. |
Выскажите мнение об этой странице
|  |