Обзор известных механизмов тиражирования и их доступность в SQL Server 7.0
Распределенные вычисления - основа современной вычислительной системы. Они позволяют максимально приблизить данные и вычислительные ресурсы к их потребителям. За счет этого можно уменьшить время реакции вычислительной системы на запрос пользователей, а некоторые элементы сделать полностью автономными. Однако в распределенной вычислительной системе часто возникает проблема согласования данных, которые хранятся на различных компьютерах и в различных базах данных. Для решения этой проблемы разработчики баз данных интегрируют в СУБД специальные приложения для синхронизации разрозненных данных, которые называются механизмами тиражирования. Эти механизмы бывают нескольких типов, и каждый их них имеет свои характерные черты. Сравнению особенностей различных механизмов тиражирования баз данных и посвящена эта статья.
Требования к механизму тиражирования зависят от задач, которые решает вся вычислительная система в целом. Например, к механизмам тиражирования в системе заказа и продажи авиабилетов будут предъявляться совсем другие требования, чем к аналогичным механизмам в системе поддержки принятия решений для мобильных торговцев. При продаже авиабилетов, после бронирования хотя бы одного билета система должна как можно быстрее распространить эту информацию по всем своим частям. Это значит, что основным требованием к такой системе является непротиворечивость и целостность данных. Программное обеспечение для мобильных торговцев должно позволять некоторое время работать автономно, а потом синхронизировать свои данные с центральной базой данных в офисе торговца. В этом случае, возможность автономной работы важнее непротиворечивости данных. Таким образом, механизм тиражирования должен обеспечить либо целостность данных в различных частях распределенной системы, либо их автономную работу. Целостность данных и независимость от центральной СУБД и являются двумя основными характеристиками тиражирования.
Рассмотрим способы тиражирования данных, расположив их в порядке увеличения целостности данных и транзакций:
Тиражирование слиянием (merge replication); Тиражирование моментального снимка (snapshot replication); Транзакционное тиражирование (transactional replication); Тиражирование с обновлением на подписчике (immediate updating subscribers); Распределенные транзакции (distributed transaction).
Причем, чем более жесткие требования к целостности данных предъявляются к СУБД, тем более надежной должна быть связь между элементами системы, что приводит к увеличению ее стоимости. Если же система рассчитана на автономную работу, то тиражирование, как правило, можно выполнять и по медленным и ненадежным каналам, например, по телефонным каналам.
Следует отметить, что почти все перечисленные методы тиражирования укладываются в единую модель «издатель-дистрибьютор-подписчик». Функции издателя выполняет центральная база данных, которая хранит основной вариант публикации: группы столбцов и строк. Для каждой публикации должен быть только один издатель. Дистрибьютор следит за изменениями данных, которые вносит издатель, и распространяет их по подписчикам. Таким образом, каждому элементу системы достаточно иметь связь только с дистрибутором, а не со всеми другими фрагментами. Следует отметить, что при небольших объемах данных, функции издателя и дистрибутора может выполнять один компьютер. Характеристики тиражирования меняются в зависимости от организации связи между издателем и дистрибутором, а также между дистрибьютором и подписчиками. Такая модель не работает только в случае распределенных транзакций, когда любая база данных системы, прежде чем подтвердить изменение данных, должна получить разрешение от всех остальных серверов системы.
Тиражирование слиянием
Тиражирование слиянием обеспечивает максимальную автономность удаленной базы данных. Суть его заключается в том, что все операции выполняются на удаленном компьютере, который может быть полностью отключен от компьютерной сети. Автономная СУБД записывает все операции с данными и их очередность. Затем в определенный момент, автономный компьютер связывается с издателем и согласовывает с ним свои данные, пересылая издателю последовательность операций, произведенных в удаленной базе данных. При возникновении конфликтов они разрешаются с помощью различных алгоритмов, например, на основе приоритета. После такого слияния издатель передает изменения на сервер-дистрибутор, для дальнейшего распространения по подписчикам. Следует отметить, что для некоторых публикаций автономный сервер является издателем, поэтому он просто передает дистрибутору обновления для дальнейшего распространения.
Для обновления локальной информации в автономной базе данных, используется метод тиражирования «по запросу», при котором процесс обновления данных инициирует автономная СУБД. Обновление может выполняться как по определенному графику, так и в ручную (например, как только появилась связь между автономной СУБД и дистрибьютором). Причем, есть два способа получать обновления: копировать моментальный снимок базы данных или очередь подтвержденных издателем транзакций. Впрочем, передачу транзакций можно использовать только в том случае, когда в автономной базе данных уже храниться копия основной. Следует отметить, что моментальный снимок базы данных включает также и дополнительную служебную информацию, например, идентификаторы столбцов и строк.
Использование такого метода тиражирования данных позволяет некоторым элементам вычислительной системы работать автономно, а потом объединять данные в едином центре (на издателе). Этот метод тиражирования хорошо подходит для мобильных сотрудников, которые, например, выезжают к клиентам на проведение переговоров и заключение сделок. Во время переговоров активно используется локальная копия базы данных. После заключения сделки, сотрудник может передать изменения и новые сведения в центральную базу данных. При этом конфликт может возникнуть, если заключен договор на уже проданный товар. На этот случай в системе должны быть предусмотрены соответствующие алгоритмы решения такой проблемы, как чисто технические, так и организационные. Следует отметить, что, например, для продажи авиа билетов такой способ тиражирования использовать сложно, поскольку могут возникать серьезные проблемы при нехватке билетов. В этом случае, необходима более оперативная схема тиражирования данных.
Простая схема "Издатель-подписчик".
Распределенное тиражирование.
Тиражирование моментального снимка данных
Способ тиражирования моментального снимка отличается от слияния данных тем, что издатель распространяет не последовательность транзакций, а снимок всех данных, в том числе и системных. В результате, подписчики не имеют возможности изменять полученные данные, и поэтому они доступны только на чтение. Все операции изменения данных выполняются только через издателя. Механизм тиражирования в этом случае работает так: дистрибьютор запрашивает у издателя моментальный снимок данных, а когда получает, то распространяет его по подписчикам. В этом варианте тиражирования, кроме распространения по запросу можно использовать схему принудительной рассылки тиража. При этом распространение данных инициируется не подписчиком, а дистрибьютором. Таким образом, при хорошей связи подписчик начинает прием данных, как только они стали доступны дистрибьютору.
Такая схема распространения данных достаточно проста и не требует разрешения конфликтов. Она может с успехом использоваться для распространения медленно меняющихся данных, например, для распространения цен на товары. Другим примером использования такой схемы является подготовка отчетов. Например, несколько подразделений предприятия собирают определенные сведения о своей деятельности и передают их в центральный офис. Затем эта информация централизовано обрабатывается и передается обратно в подразделения в качестве отчета. На этапе сбора данных подразделения выступают в роли издателя своей части данных, а для центрального офиса они доступны только на чтение. Когда же отчет готов, то его издателем является центральный офис, а для подразделений он доступен только для чтения.
Очевидным ограничением такого способа тиражирования является необходимость совершения операций только через издателя, что требует от подписчиков связи с издателем в момент совершения изменений. Кроме того, если данных много, а операций над ними совершается мало, то лучше воспользоваться другим методом тиражирования, где по сети передаются не данные, а операции над ними. Период согласования данных в этом случае примерно равен периоду запроса дистрибутором новых версий данных. Причем, чем этот период меньше, тем менее эффективно используется сеть. Лучше всего этот метод тиражирования использовать как дополнительный для распространения медленно меняющихся данных, таких как таблицы цен или отчеты, а в других случаях лучше воспользоваться более гибкими методами тиражирования.
Тиражирование транзакций
В процессе тиражирования транзакций, от издателя к подписчикам передаются не данные, а только операции над ними. При этом периодически необходимо выполнять и полную синхронизацию данных, которая выполняется по методу тиражирования моментального снимка данных. Транзакции, которые подтверждены издателем, собираются дистрибутором и копируются дальше по подписчикам, где те же операции выполняются с заранее распространенными снимками центральной базы данных. Здесь следует отметить, что тиражируются не отдельные операции над данными, а их логические группы - транзакции. Если же подписчику требуется изменить какие-либо данные в основной базе, то он должен провести транзакцию с издателем.
Тиражирование транзакций лучше всего использовать, когда в системе много данных, а операций над ними выполняется мало. Впрочем, при увеличении количества транзакций можно уменьшить период тиражирования транзакций. Причем чем меньше интервал между периодами синхронизации, тем меньше данных нужно в них передавать. Время согласования данных в различных элементах системы приблизительно равно периоду синхронизации. Одним из примеров использования метода тиражирования транзакций является система магазин-офис-склад. Магазин периодически отчитывается перед центральным офисом о количестве проданных товаров и полученных денег, а также пересылает на склад необходимые данные о количестве оставшегося товара. В этом случае, магазин может передавать накопленные данные в определенные момент (например, каждый час), что не требует серьезных расходов на поддержание информационной инфраструктуры и позволяет оперативно обновлять сведения во всех базах данных магазина, офиса и склада.
Тиражирование транзакций не очень требовательно к сетевым ресурсам, так как допускает значительные перерывы в связи, однако для систем, для которых важно как можно более быстрое распространение сведений от издателя к подписчикам, такая система тиражирования не пригодна. Если же за период тиражирования издатель не подтвердил ни одной транзакции, то это значит, что механизм тиражирования настроен не оптимально. Тиражирование транзакций позволяет выдержать баланс между расходами на поддержание сетевой инфраструктуры и временем распространения тиража.
Обновление на подписчике
Тиражирование в случае немедленного обновления инициируется издателем. Как только издатель подтверждает транзакцию, он сообщает дистрибутору о том, что данные изменены. Дистрибутор забирает подтвержденную транзакцию и рассылает ее подписчикам. Если во время завершения транзакции связь между дистрибутором и издателем была прервана, то транзакция записывается в очередь и будет передана дистрибутору, как только связь восстановится. Дальнейшее распространение данных выполняет дистрибутор либо принудительно, либо по запросу. Транзакции проводятся только через издателя.
При этом способе тиражирования достигается достаточно высокий показатель целостности транзакций и непротиворечивости данных, что очень важно для СУБД, обслуживающих быстро меняющиеся процессы. Фактически, при хорошей связи со всеми подписчиками, транзакция будет доведена до них за несколько секунд. Однако немедленное тиражирование требует постоянного, хотя и не очень надежного подключения каждого элемента системы к дистрибутору. Если же связь после каждой транзакции обрывается, а на восстановление требуется определенное время (например, при использовании телефонного модема), то лучше воспользоваться методом тиражирования транзакций.
Примером использования такой системы является продажа билетов. Как только какой-либо билет продан, сведения об этом должны быть переданы во все остальные копии основной базы, чтобы не возникало конфликтных ситуаций, когда продано два билета на одно место. Следует отметить, что при использовании двухфазного распространения транзакции можно добиться уровня целостности данных, который реализуется при распределенных транзакциях. Разница в том, что транзакции можно выполнять только с издателем.
Распределенные транзакции
В распределенных транзакциях участвуют несколько равноправных серверов баз данных, поэтому модель «издатель-дистрибьютор-подписчик» в этом случае не применима. Для подтверждения каждой транзакции все команды распространяются всем серверам, от которых должны прийти подтверждения о возможности проведения данной транзакции. Только после этого транзакция является принятой. Так работает двух фазная система подтверждения транзакции. В случае, когда хотя бы одна база данных недоступна, вся система перестает работать, поскольку неработающая система не может ни подтвердить, ни опровергнуть транзакцию. Поскольку все сервера равноправны, то транзакции можно проводить через любой сервер СУБД, а в процессе подтверждения они становятся доступны всем остальным серверам.
Основным недостатком распределенных транзакций является то, что они требуют постоянной связи между всеми серверами системы. Это предъявляет жесткие требования не только к каналам связи, но и к самим серверам. Впрочем, такая система обеспечивает максимальную целостность данных и их наиболее оперативное обновление. Использовать ее лучше всего в тех случаях, когда работа всей вычислительной системы невозможна без максимально быстрого распространения информации. Такие требования характерны для геоинформационных и метеорологических задач, а также для моделирования и САПР, где данные, на основе которые выполняются вычисления, распределены по нескольким компьютерам и базам данных.
Заключение
От правильного выбора схемы тиражирования данных зависит стоимость поддержки работоспособности системы в целом. Чем более независимой система может быть, тем меньше стоит ее поддержка. Однако увлекаться независимостью не следует, так как могут появиться серьезные ошибки в работе всей системы, а разобраться в причинах их возникновения не так-то просто. Поэтому от правильного выбора схемы тиражирования данных зависит надежность и эффективность работы распределенной системы баз данных.
Тиражирование в SQL Server 7.0
Новая версия СУБД SQL Server от Microsoft позволяет реализовать описанные в статье схемы тиражирования данных. При определении схемы тиражирования используется модель «издатель-дистрибьютор-подписчик». Эта модель реализуется с помощью следующих компонентов SQL Server 7.0:
- Агент подготовки моментального снимка базы данных (snapshot agent), который выполняет все необходимые приготовления для передачи мгновенного снимка данных с издателя на сервер дистрибутора.
- Агент чтения системного журнала (log reader agent), который запускается на дистрибуторе и проверяет изменения в базе данных издателя.
- Агент распространения тиража (distribution agent), который запускается на дистрибуторе и управляет распространением публикаций подписчикам.
- Агент слияния (merge agent), отвечающий за последовательное объединение данных между издателем и автономными базами данных.
Работа этих четырех агентов и реализует тиражирование данных в Microsoft SQL Server. Причем для настройки их совместной работы в поставке SQL Server есть специальные мастера, которые позволяют администратору СУБД быстро превратить SQL Server в один из компонентов системы. Мастер настройки дистрибьютора и издателя (configure publishing and distribution) и мастер удаления дистрибьютора и издателя (disable publishing and distribution) позволяют легко определить для SQL сервера соответствующую роль: издателя, дистрибьютора или подписчика, а также выполнить некоторые дополнительные настройки. Мастер создания публикаций (create publication) помогает администратору определить какие элементы данных должны быть объединены в публикации для дальнейшего тиражирования. Мастера принудительного тиражирования (push subscription) и распространения по запросу (pull subscription) дают администратору возможность настроить соответствующую схему тиражирования публикаций от дистрибьютора к подписчикам. Мастер настройки алгоритма разрешения конфликтов (replication conflict reconciler) помогает настроить агент слияния на определенный алгоритм разрешения конфликтов в процессе слияния транзакций. Причем, любой разработчик может создать свой собственный алгоритм разрешения конфликтов с помощью специального API-интерфейса.
Для контроля работы SQL Server, Microsoft предусмотрела специальные контрольные программы - мониторы (monitor), которые контролируют работу элементов тиражирования СУБД баз данных. Один из мониторов позволяет управлять работой издателей и подписчиков, а также созданием и распространением публикаций. С его помощью администратор может получить подробную информацию об издателях, публикациях и подписчиках. Монитор агента тиражирования (replication agents) дает администратору возможность с помощью графического интерфейса контролировать и настраивать действия всех четырех агентов, которые отвечают за процесс тиражирования. Монитор событий, возникающих в процессе тиражирования (replication alerts), позволяет настроить механизмы оповещения администратора о различных событиях, которые происходят в базах данных. Кроме того, некоторые события записываются в стандартный системный журнал.
Следует отметить, что механизм тиражирования SQL Server может быть согласован с аналогичными средствами других баз данных. Для тиражирования данных из SQL Server в другие СУБД в качестве подписчиков используются стандарты ODBC и OLE DB. Благодаря поддержке этих стандартов SQL Server 7.0 может работать с такими пакетами как Oracle, Sybase, DB2, а также Microsoft Access и Pocket Access. Если же необходимо, чтобы другая СУБД выступала в роли издателя, используя SQL Server в качестве дистрибьютора, то используется интерфейс к агенту распространения тиража. Причем, для администрирования и контроля такой гетерогенной системы тиражирования можно использовать объекты SQL-DMO.
Таким образом, новая версия SQL Server от Microsoft предлагает разработчикам баз данных разнообразные механизмы тиражирования для создания действительно распределенных приложений баз данных.