XSwitch运维手册

数据备份

使用 inotify-tools 和 rsync 来监控和备份 XSwitch 的 storage 目录。

xsbak 备份脚本

脚本只要获取到 inotify 的 close_write 事件,就会触发 rsync 进行文件备份。

脚本停止运行期间,XSwitch 产生的录音及上传的数据,都将不会备份。

#!/bin/bash
#-------------------------------------------------------
#连接远程服务器采用密钥方式
#1、生成密钥
#ssh-keygen -t rsa
#
#2、推送密钥
#ssh-copy-id -i ~/.ssh/id_rsa.pub  root@xxx.xxx.xxx.xxx
#
#3、确保远程服务器上面安装了rsync工具
#-------------------------------------------------------



#远程备份主机IP
REMOTE_IP=192.168.100.1
#连接的用户名
REMOTE_USER=root
#远程服务器ssh端口
REMOTE_SSH_PORT=22
#远程备份服务器上的备份路径
REMOTE_BACKUP_PATH=/backup


#rsync工作最忙的网络带宽占用为R_PROCESS * R_SPEED
#rsync传输文件速度单位kB
R_SPEED=10000
#rsync最大的并发数量
R_PROCESS=5

#检测工具安装
if [[ -z $(which inotifywait) ]]
then
    if [[ -n $(which rpm) ]]
    then
        yum makecache
        yum install -y epel-release
        yum install -y inotify-tools rsync

    else
        apt update
        apt install -y inotify-tools rsync
    fi
fi

#获取XSwitch的storage目录
binds=$(docker inspect --format '{{ range  .HostConfig.Binds }}{{ println . }}{{ end}}' xswitch)
audio_file_path=$(for item in $binds;do echo $item|grep 'freeswitch/storage'|cut -d ':' -f 1;done)

#创建控制队列
rm -f /tmp/fd1
mkfifo /tmp/fd1
exec 5<>/tmp/fd1
rm -f /tmp/fd1
for i in `seq $R_PROCESS`
do
    echo >&5;
done

#监测音频文件生成并传输
sysctl fs.inotify.max_user_watches=524288

inotifywait -mrq $audio_file_path -e close_write --exclude="http_file_cache|rrd" --timefmt '%d/%m/%y/%H:%M' --format '%T %w %f'| while read DATE DIR FILE;
do
    read -u5
    {
        #可以在此增加处理,如转换音频

        #添加备份信息
        TIME_EXT=$(date +%Y%m%d)_$(date +%H%M)_
        wavFile=$DIR$FILE
        FILEDIR=$(echo ${DIR#*storage/})
        #文件传输到远程服务器
        rsync -aq -e "ssh -p $REMOTE_SSH_PORT" \
          --bwlimit=$R_SPEED \
          --rsync-path="[ -d $REMOTE_BACKUP_PATH/$FILEDIR ] || mkdir -p $REMOTE_BACKUP_PATH/$FILEDIR &&rsync" \
          ${wavFile} $REMOTE_USER"@"$REMOTE_IP":"$REMOTE_BACKUP_PATH/$FILEDIR$TIME_EXT$FILE  2>&1 | grep -v known | \
          { read ok; [[ -z $ok ]] && echo "src: ${wavFile} -> remote: $REMOTE_BACKUP_PATH/$FILEDIR$TIME_EXT$FILE" || echo $ok; }

        echo "" >&5
    } &

done

使用 systemd 把脚本注册为后台服务

1、创建 service 文件

注意ExecStart=它指向 xsbak 脚本所在位置,xsbak 脚本必须有可执行权限。

cat > /etc/systemd/system/xsbak.service << EOF
[Unit]
Description=XSwich data backup shell script
After=network.target
StartLimitIntervalSec=3

[Service]
Type=simple
Restart=always
RestartSec=1
ExecStart=/opt/xsbak.sh

[Install]
WantedBy=multi-user.target

EOF

2、启用 service

#刷新systemd
systemctl daemon-reload
#运行xsbak
systemctl start xsbak
#xsbak开机自启
systemctl enable xsbak
#查看运行状态,注意观察日志
systemctl status xsbak
数据库备份