11#! /bin/bash
2-
2+ 33# заглушка, т.к. при изменении значения параметра archive_mode требуется перезагрузка СУБД
44# exit 0
5-
5+ 66function log() {
77 # echo $(date --rfc-3339=ns) $(hostname -s) $(basename "$SRC_FILE") "1ドル" &>> "$WAL_DIR/archive_wal.log"
88 return 0
99}
10-
10+ 1111WAL_DIR=" /mnt/backup_db/archive_wal/cluster"
1212SRC_FILE=" 2ドル " # откуда будем читать WAL файл
1313DST_FILE=" $WAL_DIR /1ドル .zst" # куда будем сохранять WAL файл
1414LOCK_FILE=" $WAL_DIR /1ドル .lock" # этот файл создаётся перед архиваций WAL файла и удаляется после
15-
15+ 1616log " check"
17-
17+ 1818# скрипт должен запускаться с двумя параметрами
1919test " $# " -ne 2 && echo " Error: 2 number of parameters expected, $# given" >&2 && exit 2
2020test ! -f " $SRC_FILE " && echo " Error: WAL file '$SRC_FILE ' does not exist!" >&2 && exit 1
2121test -f " $DST_FILE " && test ! -f " $LOCK_FILE " && log " exists" && exit 0
22-
22+ 2323log " does not exist"
24-
24+ 2525: << 'COMMENT '
2626 Для надёжности архивирование WAL файлов могут настроить на мастере и репликах через параметр archive_mode=always.
2727 Запрещаем от разных экземпляров СУБД конкурентную запись WAL файлов в общие сетевые папки.
@@ -32,7 +32,7 @@ COMMENT
3232
3333SRV_FILE=" $WAL_DIR /archive_server.$( hostname -s) " # сервер, на котором планируется архивирование WAL файла
3434touch -m " $SRV_FILE " || exit # создаём файл или обновляем дату модификации файла, если файл существует
35-
35+ 3636# разрешаем архивацию WAL файла только при наличии жёстких связанных ссылок (единый inode) между файлами $SRV_FILE и $LOCK_FILE
3737# для отладки и просмотра кол-ва жёстких ссылок на файл используйте утилиту stat (не используйте ls, она кеширует информацию)
3838if ln -T " $SRV_FILE " " $LOCK_FILE " & > /dev/null; then
5656 echo " Error: WAL file '$DST_FILE ' $MESSAGE " >&2
5757 exit 1
5858fi
59-
59+ 6060# кол-во потоков сжатия
6161ZSTD_THREADS=$( echo " $( nproc) / 4 + 1" | bc)
62-
62+ 6363# подсчитываем кол-во WAL файлов в очереди на архивирование
6464ARCHIVE_STATUS_DIR=$( dirname " $SRC_FILE " ) /archive_status
6565WAL_FILES_QUEUE=$( find " $ARCHIVE_STATUS_DIR " -maxdepth 1 -type f -name " *.ready" -printf " ." | wc --bytes)
66-
66+ 6767STEP=2
6868# чем больше WAL файлов в очереди, тем меньше степень сжатия (но больше скорость сжатия и размер сжатого файла)
6969# не ставьте большой уровень компрессии, это приводит к большому потреблению CPU, а экономия на размере файла несущественная
7070ZSTD_LEVEL=$( echo " (9 * ${STEP} - ${WAL_FILES_QUEUE} ) / ${STEP} " | bc)
7171test " $ZSTD_LEVEL " -lt 1 && ZSTD_LEVEL=1
72-
72+ 7373# архивируем WAL файл
7474# в zstd без флага -B1M используются не все ядра (из-за небольшого размера файла?)
75- ionice -c2 -n7 -- nice -n19 -- zstd -q -f -${ZSTD_LEVEL} -T${ZSTD_THREADS} -B1M " $SRC_FILE " -o " $DST_FILE " \
76- && rm -f " $LOCK_FILE " && log " saved, unlocked"
75+ COMMAND=" zstd -q -f -${ZSTD_LEVEL} -T${ZSTD_THREADS} -B1M '$SRC_FILE ' -o '$DST_FILE '"
76+ test $ZSTD_LEVEL -gt 1 && COMMAND=" ionice -c2 -n7 -- nice -n19 -- $COMMAND "
77+ $COMMAND && rm -f " $LOCK_FILE " && log " saved, unlocked"
0 commit comments