Содержание
Репликация
общее описание
репликация нужна в двух случаях
- когда есть несколько удаленных друг от друга филиала
- локально для обеспечения бесперебойности работы
подготовка
для начала нам нужно сделать копию БД. в это время система должна не работать т.е. закрыты все кассы и никто не ходит по территории. иначе данные в этот момент будут потерянны
заводим нужные филиалы у каждого филиала в МУ надо включить репликацию (для локальной репликации филиал не нужен)
делаем копию БД: блокируем файл
sudo /opt/firebird/bin/nbackup -L ac -U SYSDBA -P masterke
копируем файл БД
sudo cp ac.fdb . . .
разблокируем БД
sudo /opt/firebird/bin/nbackup -N ac -U SYSDBA -P masterke
копируем файл на другой компьютер
scp . . .
добавляем альяс на другом компьюторе не в коем случае не делать созвучным с названием на сервере, например пусть будет ac2
sudo nano /opt/firebird/aliases.conf
активируем скопированный файл
sudo /opt/firebird/bin/nbackup -F ac2 -U SYSDBA -P masterke
создаем на обоих компьютерах пользователя ACREPLIC
удаленная репликация
на обоих филиалах создаем папки
/opt/ac/replic/in /opt/ac/replic/out
в новом филиале подключаемся к БД
устанавливаем
после этого по расписанию запускаем acreplic с ключами
acreplic -out
выгружает все данные в папку out которые надо скопировать в другой\другие филиалы в папку in
acreplic -in
загружает данные из папки in в БД
acreplic -re
пробует повторную загрузку данных если первый заход был не удачным
все это можно делать разными способами почта\флешка и т.д. у нас был проверен и работает следующий скрипт
#!/bin/bash
#server to mount
sshserver=l@r.homeip.net
# where files to send
outpath=/opt/ac/replic/out/
# where we send file
remoteoutpath=/home/lenin/in/
# where we put files
inpath=/opt/ac/replic/in/
# where from we get file
remoteinpath=/home/lenin/f3/
# where we have backup
backuppath=/opt/ac/replic/backup/
# dir to mount remote
remotepath=/opt/ac/replic/remote/
# flag to say "we are copy"
fn=lockf3
# flag to read "we are not ready"
fns=lockf3s
# install fs
# sudo apt-get install sshfs
# check fuse for all time it will be
# sudo nano /etc/modules
# and add fuse
# for 1 time run
# modprobe fuse
# try to mount remote dir
# sshfs user1@remote_server:/tmp /opt/ac/replic/remote
# if all good unmount dir by
# fusermount -u /opt/ac/replic/remote
#sshfs attid@192.168.100.215:/tmp /opt/ac/replic/remote
# todo not run if filecount = 0
echo `date`
#запоминаем время чтоб выполнялось не дольше 5 минут
tm1=`date +%s`
if [ -f "$remotepath/flag" ]
then
echo "Flag found. try to copy out"
sshfs $sshserver:$remoteoutpath $remotepath -o nonempty
# в случае если конект повиснет выходим
tm2=`date +%s`
let "tm3 = tm2-tm1"
if (($tm3>300)); then
#60*5=300
echo exit
exit;
fi
if [ ! -f "$remotepath/flag" ]
then
echo "out connected"
/opt/ac/acreplic -out
bzip2 $outpath*.rep
while [ -f "$remotepath$fns" ]
do
sleep 3
done
touch $remotepath$fn
cp $outpath*.bz2 $backuppath
mv $outpath*.bz2 $remotepath
rm $remotepath$fn
fusermount -u $remotepath
fi
fi
fusermount -u $remotepath
if [ -f "$remotepath/flag" ]
then
echo "Flag found. try to copy in"
sshfs $sshserver:$remoteinpath $remotepath -o nonempty
# в случае если конект повиснет выходим
tm2=`date +%s`
let "tm3 = tm2-tm1"
if (($tm3>300)); then
#60*5=300
echo exit
exit;
fi
if [ ! -f "$remotepath/flag" ]
then
echo "in connected"
while [ -f "$remotepath$fns" ]
do
sleep 3
done
touch $remotepath$fn
mv $remotepath*.bz2 $inpath
rm $remotepath$fn
fusermount -u $remotepath
# bzip2 -d $inpath*.bz2
for bz2files in `ls $inpath*.bz2`
do
bzip2 -d $bz2files
done
/opt/ac/acreplic -in -v
/opt/ac/acreplic -re -v
# resend files
for rf in `cat $inpath/resand| grep "#" -v`;
do
cp -f $backuppath$rf $outpath
done;
rm $inpath/resand
fi
fi
fusermount -u $remotepath
локальная репликация
по расписанию запускаем acreplic с ключом
acreplic -local
выгружает все данные во вторую БД и там же их загружает
acreplic -re -l
пробует повторную загрузку данных если первый заход был не удачным
совмещенная репликация
сначало надо запустить удаленную репликацию, потом заменить ключи запуска на
acreplic -out -l
выгружает все данные в папку out которые надо скопировать в другой\другие филиалы в папку in и одновременно копирует в локальную БД
acreplic -in -l
загружает данные из папки in в БД и одновремено в локальную БД
acreplic -re -l
пробует повторную загрузку данных если первый заход был не удачным в обоих БД
восстановление при сбое
т.е. предполагаем что сервер умер и его больше нет. отключаем его от сети. переделываем альяс на резервном на правильный (ac) подключаемся к БД и востанавливаем значения генераторов меняем ИП на резерве на ИП бывшего сервера. все должно продолжить работать как будто ничего не произошло. единственно что могут потерятся данные за период репликации, который рекомендуется делать раз в 5 минут
