====== Репликация ====== ===== общее описание ===== репликация нужна в двух случаях - когда есть несколько удаленных друг от друга филиала - локально для обеспечения бесперебойности работы ===== подготовка ===== для начала нам нужно сделать копию БД. в это время система должна не работать т.е. закрыты все кассы и никто не ходит по территории. иначе данные в этот момент будут потерянны заводим нужные филиалы у каждого филиала в МУ надо включить репликацию (для локальной репликации филиал не нужен) делаем копию БД: блокируем файл 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 [[ac:perenos_basu#vosstanavlivaem_polzovatelja]] ===== удаленная репликация ===== на обоих филиалах создаем папки /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 минут