Введение в SQL Data Services

Содержание

Слайд 2

Развитие компонентного подхода

Развитие компонентного подхода

Слайд 3

Эволюция хостинга

Эволюция хостинга

Слайд 4

Преимущества облачной модели с точки зрения заказчика

Не требует крупных предварительных инвестиций
В случае

Преимущества облачной модели с точки зрения заказчика Не требует крупных предварительных инвестиций
неудачи проекта не нужно ломать голову, куда пристроить дорогостоящее оборудование
В случае удачи автоматически решается проблема масштабирования со 100 пользователей на 1000, на 10000, ...
Меньше операционных издержек
Размещение громадных количеств пользователей на высокомасштабируемом сервере дает стоимость в расчете на пользователя на порядки меньше, чем в случае развертывания системы на предприятии
Пересекает границы организации
Файрвол не преграда
Ценность информации многократно возрастает, если расширить ее на партнеров, поставщиков, клиентов
Проще, чем строить экстранет
Быстрая подготовка к работе
Пользователям не требуется ждать внедрения и настройки специализированных средств
Позволяет IT сфокусироваться на инновациях

Слайд 5

Три модели DaaS

Multitenancy hosted model
Несколько организаций шарят одну базу
Грубо говоря, каждый эккаунт

Три модели DaaS Multitenancy hosted model Несколько организаций шарят одну базу Грубо
привязан к своей схеме
Стандартный доступ через SOAP, REST, XML, ODBC, JDBC, SQL
Можно создавать таблички, DRI, запрашивать, добавлять, изменять данные
Нет задачи сопровождать и поддерживать
Dedicated database hosted model
Каждой организации выделяется по БД
Все БД шарят общую инфраструктуру: сервера, сторидж, ...
Доступ по стандартным протоколам, что и в пред.случае
DBA клиента может апгрейдить, тюнить базу, вообще делать с ней, что хочет – она же его выделенная
Database container model
Обращаемся уже не к таблицам, а к сущностям
Более высокий уровень абстракции
Сущности, вообще говоря, нереляционны, хотя основываются на реляционных таблицах
Базовая сущность – набор свойств со значениями, сущности могут наследовать друг от друга
Доступ к контейнеру сущностей как к веб-сервису (REST, SOAP)

Слайд 6

Платформа Windows Azure

Платформа Windows Azure

Слайд 7

Задачи и решения

Транспорт и инфраструктура сервисов
Windows Communication Foundation
Масштабируемый хостинг сервисов и приложений
Windows

Задачи и решения Транспорт и инфраструктура сервисов Windows Communication Foundation Масштабируемый хостинг
Azure
Связь разнородных сервисов между собой
.NET Services
Авторизация
LiveID, CardSpace (Client), .Net Services
Масштабируемая свободно структурированная база данных, доступная по REST и SOAP
SQL Services
Структурированная база данных в виде REST
ADO.NET Data Services
Синхронизация данных
ADO.NET Synchronization Services, Sync Framework, Live Framework

Слайд 8

Характеристики SDS

Характеристики SDS

Слайд 9

Параллельная обработка

Все запросы обрабатываются через слой SDS Front End
Запрос, разбитый на

Параллельная обработка Все запросы обрабатываются через слой SDS Front End Запрос, разбитый
части, будет адресован нескольким серверам

Слайд 10

В открытом тестировании с сентября 2008 г.

В открытом тестировании с сентября 2008 г.

Слайд 11

Создание облачного приложения

Windows Azure SDK - примеры
Windows Azure Tools for Microsoft Visual

Создание облачного приложения Windows Azure SDK - примеры Windows Azure Tools for
Studio - шаблоны проектов
Подробнее - см., напр., http://habrahabr.ru/blogs/Azure/49389/

Слайд 12

SDS SDK

Состав
SDS Explorer - графическая утилита для управления authorities / контейнерами /

