Скачать презентацию Введение в SQL Data Services Алексей Шуленин эксперт Скачать презентацию Введение в SQL Data Services Алексей Шуленин эксперт

023aa0967c0306a3885f319f6a150e42.ppt

  • Количество слайдов: 38

Введение в SQL Data Services Алексей Шуленин эксперт по технологиям обработки и анализа информации Введение в SQL Data Services Алексей Шуленин эксперт по технологиям обработки и анализа информации департамент стратегических технологий Российское представительство Microsoft Corporation

Развитие компонентного подхода Идея повторного использования кода Статические библиотеки Динамические библиотеки Сеть Процедуры (подпрограммы) Развитие компонентного подхода Идея повторного использования кода Статические библиотеки Динамические библиотеки Сеть Процедуры (подпрограммы) DLL/Сборки RPC Абстракция Сервисы объекты Компоненты DCOM/. net REMOTING

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

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

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

Платформа Windows Azure Платформа Windows Azure

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

Характеристики SDS Масштабируемость Уменьшение капиталозатрат • Миллионы геораспределенных машин, распределяемая по географическому принципу доставка Характеристики SDS Масштабируемость Уменьшение капиталозатрат • Миллионы геораспределенных машин, распределяемая по географическому принципу доставка информации петабайты данных, петафлопы вычислительной мощности • Недорогие процессоры, диски IDE/SATA Уменьшение операционных • Самомониторинг, самонастройка, самоизлечение издержек Предсказуемое • На которое не оказывают влияния программные, аппаратные детерминированное и коммуникационные сбои последовательное поведение Высокая производительность • Инновационные алгоритмы

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

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

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

Состав SDS SDK SDS Explorer - графическая утилита для управления authorities / контейнерами / Состав SDS SDK SDS Explorer - графическая утилита для управления authorities / контейнерами / сущностями Утилита командной строки SDS Command Prompt Размер - 553 КБ Ставится отсюда: https: //www. microsoft. com/downloads/details. aspx? Family. Id=0 B 1 F A 5 C 6 -EC 9 D-440 B-939 E-481 DD 05 F 2627&displaylang=en

SDS Explorer Создание Authority SDS Explorer Создание Authority

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

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

Гибкая схема сущности <Книга xmlns: s= Гибкая схема сущности <Книга xmlns: s="http: //schemas. microsoft. com/sitka/2008/03/" xmlns: xsi="http: //www. w 3. org/2001/XMLSchema-instance" xmlns: x="http: //www. w 3. 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. w 3. org/2001/XMLSchema-instance" xmlns: x="http: //www. w 3. 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. w 3. org/2001/XMLSchema-instance" xmlns: x="http: //www. w 3. 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. w 3. org/2001/XMLSchema-instance" xmlns: x="http: //www. w 3. org/2001/XMLSchema"> 4 <Название xsi: type="x: string">Введение в SDS <Жанр xsi: type="x: string">ж 2 <Кол-во_в_наличии xsi: type="x: decimal">10 Разные наборы свойств в разных сущностях Разные типы данных у свойств с одинаковым именем Каждая сущность создается отдельно

