Welcome to TechNet Blogs Sign in | Join | Help

вышел SQL Server 2008 CTP6.

Вышел СТР6 SQL Server 2008. Что можно сказать интересного?  В принципе, вся основная функциональность, которая должна будет присутствовать в финальной версии – уже представлена в СТР. Т.е. по хорошему, можно уже тестировать с прикидкой на то, как продукт «впишется» в  работающую уже схему/решение.

Ах да,  еще важно, что этот СТР на днях можно будет посмотреть и на русском языке.

В двух словах о том, что добавлено из функционала:

1)      iFTS – новых поисковый движок. Очень интересно будет посмотреть, как он работает с русским языком. Если кто-то чего-то нароет – пишитеJ

2)      Filtered Index -  тут все понятно: оптимизация для некластерного индекса.

3)      Sparse columns – оптимизация пространства, используемого таблицей. Интересный механизм. Фактически, составляет таблицу, где указывается только ячейки, содержащие данные. NULL’ы не хранятся в таблице.

4)      Data compression – сжатие данных. Помогает более эффективно использовать хранилище и оптимизировать IO

5)      Много дополнений в Reporting Services. Одно из самых востребованных – поддержка рендеринга Microsf Word при  составлении отчетов

Posted by MOCKAlb | 0 Comments

SQL Server 2005: масштабируемость решений с помощью контентно-зависимой маршрутизации.

SQL 2005: масштабируемость  решений с  помощью  контентно-зависимой маршрутизации.

 

Начну сей творческий труд с пары оговорок:

1) Оригинальная тема, возможно, называется несколько иначе. Английское название технологии звучит так: Scaling out with Data Dependant routing. Термин “Scale Out” сам по себе является достаточно интересным событием: исходя из перевода, это должно означать что-то типа уменьшения масштаба. Ну, когда, все вещи становятся меньше, так сказать, видны с высоты птичьего полета. По сути, никто, конечно серверы уменьшать не будет.  Касаемо  Data Dependant Routing -  возьму на себя смелость объявить это как «контентно- или контекстно-зависимой маршрутизацией». Потом объясню почему.

2) Пример архитектуры, который я собираюсь описать, вообще-то не зависит от версии SQL Server. SQL Server 2005 был разработан с учетом пожеланий клиентов в этом направлении. По сути,  тех же самых результатов, но с большими затратами ресурсов можно было достигнуть и в более ранних версиях.

Итак, начнем-с.

Всякая компания рано или поздно мечтает стать большой, солидной организацией. Чтобы все с уважением относились к имени компании, чтобы клиентов было много.   Отделы ИТ тоже мечтают, чтобы их компании росли. Только вот, сам по себе рост, с точки зрения ИТ подразделения, приносит и головную боль: растут базы клиентов-то! Растет, понимаешь, объем документов на серверах! Вводятся, всякие там, ERP, CRM и т.д.

На первых порах этот рост, достаточно успешно, можно контролировать покупкой новых, более мощных серверов. Затем, у всякого архитектора, либо же начальника ИТ подразделения возникает дилемма: с одной стороны – здоровенный парк еще пока актуального железа, с другой – можно купить ОДИН СУПЕР БОЛЬШОЙ и водрузить все на него. «Хорошо, а если и этот СУПЕР БОЛЬШОЙ вдруг упрется в пределы производительности, как я потом нашему директору (финансисту, хозяину компании, вице-президенту,_вставь свое название должности_) объясню, что давеча вот, потратили деньги – а нужно еще и больше?»- думает человек. В какой-то момент, стоимость лишнего гигагерца и мегабайта становятся просто-таки золотыми.

Итого, получаем практически всем известную картину: «Но вчера были раки!!! Но большие!! Но по пять.. А сегодня – маленькие.. Но по три». Что делать-то? Выбивать деньги или есть еще какие-то варианты? Есть. Этим вариантом, собственно и является scale out решение, построенное на том, что система будет иметь возможность «жить» не на одном БОЛЬШОМ сервере, а будет состоять из данных, распределенных грамотным образом по разным серверам  плюс приложение, которое будет знать, как их собрать. Тем самым можно достигнуть теоретически неограниченной возможности роста приложения без грандиознейших затрат.

 Контекстно-зависимая маршрутизация

