Введение

В статье описана настройка новой синхронизации между базами данных r_keeper_7

Минимальная версия r_keeper_7 для работы синхронизации — 7.6.4.

Описание синхронизации

Схема взаимодействия

Для включения синхронизации, укажите настройку ниже в ini-файле сервера. 

[DBSYNC]

UseDBSync=1

После запуска в этом режиме, сервер справочников создаст рядом с файлом базы rk7.udb файл rk7.udb.SQLite и папку, в которой будет накапливать резервные копии, журнальные файлы и файл настройки фильтрации для передачи клиентским приложениям. 
По умолчанию это папка DBSync\outgoing в папке с базой данных.

Передача клиентским приложениям происходит по сети. Сетевой доступ к этой папке обеспечивается по протоколу WebDAV.  Для работы WebDAV каждым сервером запускается nginx, доступ к которому автоматически прокидывается сквозь HTTP-интерфейс сервера. Если в ini-файлах клиентских приложений не задан статический ReqSourceURL, хост и порт для подключения к нему клиентские приложения по умолчанию выясняют у сервера сами, подключаясь к нему по сетевому имени.

Схема взаимодействия модулей в синхронизации 2.0 представлена ниже:

Настройка синхронизации

Откройте файл настроек сервера справочников — rk7srv.INI и добавьте настройку UseDBSync=1 в секцию [DBSYNC]. Секции по умолчанию нет, так что ее тоже необходимо указать.

;;first line comment to avoid problems with BOM
[REFSERVER] Server = RK7TEST
UDBFILE = ..\..\base\rk7.udb
MainLang = .\localize\rkeeper7\rkeeper7.ru.xlf
AltLang = .\localize\rkeeper7\rkeeper7.en.xlf
WorkModules = ..\..\base\workmods
ErrorLogSize = 10485760
DisableSMARTVerify = 1
UseNetChecking=1
LicServerIP=l.ucs.ru:60606
Usesql=1

[DBSYNC]
UseDBSync=1

[NETKERN]
Protocols = tcpsoc.DLL
DELPHI

Сохраните файл и запустите сервер справочников. 

  1. Откройте менеджерскую станцию.
  2. Перейдите в Настройки > OLAP отчеты > Серверы отчетов
  3. Выберите ваш сервер отчетов или справочников. В свойствах поставьте галочку Use Free Listen Port
  4. В разделе настройке HTTP API разделе HTTP Ограничения из выпадающего списка выберите HTTP Access
  5. Если вы не знаете, как указать привилегию на объект: HTTP Access — читайте в статье настройка интерфейсов.
  6. Сохраните настройки перезапустите сервер.

В папке RK7\base\ появится папка DBSync, содержащая папку outgoing. В outgoing сервер справочников будет накапливать резервные копии и журнальные файлы для передачи клиентским приложениям.

Пропишите эту же настройку в остальных приложениях: сервере отчетовкассовом сервере и кассовых станциях.

[DBSYNC] 
UseDBSync=1
DELPHI

Сохраните файлы настроек и запустите приложения.

Проверка синхронизации

Для проверки синхронизации можно просмотреть папку браузером. Для этого откройте ссылку вида:

https://http_host:http_port/rk7api/v1/dbsync/
  • http_host — IP-адрес желаемого сервера. В нашем случае это 127.0.0.1
  • http_port — порт сервера. Задается в секции [TCPSOC]. Если не указан, можно узнать, открыв веб-интерфейс — для этого нажмите на значок в трее 2 раза левой кнопкой мыши.
    Например, для сервера справочников:

Для примера, откроем ссылку https://127.0.0.1:54318/rk7api/v1/dbsync/ — моего сервера справочников. Вместо порта 54318 — укажите свой.

Появится окно авторизации.

Укажите имя пользователя латиницей с привилегией HTTP_Access и пароль.

Нажмите Вход. Появится список файлов в папке:

Если список появился — синхронизация работает. Дополнительно проверить синхронизацию можно, изменив имя блюда в меню и проверить это на кассовой станции. 

Аналогичным образом можно проверять кассовый сервер и сервер отчетов.

Обработка остановки синхронизации, online-обновление баз данных

