mysql,minio,elasticsearch,mongodb备份脚本
服务器配置
可能需要备份文件到远端服务器。可以使用nfs或scp等方式。
nfs配置
服务端
通过nfs网络文件系统作为备份磁盘,将文件备份到远端。可以通过yum等包管理工具直接安装nfs,或者通过docker.
version: '3.1'
services:
nfs-server:
image: gists/nfs-server
container_name: nfs-server
ports:
- "2049:2049"
cap_add:
- SYS_ADMIN
- SETPCAP
environment:
- "NFS_DOMAIN=*" # The visitor IP range
- NFS_OPTION="fsid=0,rw,sync,no_root_squash,all_squash,anonuid=0,anongid=0,no_subtree_check"
volumes:
- ./data:/nfs-share
restart: always
客户端
# centos
yum install nfs-utils
# ubuntu debain
apt install nfs-common
# 服务端ip, 挂载地址设置
mkdir /backup
mount -v -t nfs -o vers=4 192.168.3.196:/ /backup
ssh免密登录配置
-
服务端创建用户
以下脚本将创建一个名为backup_user的用户,家目录为/app/backup#!/bin/bash username=backup_user home_dir=/app/backup # 生成随机密码 password=$(openssl rand -base64 12) # 创建用户并指定家目录 useradd -m -d $home_dir -s /bin/bash $username chown -R $username:$username $home_dir chmod 700 $home_dir # 设置密码 echo "$username:$password" | chpasswd # 输出生成的密码 echo "用户$username创建完成,其家目录设置为$home_dir,随机生成的密码为:$password" -
客户端生成密钥对
ssh-keygen -t rsa -b 4096 -C "backup_user@your_host" -
客户端上传公钥至服务端,需要输入ssh密码
ssh-copy-id -i ~/.ssh/id_rsa.pub backup_user@your_host -
如果
ssh-copy-id不可用,也可以手动设置a. 客户端查看公钥
cat ~/.ssh/id_rsa.pubb. 服务端执行
username=backup_user home_dir=/app/backup mkdir -p $home_dir/.ssh chmod 700 $home_dir/.ssh echo "客户端公钥" >> $home_dir/.ssh/authorized_keys chmod 600 $home_dir/.ssh/authorized_keys chown -R $username:$username $home_dir/.ssh -
配置成功后,使用
ssh执行远程命令或使用scp拷贝文件不再需要输入密码。
备份脚本
mysql备份脚本
mysql_backup.sh
#!/bin/bash
export PATH=$PATH:/usr/local/mysql/bin
date_str=$(date +%Y-%m-%d)
source_path=/apps/backup/
dest_path=/backup/mysql/
dump_file=mysql_184_dump-$date_str.sql.gz
passwd=mypasswd
mysqldump -uroot -p$passwd --all-databases |gzip > $source_path$dump_file
cp $source_path$dump_file $dest_path
# 保留最近3个文件
for f in `ls ${dest_path} |grep mysql_184_dump |sort -r |sed '1,3d'`;do
rm -f $source_path$f
rm -f $dest_path$f
done
minio备份脚本
mc客户端下载: https://min.io/download?license=agpl&platform=linux#/linux
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
mc alias set prod http://MINIO-SERVER MYUSER MYPASSWORD
minio_backup.sh
#!/bin/bash
export PATH=$PATH:/root/minio-binaries/
date_str=$(date +%Y-%m-%d)
source_dir=/app/minio/backup/
backup_filename=portal-uploads-$date_str
dist_dir=/backup/minio/
cd $source_dir
mc cp --recursive prod/portal-uploads/ $backup_filename
zip -r ${backup_filename}.zip $backup_filename
rm -rf $backup_filename
cp ${backup_filename}.zip $dist_dir
# 保留最近3个备份
for f in `ls ${source_dir} |grep portal-uploads- |sort -r |sed '1,3d'`;do
rm -f $source_dir$f
rm -f $dist_dir$f
done
elasticsearch备份脚本
基于elasticsearch-dump,可以使用npm安装,或者直接使用docker:
docker pull elasticdump/elasticsearch-dump
elasticsearch_backup.sh
#!/bin/bash
date_str=$(date +%Y-%m-%d)
source_dir=/apps/backup/
dist_dir=/backup/elasticsearch/
cd $source_dir
docker run --rm elasticdump/elasticsearch-dump \
--input=http://user:passwd@192.168.3.165:9200 \
--type=mapping --output=$ |gzip > mapping-${date_str}.json.gz
docker run --rm elasticdump/elasticsearch-dump \
--input=http://user:passwd@192.168.3.165:9200/portal-page-view-* \
--type=data --output=$ |gzip > portal-page-view-${date_str}.json.gz
docker run --rm elasticdump/elasticsearch-dump \
--input=http://user:passwd@192.168.3.165:9200/gateway-* \
--type=data --output=$ |gzip > gateway-${date_str}.json.gz
cp *-${date_str}.json.gz $dist_dir
# 保留最近3个备份
clean_up() {
for f in `ls ${source_dir} |grep $1 |sort -r |sed '1,3d'`;do
rm -f $source_dir$f
rm -f $dist_dir$f
done
}
clean_up "gateway-"
clean_up "portal-page-view-"
clean_up "mapping-"
mongodb备份脚本
mongodump可以从容器中获取:
docker cp mongo-server:/usr/bin/mongodump /usr/local/bin
mongodb_backup.sh
#!/bin/bash
date_str=$(date +%Y-%m-%d)
base_dir=/app/backup/
output_dir=$base_dir$date_str
mongo_user=root
mongo_passwd=Passwd
database=lms_device
authDB=admin
mkdir -p $output_dir
mongodump -u$mongo_user -p$mongo_passwd --authenticationDatabase=$authDB \
--uri=mongodb://192.168.4.211:27019 -d $database -o $output_dir
# 是否要备份到其他存储
remote_dir=/app/backup/mongo_backup/
remote_host=192.168.3.196
remote_user=backup_user
cd $base_dir
scp -r $date_str $remote_user@$remote_host:$remote_dir
# 保留最近3个备份
for sub_dir in `ls ${base_dir} |sort -r |sed '1,3d'`;do
rm -rf $sub_dir
done
ssh $remote_user@$remote_host << EOF
for sub_dir in \$(ls ${remote_dir} |sort -r |sed '1,3d');do
rm -rf \$sub_dir
done
EOF
crontab定时执行
crontab -e
# 每天1点执行一次
0 1 * * * sh /app/backup/mysql_backup.sh
0 2 * * * sh /app/backup/minio_backup.sh
0 3 * * * sh /app/backup/elasticsearch_backup.sh
0 4 * * * sh /app/backup/mongodb_backup.sh
时区问题
crontab可能会因为时区问题,导致获取的date_str错误,解决方法:
more /etc/localtime
cp /etc/localtime /etc/localtime.bak
cp -pf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

浙公网安备 33010602011771号