- PVSM.RU - https://www.pvsm.ru -
Здравствуйте.
Предлагаю вашему вниманию перевод первой статьи из цикла сравнения сервисов, предоставляемых Windows Azure и Amazon, который пишется достаточно известным в облачных кругах специалистом — Gaurav Mantri.
В этой статье я сравню Windows Azure Table Storage и Amazon DynamoDB – WATS и ADDB соответственно.
С точки зрения функциональности WATS и ADDB предоставляют похожие возможности. Обе – NoSQL-системы, предназначенные для хранения большого количества данных. Amazon также имеет еще одну базу данных NoSQL – SimpleDB [1].
Важным моментом, который необходимо отметить, является то, что ADDB – не просто NoSQL-база данных. Это сервис баз данных. Да, это правда, что он используется для управления данными, однако вы контролируете степень масштабируемости системы с помощью пропускной способности, которая вам необходима. В этом смысле всё это весьма похоже на экземпляры сервиса вычислений Amazon или Windows Azure. В случае экземпляра сервиса вычислений вы выбираете, какой размер экземпляра вам нужен, и система реагирует на запрос. Аналогично в случае ADDB – вы сообщаете системе, как много операций чтения и записи будет производить ваше приложение в таблицу ADDB, и ADDB выделяет необходимые мощности.
Концептуально обе системы похожи:
Естественно, есть несколько существенных различий:
Концепции
Таблица: когда мы думаем о таблице, то первым, что приходит в голову, является утверждение, что это “что-то, что состоит из строк и столбцов”. Таблица в WATS и ADDB может выглядеть так, как мы представляем себе, но на самом деле это не так. Рассматривайте таблицу как контейнер, содержащий коллекции пар ключ-значение, отображающих данные. В реляционной модели мы определяем столбцы для таблиц, и строки содержат данные. Для хранения данных в таблице вы должны определить столбцы. Таблица в WATS и ADDB не содержит схему, то есть столбцы определять необходимости нет. Короче говоря, рассматривайте таблицу как мешок, куда вы складываете нужные данные.
Несмотря на то, что концептуально таблицы в обеих системах являются контейнерами для хранения данных, между ними есть несколько различий:
Сущность и объект: То, что определяет данные в таблице. Каждая сущность (в WATS) и объект (item, ADDB) состоит из одного или более атрибутов. Атрибут – это коллекция пар ключ-значений (ключ-значение-данные в WATS). В реляционных базах данных это была бы строка. Здесь же каждая строка в таблице или домене не имеет связей с другими строками. Каждая сущность в WATS уникально идентифицируется двумя атрибутами: PartitionKey и RowKey — рассматривайте это как композитный первичный ключ. Каждая сущность должна иметь уникальную комбинацию этих атрибутов. В ADDB каждый объект уникально идентифицируется первичным ключом, который является одним из атрибутов объекта. Все объекты в таблице ADDB должны иметь первичный ключ.
Между сущностью и объектом есть несколько различий:
ADDB поддерживает два типа первичных ключей:
Выделение пропускной способности
Одной из наиболее важных функций в ADDB является выделение пропускной способности, позволяющей настроить необходимую пропускную способность для приложения. Вкратце – выделение пропускной способности определяет, как много операций чтения и записи в минуту может быть совершено для таблицы ADDB. Основываясь на предоставленных вами значениях, ADDS выделяет соответствующие ресурсы, при этом вы можете обновить конфигурацию налету с использованием API или Amazon Management Console.
Выделение пропускной способности оперирует двумя терминами — Read Capacity Units для операций чтения и Write Capacity Units для операций записи.
Read Capacity Unit определяется как количество операций согласованного чтения в секунду в блоке 1 Кб. Так, если вы запросили 10 RCU, это значит, что вы можете выполнить операции согласованного чтения на 10 объектах до 1 Кб в размере в секунду. Если размер объекта более чем 1 Кб, количество объектов, которые вы можете прочитать в секунду, будет меньше. Например, если ваши объекты имеют размер 1 и 2 Кб, вы сможете совершить только 5 операций согласованного чтения в секунду перед тем, как система начнет вас ограничивать.Если вы хотите вместо согласованного чтения использовать согласованное в конечном счете чтение (eventually consistent read), пропускная способность обычно удваивается – если вы запросили 10 RCU, вы сможете сделать 20 операций согласованного в конечном счете чтения на объектах в 1 Кб и меньше.
Аналогично с Write Capacity Unit – количество операций чтения или записи на 1 Кб. Если запрошено 10 WCU, можно будет совершить запись 10 объектов до 1 Кб в размере в секунду. Если размер объекта превышает 1 Кб, количество объектов для записи в секунду уменьшается. Например, если размер объектов между 1 и 2 Кб, можно будет совершить 5 операций записи в секунду перед тем как система начнет ограничение.
Обратите внимание, что выделение пропускной способности имеет особенности в вопросе ценообразования, так как цены на ADDB формируются отдельно от остальных сервисов. По сути, вы платите за операции чтения и записи, зарезервированные вами. На момент написания статьи вы заплатили бы $0.01 / час за каждые 10 unit of write capacity и $0.01 / час за каждые 50 units write capacity в датацентре в US East (Virginia). В принципе, ценообразование аналогично тому, как формируются цены за экземпляры вычислительных сервисов, в случае которых вы запрашиваете виртуальную машину определенного размера (с определенными мощностями и RAM) и почасово платите за эту виртуальную машину вне зависимости от того, полностью ли вы загружаете ее или нет. Аналогично в ADDB – вы платите почасово за пропускную способность, которую вы запросили у Amazon, вне зависимости от степени ее использования.
Когда дело доходит до выделения пропускной способности, возникает несколько моментов, которые необходимо учитывать:
Цены
Перед тем как мы поговорим о функциональности, предоставляемой каждой из систем, давайте посмотрим на ценообразование. В обеих системах нет “капитальных” затрат. К компонентам, входящим в ценообразование, относятся:
Ценообразование в ADDB более предсказуемо, нежели ценообразование в WATS, однако необходимо правильно подсчитать необходимую пропускную способность, чтобы не платить за лишние запросы или не вызывать их ограничение системой.
Список функций
| WATS | ADDB | |
| Create Table/CreateTable [6] | Да [7] | Да [8] |
| Query Tables/ListTables [9] | Да [10] | Да [11] |
| Delete Table/DeleteTable [12] | Да [13] | Да [14] |
| UpdateTable [15] | Нет | Да [16] |
| DescribeTable [17] | Нет | Да [18] |
| CRUD на одной сущности/объекте [19] | Да [20] | Да [21] |
| CRUD на нескольких сущностях/объектах [22] | Да [23] | Да [21] |
| Query Entities/Query (Scan) [24] | Да [25] | Да [26] |
Рассмотрим подробнее все функции из списка.
| WATS | ADDB | |
| Create Table/CreateTable | Да [7] | Да [8] |
Как следует из имени этой функции, она создает таблицу в WATS и ADDB. В отличие от SimpleDB, где операция CreateDomain является идемпотентной, в ADDB она таковой не является – если вы попытаетесь создать таблицу с именем существующей таблицы, система выкинет ошибку.
Есть несколько конвенций именования таблицы/домена, они сведены в таблицу ниже.
| WATS | ADDB | |
| Минимальная/максимальная длина | 3/63 | 3/255 |
| Чувствительность к регистру | Смешанный регистр | Смешанный регистр |
| Разрешенные символы | Alphanumeric | Alphanumeric, дефис (-), тире (_), точка (.) |
Есть еще несколько моментов:
| WATS | ADDB | |
| Query Tables/ListTables | Да [10] | Да [11] |
Функция возвращает список таблиц. Один запрос функции возвращает до 1000 таблиц в WATS и все таблицы в ADDB, если же остаются ещё таблицы или домены, возвращается также continuation token, позволяющий получить доступ к следующему набору таблиц или доменов.
| WATS | ADDB | |
| Максимальное количество записей на вызов функции | 1000 | - |
| Возвращение continuation token | Да | Да |
| WATS | ADDB | |
| Delete Table/DeleteTable | Да [13] | Да [14] |
Функция удаляет таблицу. В ADDB не идемпотента.
Для удаления таблицы в ADDB таблица должна быть в состоянии Active. Эта операция в ADDB асинхронна. В WATS, несмотря на то, что кажется, что она синхронна, она тоже асинхронна. При отправке запроса на удаление таблицы в WATS таблица помечается системой для удаления и становится недоступной, и удаляется только в процессе сборки мусора, поэтому настоящее время удаления таблицы может варьироваться в зависимости от размера данных в этой таблице. По моему опыту удаление очень большой таблицы может занять часы. В это время попытка создания таблицы с этим же именем приведет к ошибке (Conflict error – HTTP Status Code 409).
| WATS | ADDB | |
| UpdateTable | Нет | Да [16] |
Функция используется для обновления выделенной пропускной способности для таблицы в ADDB. Можно увеличивать и уменьшать выделенную пропускную способность:
| WATS | ADDB | |
| DescribeTable | Нет | Да [18] |
Функция DescribeTable используется для получения следующей информации о таблице:
Обратите внимание, что результаты этой операции согласованы в конечном счете, поэтому не гарантируется, что вы получите самые свежие обновления.
| WATS | ADDB | |
| CRUD на одной сущности/объекте | Да [20] | Да [21] |
Обе системы позволяют выполнять операции Create, Read, Update, Delete (CRUD) на одной сущности/объекте.
Что необходимо помнить:
В WATS для операций создания можно использовать несколько операций, в ADDB все они объединениы в одну функцию (PutItem [27]). Операция PutItem создает объект либо, если таблица содержит объект с указанным первичным ключом, этот объект полностью замещается. В WATS есть три функции для создания сущности:
В обеих системах операции чтения заключаются в запросе атрибутов сущности/объекта. В WATS это реализуется с помощью Query Entities [25] и передачи PartitionKey и RowKey в качестве аргументов. В ADDB это реализовано с помощью GetItem [31] и передачи в качестве аргументов первичного ключа объекта.
Обратите внимание, что по умолчанию операция GetItem совершает согласованное в конечном счете чтение. Однако можно указать этой функции осуществлять согласованное чтение, используя опциональный параметр ConsistentRead.
В WATS существует несколько способов обновлять сущности, в ADDB же только два:
В WATS доступно четыре функции для обновления сущности:
Обновление согласно условию (Conditional Updates): Обе системы поддерживают обновление согласно условию, однако действуют эти механизмы по-разному. В ADDB вы определяете условия на значениях существующих атрибутов, то есть определяете, что ADDB обновит значение атрибута1 только если значение другого атрибута атрибут2 равно какому-то значению. Обновление согласно условию в ADDB поддерживают проверку существования атрибута. В WATS все по-другому. В WATS все зависит от значения ETag сущности. Для обновления сущности согласно условию вы должны предоставить значение ETag сущности в одном из заголовков запросов (когда используете REST API), после чего WATS сравнивает это значение с текущим значением ETag обновляемой сущности и обновление совершается только если эти значения совпадают.
Для удаления сущности в WATS можно использовать Delete Entity [35] передавая PartitionKey и RowKey этой сущности в качестве входных аргументов. Аналогично удалению объекта в ADDB, вы используете DeleteItem [36] с передачей первичного ключа этого объекта как входного аргумента.
DeleteAttributes в ADDB идемпотентна, то есть если вы пробуете удалить несуществующую сущность, ADDB не выкинет ошибку до тех пор, пока вы не используете удаление на основе условия. Если вы совершаете удаление согласно условию, в ADDB операция не идемпотентна. В WATS при попытке удаления несуществующей сущности будет выброшена ошибка (NotFound error – HTTP Status Code 404) .
Удаление согласно условию: Обе системы поддерживают удаление согласно условию, однако действуют эти механизмы по-разному. В ADDB вы определяете условия на значениях существующих атрибутов, то есть определяете, что ADDB удалит объект только если значение атрибута атрибут2 равно какому-то значению. Удаление согласно условию в ADDB поддерживает проверку существования атрибута. В WATS все по-другому. В WATS все зависит от значения ETag сущности. Для обновления сущности согласно условию вы должны предоставить значение ETag сущности в одном из заголовков запросов (когда используете REST API), после чего WATS сравнивает это значение с текущим значением ETag удаляемой сущности и удаление совершается только если эти значения совпадают.
| WATS | ADDB | |
| CRUD для нескольких сущностей/объектов | Да [23] | Да [21] |
Обе системы поддерживают выполнение операций CRUD для нескольких сущностей/объектов в пределах одного вызова сервиса.
В WATS для CRUD можно использовать Entity Group Transactions [23]. В ADDB для этого можно использовать BatchWriteItem [37]. Можно использовать также BatchGetItem [38] для чтения нескольких объектов из нескольких таблиц с использованием первичных ключей.
Комментарии:
| WATS | ADDB | |
| Query Entities/Query (Scan) | Да [25] | Да [26] |
Используется для получения одной или более сущностей/объектов из таблицы на основе критерия.
Комментарии:
Резюмируя – обе системы сравнимы по функциональности. Есть некоторые различия в функциональности и, если разработчику держать их в уме в процессе разработки и планирования, вполне возможно создать систему, которая будет использовать оба сервиса, даже, возможно, с интеграцией. У каждой системы есть свои преимущества и недостатки и мы должны использовать эти преимущества и недостатки, чтобы решить, какая из систем лучше подойдет под наши нужды.
Автор: ahriman
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/microsoft/8463
Ссылки в тексте:
[1] SimpleDB: http://aws.amazon.com/simpledb/
[2] 2011-08-18: http://msdn.microsoft.com/en-us/library/windowsazure/dd894041.aspx
[3] 2011-12-05: http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/Introduction.html?r=9072
[4] здесь: http://blogs.msdn.com/b/windowsazurestorage/archive/2010/05/10/windows-azure-storage-abstractions-and-their-scalability-targets.aspx
[5] Amazon: http://www.amazon.com/gp/html-forms-controller/DynamoDB_Limit_Increase_Form
[6] Create Table/CreateTable: http://gauravmantri.com/2012/04/30/comparing-windows-azure-table-storage-and-amazon-dynamodb/#f001
[7] Да: http://msdn.microsoft.com/en-us/library/windowsazure/dd135729.aspx
[8] Да: http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/API_CreateTable.html
[9] Query Tables/ListTables: http://gauravmantri.com/2012/04/30/comparing-windows-azure-table-storage-and-amazon-dynamodb/#f002
[10] Да: http://msdn.microsoft.com/en-us/library/windowsazure/dd179405.aspx
[11] Да: http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/API_ListTables.html
[12] Delete Table/DeleteTable: http://gauravmantri.com/2012/04/30/comparing-windows-azure-table-storage-and-amazon-dynamodb/#f003
[13] Да: http://msdn.microsoft.com/en-us/library/windowsazure/dd179387.aspx
[14] Да: http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/API_DeleteTable.html
[15] UpdateTable: http://gauravmantri.com/2012/04/30/comparing-windows-azure-table-storage-and-amazon-dynamodb/#f004
[16] Да: http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/API_UpdateTable.html
[17] DescribeTable: http://gauravmantri.com/2012/04/30/comparing-windows-azure-table-storage-and-amazon-dynamodb/#f005
[18] Да: http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/API_DescribeTables.html
[19] CRUD на одной сущности/объекте : http://gauravmantri.com/2012/04/30/comparing-windows-azure-table-storage-and-amazon-dynamodb/#f006
[20] Да: http://msdn.microsoft.com/en-us/library/windowsazure/dd179423.aspx
[21] Да: http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/operationlist.html
[22] CRUD на нескольких сущностях/объектах : http://gauravmantri.com/2012/04/30/comparing-windows-azure-table-storage-and-amazon-dynamodb/#f007
[23] Да: http://msdn.microsoft.com/en-us/library/windowsazure/dd894038.aspx
[24] Query Entities/Query (Scan): http://gauravmantri.com/2012/04/30/comparing-windows-azure-table-storage-and-amazon-dynamodb/#f008
[25] Да: http://msdn.microsoft.com/en-us/library/windowsazure/dd179421.aspx
[26] Да: http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/API_Query.html
[27] PutItem: http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/API_PutItem.html
[28] Insert Entity: http://msdn.microsoft.com/en-us/library/windowsazure/dd179433.aspx
[29] Insert or Merge Entity: http://msdn.microsoft.com/en-us/library/windowsazure/hh452241.aspx
[30] Insert or Replace Entity: http://msdn.microsoft.com/en-us/library/windowsazure/hh452242.aspx
[31] GetItem: http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/API_GetItem.html
[32] UpdateItem: http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/API_UpdateItem.html
[33] Merge Entity: http://msdn.microsoft.com/en-us/library/windowsazure/dd179392.aspx
[34] Update Entity: http://msdn.microsoft.com/en-us/library/windowsazure/dd179427.aspx
[35] Delete Entity: http://msdn.microsoft.com/en-us/library/windowsazure/dd135727.aspx
[36] DeleteItem: http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/API_DeleteItem.html
[37] BatchWriteItem: http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/API_BatchWriteItem.html
[38] BatchGetItem: http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/API_BatchGetItems.html
[39] Scan: http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/API_Scan.html
Нажмите здесь для печати.