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免密登录配置

  1. 服务端创建用户
    以下脚本将创建一个名为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"
    
  2. 客户端生成密钥对

    ssh-keygen -t rsa -b 4096 -C "backup_user@your_host"
    
  3. 客户端上传公钥至服务端,需要输入ssh密码

    ssh-copy-id -i ~/.ssh/id_rsa.pub backup_user@your_host
    
  4. 如果ssh-copy-id不可用,也可以手动设置

    a. 客户端查看公钥

    cat ~/.ssh/id_rsa.pub
    

    b. 服务端执行

    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
    
  5. 配置成功后,使用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
posted @ 2024-12-18 12:10  伊丽莎白菜  阅读(102)  评论(0)    收藏  举报