Lupinus

Re:从零开始的go学习生活(`・ω・´)

0%

[rsync数据备份]

rsync数据备份

环境准备

主机名 内网IP 外网IP 角色
web01 172.16.1.7 10.0.0.7 备份客户端
backup 172.16.1.41 10.0.0.41 备份服务端

rsync概述

rsync是一款开源、快速、多功能、可实现全量及增量的本地或远程数据同步备份的优秀工具。rsync软件适用于Unix、linux、windows等多种操作平台

为什么使用rsync不用scp?

  • scp是基于ssh协议的命令,不是一个服务

  • scp每次都基于全量拷贝,rsync支持增量拷贝

备份类型

  • 全量备份

    • 将数据全部备份出来

      image-20220513223426274

  • 增量备份

    • 基于上一次备份,新增部分的数据备份出来

      image-20220513223539309

  • 差异备份

    • 基于全量备份,新增部分的数据备份出来

rsync应用场景

  • 推:所有主机推送本地数据至rsync备份服务器,会导致数据同步缓慢(适合少量数据备份)

image-20220513225122692

  • 拉:rsync备份服务端拉去所有主机上的数据,会导致备份服务器开销过大

360截图1814122193114116

  • 大量服务器备份场景

image-20220513225426835

  • 异地备份实现思路

image-20220513225858773

rsync传输模式

注意:rsync拷贝目录时,加/和不加/是有区别的

/etc/ :将etc目录下的所有文件拷贝过去,不包括目录本身

/etc :将etc目录本身和目录下的所有文件一并拷贝过去

  • 本地模式(cp)
1
2
3
4
5
Local: rsync [OPTION...] SRC... [DEST] 
cp [OPTION]... SOURCE DEST

#语法
rsync [选项] 源文件.. 目标路径
  • 远程模式(scp)
1
2
3
4
5
6
7
8
9
Access via remote shell: 
Pull: 拉 rsync [OPTION...] [USER@]HOST:SRC... [DEST]
Push: 推 rsync [OPTION...] SRC... [USER@]HOST:DEST

#语法
拉:rsync [选项] [用户@]主机IP:文件路径 本机目录
推:rsync [选项] 本机文件 [用户@]主机IP:目录

注意:如果不加 用户@ 默认以当前系统登录的用户为用户名
  • 守护进程模式(把rsync当成服务启动)
1
2
3
4
5
6
Access via rsync daemon: 
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST

拉:rsync [选项..] [用户名@]主机IP::配置文件中的模块名 本机目录
推:rsync [选项..] 本机文件 [用户名@]主机IP::配置文件中的模块名

企业中为啥使用守护进程模式?

  • 远程模式和scp差不多,基于ssh协议

  • 需要知道系统的用户名和密码

  • 守护进程不需要ssh协议,服务启动后,自带端口

  • 守护进程可以设置匿名用户,不需要使用系统用户

rsync选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
-a:归档模式传输, 等于-tropgDl 
-v:显示同步过程
-z:压缩,提高传输效率
==============================
-t:time 保持文件的时间信息
-r:拷贝目录时,递归拷贝
-o:owner 保持文件的属主信息
-g:group 保持文件的属组信息
-p:perm 保持文件的权限信息
-D:device 保持设备文件的信息
-l:link 保留软链接
==============================
-P:显示进度
-L:保留软链接指向的目标文件
--exclude=PATTERN 指定排除不需要传输的文件模式
--exclude-from=file 指定排除文件
--bwlimit=1 限速传输
--partial 断点续传
--delete 决定数据是否要同步 rm
--password-file= 指定密码文件

rsync环境准备

主机名 WanIP LanIP 角色
web01 10.0.0.7 172.16.1.7 rsync客户端
backup 10.0.0.41 172.16.1.41 rsync服务端

rsync工作模式

  • 本地模式(cp)

  • 远程模式(scp)

  • 守护进程模式

rsync官网:https://rsync.samba.org/

rsync监听端口:873

rsync运行架构:C/S Client/Server

架构类型

C/S Client/Server

B/S Browser/Server

rsync服务端的作用:存储备份数据的

服务端操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#1.安装 
[root@backup ~]# yum install -y rsync

#2.配置
[root@backup ~]# vim /etc/rsyncd.conf
uid = rsync
gid = rsync
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
#####################################
[backup] comment = welcome to oldboyedu backup!
path = /backup

#服务的用户
uid = rsync
#服务的用户组
gid = rsync
#该服务监听的端口
port = 873
#rsync不以root身份运行,传输数据不使用系统用户
fake super = yes
#禁锢目录,客户端推送时只能在创建的目录(不允许获取到root权限)
use chroot = no
#最大连接数,最多能有多少个客户端跟服务端的873端口建立连接
max connections = 200
#超时时间
timeout = 600
#忽略错误
ignore errors
#只读 = false,不只读,可读可写
read only = false
#不允许查看模块信息
list = false
#匿名用户
auth users = rsync_backup
#匿名用户的密码文件
secrets file = /etc/rsync.passwd
#日志文件
log file = /var/log/rsyncd.log
#################################
[backup]
#模块的描述信息
comment = welcome to oldboyedu backup!
#备份的目录
path = /backup

端口的范围:1~65535

#3.创建rsync系统用户
[root@backup ~]# useradd rsync -s /sbin/nologin -M

#4.创建服务端的密码文件
[root@backup ~]# vim /etc/rsync.passwd
rsync_backup:123

[root@backup ~]# echo 'rsync_backup:123456' > /etc/rsync.passwd

#5.修改密码文件的权限为 600(rsync规定)
[root@backup ~]# chmod 600 /etc/rsync.passwd

#6.创建备份目录
[root@backup ~]# mkdir /backup

#7.修改备份目录的属组和属主
[root@backup ~]# chown rsync:rsync /backup/

#8.启动rsync服务并加入开机自启
[root@backup ~]# systemctl start rsyncd
[root@backup ~]# systemctl enable rsyncd

# 9.检查服务进程
[root@backup ~]# ps -ef|grep [r]sync
root 7787 1 0 05:58 ? 00:00:00 /usr/bin/rsync --daemon --no-detach

# 10.检查服务端口
[root@backup ~]# netstat -lntup|grep 873
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 7787/rsync
tcp6 0 0 :::873 :::* LISTEN 7787/rsync

客户端操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
推:rsync [option..] 原文件 [用户名@]主机IP::模块名 
rsync -avz /etc/passwd rsync_backup@172.16.1.41::backup

#报错
##用户密码认证失败
[root@web01 ~]# rsync -avz /etc/passwd rsync_backup@172.16.1.41::backup
Password:
@ERROR: auth failed on module backup
rsync error: error starting client-server protocol (code 5) at main.c(1649) [sender=3.1.2]
原因:1.用户输入错误 2.密码输入错误 3.密码文件的权限不是600
##模块名不认识
[root@web01 ~]# rsync -avz /etc/passwd rsync_backup@172.16.1.41::bak
@ERROR: Unknown module 'bak' rsync error: error starting client-server protocol (code 5) at main.c(1649) [sender=3.1.2]
##无法和172.16.1.41rsync服务建立连接
[root@web01 ~]# rsync -avz /etc/passwd rsync_backup@172.16.1.41::backup
rsync: failed to connect to 172.16.1.41 (172.16.1.41): No route to host (113)
rsync error: error in socket IO (code 10) at clientserver.c(125) [sender=3.1.2]
原因:1.防火墙 2.selinux 3.服务没启动 4.服务的端口改了
##客户端的密码文件权限也必须是600,否则报错
[root@web01 ~]# rsync -avz /etc/shadow rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.pass
ERROR: password file must not be other-accessible rsync error: syntax or usage error (code 1) at authenticate.c(196) [sender=3.1.2]

#1.安装
[root@web01 ~]# yum install -y rsync

#2.客户端创建密码文件(客户端上的密码文件,只需要写密码,不需要写用户)
[root@web01 ~]# vim /etc/rsync.pass
123456

#3.客户端上的密码文件也必须是600权限
[root@web01 ~]# chmod 600 /etc/rsync.pass

#4.推数据
[root@web01 ~]# rsync -avz /etc/shadow rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.pass

#5.使用环境变量免交互输入密码
[root@web01 ~]# export RSYNC_PASSWORD=123456
[root@web01 ~]# rsync -avz /etc/shadow rsync_backup@172.16.1.41::backup

排错过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
##服务端 
#1.检查配置文件
[root@backup ~]# cat /etc/rsyncd.conf
#2.检查密码文件的权限
[root@backup ~]# ll /etc/rsync.passwd
-rw------- 1 root root 20 May 16 17:37 /etc/rsync.passwd
#3.检查密码文件中的内容
检查用户名是否和配置文件中的用户名一致
#4.检查模块目录的权限
模块目录的权限,必须是rsync配置文件中指定的uid和gid的权限

##客户端
#1.检查命令用户名
命令中的用户名要跟服务端配置文件和密码文件中的用户名一致 rsync_backup
#2.检查命令模块名
命令中的模块名要跟服务端配置文件中的模块名一致 backup
#3.如果有密码文件,检查权限
600 root root
#4.检查密码文件内容
只需要写密码
#5.检查环境变量中的密码
[root@web01 ~]# echo $RSYNC_PASSWORD
123456
密码是否和服务端密码文件保持一致

rsync企业实战

环境准备

主机名 WanIP LanIP 角色
backup 10.0.0.41 172.16.1.41 rsync服务端
web01 10.0.0.7 172.16.1.7 rsync客户端
nfs 10.0.0.31 172.16.1.31 rsync客户端

先决条件

1
2
3
4
5
6
7
8
9
10
11
12
13
#1.安装时间同步
yum install -y ntpdate

#2.时间同步
crontab -e
*/5 * * * * /usr/sbin/ntpdate time1.aliyun.com >/dev/null

#3.关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

#4.关闭selinux
setenforce 0 sed -i 's#selinux=enforcing#selinux=disabled#g' /etc/sysconfig/selinux

客户端需求

1.客户端提前准备存放的备份的目录,目录规则如下: /client_backup

2.客户端在本地打包备份(系统配置文件、应用配置等)拷贝至 /client_backup 包名:nfs_172.16.1.31_2022-05- 16.tar.gz

3.客户端最后将备份的数据进行推送至备份服务器

4.客户端每天凌晨1点定时执行该脚本

5.客户端服务器本地保留最近7天的数据, 避免浪费磁盘空间

服务端需求

1.服务端部署rsync,用于接收客户端推送过来的备份数据

2.服务端需要每天校验客户端推送过来的数据是否完整

3.服务端需要每天校验的结果通知给管理员

4.服务端仅保留6个月的备份数据,其余的全部删除

如何校验一个数据的完整性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1.备份打包后,给压缩包做一个MD5加密 
/client_backup/nfs_172.16.1.31_2022-05-16.tar.gz
md5sum nfs_172.16.1.31_2022-05-16.tar.gz > jiaoyan.txt

2.将校验文件,和压缩包一并传递到服务端

3.在服务端使用md5sum -c检查校验
#完整传输
[root@backup tmp]# md5sum -c jiaoyan.txt
1.txt: OK

#被篡改或不完整
[root@backup tmp]# md5sum -c jiaoyan.txt
1.txt: FAILED
md5sum: WARNING: 1 computed checksum did NOT match

脚本实现客户端需求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
1.客户端提前准备存放的备份的目录,目录规则如下:/client_backup
mkdir /client_backup

2.客户端在本地打包备份(/etc/passwd)拷贝至/client_backup,包名:nfs_172.16.1.31_2022-05- 16.tar.gz
cd /etc && tar zcf /client_backup/nfs_172.16.1.31_2022-05-16.tar.gz passwd

3.客户端最后将备份的数据进行推送至备份服务器
rsync -az /client_backup/ rsync_backup@172.16.1.41::backup

4.客户端服务器本地保留最近7天的数据, 避免浪费磁盘空间
find /client_backup -type f ! -mtime -7|xargs rm -f

5.客户端每天凌晨1点定时执行该脚本
crontab -e
00 01 * * * /bin/sh /root/bakup.sh >/dev/null

#编写脚本
[root@web01 ~]# vim /root/backup.sh
#!/bin/bash
bak_dir="/client_backup"
host_name=`hostname`
ip=`/usr/sbin/ifconfig eth1|awk 'NR==2{print $2}'`
date_time=`date +%F`
export RSYNC_PASSWORD=123456

#1.创建客户端的备份目录
mkdir -p $bak_dir
#2.进入备份目录,压缩备份文件
cd /etc && \
tar zcf $bak_dir/${host_name}_${ip}_${date_time}.tar.gz passwd
#3.生成校验文件
cd $bak_dir && \
md5sum ${host_name}_${ip}_${date_time}.tar.gz > ${host_name}_${ip}_${date_time}.md5
#4.推送数据到rsync服务端
rsync -avz $bak_dir/ rsync_backup@172.16.1.41::backup
#5.保留7天内的文件
find $bak_dir -type f ! -mtime -7|xargs rm -f

脚本实现服务端需求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
##rsync部署
#1.服务端部署rsync,用于接收客户端推送过来的备份数据
[root@backup ~]# vim /etc/rsyncd.conf
uid = rsync
gid = rsync
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.passwd log
file = /var/log/rsyncd.log
#####################################
[backup]
comment = welcome to oldboyedu backup!
path = /backup

#2.服务端需要每天校验客户端推送过来的数据是否完整
cd /backup/ && md5sum -c *2022-05-16.md5

#3.服务端需要每天校验的结果通知给管理员
md5sum -c *2022-05-16.md5 |mail -s 'xxx' 123@qq.com

#4.服务端仅保留180天的备份数据,其余的全部删除
find /backup -type f ! -mtime -180|xargs rm -f

##配置发邮件
#1.安装发邮件服务
[root@backup ~]# yum install -y mailx
#2.修改配置文件
[root@backup ~]# vim /etc/mail.rc
set from=253097001@qq.com
set smtp=smtps://smtp.qq.com:465
set smtp-auth-user=管理员邮箱
set smtp-auth-password=授权码
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/
#3.编写脚本
[root@backup ~]# vim check_md5.sh
#!/bin/bash
bak_dir="/backup"
host_name=`hostname`
ip=`/usr/sbin/ifconfig eth1|awk 'NR==2{print $2}'`
date_time=`date +%F`

cd ${bak_dir} && \
md5sum -c *${date_time}.md5|mail -s "${date_time}_数据备份校验" 管理员邮箱 >/dev/null
find /backup -type f ! -mtime -180|xargs rm -f

测试crontab

1
2
3
4
5
6
7
8
9
#客户端定时任务 
crontab -e
#Usage:backup BY roger Date:2022-5-16
00 01 * * * /bin/sh /root/backup.sh &>/dev/null

#服务端定时任务
crontab -e
#Usage:md5 BY roger Date:2022-5-16
01 01 * * * /bin/sh /root/check_md5.sh &>/dev/null

image-20220517011007669

rsync结合inotify实时同步

如果只是做备份,不需要实时备份

定时任务最小单位是分钟级别

数据需要实时同步该如何解决?

inotify概述

inotify其实是一个监控命令,监控一个文件或目录的状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#1.安装inotify(客户端) 
[root@web01 ~]# yum install -y inotify-tools
[root@nfs ~]# yum install -y inotify-tools

#2.选项
-m 持续监控
-r 递归
-q 静默,仅打印时间信息
--timefmt 指定输出时间格式
--format 指定事件输出格式
-%Xe 事件
-%w 目录
-%f 文件
-e 指定监控的事件
access 访问
modify 内容修改
attrib 属性修改
close_write 修改真实文件内容
open 打开
create 创建
delete 删除
umount 卸载

#3.监控测试
/usr/bin/inotifywait -mrq --format '%Xe %w %f' -e create,modify,delete,attrib,close_write /client_backup

#4.编写脚本
#!/bin/bash
dir=/client_backup/
export RSYNC_PASSWORD=123456
inotifywait -mrq --format '%w %f' -e create,delete,attrib,close_write $dir|while read line;do
rsync -az --delete $dir rsync_backup@172.16.1.41::backup
done &

rsync总结

rsync作用:数据备份,数据同步

备份类型:

  • 全量备份

    • 将数据全部做一次备份
  • 增量备份

    • 基于上一次备份的数据,新增的部分
  • 差异备份(数据库 物理备份 Xtrabackup)

    • 基于上一次全备的数据,新增的部分

rsync三种工作模式:

  • 本地模式(local)

    1
    2
    3
    4
    5
    6
    #类似于cp命令:可以拷贝本地的文件目录等... 
    语法:
    rsync [选项] 源文件 目标路径
    rsync /root/1.txt /tmp

    当需要拷贝比较大的目录,或者文件比较多的目录,建议使用rsync
  • 远程模式(remote)

    1
    2
    3
    4
    5
    6
    7
    #类似于scp命令:基于ssh协议,会受到ssh协议的限制 
    语法:
    推: rsync [选项] 源文件 系统用户@IP地址:/目标路径
    rsync -avz /root/1.txt root@172.16.1.41:/tmp

    拉: rsync [选项] 系统用户@IP地址:/远端文件 本地路径
    rsync -avz root@172.16.1.41:/etc/passwd .
  • 守护进程模式(daemon)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    #将rsync当成是一个服务启动起来
    优势:
    1.不受到ssh协议影响
    2.不需要知道系统用户的密码

    #1.安装
    #2.修改配置文件
    [root@backup ~]# cat /etc/rsyncd.conf
    #服务的用户 uid = rsync # 服务的用户组
    gid = rsync
    #该服务监听的端口 客户端 --port=xxx
    port = 873
    #不以root身份运行,传输数据不使用系统用户
    fake super = yes
    #禁锢目录,不允许获取到root权限
    use chroot = no
    #最大连接数,最多能有多少个客户端跟服务端的873端口建立连接
    max connections = 200
    #超时时间
    timeout = 600
    #忽略错误
    ignore errors
    #只读 = false,不只读,可读可写
    read only = false
    #不允许查看模块信息
    list = false
    #匿名用户
    auth users = rsync_backup
    #匿名用户的密码文件(权限600,属主和属组都是root)
    secrets file = /etc/rsync.passwd
    #日志文件
    log file = /var/log/rsyncd.log
    #####################################
    #模块名
    [backup]
    #模块的描述信息
    comment = This directory for backup Nginx !
    #备份的目录
    path = /backup

    ###多模块配置
    #####################################
    [backup]
    comment = This directory for backup Nginx !
    path = /backup [zls] comment = xxx

    [zls]
    comment = xxx
    path = /bak

    #3.启动服务
    ##客户端,密码的三种方式
    1.密码文件(权限600,内容只有密码,不能写用户,属主和属组必须是root)
    2.手动输入密码
    3.export RSYNC_PASSWORD=123456(推荐)

数据校验:

1
2
3
4
md5加密算法 
md5sum 文件名 #给指定的文件生成一个加密字符串
校验文件:-c
md5sum -c 校验文件

实时同步:

1
2
3
作用:为了保证数据的一致性 
inotify:了解
sersync:实时同步,底层inotify