Да-да-да, немного высокотехнологичного порно и все будет работать… Может сложиться так, что два-три-десять сайтов используют одинаковую БД, да еще и меняют ее переодически. Сделать один общий сервер БД не вариант, потому что все начинает тормозить адски. Закинуть все на один мегамощный комп уже не помогает от тормозов. И вот тут-то и приходит на помощь репликация эмси скл. Вот смотришь 12 минутное видео от микрософт, где мужик накликавает все типы репликаций и понимаешь — это же так просто Smile Но есть один момент – репликация не будет нормально работать, если ваши сервера не в локальной сети. VPN поднимать совсем было не охота. Ну да ладно, придумали этакий костыль – механизм веб репликации данных – это та же репликация слиянием, что и обычно, только в миллион раз медленнее, но работает зато через интернет.

Что вообще происходит?

  1. На подписчике запускается агент слияния. Агент выполняет следующие действия:
    1. устанавливает SQL-соединение с базой данных подписки;
    2. извлекает из базы данных все изменения;
    3. производит HTTPS-запрос к компьютеру, на котором работает IIS-сервер;
    4. загружает изменения данных в виде XML-сообщения.

     

  2. Средство прослушивания репликации SQL Server и посредник репликации слиянием, находящиеся на IIS-сервере, выполняют следующие действия:
    1. обрабатывают HTTPS-запрос;
    2. устанавливают SQL-соединение с базой данных публикации;
    3. применяют переданные изменения к базе данных публикации;
    4. извлекают загруженные изменения для подписчика;
    5. возвращают HTTPS-ответ на агент слияния.

     

  3. После получения HTTPS-ответа агент слияния на подписчике применяет загруженные изменения к базе данных подписки.

 

И если тебе захотелось это настроить, вот готовый мануал с картинками!

На сервере, который раздает

Настройка IIS

Ставим IIS, потом настраиваем его по этой инструкции: https://msdn.microsoft.com/ru-ru/library/ff714039.aspx — Установка и настройка средства прослушивания репликации SQL Server. Там много всего не по делу, вот что я из нее делал

  1. Создайте на компьютере, где запущены службы IIS, новый каталог для файла replisapi.dll. Этот каталог вы можете создать в любом расположении, но рекомендуется разместить его в каталоге C:\Inetpub. Например, создайте каталог C:\Inetpub\SQLReplication\
  2. Скопируйте файл replisapi.dll из каталога C:\Program Files\Microsoft SQL Server\120\com\ в каталог, созданный на шаге 1.
    image
  3. Зарегистрируйте файл replisapi.dll. В каталоге, созданном в шаге 1, выполните следующую команду через cmd: regsvr32 replisapi.dll
    image
  4. Создайте новый веб-сайт для репликации или воспользуйтесь уже существующим. Я сделал новый, а физический путь поставил с:\Inetpub\SQLReplication\Home – это не принципиально
  5. Создайте виртуальный каталог в службах IIS. Виртуальный каталог должен быть создан на сайте, созданном в шаге 4, и сопоставлен с каталогом, созданным в шаге 1. Разрешения для этого каталога должны быть максимально ограничены. Необходимо выбрать как минимум разрешения Чтение и Выполнение.
    1. В диспетчере служб IIS на панели Соединения щелкните правой кнопкой мыши Веб-сайт по умолчанию и выберите Добавить виртуальный каталог.
    2. В поле Псевдоним введите SQLReplication.
    3. В поле Физический путь введите с:\Inetpub\SQLReplication\, затем нажмите кнопку ОК.
      capture-20150127-012010

     

  6. Установите в настройках служб IIS разрешение выполнять файл replisapi.dll.
    1. В диспетчере служб IIS щелкните Веб-сайт по умолчанию.
    2. На центральной панели выберите Сопоставления обработчика.
    3. На панели Действия выберите Добавить сопоставление модуля.
    4. В поле Путь запроса введите replisapi.dll.
    5. В раскрывающемся списке Модуль выберите IsapiModule.
    6. В поле Исполняемый объект введите С:\Inetpub\SQLReplication\replisapi.dll.
    7. В поле Имя введите Replisapi.
    8. Нажмите кнопку Ограничения запроса, перейдите на вкладку Доступ и щелкните Выполнить.
    9. Нажмите кнопку ОК, чтобы закрыть диалоговое окно Ограничения запроса, а затем повторно нажмите кнопку ОК, чтобы закрыть диалоговое окно Добавить сопоставление модуля. При запросе на разрешение расширений ISAPI нажмите Да, чтобы добавить расширение.
    10. Убедитесь, что файл Replisapi.dll включен в список Включены сопоставлений обработчика. Если он находится в списке Выключены, щелкните правой кнопкой мыши Replisapi и выберите Изменить разрешения функции. Установите флажок Выполнить, а затем нажмите кнопку ОК.

     

  7. Настройка проверки подлинности служб IIS
    1. В диспетчере служб IIS щелкните на созданный сайт.
    2. На средней панели дважды щелкните Проверка подлинности.
    3. Щелкните правой кнопкой мыши «Анонимная проверка подлинности» и выберите «Выключить».
    4. Щелкните правой кнопкой мыши «Обычная проверка подлинности» и выберите «Включить».
    5. Если каких-то проверок подлинности не хватает – установите их через диспетчер серверов.
  8. Получите сертификат через stratssl.com. Вот инструкция как получить: http://habrahabr.ru/post/127643/ В итоге получится два файла: ssl.crt и ssl.key. Ну и пароль для ключа
  9. Устанавливаем SSL сертификат
    1. На сайте www.startssl.com идем сюда и жмем Create PKCS#12 (PFX) File:
      image
    2. Втыкаем туда текст из файлов с шага 8:
      image
    3. Жмем кнопку и скачиваем PFX файл, который закидываем на сервер IIS.
    4. Там заходим в IIS Manager, жмем это:
      image
    5. Жмем справа импортировать, выбираем файлс третьего шага. Пофиг что расширение не подходит. Вводим пароль и жмем ОК
    6. Потом идем в наш созданный сайт и там создаем привязку:
      image
    7. Все, заходим сюда: https://<тут_адрес_сайта>/sqlreplication/replisapi.dll?diag, проблем с сертификатом быть уже не должно, вводим админские логин и пароль, должно появится что-то типа этого:
      capture-20150127-014012
  10. Возможно пулу приложения понадобится указать удостверение в дополнительных настройках. Можно создать левого пользователя без прав, с длинным паролем без ограничения срока действия, воткнуть его в группу IIS_IUSRS и дать ему права Чтение, Чтение & Выполнение и Просмотр содержимого папок на папку с:\Inetpub\SQLReplication\

 