LINQ-подобный язык запросов Запросы Подробнее - см. BOL на SDS (http: //msdn. microsoft. com/enus/library/cc LINQ-подобный язык запросов Запросы Подробнее - см. BOL на SDS (http: //msdn. microsoft. com/enus/library/cc 512417. aspx) Пример (from жанр in entities. Of. Kind("Жанр") where жанр["Жанр"] == "Классика" from книга in entities. Of. Kind("Книга") where книга["Жанр"] == жанр. Id orderby книга["Название"] select книга). Take(2) Комментарии Обращение к служебным св-вам: книга. Id, к пользовательским книга["Жанр"] Case sensitive: книга["жанр"] не поймет В то же время и ошибки не будет - схема-то гибкая entities. Of. Kind("Жанр") то же, что where жанр. Kind == "Жанр": && … Результат метода Of. Kind() сам является selectом (как и entities) Можно просто написать в качестве запроса entities. Of. Kind(. . . ). Можно использовать «статическое звучание» метода Вместо (select. . . ). Take(n) - Take(select. . . , n)

Работа по протоколу 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-приложения

Создание собственного RESTприложения Все, что требуется – сформировать соответствующий HTTP Request и отправить его Создание собственного RESTприложения Все, что требуется – сформировать соответствующий HTTP Request и отправить его на URL SDS. C: Events"09 -02 Tech. Days"SDSRESTSDS_Get. Sitka. Pwd. ps 1 [string] $login = "alexejs"; [string] $password = Get. Sitka. Pwd function Get. Web. Page([string] $url) { [net. http. Web. Request] $req = [net. web. Request]: : create($url) $req. Credentials = new-object Network. Credential($login, $password) [net. http. Web. Response] $rep = $req. get. Response() [IO. Stream. Reader]$sr = new-object IO. Stream. Reader($rep. get. Response. Stream()) return $sr. Read. To. End() } Взято из Request на пред. слайде [string] $url = "https: //leshik. database. windows. net/v 1/ Библиотека? q='entities. Of. Kind(`"Книга`"). Take(2)'" [string] $output = Get. Web. Page($url) [console]: : Write. Line(); [console]: : Write. Line($output); [console]: : Write. Line()

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

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

Выполнение запроса Sitka. Soap. Ser vice. Client. Qu ery(scope, «текст запроса» ) запрос Выполнение запроса Sitka. Soap. Ser vice. Client. Qu ery(scope, «текст запроса» ) запрос

Аутентификация по SOAP В отличие от REST, помимо базовой, поддерживаются: // Access Control Service Аутентификация по SOAP В отличие от REST, помимо базовой, поддерживаются: // Access Control Service proxy = new Sitka. Soap. Service. Client("Username. Token. Endpoint"); proxy. Client. Credentials. User. Name = "solutionname"; proxy. Client. Credentials. User. Name. Password = "solutionpassword"; //Card. Space proxy = new Sitka. Soap. Service. Client("Card. Space. Token. Endpoint"); proxy. Display. Initialization. UI(); //вызывает Card. Space prompt proxy. Open(); //для Card. Space требуется явное открытие прокси //X. 509 proxy = new Sitka. Soap. Service. Client("Certificate. Token. Endpoint"); proxy. Client. Credentials. Client. Certificate. Set. Certificate( "CN=localhost", Store. Location. Local. Machine, Store. Name. My ); //предварительно требуется создать сертификат (с закрытым ключом) и установить его куда-нибудь на данную машину (например, в Local ComputerPersonalCertificates), Personal Conainer – это Store. Name. My). //Также создать самогенерящийся открытый ключ сертификата в Local ComputerTrusted PeopleCertificates, чтобы он валидировался Адрес службы https: //database. windows. net/soap/v 1/zurich

static void Main(string[] args) { Sitka. Soap. Service. Client proxy = new Sitka. Soap. static void Main(string[] args) { Sitka. Soap. Service. Client proxy = new Sitka. Soap. Service. Client("Basic. Auth. Endpoint"); proxy. Client. Credentials. User. Name = "alexejs"; proxy. Client. Credentials. User. Name. Password = Settings. Default. Sitka. Password; Scope scope = new Scope(); scope. Authority. Id = "leshik"; scope. Container. Id = "Библиотека"; scope. Entity. Id = "1"; Entity entity = proxy. Get(scope); Debug. Write. Line("Старое значение версии = " + entity. Version); entity. Properties["Название"] = "Руслан и Людмила"; scope. Version. Match = new Version. Match(); scope. Version. Match. Version = entity. Version; scope. Version. Match. Type = Version. Match. Type. Match; try { scope = proxy. Update(scope, entity); } Совместный доступ catch (System. Service. Model. Fault. Exception e) { string err. Msg; switch (e. Detail. Status. Code) { case Error. Codes. Entity. Not. Found: err. Msg = String. Format("Эвона! А сущность с Id {0} уже кто-то прихлопнул : (", entity. Id); break; case Error. Codes. Precondition. Failed: err. Msg = String. Format("Дык ить сущность с Id {0} с тех пор вроде как того, поменялась : (", entity. Id); break; default: err. Msg = "Чета случилось, а че - хтож ево знаить : ("; break; } Debug. Write. Line(err. Msg); } Debug. Write. Line("Новое значение версии = " + scope. Version. Match. Version); proxy. Close(); }

То же самое в случае REST (1) static void Main(string[] args) { string login То же самое в случае REST (1) static void Main(string[] args) { string login = "alexejs", password = Settings. Default. Sitka. Password; string authority. Id = "leshik", container. Id = " Библиотека", entity. Id = "1"; string url = "https: //" + authority. Id + ". database. windows. net/v 1/" + container. Id + "/" + entity. Id; Xml. Document entity. Xml = new Xml. Document(); Http. Web. Request req = (Http. Web. Request) Web. Request. Create(url); req. Credentials = new Network. Credential(login, password); req. Content. Type = "application/x-ssds+xml"; //Читаем сущность c Id = entity. Id в entity. Xml (Xml. Document). req. Method = "GET"; Http. Web. Response rep = (Http. Web. Response) req. Get. Response(); string xml_сущности_в_виде_текста = new Stream. Reader(rep. Get. Response. Stream()). Read. To. End(); entity. Xml. Load. Xml(xml_сущности_в_виде_текста); rep. Close(); Debug. Write. Line("n. Успешно прочитана сущность: n" + xml_сущности_в_виде_текста); //Из XML вытаскиваем и запоминаем версию Xml. Namespace. Manager nsmgr = new Xml. Namespace. Manager(entity. Xml. Name. Table); nsmgr. Add. Namespace("s", "http: //schemas. microsoft. com/sitka/2008/03/"); Xml. Node x = entity. Xml. Document. Element. Select. Single. Node("s: Version", nsmgr); string версия = x. Inner. Text; //Меняем какие-нибудь св-ва сущности entity. Xml. Select. Single. Node("Книга/Название"). Inner. Text = "Руслан и Людмила"; xml_сущности_в_виде_текста = entity. Xml. Inner. Xml; Debug. Write. Line("Изменяем сущность к виду: n" + xml_сущности_в_виде_текста); . . .

То же самое в случае REST (2) //Апдейтим сущность на сервер req = (Http. То же самое в случае REST (2) //Апдейтим сущность на сервер req = (Http. Web. Request)Web. Request. Create(url); req. Credentials = new Network. Credential(login, password); req. Content. Type = "application/x-ssds+xml"; req. Method = "PUT"; req. Headers["If-Match"] = версия; //если на сервере будет уже другая версия, выкинется исключение Encoding кодировка = Encoding. UTF 8; req. Content. Length = кодировка. Get. Byte. Count(xml_сущности_в_виде_текста); req. Get. Request. Stream(). Write(кодировка. Get. Bytes(xml_сущности_в_виде_текста), 0, (int)req. Content. Length); try { rep = (Http. Web. Response)req. Get. Response(); Debug. Write. Line("Обновление прошло успешно. Новая версия записи = " + rep. Headers["e. Tag"]); rep. Close(); } catch (Web. Exception e) { rep = (Http. Web. Response)e. Response; if (e. Status == Web. Exception. Status. Protocol. Error) switch (rep. Status. Code) { case Http. Status. Code. Not. Found: Debug. Write. Line(String. Format("Эвона! А сущность с Id {0} уже кто-то прихлопнул : (", entity. Id)); break; //rep. Status. Description == "Not Found" //e. Message == "The remote server returned an error: (404) Not Found. " case Http. Status. Code. Precondition. Failed: Debug. Write. Line(String. Format("Дык ить сущность с Id {0} с тех пор вроде как того, поменялась : (", entity. Id)); break; //rep. Status. Description == "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. Write. Line("Чета случилось, а че - хтож яво таперича знаить : ("); } Debug. Write. Line(""); }

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

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

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

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

То же самое на картинке Data Center Windows Azure Web App REST Client REST/SOAP То же самое на картинке Data Center Windows Azure Web App REST Client REST/SOAP + ACE Model SDS Current Application SQL Client* HTTP TDS Cloud HTTP+REST Cloud Browser Application REST Client Windows Azure Data Center REST Client Application Browser Application Evolves Application REST (Astoria) Web App ADO. Net + EF SQL Client* TDS + TSQL Model SDS Next * Client access enabled using TDS for ODBC, ADO. Net, OLEDB, PHP-SQL, Ruby, … ODBC, OLEDB, ADO. Net PHP, Ruby, …

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

Service Provisioning Model Каждый account Account объект биллинга владеет одним или несколькими виртуальными серверами Service Provisioning Model Каждый account Account объект биллинга владеет одним или несколькими виртуальными серверами Каждый server Server хостит одну или несколько БД, включая virtual master каждая БД ограничена в размерах На сервере заводятся logins Каждая database Database имеет много SQL users Server=server 1. database. windows. net Database=test. DB Login=nigele[@server 1] (отображается на testuser)

Логические базы данных (ЛБД) По-прежнему автоматическая репликация, избыточность, контроль здоровья и восстановление в случае Логические базы данных (ЛБД) По-прежнему автоматическая репликация, избыточность, контроль здоровья и восстановление в случае сбоя Provisioning (databases, accounts, roles…), Metering, and Billing ine 4 Machine 5 Machine 6 stance SQL Instance SQL DB DB DB 3 DB 4 DB 5 DB 1 DB 3 DB 2 DB 1 DB 6 DB 2 Mach SQL In SQL DB 3 DB 4 Scalability and Availability: Fabric, Failover, Replication, and Load Balancing DB 5

Пример в рамках новой модели <? php $host = Пример в рамках новой модели A $row->Brn"); $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

Расширяя SQL в Облако Symmetric Programming Model Data Hub Aggregation Расширяя SQL в Облако Symmetric Programming Model Data Hub Aggregation

Вопросы? Вопросы?

© 2007 Microsoft Corporation. All rights reserved. Microsoft, Windows Vista and other product names © 2007 Microsoft Corporation. All rights reserved. Microsoft, Windows Vista and other product names are or may be registered trademarks and/or trademarks in the U. S. and/or other countries. The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation. MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.