В секции [DBSYNC] можно записать дополнительные настройки управляющие режимом синхронизации.
Параметр StopSyncAction применяется на кассовом сервере и на сервере отчётов для указания, что им необходимо делать, если будет остановлена синхронизация — например: отключен сервер справочников или вышестоящий транзитный сервер отчётов.
В соответствующих конфигурационных файлах:

  • rk7srv.ini — для сервера справочников
  • repsserv.ini — для сервера отчетов

В блоке [DBSYNC] необходимо прописать StopSyncAction= и одно из следующих 3 значений:

  • Nothing — сервер создаст  в логе запись об остановке синхронизации

    [DBSYNC] 
    StopSyncAction=Nothing 
    CODE
  • RestartApp — сервер создаст  в логе запись об остановке синхронизации, затем автоматически перезагрузится

    [DBSYNC] 
    StopSyncAction=RestartApp
    CODE
  • ReloadReferences — сервер создаст  в логе запись об остановке синхронизации, обновит бэкап и скачает коллекции. Будет сохранена более свежая версия базы r_keeper 7.

    [DBSYNC] 
    StopSyncAction=ReloadReferences
    CODE

Описание ini-файлов

Сервер справочников

Файл настроек сервера справочников — rk7srv.INI

[DBSync] ; Включение ведения второй базы SQLiteCMN для общей (основной) и локальной баз справочников, 
; и записи их журнальных файлов и бэкапов для работы механизма синхронизации базами. 
; После запуска в этом режиме, сервер справочников сделает рядом с файлом базы rk7.udb файл rk7.udb.SQLite 
; и папку, в которой будет накапливать резервные копии, журнальные файлы и файл настройки фильтрации 
; для передачи клиентским приложениям. Подробнее о ней см. ниже, в описании параметра OutputPath. 
; По умолчанию это папка DBSync\outgoing в папке с базой данных. 
; Сетевой доступ к этой папке у нас автоматически обеспечивается по протоколу WebDAV, 
; для чего каждым сервером запускается свой nginx, доступ к которому автоматически прокидывается 
; сквозь HTTP-интерфейс сервера. Если в ini клиентских приложений им не задан статический ReqSourceURL (см. ниже), 
; хост и порт для подключения к нему клиентские приложения по умолчанию выясняют у сервера сами, подключаясь к нему по сетевому имени. 
; Для проверки можно подключаться к этой папке, например, web-браузером, по URL вида https://<http host>:<http port>/rk7api/v1/dbsync/ UseDBSync = 1 

; Папка, в которую будут попадать созданные файлы бакапов, журналов и файл настройки фильтрации. 
; Можно не задавать, так как по умолчанию - это папка DBSync\outgoing\ рядом с файлом собственной базы данных справочников 
; сервера справочников. Клиентские приложения берут из неё файлы для обновления своих баз. 
; Доступ к ней они получают либо через встроенный WebDAV, либо напрямую как к папке в файловой системе, либо любым другим способом. 
; OutputPath = <DataBasePath>DBSync\outgoing 

; Через столько транзакций делать бэкап. По умолчанию, через каждые 1000 файлов журнала. 
; BackupOnVersionsDelta = 2000 

; После накопления какого суммарного размера журнала (в процентах от размера последнего бэкапа) делать новый бэкап. 
; По умолчанию, 30% - новый бэкап будет сделан, когда суммарный размер файлов журнала, 
; появившихся после создания последнего бэкапа, достигнет 30% от размера этого последнего бэкапа. 
; BackupOnJournalSizeMultiplier = 30 

; После достижения какого суммарного объёма файлов журнала стирать из OutputPath самые старые из них. 
; Задаётся в процентах от размера последнего сделанного бэкапа, по умолчанию 300. 
; То есть, по умолчанию, файлов журнала будет храниться три размера базы. 
; BackupMaxTotalSizeMultiplier = 300 

; Минимальное время хранения файлов журналов в часах 
; По умолчанию журналы хранятся не менее 8 часов 
; MinSaveJournalHours = 8 

; Сколько минут после появления более свежего бэкапа ждать отсутствующих журналов 
; Этот параметр срабатывает только при использовании внешнего транспорта, при использовании встроенного транспорта наличие пробелов в файлах журнала запрашивается с вышестоящего сервера и синхронизация останавливается через 5 минут
; Затем происходит запрос бэкапа и применение, если возможно.  
; NoJournalMinutesStopSync = 5

