Архив системы. Последний релиз: 25-10-2008
.
Все необходимые файлы и каталоги размещаются в домашнем каталоге
пользователя sync
.
archive
- команда архивирования пакетовsyncctl
- программа синхронизацииnodeconf
- скрипт получения информации об узлах из конф. файлаetc/sync.conf
- конфигурационный файл системы синхронизацииetc/nodes.conf
- конфигурационный файл удаленных узловetc/nodes.sec
- конфигурационный файл уровней безопасности пакетовetc/common
- общие параметры, процедуры и функцииetc/sybase.sql
- все SQL-выражения, используемые в системеetc/profiles
- файлы-шаблоны для трех профилей системы:azs
- для использования системы на АЗСoffice
- для использования системы в оперцентреcenter
- для использования системы в клиринговом центре
doc
- документация по проектуФормат пакета.pdf
Система шифрования пакетов.pdf
changelog.txt
- история изменений системыdoc/todo.txt
- список будущих изменений системы
В базу данных устанавливается система под пользователем, который
устанавливает соединение с БД в программе, указанной в SQL_EXEC
.
- awk
- cat
- cksum
- expr
- gpg
- gzip
- printf
- sed
- sort
- tar
- touch
- tr
- zcat
/home/sync/ - домашний каталог системы
nodes/ - общий каталог для данных всех удаленных узлов
node1/ - данные, относящиеся к удаленному узлу node1
inbox/ - входящие сообщения (что пришло с узла)
outbox/ - исходящие сообщения (что должно уйти на узел)
node2/
inbox/
outbox/
...
arch/ - архив пакетов
inbox/ - для входящих пакетов
node1/ - пакеты, пришедшие с удаленного узла node1
YYYY.MM/ Пакеты разносятся по разным каталогам,
node2/ в зависимости от даты обработки пакетов.
YYYY.MM/
...
outbox/ - для исходящих пакетов
node1/ - пакеты, пришедшие с удаленного узла node1
YYYY.MM/ Пакеты разносятся по разным каталогам,
node2/ в зависимости от даты создания пакетов.
YYYY.MM/
...
Например, если имеются два узла barnaul
и azs1
, которые взаимно
обмениваются информацией, то потоки информации между каталогами
можно отобразить следующим образом:
Узел barnaul | Узел azs1
---------------------------|--------------------------------
/home/sync/ | /home/sync/
nodes/ | nodes/
azs1/ | barnaul/
------ inbox/ <----- пакеты ----- outbox/ -------
| ---- outbox/ ----- пакеты -----> inbox/ ----- |
| | | | |
| | arch/ | arch/ | |
| | inbox/ | inbox/ | |
| | azs1/ | barnaul/ | |
|-------> 2003.04/ | 2003.04/ <-----| |
| outbox/ | outbox/ |
| azs1/ | barnaul/ |
|-----> 2003.04/ | 2003.04/ <-------|
node1/
.connect - параметры соединения с узлом
.prepare.sql - закэшированный SQL-скрипт подготовки
данных для узла
.update.sql - закэшированный SQL-скрипт обработки
данных с узла
inbox/
pkt-0000001.tgz - файлы-пакеты, пришедшие с удаленного узла
pkt-0000002.tgz и еще не обработанные
outbox/
pkt-0000001.tgz - файлы-пакеты, сформированные для отправки
на удаленный узел, но еще не отправленные
----------------------------------------------------------------
Уровень безопасности пакета
----------------------------------------------------------------
0 | 1 | 2
----------------------------------------------------------------
пакет без защиты | подписанный пакет | зашифрованный пакет
----------------------------------------------------------------
packet.info packet.info packet.info
Owner_TableName1.dat packet.info.sig packet.info.sig
Owner_TableName1.del packet.data packet.data.enc
Owner_TableName2.dat packet.data.sig packet.data.sig
Owner_TableName2.del
packet.info - Служебная информация о пакете
packet.info.sig - Подпись файла packet.info
packet.data - Данные пакета
packet.data.enc - Данные пакета в зашифрованном виде
packet.data.sig - Подпись файла packet.data
Содержимое файла packet.data (файл в формате tgz):
Owner_TableName1.dat - Добавленные и измененные записи таблицы TableName1
Owner_TableName1.del - Стертые записи из таблицы TableName1
Owner_TableName2.dat - Добавленные и измененные записи таблицы TableName2
Owner_TableName2.del - Стертые записи из таблицы TableName2
....
-
Распаковать инсталляционый файл при помощи команды
$ zcat sync.tgz | tar x
-
Добавить пользователя
sync
в/etc/passwd
:sync::3:3:Synchronization System:/home/sync:/bin/sh
-
Добавить группу
sync
в/etc/group
:sync::3:sync
-
Определить имя локального узла (значение переменной
NODENAME
вetc/sync.conf
) -
Установить систему в базе данных (будут созданы служебные таблицы):
$ syncctl system install
-
Добавить в систему удаленные узлы:
$ syncctl node add <имя удаленного узла>
-
Указать записи каких таблиц будут тиражироваться на удаленные узлы:
$ syncctl table add <имя таблицы>
-
Указать индивидуально для каждого узла какие таблицы и с какими ограничениями будут тиражироваться на удаленные узлы: см. описание в файле
nodeconf
-
Система не будет замечать изменения в записях, если при этом прямо модифицируется значение служебного поля
Packet
илиInitPacket
. -
Система не будет замечать удаления записей, если значение служебного поля
InitPacket
равно0
. -
Система при синхронизации оперирует только общими полями, входящими в таблицу на обеих сторонах. Существует несколько ограничений этого правила:
-
Ключевые поля таблицы на принимающей стороне должны обязательно присутствовать в таблице на отсылаемой стороне (не обязательно, как ключевые и не обязательно как реальные).
-
Не могут синхронизироваться таблицы, состоящие только из ключевых полей.
-
Не могут синхронизироваться таблицы, в которых есть поля типов
long varchar
иlong binary
. Это связано с тем, что в их именах используется пробел. Также неопределено поведение системы в случае наличия полей типаuser-defined
.
-
-
У синхронизируемой таблицы должен обязательно определен первичный ключ, причем на обеих сторонах обмена.
-
Система должна работать на том компьютере, на котором запущен сервер баз данных, если это SQL Anywhere. Это связано с особенностью реализации обновления данных: используется команда
load
, которая требует нахождения файлов данных на компьютере, где запущенdb engine
. -
Система должна устанавливаться в базу данных только под одним пользователем.
-
Предполагается, что программа
$SQL_EXEC
возвращает код возврата, указывающий на успешность выполнения SQL-выражения. -
Предполагается уникальность имени служебного поля
Packet
во всех таблицах базы данных. Другими словами, если у таблицы имеется полеPacket
, то однозначно предполагается, что данные этой таблицы тиражируются на удаленные узлы. -
Служебными полями считаются поля, названия которых начинается с
pkt_
. -
Имя удаленного узла не может содержать пробелов и знаков подчеркивания.
-
Имя удаленного узла не может быть
default
, так как это ключевое слово используется в конфигурационном файлеnodes.sec
. -
Имя владельца таблицы не может содержать символ
_
.
Для того, чтобы встроить систему синхронизации в дистрибутив станции
необходимо выполнить команду build_from_cvs
из каталога etc/profiles
.
При этом файлы системы будут извлекаться непосредственно из CVS.
$ build_from_cvs <dir> <version>
где <dir> - корневой каталог дистрибутива станции. Обычно
это каталог, куда смонтирован раздел 77 диcтри-
бутивного диска. Система будет установлена
в каталог /home/sync на этом разделе;
<version> - официальная метка версии системы в CVS (обычно
RELEASE-X_Y_Z, см. раздел ВЕРСИИ СИСТЕМЫ)
Для подробного описания изменений см. файл doc/changelog.txt
- RELEASE-2_1
- RELEASE-2_1_1
- RELEASE-3_0
- RELEASE-3_1
- RELEASE-3_2
$ syncctl <объект> <действие> [<опции>]
Объект | Описание |
---|---|
system |
система синхронизации в целом |
keyring |
ключи системы |
node |
удаленный узел (узел, который будет получать данные) |
table |
синхронизируемая таблица |
data |
данные синхронизации |
prepared |
номер последнего успешно сформированного пакета |
updated |
номер последнего успешно обработанного пакета |
Действие | Описание |
---|---|
install |
установить систему в базе данных |
uninstall |
убрать из базы все, что относится к системе |
update |
обновить систему в базе данных |
status |
вывести данные о системе (версия, узлы, таблицы) |
reset-cache |
сбросить все кэшированные SQL-скрипты |
Действие | Описание |
---|---|
make |
создать первичную пару ключей для данного узла |
make for <узел> |
создать первичную пару ключей для узла <узел> |
add <узел>.key |
добавить открытый ключ узла в кольцо доверия |
remove <узел> |
удалить открытый ключ узла из кольца доверия |
list |
вывести список открытых ключей |
export |
выгрузить свой открытый ключ в файл <узел>.key |
Действие | Описание |
---|---|
add <название узла> |
добавить узел в систему |
remove <название узла> |
убрать узел из системы |
reset <название узла> |
начать заново формирование исходящих пакетов |
list |
вывести список узлов, зарегистрированных в системе |
Действие | Описание |
---|---|
add <имя таблицы> |
сделать записи таблицы тиражируемые на узлы |
update <имя таблицы> |
обновить метаданные таблицы для тиражирования |
remove <имя таблицы> |
прекратить тиражировать записи таблицы |
dwatch-on <имя таблицы> |
включить слежение за удалением записей таблицы |
dwatch-off <имя таблицы> |
выключить слежение за удалением записей таблицы |
Действие | Описание |
---|---|
prepare [for <group>] |
подготовить данные для отправки на узел/узлы |
update from <group> |
обновить БД данными, пришедшими с узла/узлов, где <group> - название группы узлов или конкретного узла |
Действие | Описание |
---|---|
get for <node> |
вернуть номер последнего успешно сформированного пакета |
set <num> for <node> |
установить номер последнего успешно сформированного пакета |
Действие | Описание |
---|---|
get for <node> |
вернуть номер последнего успешно обработанного пакета |
set <num> for <node> |
установить номер последнего успешно обработанного пакета |
Получить информацию по узлу или группе узлов из конфигурационного файла узлов
nodeconf <узел/группа> <объект> [for <таблица>]
Объект | Описание |
---|---|
nodelist |
список узлов, входящих в группу. Если в качестве первого параметра задан узел, то он и будет возращен |
grouplist |
список групп, в которые входит узел |
tablelist |
список таблиц, данные которых передаются на узел |
fieldlist |
список полей таблицы |
condition |
условие для выборки данных из таблицы |
tablealias |
другое имя таблицы, если оно определено. Иначе это же имя. |
config |
текущая конфигурация узла |
В файле индивидуально для узла или для группы узлов прописываются параметры, влияющие на процесс генерации данных:
- набор таблиц, данные которых будут пересылаться на узел;
- индивидуально для каждой таблицы:
- вертикальная фильтрация - набор полей таблицы;
- горизонтальная фильтрация - условия, налагаемые на каждую запись таблицы.
Файл разбит на секции двух типов:
- необязательная секция для описания групп узлов, и
- одна или более секций для описания параметров узлов.
Секция начинается с заголовка секции и заканчивается обязательным признаком конца секции.
Признак конца секции должен присутствовать, даже если в файле определяется только одна секция или секция располагается в конце файла.
Секция содержит описание одной или более групп узлов. Файл может содержать только одну секцию данного типа.
- Заголовок секции:
# === Groups ===
- Признак конца секции:
# ==============
Формат для определения группы:
group_<название группы>="<узел|группа>[ <узел|группа>...]"
Группы могут быть вложенными.
ВНИМАНИЕ! Название группы не должно быть частью названий узлов.
Например, группа azs
и узлы azs1
, azs2
и т.д. Смените в таком
случае название группы, напрмер, на azses
.
Секция содержит описание параметров для узлов, указанных в заголовке секции. Файл может содержать несколько секций для одного узла.
- Заголовок секции:
# === For nodes: <узел|группа>[ <узел|группа>...]
- Признак конца секции:
# ==============
Все поля таблицы плюс необязательные виртуальные поля:
table_<владелец>_<таблица>='*[ <вирт.поле1>...]'
Указанные поля (в том числе виртуальные) плюс поля, входящие в первичный ключ:
table_<владелец>_<таблица>='<поле1>[ <поле2>...]'
Формат определения виртуального поля: <имя>[<тип>]=<значение>
<имя>
- название поля,<тип>
- SQL-тип поля,<значение>
- любое допустимое SQL-выражение с одним исключением: выражение не должно содержать пробелов!
Виртуальное поле может "перекрывать" собой любое поле в таблице, в том числе входящее в первичный ключ.
condi_<владелец>_<таблица>="<условие>"
В условии и в списке полей могут использоваться специальные
макропеременные, значения которых подставляются во время
выполнения команды syncctl data prepare
:
<sender_name>
- имя узла, который готовит пакет<receiver_name>
- имя узла, для которого готовится пакет<sender_number>
- число, входящее в<sender_name>
(например, для узлаazs99
<sender_number>
заменяется на99
)<receiver_number>
- число, входящее в<receiver_name>
(например, для узлаazs99
<receiver_number>
заменяется на99
)
Для включения представления в процесс синхронизации необходимо:
-
включить каждую таблицу, входящую в представление в процесс синхронизации командой
syncctl table add <владелец>.<таблица>
-
переопределить представление таким образом, чтобы в него вошли все поля
Packet
от таблиц, входящих в представление:
create view as select <поля>,
<таблица1>.Packet as pkt_<таблица1>,
<таблица2>.Packet as pkt_<таблица2>,
...
from <таблица1>,
<таблица2>,
...
where <условие>
- добавить представление в файл
nodes.conf
как обычную таблицу с двумя исключениями:
- в списке полей нельзя использовать знак
*
(все поля); - в списке полей обязательно должен быть определен список полей, входящих в "виртуальный" первичный ключ представления, путем заключения этих полей в фигурные скобки
{}
table_<владелец>_<представление>='{<ключ.поле1> <ключ.поле2>...}[ <поля>]'
condi_<владелец>_<представление>="<условие>"
alias_<владелец>_<таблица>="<НОВЫЙ владелец>.<НОВОЕ название таблицы>"