Создание публикации

Теперь создаем публикацию репликации слияния. Надо помнить что это дерьмо добавляет левые столбцы к базе, поэтому сначала делаем полный бекап! Да кстати если у тебя в бд есть столбец с именем gen – то вероятно ничего не будет работать. Переименовать надобно.

  1. Жмем сюда
    image
  2. Выбираем БД и тип – публикация слиянием
    image
  3. Выбираем объекты, например таблицы.
  4. Далее, далее, далее…
  5. Выбираем не лучшее решение. Послушай мелкомягких и сделай по-своему
    image
  6. Вводим имя публикации и запоминаем его. Оно нам пригодится
    image
  7. Все четко
    image

Создание снимка БД для инициализации

Публикация создана, но этого мало. Нужно создать снимок.

  1. Жмем на агента:
    image
  2. Должно быть как на рисунке. Эта программа кромсает твои таблицы и стопорит транзакции. Но это во благо. Если что не так — жми запустить.
    capture-20150127-015623
  3. Кстати может понадобится дать полный доступ для SQLSERVERAGENT или для всех на папку C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\repldata (ну или куда там у тебя инсталирован SQL Server)
  4. В итоге должно стать так:
    capture-20150127-022404

Настройка параметров публикации

Теперь заходим в свойства публикации (правая кнопка – меню – свойства). Там надо

  1. Выбрать срок действия:
    image
  2. Разрешить веб-синхронизацию и указать сайт:
    image
  3. Если планируются жирные синхронизации, то можно поэкспериментировать с параметром WebSyncMaxXmlSize по адресу: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\110\Replicationimage
    Например если поставить туда 2000000, то все будет примерно так плачевно:
    capture-20150127-125925
    image
    Так что поаккуратнее с этим WebSyncMaxXmlSize.

Последний штрих – регистрируем подписчика

Для этого выполняем скрипт:

 

На сервере, который отгребает (подписчик)

  1. Создаем БД. Запоминаем ее имя.
  2. Выполняем такой запрос, только подписать нужно свои параметры

И о чудо, появилась подписка:

capture-20150127-021213

 

Жмем Репликация – Локальный подписки – на подписку правой кнопкой – в меню выбираем Свойства. Появляется таблица, и там есть строка “Время ожидания сервера” ставим побольше:

image

Когда все готово, жмем Репликация – Локальный подписки – на подписку правой кнопкой – в меню выбираем “Просмотр состояния синхронизации”:

capture-20150127-022734

Появляется диалог, жмем запустить, ждем полтора года:

capture-20150127-023038

 

Вот такой простой и понятный алгоритм репликации SQL Server.