SDS SDK Состав SDS Explorer - графическая утилита для управления authorities /
сущностями
Утилита командной строки SDS Command Prompt
Размер - 553 КБ
Ставится отсюда:
https://www.microsoft.com/downloads/details.aspx?FamilyId=0B1FA5C6-EC9D-440B-939E-481DD05F2627&displaylang=en

Слайд 13

SDS Explorer

Создание Authority

SDS Explorer Создание Authority

Слайд 14

SDS Explorer

Просмотр набора имеющихся у эккаунта authorities:

SDS Explorer Просмотр набора имеющихся у эккаунта authorities:

Слайд 15

SDS Explorer

Получение сущности

Metadata Properties (служебные поля)

Kind

Id

Version

Flexible Properties
(пользовательские поля)

SDS Explorer Получение сущности Metadata Properties (служебные поля) Kind Id Version Flexible Properties (пользовательские поля)

Слайд 16

Гибкая схема сущности

Разные наборы свойств в разных сущностях
Разные типы данных у свойств

Гибкая схема сущности Разные наборы свойств в разных сущностях Разные типы данных
с одинаковым именем
Каждая сущность создается отдельно

<Книга xmlns:s="http://schemas.microsoft.com/sitka/2008/03/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:x="http://www.w3.org/2001/XMLSchema">
1
<Название xsi:type="x:string">Руслан и Людмила
<Жанр xsi:type="x:string">ж1

<Книга xmlns:s="http://schemas.microsoft.com/sitka/2008/03/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:x="http://www.w3.org/2001/XMLSchema">
2
<Название xsi:type="x:string">Борис Годунов
<Жанр xsi:type="x:string">ж1
<Год_издания xsi:type="x:decimal">1831

<Книга xmlns:s="http://schemas.microsoft.com/sitka/2008/03/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:x="http://www.w3.org/2001/XMLSchema">
3
<Название xsi:type="x:string">Герой нашего времени
<Жанр xsi:type="x:string">ж1
<Год_издания xsi:type="x:string">1841

<Книга xmlns:s="http://schemas.microsoft.com/sitka/2008/03/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:x="http://www.w3.org/2001/XMLSchema">
4
<Название xsi:type="x:string">Введение в SDS
<Жанр xsi:type="x:string">ж2
<Кол-во_в_наличии xsi:type="x:decimal">10

Слайд 17

Запросы