; После достижения какого количества бэкапов стирать из OutputPath самые старые из них. 
; По умолчанию хранится два бэкапа - последний и, на всякий случай, предыдущий 
; BackupCountLimit = 2 

; Для защиты обмена файлами через http можно задать системный пароль, значение параметра должно начинаться с ":" 
; ServerLoginInfo = :<Password> 

; Включение режима откладки nginx. 1 — включить. По умолчанию — 0. 
; NginxDebug = 0
DELPHI

Сервер отчетов

Файл настроек сервера отчетов — repserv.ini

[DBSync]
; Включение получения бэкапов, журналов и файла настроек фильтрации с вышестоящего сервера для синхронизации
; с ним своей основной базы справочников, а так же включение ведения второй базы SQLiteCMN для локальных справочников,
; и записи её журнальных файлов и бэкапов для работы механизма синхронизации базами.
; После запуска в этом режиме, сервер отчётов сделает рядом с файлом базы rk7.udb папку DBSync\outgoing,
; в которой будет накапливать бэкапы, журнальные файлы и файл настроек фильтрации для передачи своим клиентским
; приложениям, как по основной базе справочников, полученные с вышестоящего сервера и применённые к своей базе,
; так и по локальной базе, сформированные при редактировании локальных справочников на этом сервере. UseDBSync = 1
; По поводу настроек исходящей папки, см. описание аналогичной секции параметров сервера справочников.
; Доступ к папке OutputPath на вышестоящем сервере может быть открыт по протоколу WebDAV и посторонними средствами,
; в этом случае в параметре ReqSourceURL нужно указать URL, откуда запрашивать (Request) данные.
; ReqSourceURL = http://<serverIP>:<WebDAVPort>/rk7api/v1/dbsync
; Если этот параметр заполнен пустым значением, то скачивание по протоколу WebDAV будет отключено.
; Это полезно, если вышестоящий сервер находится на том же компьютере или в локальной сети, и есть возможность
; дать доступ к его исходящей папке напрямую средствами файловой системы.
; ReqSourceURL =
; Для балансировки нагрузки на сеть и серверы, можно задать сколько секунд должны ждать процессы скачивания по WebDAV
; между запросами к серверу на тему появления нового файла журнала или нового бэкапа. По умолчанию - интервал 2 секунды.
; ReqInterval = 2
; Для балансировки нагрузки на сеть и серверы, в процессе скачивания через WebDAV можно регулировать
; сколько процентов от размера бэкапа должны быть файлы журнала, чтобы на старте работы клиента скачался этот бэкап,
; а не скачивались и накатывались эти файлы журнала.
; По умолчанию задано 100 процентов: если нужные файлы журнал больше бэкапа, скачается бэкап.
; Если указать 200, то файлы журнала должны оказаться в 2 раза больше бэкапа, чтоб было выбрано скачивание бэкапа,
; а если указать 50 - бэкап может быть в 2 раза больше логов, но скачается бэкап.
; Выбирайте значение для этого параметра в зависимости от скорости сети, скорости применения файлов журнала,
; торможения системы при применении большого количества файлов журнала и т.п.
; ReqStartLoadBackupMultiplier = 100
; По умолчанию, при подключении через WebDAV бэкапы для папки OutputPath делаются локально, с оглядкой на настройки
; условий снятия бэкапов и независимо от серверов. Поэтому они получаются не для тех же версий данных, для которых бэкапы
; сняты на других серверах. В случае потребности в синхронности бэкапов или для снижения какой-то из нагрузок,
; сделана возможность включить режим получения бэкапов скачиванием их с вышестоящего сервера. По умолчанию она выключена.
; ReqToDownloadBackups = 0
; Папка (относительно exe-файла), откуда будут забираться бэкапы и журнальные файлы с ближайшего вышестоящего сервера
; для обновления своей базы. По умолчанию она задаётся равной <DatabasePath>DBSync\incoming
; Если параметр ReqSourceURL (см. выше) не задан пустым, то именно в неё по WebDAV будут скачиваться файлы.
; Если ReqSourceURL задан пустым, то здесь можно указать путь к папке DBSyncOutputPath вышестоящего сервера
; справочников или отчётов, если она находится в той же сети или на том же компьютере, или к её копии, получаемой
; с удалённого сервера каким-либо сторонним средством.
; InputPath = <RefServerBaseFolder>\DBSync\outgoing
; Папка, в которую будут попадать обработанные файлы бэкапов и журналов. Туда же будут записываться файлы базы локальных справочников.
; Можно не задавать, так как по умолчанию - это папка <DatabasePath>DBSync\outgoing\ рядом с файлом базы данных справочников сервера отчётов.
; OutputPath = <DataBasePath>DBSync\outgoing
; Режим, когда сервер отчётов обработанные файлы из папки InputPath будет удалять после их копирования в OutputPath.
; Это полезно, если в папку InputPath их они скачиваются персонально для данного сервера отчётов.
; Если в качестве входящей папки указана исходящая папка вышестоящего сервера, и она используется несколькими клиентами совместно,
; этот режим не уместен, и за чисткой этой папки следит сам вышестоящий сервер.
; В связи с этим, если InputPath=<DataBasePath>DBSync\incoming то по умолчанию RemoveProcessed = 1, иначе 0.
; RemoveProcessed = 0
; Для обмена файлами через http можно задать системного пользователя с паролем
; Для http сервера:
; ServerLoginInfo = :<Password>
; Для http клиента:
; ReqSourceLoginInfo = [<User>]:<Password>
; <User> - только для внешних WebDAV серверов. Для подключения к серверам RK7 <User> задавать не надо (будет использовано сетевое имя)!
; Те же, что и на сервере справочников
; BackupOnVersionsDelta = 2000
; BackupOnJournalSizeMultiplier = 30
; BackupMaxTotalSizeMultiplier = 300
; MinSaveJournalHours = 8
; NoJournalMinutesStopSync = 5
; BackupCountLimit = 2
; NginxDebug = 0 [CONFIG]
; Тип используемой базы. Механизм рассчитан на работу с SQLite, поэтому нужно указывать SQLiteCMN или SQLiteUCS.
; Должен совпадать с типом базы, указанным на сервере справочников.
; Пока там это указывать невозможно, так что здесь тоже не нужно его задавать.
; DataBaseKind = SQLiteCMN
; Настройки фильтрации не изменились, при желании включается через SyncSchdFile.
; Но при синхронизации базами, настройки фильтрации используются на чтении из базы,
; и поэтому они теперь нужны не только на репе - они должны быть заданы на каждом кассовом сервере и у каждой кассовой станции.
; Поэтому:
; Серверы, при включённом UseDBSync, свой фильтр сохраняют в OutputPath для использования клиентами.
; Клиенты, при включённом UseDBSync, если в параметре SyncSchdFile не задано иного, используют файл настройки фильтрации
; из папки, заданной параметром InputPath. Туда он должен попадать из OutputPath вышестоящего сервера.
; Коме того, из заданного в этом параметре файла используются только RestFilterIn, skipDeleteIn, а расписание не используется.
; SyncSchdFile =
DELPHI