Итак, вроде принято решение использовать  scale-out решение, контекстно-зависимую маршрутизацию, что делать дальше?  Дальше надо думать, как использование этого подхода отразится на работе приложения.  То есть, что останется, а что придется переписывать, так как на приложение ложится задача знать, куда, на какой сервер  отправить запрос. При контесктно-зависимой маршрутизации запроса не используются представления, объединяющие данные с нескольких серверов. Как раз наоборот, каждый сервер становится независимым ( за исключением одного сервера, который хранит схему. Приложение же должно хранить схему того, как данные разбиты и куда отправлять запросы.

Как следить за тем, где живут записи? Допустим, у нас есть приложение для дистрибьюторской компании, и база данных для этого приложения находится на той же машине, что и Web-приложение, через которое клиенты работают с нашей базой. Все данные разбиты на куски по  клиентским ID, соответственно нужно создать таблицу соответствия ID  номеру секции

 Получится что-то типа:

Customer ID

Partition ID

10015

1 (Data 1)

10016

2 (Data 2)

10017

1

10018

3 (Data 3)

 

 

Более наглядно схему работы решения можно представить следующим образом:

 

Где компьютер желтого цвета и есть то самое приложение среднего уровня, которое и хранит выше приведенную таблицу соответствий.

Что происходит дальше?

Клиентское приложение шлет запрос  «покажите все транзакции клиента 10015»,  жёлтый сервер сам определяет , куда этот запрос отправить дальше, а именно – на сервер Data1.В данной ситуации нет абсолютно никакой необходимости привлекать серверы Data 2 и Data3.

Теперь мы решили провести инвентаризацию всех продуктов.  Т.е надо построить отчет по всем Product ID. Данные у нас разбиты по Customer ID. Скорее всего , на каждом сервере найдутся записи с Product ID, соответственно и «допрашивать» придется всех. Что будет делать приложение? Правильно – опрашивать все серверы и строить общий отчет, на базе данных, что будут получен с каждого сервера. Выглядит, как очень трудоемкий процесс с подключением  большого количества ресурсов. Так оно, собственно и есть, поэтому такого рода задачи необходимо запускать как «фоновые» и в то время, когда это наименьшим образом повлияет на клиентов или пользователей.

 

«Узкие места» или чем это все грозит?

Достоинство системы, построенной  на базе контекстно-зависимой маршрутизации очевидно: при появлении новых пользователей, мы просто добавляем еще один сервер, потом еще и т.д. Не надо тратиться на дорогущий сервер с огромным дисковым пространством. Но, как известно, бесплатный сыр бывает только в мышеловке, поэтому за любыми достоинствами скрываются какие-то ограничения.

 

В данной ситуации придется считаться со следующими вещами:

1) Управление  и администрирование. Чем больше решение растет « в ширь», тем  большим количеством серверов придется заниматься, выполняя как рутинные задачи, так те, что будут «сваливаться» в процессе эксплуатации.  Т.е установка фиксов, обновлений, резервное копирование – все это будет умножено на количество поддерживаемых серверов. Хотя, с другой стороны, добавление еще одно сервера будет менее болезненной процедурой.

2) Разбиение ( группирование) данных. Это одна из основных «головных болей». Правильность выбора критерия разбиения данных будет означать, насколько легко  и безболезненно  будет расти решение.  Если параметр разбиения будет задан неверно, то это может потянуть за собой огромный список неприятностей. Необходимо очень хорошо понимать бизнес-логику и возможности  ее модификации, чтобы минимизировать проблемы при росте приложения.

3) Изменение бизнес логики приложения. Со временем правила , по которым работает компания, могут видоизменяться, соответственно это накладывает ограничение на приложение среднего уровня, которое в свою очередь, отвечает за знание куда отправить запрос. Что будет , если нужно ввести новые элементы логики? Переписывать все полностью? Что  будет, если добавится новый тип данных? ( В принципе, этот пункт тесно связан с предыдущим)