LINQ-подобный язык запросов
Подробнее - см. BOL на SDS (httphttp://http://msdnhttp://msdn.http://msdn.microsofthttp://msdn.microsoft.http://msdn.microsoft.comhttp://msdn.microsoft.com/http://msdn.microsoft.com/enhttp://msdn.microsoft.com/en-http://msdn.microsoft.com/en-ushttp://msdn.microsoft.com/en-us/http://msdn.microsoft.com/en-us/libraryhttp://msdn.microsoft.com/en-us/library/http://msdn.microsoft.com/en-us/library/cchttp://msdn.microsoft.com/en-us/library/cc512417.http://msdn.microsoft.com/en-us/library/cc512417.aspx)
Пример
(from жанр in entities.OfKind("Жанр")

Запросы LINQ-подобный язык запросов Подробнее - см. BOL на SDS (httphttp://http://msdnhttp://msdn.http://msdn.microsofthttp://msdn.microsoft.http://msdn.microsoft.comhttp://msdn.microsoft.com/http://msdn.microsoft.com/enhttp://msdn.microsoft.com/en-http://msdn.microsoft.com/en-ushttp://msdn.microsoft.com/en-us/http://msdn.microsoft.com/en-us/libraryhttp://msdn.microsoft.com/en-us/library/http://msdn.microsoft.com/en-us/library/cchttp://msdn.microsoft.com/en-us/library/cc512417.http://msdn.microsoft.com/en-us/library/cc512417.aspx) Пример

where жанр["Жанр"] == "Классика"
from книга in entities.OfKind("Книга")
where книга["Жанр"] == жанр.Id
orderby книга["Название"]
select книга).Take(2)
Комментарии
Обращение к служебным св-вам: книга.Id, к пользовательским - книга["Жанр"]
Case sensitive: книга["жанр"] не поймет
В то же время и ошибки не будет - схема-то гибкая
entities.OfKind("Жанр") то же, что where жанр.Kind == "Жанр": && …
Результат метода OfKind() сам является selectом (как и entities)
Можно просто написать в качестве запроса entities.OfKind(...).
Можно использовать «статическое звучание» метода
Вместо (select ...).Take(n) - Take(select ..., n)

Слайд 18

Работа по протоколу REST

HTTP-методы POST, GET, PUT, DELETE преобразуются в CRUD
Иными словами,

Работа по протоколу REST HTTP-методы POST, GET, PUT, DELETE преобразуются в CRUD
в INSERT / SELECT / UPDATE / DELETE
На самом деле мы ее все это время наблюдали
SDS Explorer – это приложение, работающее с SDS по REST
Имеется полезная кнопка Request-Response, которая позволяет посмотреть, что уходит/приходит по HTTP во время выполнения действий над объектами SDS
Существенно облегчает создание собственного REST-приложения

Слайд 19

Создание собственного REST-приложения

Все, что требуется – сформировать соответствующий HTTP Request и отправить

Создание собственного REST-приложения Все, что требуется – сформировать соответствующий HTTP Request и
его на URL SDS

. C:\Events\"09-02 TechDays"\SDS\REST\SDS_GetSitkaPwd.ps1
[string] $login = "alexejs"; [string] $password = GetSitkaPwd
function GetWebPage([string] $url)
{
[net.httpWebRequest] $req = [net.webRequest]::create($url)
$req.Credentials = new-object Net.NetworkCredential($login, $password)
[net.httpWebResponse] $rep = $req.getResponse()
[IO.StreamReader]$sr = new-object IO.StreamReader($rep.getResponseStream())
return $sr.ReadToEnd()
}
[string] $url = "https://leshik.data.database.windows.net/v1/Библиотека?q='entities.OfKind(`"Книга`").Take(2)'"
[string] $output = GetWebPage($url)
[console]::WriteLine(); [console]::WriteLine($output); [console]::WriteLine()

Взято из Request на пред.слайде

Слайд 20

Работа по протоколу SOAP

Создание ссылки на Windows Communication Foundation-сервис SDS
https://database.windows.net/soap/v1/

Работа по протоколу SOAP Создание ссылки на Windows Communication Foundation-сервис SDS https://database.windows.net/soap/v1/

Слайд 21

Работа по протоколу SOAP

Читается wsdl, создается прокси
Становится доступной объектная модель
IntelliSense

Работа по протоколу SOAP Читается wsdl, создается прокси Становится доступной объектная модель IntelliSense

Слайд 22

Выполнение запроса
SitkaSoapServiceClient.Query(scope, «текст запроса»)

запрос

Выполнение запроса SitkaSoapServiceClient.Query(scope, «текст запроса») запрос

Слайд 23

Аутентификация по SOAP

В отличие от REST, помимо базовой, поддерживаются:
// Access Control Service
proxy

Аутентификация по SOAP В отличие от REST, помимо базовой, поддерживаются: // Access
= new SitkaSoapServiceClient("UsernameTokenEndpoint");
proxy.ClientCredentials.UserName.UserName = "solutionname";
proxy.ClientCredentials.UserName.Password = "solutionpassword";
//CardSpace
proxy = new SitkaSoapServiceClient("CardSpaceTokenEndpoint");
proxy.DisplayInitializationUI(); //вызывает CardSpace prompt
proxy.Open(); //для CardSpace требуется явное открытие прокси
//X.509
proxy = new SitkaSoapServiceClient("CertificateTokenEndpoint");
proxy.ClientCredentials.ClientCertificate.SetCertificate(
"CN=localhost", StoreLocation.LocalMachine, StoreName.My
); //предварительно требуется создать сертификат (с закрытым ключом) и установить его куда-нибудь на данную машину (например, в Local Computer\Personal\Certificates), Personal Conainer – это StoreName.My).
//Также создать самогенерящийся открытый ключ сертификата в Local Computer\Trusted People\Certificates, чтобы он валидировался
Адрес службы https://data.database.windows.net/soap/v1/zurich

Слайд 24

static void Main(string[] args)
{
SitkaSoapServiceClient proxy = new SitkaSoapServiceClient("BasicAuthEndpoint");
proxy.ClientCredentials.UserName.UserName =

static void Main(string[] args) { SitkaSoapServiceClient proxy = new SitkaSoapServiceClient("BasicAuthEndpoint"); proxy.ClientCredentials.UserName.UserName =
"alexejs";
proxy.ClientCredentials.UserName.Password = Settings.Default.SitkaPassword;
Scope scope = new Scope();
scope.AuthorityId = "leshik"; scope.ContainerId = "Библиотека"; scope.EntityId = "1";
Entity entity = proxy.Get(scope);
Debug.WriteLine("Старое значение версии = " + entity.Version);
entity.Properties["Название"] = "Руслан и Людмила";
scope.VersionMatch = new VersionMatch();
scope.VersionMatch.Version = entity.Version;
scope.VersionMatch.MatchType = VersionMatchType.Match;
try
{ scope = proxy.Update(scope, entity); }
catch (System.ServiceModel.FaultException e)
{
string errMsg;  
switch (e.Detail.StatusCode)
{
case ErrorCodes.EntityNotFound: errMsg = String.Format("Эвона! А сущность с Id {0} уже кто-то прихлопнул :(", entity.Id); break;
case ErrorCodes.PreconditionFailed: errMsg = String.Format("Дык ить сущность с Id {0} с тех пор вроде как того, поменялась :(", entity.Id); break;
default: errMsg = "Чета случилось, а че - хтож ево знаить :("; break;
}
Debug.WriteLine(errMsg);

Debug.WriteLine("Новое значение версии = " + scope.VersionMatch.Version);
  proxy.Close();
}

Совместный доступ

Слайд 25

static void Main(string[] args)
{
string login = "alexejs", password = Settings.Default.SitkaPassword;

static void Main(string[] args) { string login = "alexejs", password = Settings.Default.SitkaPassword;
string authorityId = "leshik", containerId = "Библиотека", entityId = "1";
string url = "https://" + authorityId + ".data.database.windows.net/v1/" + containerId + "/" + entityId;
XmlDocument entityXml = new XmlDocument();
HttpWebRequest req = (HttpWebRequest) WebRequest.Create(url);
req.Credentials = new NetworkCredential(login, password);
req.ContentType = "application/x-ssds+xml";
//Читаем сущность c Id = entityId в entityXml (XmlDocument).
req.Method = "GET";
HttpWebResponse rep = (HttpWebResponse) req.GetResponse();
string xml_сущности_в_виде_текста = new StreamReader(rep.GetResponseStream()).ReadToEnd();
entityXml.LoadXml(xml_сущности_в_виде_текста);
rep.Close();
Debug.WriteLine("\nУспешно прочитана сущность:\n" + xml_сущности_в_виде_текста);
//Из XML вытаскиваем и запоминаем версию
XmlNamespaceManager nsmgr = new XmlNamespaceManager(entityXml.NameTable);
nsmgr.AddNamespace("s", "http://schemas.microsoft.com/sitka/2008/03/");
XmlNode x = entityXml.DocumentElement.SelectSingleNode("s:Version", nsmgr);
string версия = x.InnerText;
//Меняем какие-нибудь св-ва сущности
entityXml.SelectSingleNode("Книга/Название").InnerText = "Руслан и Людмила";
xml_сущности_в_виде_текста = entityXml.InnerXml;
Debug.WriteLine("Изменяем сущность к виду:\n" + xml_сущности_в_виде_текста);
...

То же самое в случае REST (1)

Слайд 26

//Апдейтим сущность на сервер
req = (HttpWebRequest)WebRequest.Create(url);
req.Credentials = new NetworkCredential(login,

//Апдейтим сущность на сервер req = (HttpWebRequest)WebRequest.Create(url); req.Credentials = new NetworkCredential(login, password);
password);
req.ContentType = "application/x-ssds+xml";
req.Method = "PUT";
req.Headers["If-Match"] = версия; //если на сервере будет уже другая версия, выкинется исключение
Encoding кодировка = Encoding.UTF8;
req.ContentLength = кодировка.GetByteCount(xml_сущности_в_виде_текста);
req.GetRequestStream().Write(кодировка.GetBytes(xml_сущности_в_виде_текста), 0, (int)req.ContentLength);
try
{
rep = (HttpWebResponse)req.GetResponse();
Debug.WriteLine("Обновление прошло успешно. Новая версия записи = " + rep.Headers["eTag"]);
rep.Close();
}
catch (WebException e)
{
rep = (HttpWebResponse)e.Response;
if (e.Status == WebExceptionStatus.ProtocolError)
switch (rep.StatusCode)
{
case HttpStatusCode.NotFound:
Debug.WriteLine(String.Format("Эвона! А сущность с Id {0} уже кто-то прихлопнул :(", entityId)); break;
//rep.StatusDescription == "Not Found"
//e.Message == "The remote server returned an error: (404) Not Found."
case HttpStatusCode.PreconditionFailed:
Debug.WriteLine(String.Format("Дык ить сущность с Id {0} с тех пор вроде как того, поменялась :(", entityId)); break;
//rep.StatusDescription == "A precondition, such as Version, could not be met."
//e.Message == {"The remote server returned an error: (412) A precondition, such as Version, could not be met."
}
else
Debug.WriteLine("Чета случилось, а че - хтож яво таперича знаить :(");
}
Debug.WriteLine("");
}

То же самое в случае REST (2)

Слайд 27

Массовая загрузка

Подготовить из таблицы XML с определениями сущностей
Превращаем каждую запись в сущность
Делается

Массовая загрузка Подготовить из таблицы XML с определениями сущностей Превращаем каждую запись
элементарным запросом SELECT … FOR XML
Загрузить полученный XML с определениями сущностей на SDS
Делается при помощи утилиты st.exe (вторая в составе SDK)
Мне неизвестно о существовании у SDS специализированных интерфейсов массовой загрузки
Поэтому я полагаю, что чуда не происходит
Утилита разбивает пакетный XML на куски по числу заказанных потоков
Чтобы на каждый поток пришлось примерно равное кол-во сущностей
И создает их по заказанному протоколу аналогично рассмотренным выше способам

Слайд 28

Массовая загрузка

sqlcmd -S (local) -d Northwind -E -i c:\temp\CustomerQuery.sql -o Customers.xml

Массовая загрузка sqlcmd -S (local) -d Northwind -E -i c:\temp\CustomerQuery.sql -o Customers.xml

Слайд 29

Массовая загрузка

"%programfiles%"\"Microsoft SQL Data Services SDK"\st.exe loadbatch leshik Northwind c:\Temp\Customers.xml /rest /overwrite

Массовая загрузка "%programfiles%"\"Microsoft SQL Data Services SDK"\st.exe loadbatch leshik Northwind c:\Temp\Customers.xml /rest /overwrite /verbose /parallel:4
/verbose /parallel:4

Слайд 30

Чтоб ты жил в эпоху перемен (старинное китайское проклятие)

На конференции MIX’09 в марте

Чтоб ты жил в эпоху перемен (старинное китайское проклятие) На конференции MIX’09
было объявлено (http://msdn.microsoft.com/en-us/sqlserver/dataservices/default.aspx), что SDS будут поддерживать произвольный T-SQLный доступ по обычному протоколу TDS
Таким образом, работа с SQL Server в Облаке не будет отличаться от работы с локальным SQL Server
Это здорово, но означает, что только что расказанное уже не актуально
До мая закрытое тестирование, май - июнь - по приглашениям, с июля - все желающие
Модель ACE и доступ по REST/SOAP в настоящее время остаются, но впоследствии перейдут в Azure Storage

Слайд 31

То же самое на картинке

Evolves

То же самое на картинке Evolves

Слайд 32

Преимущества новой модели

Сочетание преимуществ привычной работы с SQL Server и неограниченной доступности

Преимущества новой модели Сочетание преимуществ привычной работы с SQL Server и неограниченной
и масштабируемости Облака ценой минимальных административных издержек
Знакомая реляционная модель SQL Server
Использование существующих инструментов и API
Поддерживается работа из PHP, Ruby, Java

Просто БД в Облаке

Слайд 33

Service Provisioning Model

Каждый account
объект биллинга
владеет одним или несколькими виртуальными серверами
Каждый server
хостит одну

Service Provisioning Model Каждый account объект биллинга владеет одним или несколькими виртуальными
или несколько БД, включая virtual master
каждая БД ограничена в размерах
На сервере заводятся logins
Каждая database
имеет много SQL users

Account

Server

Database

Server=server1.data.database.windows.net
Database=testDB
Login=nigele[@server1] (отображается на testuser)

Слайд 34

Логические базы данных (ЛБД)

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

Логические базы данных (ЛБД) По-прежнему автоматическая репликация, избыточность, контроль здоровья и восстановление
случае сбоя

Machine 5

SQL Instance

SQL DB

DB5

DB1

DB3

DB2

Machine 6

SQL Instance

SQL DB

DB1

DB6

DB2

DB3

Machine 4

SQL Instance

SQL DB

DB1

DB2

DB3

DB4

Machine 7

SQL Instance

SQL DB

DB4

DB5

DB1

DB7

Слайд 35

$host = "server.data.dev.mscds.com";
$dbname = "database";
$dbuser = "user@server";
$dbpwd

$host = "server.data.dev.mscds.com"; $dbname = "database"; $dbuser = "user@server"; $dbpwd = "password";
= "password";
$driver = "{SQL Server Native Client 10.0}";
// Build connection string
$dsn="Driver=$driver;Server=$host;Database=$dbname;Encrypt=true;TrustServerCertificate=true";
if (!($conn = @odbc_connect($dsn, $dbuser, $dbpwd))) {
die("Connection error: " . odbc_errormsg());
}
// Got a connection, run simple query
if ($qh = @odbc_exec($conn, "SELECT A, B FROM myTable")) {
// Dump query result
$rows = 0;
while ( $row = @odbc_fetch_object($qh) ) {
echo("$rows: $row->A $row->B\r\n");
$rows++;
}
@odbc_free_result($qh);
}
else {
// Error running query
echo("Query error: " . odbc_errormsg($conn));
}
// Free the connection
@odbc_close($conn);
?>

Пример в рамках новой модели

http://blogs.msdn.com/ssds/archive/2009/03/27/9515262.aspx

Слайд 36

Расширяя SQL в Облако

SQL Data Services (SDS)
Database-as-a-Service

Data Sync

Reference Data

Reporting

Business Intelligence

Symmetric Programming Model

Предложение

Расширяя SQL в Облако SQL Data Services (SDS) Database-as-a-Service Data Sync Reference
начального уровня – базовая функциональность СУБД в качестве сервиса (SDS), синхронизация и концентрация данных
Дальнейшие предложения
Дополнительные сервисы платформы данных: BI/DSS, DW
Новые сервисы: Reference Data, Secure Data Hub

Data Hub Aggregation

Слайд 37

Вопросы?

Вопросы?
Имя файла: Введение-в-SQL-Data-Services.pptx
Количество просмотров: 187
Количество скачиваний: 0