Кассовый сервер

Файл настроек кассового сервера — RKEEPER.INI

[DBSync] 
; Смотрите описание аналогичной секции параметров сервера отчетов, имея ввиду что база локальных справочников на кассовом сервере тоже берется исключительно с вышестоящего сервера. 
[CONFIG] 
; Смотрите описание аналогичной секции параметров сервера отчетов.
DELPHI

Кассовая станция и станция печати

Файл настроек кассовой станции и станции печати — wincash.ini и winprint.ini

[DBSync]
; Смотрите описание аналогичной секции параметров сервера отчётов, но параметры отвечающие за наполнение и чистку папки OutputPath и выполнение бэкапов игнорируются 
[CONFIG]
; Путь к собственной папке для БД справочников кассовой станции.
; Кассовая станция в режиме синхронизации базами тоже будет иметь свою базу данных, и должна понимать, куда её положить.
; Если не указать - будет использоваться папка приложения. 
BasePath = ..
; Вместо используемого на серверах параметра DBSyncMoveToOutput, у кассовой станции параметр назван DBSyncRemoveProcessed
; Это режим, когда касса обработанные файлы из папки DBSyncInputPath будет удалять после обработки.
; Это полезно, если их в папку DBSyncInputPath перекладывает какой-либо сторонний механизм, персонально для данной кассы.
; По умолчанию 1, если DBSyncInputPath=<DataBasePath> + 'DBSync\incoming', иначе 0.
; DBSyncRemoveProcessed = 0
; В остальном - смотрите описание аналогичной секции параметров кассового сервера.
DELPHI