4) Доступность данных. Еще один узкий момент, где нужно своевременное правильное решение может избавить от кучи проблем – что произойдет с работой всего решения, если один из серверов данный просто упадет? А если «умрет» сервер, где хостится приложение?

 

Все эти вопросы были очень удачно освещены в решении, разработанном для  MSN Communication Services Platform, описанием которого я и займусь немного позже.

 

 

Posted by MOCKAlb | 1 Comments

Вышел СТР4 SQL Server 2008, он же CTP July

Для желающих ознакомиться ссылка:

https://connect.microsoft.com/SQLServer/content/content.aspx?ContentID=5395

(Не забудьте зарегистрироваться, если еще этого не сделали :)

А так же, грядут презентации по новым и не сильно возможностям продукта.

 

LiveMeeting EventEnterprise Scale Reporting Engine 08/15/07  
LiveMeeting EventAS Time Series Stability 08/17/07
LiveMeeting EventNew Datetime Data Type 08/21/07
LiveMeeting EventDatabase Mirroring Enhancements 08/24/07
LiveMeeting EventOrdpath For SQL Server 08/28/07

Всем удачи, не забывайте слать баги и вопросы.

Буду разбираться, напишу о полученном опыте :)

Posted by MOCKAlb | 0 Comments

CTP3: DMF. Продолжаем изучение. Группы политик и дачный сезон

Продолжение изысканий.

После того, как простой пример по запрещению написания неправильных слов на заборе окончился успехом,  пришла в голову идея посмотреть, что же такое «пользовательские группы».

Принцип работы политик и групп примерно такой: мы на даче. У всех «правильных» садоводов- любителей на даче водятся всякие гвозди, шурупы, лопаты, молотки, топоры, веревки для подвязки,  шланги, семена и т.д. Ну не валяется же это все по территории?

 У хорошего дачника есть банка с гвоздями ( где только гвозди, но правда, разных размеров), банка с шурупами, коробка с мелким инструментом и уголок для садового инвентаря. Так вот эти банки, коробки  и уголок – это наши группы. Если дачник хочет прибить гвоздь в бане, чтоб тот поработал как вешалка, то товарищ к объекту  [баня]  применяет политику [гвоздь] из группы [банка с гвоздями]. Если я не ошибаюсь, то facet ( он же аспект) в данном случае – «работа вешалкой».

[Гвоздь] может принадлежать только [банке с гвоздями]. Он не может в тоже самое время принадлежать группе [садовый инвентарь] или [банка с шурупами]. Попробуйте положить гвоздь в три разные банки одновреммено? Зато разные по размеру гвозди могут лежать в одной и той же банке. А группы [банка с шурупами] и [банка с гвоздями], в свою очередь,  можно применять к объектам [баня], [дача] ( ну там, ремонт мелкий), стена и т.д.

 Политики [лопата] и [шланг], по аналогии с примером выше, могут применяться к объекту [грядка] и принадлежать группе [угол].

Фух.. Уже кажется достаточно примеров. Я сам все понял.

Теперь перейдем  к практике.

Попробуем создать политику, которая будет определять правило задания пути и имени базы данных, создаваемой на сервере.

 

Для этого для начала создадим условие ( в примере с дачником условием может быть - жена запилила:  « вещи в бане  валяются на полу. Перед людьми стыдно!». Вообще это одно из самых универсальных условий типа «жена»).

Имя: File Path Condition

Facet: Database Facet

Expression:

‘PrimaryFilePath’ NOT LIKE ‘ c:\SQL\MyDB%’

Далее, опишем политику:

Name: File Path Policy

Enabled – ставим галочку.

Condition: File Path Condition

Group: DB Group ( эту группу я просто только что создал, сказав 'New')

В поле «Applies to:» выбираем Server/Database

И говорим, что мы хотим следить за изменениями ( Check on changes)

 

Дело сделано. Осталось только проверить. Создаем базу DBtest_3где яростно нарушаем правило нами же созданное:

 

create database DBtest_3 on

