4

Мы находимся на этапе проектирования для создания контрольного журнала в существующем веб-приложении. Приложение работает на Windows Azure и использует базу данных SQL Azure.Как хранить данные аудита в Azure

Журналы аудита должны быть отфильтрованы пользователем или по типу объекта (например, показать все действия пользователя или показать все действия, выполняемые над объектом).

Нам нужно выбрать способ хранения данных, следует ли использовать SQL Azure или использовать табличное хранилище? Мы предпочитаем хранение таблиц (дешевле).

Однако проблема с хранилищем таблиц заключается в том, как определить ключ раздела. У нас несколько тысяч клиентов (пользователей приложений) в нашей базе данных SQL, каждая из которых находится в собственном арендаторе. Использование идентификатора арендатора в качестве ключа раздела недостаточно специфично, поэтому нам нужно добавить что-то к ключу раздела. Таким образом, возникает проблема: учитывая требования к фильтрации, мы можем добавить идентификатор пользователя к ключу раздела, чтобы сделать фильтрацию пользователем простой, или мы можем добавить идентификатор объекта, чтобы упростить фильтрацию по объекту.

Итак, мы видим два возможных решения:
- использовать SQL Azure вместо хранения таблицы
- использование для хранения таблицы и использовать две таблицы с разными ключами разделов, что означает, что мы дублируем всех записей

Любые идеи, что это лучший подход к нашей ситуации? Есть ли другие, лучшие решения?

+0

Вы пытаетесь провести аудит только операций с базами данных SQL, таких как DDL, DML..или все пользовательские взаимодействия. – TheGameiswar

+0

Мы хотим сохранить определенные события (операции CRUD), эти события могут возникать на данных SQL, но также и на данных blob (у нас есть много сериализованных данных в блоках) – Hanno

+0

Если все ваши аудиторские «записи» будут соответствовать критериям размера в хранилище таблиц (1 МБ), я бы предположил, что это почти предпочтение и как вы хотите иметь к ним доступ. Я бы лично пошел на SQL Azure, если команда знакома с SQL/SQL Server и имеет в виду обработку [параллелизм с хранилищем таблиц] (https://azure.microsoft.com/en-us/documentation/articles/storage-concurrency/# management-concurrency-in-the-table-service) –

ответ

1

ДокументDB на Azure, возможно, стоит рассмотреть. https://azure.microsoft.com/en-us/documentation/articles/documentdb-use-cases/ Вы можете иметь аудита хранятся в DocDB в формате JSON документов (пользователь, активность, полей объекта и может индексировать по всем полям)

+0

Спасибо за предложения, мы продолжим расследование этого подхода – Hanno

+0

Отмечено как ответ, потому что мы решили использовать DocumentDB – Hanno

0

Azure Table Storage подходит для хранения данных журнала. Поскольку службы Azure App используют хранилище таблиц Azure для хранения журналов диагностики.

Вдумайтесь, вы можете установить PartitionKey в качестве имени владельца вашего пользователя, а RowKey - это идентификатор пользователя. В соответствии с Table Storage Data Model, нам нужно только сохранить:

Вместе PartitionKey и RowKey однозначно идентифицировать каждый объект в таблице

В качестве альтернативы, вы можете уточнить ваше беспокойство по поводу:

Использование идентификатора арендатора в качестве ключа раздела не является достаточно конкретным, поэтому нам нужно что-то добавить к ключу раздела

Кроме того, вы можете обратиться к https://azure.microsoft.com/en-us/documentation/articles/storage-table-design-guide/#overview за дополнительной информацией о дизайне Azure Table Storage.

Любое обновление, не стесняйтесь, дайте мне знать.

+0

Возможно, я не понимаю его правильно, но если бы мы используйте идентификатор арендатора для ключа раздела и идентификатора пользователя для ключа строки, мы можем хранить только одну запись на пользователя? Нам нужно будет хранить много записей на пользователя (в основном, все действия, которые выполняет пользователь), чтобы это не сработало, не так ли? – Hanno

+0

Да, вы правы. Вы можете попытаться использовать идентификатор владельца (имя) для ключа раздела и идентификатор пользователя для настраиваемого ключа, и вы можете сгенерировать ключ 'uuid' в качестве строки для идентификатора объекта журнала. –

0

Если вы беспокоитесь о фильтрации несколькими способами - вы всегда можете записывать одни и те же данные в несколько разделов. Он работает очень хорошо. Например, в нашем приложении у нас есть Персонал и Клиенты. Когда есть взаимодействие, которое мы хотим отслеживать/отслеживать, применяемое к ним обоим (возможно, по телефону Purchase), мы будем записывать ту же информацию (как правило, json) в наши таблицы аудита.

{ 
    PurchaseId: 9485, 
    CustomerId: 138, 
    StaffId: 509, 
    ProductId: 707958, 
    Quantity: 20 
    Price: 31.99, 
    Date: '2017-08-15 15:48:39' 
} 

И мы напишем тот же ряд следующих разделов: Product_707958, Customer_138, Staff_509. Ключ строки один и тот же в трех строках в каждом разделе: Purchase_9485. Теперь, если я хочу пойти и запросить все, что произошло для данного персонала, клиента или элемента, я просто захватил весь раздел. Хранение грязи дешево, поэтому кому это нужно, если вы напишете его в нескольких местах?

Кроме того, у вас есть идея, что у вас есть несколько арендаторов - вы можете сделать имя таблицы Tenant_[SomeId]. Есть некоторые другие проблемы, с которыми вам придется иметь дело, но это в некотором смысле еще один ключ для получения данных без схемы.