一、可用方案
NFS主———-rsync+inotify实时同步—————NFS备
问题:故障切换需要人为参与
DRBD+HeartBeat+NFS高可用文件服务器
特点:解决了单点故障、故障可以自动切换
问题:性能不足
兼顾:性能+高可用+数据安全性 ====》 分布式存储
ceph
MFS
Gluster
二、NFS
network file system:网络文件系统
网络存储可以分为三大类:
1、文件存储:对外提供的文件 —-》NFS
2、块存储:对外提供一个块设备(就是一块裸盘)
ceph可以提供块存储
3、对象存储:存储数据的单位是一个个的对象
三、NFS架构图
CS架构
服务端:/etc/exports
/data 192.168.71.0/24(rw,all_squash)
客户端:
mount -t nfs 服务端ip地址:/data /本地路径
客户端使用
读写数据————》/本地路径 —————–》nfs数据源
四、nfs使用详解
服务端
环境初始化
关selinux、防火墙
yum install nfs-utils rpcbind -y
配置:/etc/exports
/data 192.168.71.0/24(rw,sync,all_squash)
创建目录
mkdir /data
启动服务
systemctl start nfs-server
客户端
环境初始化
关selinux、防火墙
yum install nfs-utils rpcbind -y
all_squash
anonuid 666
anongid 666
五、制作nfs的备份/镜像机
方案一:
rsync+inotify
inotify:帮们检测一个文件下的变动,一旦该文件夹下有变动,都可以检测到
rsync:帮我们把变动文件同步到远程的备份机上
方案二:
sersync=rsync+inotify的封装
缺点:
故障切换要人手动完成
六:rsync的使用
yum install rsync -y
rsync命令即可以当客户端又可以当服务端
当客户端时:
优点:
1、rsync涵盖了scp、cp二者功能,即rsync同时支持本地拷贝与远程拷贝
2、scp与cp每次拷贝都是全量的,而rsync是增量的
3、scp远程传输不支持断电续传,而rsync支持
4、灵活性、可配置型强
缺点:
1、命令行选项复杂
2、本身没有检测文本何时变化的能力
3、对cpu消耗比较大
服务端:
rsync –deamon #systemctl start rsyncd
对比:
scp —————-ssh协议—————–》sshd
rsync
rsync—————-ssh协议—————–》sshd
rsync /a.txt 系统账号@1.1.1.111:/test
rsync—————-rsync协议—————–》rsyncd
rsync /a.txt 虚拟账号@1.1.1.111::模块名
rsync——————–ssh协议—————————–>sshd服务
要求服务端必须开启sshd服务(默认都是开启的)
基于ssh协议通信的话:
1、使用的账号是系统账号
2、ssh协议支持密码登录、密钥登录
用法与scp非常像
#1、上传/推送push
scp -r /aaa root@192.168.71.115:/bbb
#2、下载/拉取pull
scp -r root@192.168.71.115:/bbb /aaa
#1、上传/推送push
rsync -avz /aaa root@192.168.71.115:/bbb
#2、下载/拉取pull
rsync -avz root@192.168.71.115:/bbb /aaa
指定端口
scp -r -P 2222 root@192.168.71.115:/bbb /aaa
rsync -avz -e ‘ssh -p 2222’ root@192.168.71.115:/bbb /aaa
注意点:
1、虽然服务端启动的服务是sshd而不是rsyncd,但也必须安装rsync
2、scp是全量传输(内部有优化机制),rsync都是增量传输
rsync——————–rsync协议—————————–>rsyncd服务(rsync –deamon)
与ssh协议的区别是,基于rsync协议传输采用的是虚拟用户,而不是系统用户
1、客户端与服务端都需要做
关selinux、防火墙
yum install rsync -y
2、配置服务端
配置文件见博客
3、做好准备工作
useradd rsync -s /sbin/nologin -M
[root@nfs ~]# cat /etc/rsync.passwd
egon:123
[root@nfs ~]# chmod 600 /etc/rsync.passwd
4、启动服务
systemctl start rsyncd
虚拟用户egon——————-》系统用户rsync———–》操作xxx下的文件夹/egon_bak1
5、修改模块目录的属主与属组
chown rsync.rsync /egon_bak1
chown rsync.rsync /egon_bak2
6、测试使用
rsync -avz /aaa/1.txt egon@192.168.71.115::xxx/111.txt
rsync -avz /aaa/1.txt egon@192.168.71.115::yyy/111.txt
rsync -avz egon@192.168.71.115::yyy/111.txt /abc/1.txt
三种备份思想:
全量:
特点:每次都是一次完整的“拷贝”
恢复:
只需要一个文件
差异:
特点:每次都是跟第一次全量备份比较,只备份差异部分
此刻目录内文件的变化:1.txt 2.txt 3.txt 4.txt 5.txt
第一次全量:1.txt 2.txt 3.txt
第二次备份:只备份了4.txt
第二次备份:备份4.txt、5.txt
恢复:只需要两个文件
先恢复全量,然后把你想恢复那个时间节点的备份文件恢复即可
增量:
特点:每次都是跟上一次备份比较,只备份差异部分
此刻目录内文件的变化:1.txt 2.txt 3.txt 4.txt 5.txt
第一次全量:1.txt 2.txt 3.txt
第二次备份:4.txt
第三次备份:5.txt
恢复:是一个链,沿途的备份文件都需要
先恢复全量,再以此恢复沿途的增量备份,直到到达
你想要恢复的时间点
综上,对比三种备份方案
1、占用空间:全量 > 差异 > 增量
2、恢复数据过程的复杂程度:增量 > 差异 > 全量
rsync的增量备份
rsync -a –delete –link-dest 上一次的备份 当前的状态 备份的目标位置
第一次全量:
rsync -a –delete /data/ /bak/111
第二次备份:
rsync -a –delete –link-dest /bak/111 /data/ /bak/222
————> echo 3333 > /data/3.txt
第三次备份
rsync -a –delete –link-dest /bak/222 /data/ /bak/333
————> echo 1111 > /data/1.txt
第四次备份
rsync -a –delete –link-dest /bak/333 /data/ /bak/444
总结:与上一次一样会直接硬链接到上一次,不一样的才会创建新的
总结rsync特点:
1、耗cpu、省io
2、不适合的应用场景
源目录频繁变动
不适合同步大文件
镜像站:
1、搭建好一个主dns
共享文件夹/data
2、搭建好一个从dns,与主dns的配置一致
共享文件夹/data
#!/bin/bash
watch_dir=/data/ # 本地被监控目录
user="egon" # 虚拟用户
export RSYNC_PASSWORD=123 # 虚拟用户密码
module="xxx" # 远程模块名
ip=192.168.71.114 # 远程主机ip
# 先整体同步一次
rsync -azc --delete ${watch_dir} ${user}@${ip}::${module}
# 切换到被监控目录下,然后用inotifywait监控./目录,这样后期就可以用-R选项同步新增的子目录
cd $watch_dir
/usr/bin/inotifywait -mrq --timefmt '%Y-%m-%d %H:%M:%S' --format '%w%f:%Xe:%T' -e create,delete,modify,move,attrib,close_write ./ \
--exclude=".*.swp" | \
while read line
do
# $line的输出format为:文件路径:事件:时间
FILE=$(echo $line | awk -F: '{print $1}') # 获取文件的绝对路径
EVENT=$(echo $line | awk -F: '{print $2}') # 获取监控的事件
# 监控到对文件的下述行为后,只把文件同步到远端
if [[ $EVENT =~ 'CREATE' ]] || [[ $EVENT =~ 'MODIFY' ]] || [[ $EVENT =~ 'CLOSE_WRITE' ]] || [[ $EVENT =~ 'MOVED_TO' ]] || [[ $EVENT =~ 'ATTRIB' ]];then
rsync -azcR ${FILE} ${user}@${ip}::${module}
fi
# 监控到涉及到目录的改动,将目录同步到远端,例如用dirname ${FILE}获取目录
if [[ $EVENT =~ 'DELETE' ]] || [[ $EVENT =~ 'MOVED_FROM' ]];then
rsync -azcR --delete $(dirname ${FILE})/ ${user}@${ip}::${module} &>/dev/null
fi
done &