(

Name = TheDB_Test3,

Filename ='c:\sql\thisisthe_test3.mdf'

)

 

И  “Command(s) completed successfully”!!

Что случилось? Можно было не копать грядку и не забивать гвоздь? Ничего не работает?

Обновим-ка в обозревателе картиночку.

И что видим?

 

 

 

Заметно красный крестик? Смотрим что там:

 

 

 Итого: то, что мы злостно нарушили, не осталось не замеченным. Процесс создания базы не является «обратимым»  - его нельзя откатить назад. Поэтому и команда выполнилась успешно и никаких разверзшихся небес. Отрадно, что появилось визуальной отображение конфликта того, что было сделано  с заданной политикой.

Пока я играл с политиками и группами, я заметил следующий эффект: подписать под группы можно все базы, кроме системных. Т.е получается, что на системные базы распространяются все политики , приписанные  к группе «по умолчанию».  В то время как все остальные базы могут быть подписаны как на группу по умолчанию, так и на определенные пользователем.

В принципе, это кажется очень разумным шагом. Но на всякий случай было бы интересно, есть ли у кого идеи, почему данная реализация может быть неправильной?

Posted by MOCKAlb | 0 Comments
Filed under:

Еще один обзор DMF. На этот раз от Николая Денищенко

Достаточно красочно и понятно и абсолютно академично Николай Денищенко описал результаты своих исследований DMF.

Наслаждайтесь :)

Приятно, что ширится круг людей, начинающих разбираться с SQL 2008

Posted by MOCKAlb | 0 Comments
Filed under:

СТР 3: Declarative Management framework. Пример

Возьмем простую задачу: необходимо запретить все имена таблиц, которые начинаются на Test.

Для этого необходимо создать  условие, которое будет проверять: имя таблицы не равно  «Test%».

Для этого в Management Studio:

1. Идем  в  Policy Management, правой кнопкой кликаем на Conditions и говорим: New Condition.

2. В открывшемся окне  Create New Condition в поле Name говорим: Table Name Condition .

3. В поле Facet выбираем Multipart Name Facet.

4.  В поле задания условия (Expression) в Field выбираем: Name;

В поле Operator:  NOT Like;  в поле Value пишем Test%

В поле описания можно сказать: The table name should not start with Test

Далее необходимо создать политику:

1.       В обозревателе  Object Explorer кликаем правой кнопкой на Policies и выбираем New Policy.

2.       В окне Create New Policy выбираем имя для политики, типа: Table Name Policy,

3.       Ставим галочку  на «Enabled»

4.        В поле Condition box выбираем Table Name Condition.

5.       Группу можно оставить Default”.

6.       В поле Applies to: выбрать из всего списка Server/Database/Table.

7.       В описании режима исполнения: Enforce

 

Теперь  в  QA создаем запрос:

create table Test (Name nvarchar (10))

 

Policy 'Table Name Policy' has been violated by 'Server/Database[@Name='master']/Table[@Name='Test' and @Schema='dbo']'. This transaction will be rolled back.

Msg 3609, Level 16, State 1, Procedure sp_syspolicy_dispatch_event, Line 88

The transaction ended in the trigger. The batch has been aborted.

 

Что и требовалось доказать.

Создание же таблиц с другими процедурами проходит нормально.

P.S прежде чем попробовать DMF обратите внимание: был найден  баг в СТР, который может свести на нет все попытки запуска примера. Как это дело обойти описано тут:

http://sqlserver-qa.net/blogs/sql2008/archive/2007/06/10/653.aspx

 

Posted by MOCKAlb | 0 Comments
Filed under:

CTP3: Declarative Management Framework. Введение

Declarative Management Framework

Управление сервером баз данных можно разбить на два типа «жизненных циклов»:  управление сервером  и управление приложениями.  Управление  приложениями включает в себя все, что необходимо для поддержки работы приложений и сохранности и актуальности данных, хранимых на сервере.

Можно попробовать описать это следующими картинками:

 

SQL Server

Дистрибутив/
Upgrade/
фиксы

SQL Server Instance

 

Операционная система.

Настройка

Поддержка