文件共享NAS+rsync
文件共享NAS+rync
日常使用:NAS比较多,公有云基本也是使用NAS,包括后续的PVC也有两种模式:云盘版本和NAS版本
NAS:直接进行挂载,要安装软件,NFS协议,可以共享挂载,存在一定的性能瓶颈
文件系统分类:EXT4,XFS,NFS(网络共享)
VFS:屏蔽了底层文件系统的差异,给到操作系统指令去读,操作系统可以直接读到NAS内的内容,服务叫NAS,文件系统协议叫NFS
类似MySQL的锁机制,NAS的文件共享也会被多个人访问,需要确保每个人的修改不要产生冲突,可以将用户上传的图片直接放到NAS上
注册中心
NAS的服务起来后,会有端口号时常变化的情况,需要使用到注册中心;一旦NAS的服务启动了,就不会变了,包括NAS服务器的IP;用户想要访问NAS,就去到注册中心获取IP+端口,就可以访问了
类似nacos注册中心,也是可以将微服务注册到nacos,用户/k8s/服务器等访问服务的时候,直接访问到nacos,访问微服务--->pod,一个微服务=一个pod/services,对外提供服务

基于RPC服务/协议来进行连接的(监听端口111),RPMBIND服务
先连接注册中心---访问到NAS服务---通过RPC服务(TCP)协议,连接到RPC,从而访问NFS服务,不管是mount也好还是访问/修改文件也好
搭建NFS文件共享系统
1.安装相关软件包
必备软件包:nfs-utils,客户端+服务端,自带nfs-server和nfs-utils客户端
rpcbind:注册中心,监听111端口--->相关依赖
yum -y install rpcbind nfs-utils
rpm -ql nfs-utils | grep rpc
systemctl status rpcbind
ss -ntl | grep 111
netstat -ntlp | grep rpcbind
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 4522/rpcbind
tcp6 0 0 :::111 :::* LISTEN 4522/rpcbind
##rpc服务以前叫portmapper
rpcinfo -p
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
NFS监听端口号特别多,都是基于一些程序,服务提供的
2.启动nfs-server服务,观察端口号,只读权限查看
showmount -e 10.0.0.129:看129的机器上有没有共享出来的目录
systemctl start nfs-server
##创建两个目录
[12:35:53 root@slave1 data]#mkdir nfs-share1
[12:36:00 root@slave1 data]#mkdir nfs-share2
##修改NFS共享目录配置
vim /etc/exports
/data/nfs-share1 *() --->共享哪个目录,其他人对他的权限,*代表所有,*(rw)代表读写
/data/nfs-share1 *(rw) --->*(rw)代表读写
##查看当前共享的目录
exportfs -v
##使配置文件生效
exportfs -r
[13:52:40 root@slave1 data]#exportfs -v
/data/nfs-share1
<world>(sync,wdelay,hide,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)
目前是只读的状态
##客户端挂载NAS
master
yum -y install nfsutils
mkdir -p /data/nfs
##showmount,这估计是访问111端口的
showmount -e 10.0.0.129
Export list for 10.0.0.129:
/data/nfs-share1 *
##挂载NAS,使用的是nfs4的文件系统
mount 10.0.0.129:/data/nfs-share1 /data/nfs
df -Th | grep nfs
10.0.0.129:/data/nfs-share1 nfs4 98G 17G 82G 17% /data/nfs
##修改为rw读写权限
/data/nfs-share1 *(rw) --->*(rw)代表读写
[root@slave1 nfs-share1]#exportfs -v
/data/nfs-share1
<world>(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
3.修改权限,映射账号,实现读写
对于NFS的服务来讲:先在NFS服务器授权共享目录
1.远程NFS客户端访问的用户,是根据UID来判断在nfs目录上写的用户/用户组的;比如root--->nobody,但是普通用户就是普通用户,写上远端服务器的UID+GID
2.修改共享目录的权限
[root@slave1 nfs-share1]#grep nobody /etc/passwd
nobody:x:99:99:Nobody:/:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
##others实现读写
chmod 647 /data/nfs-share1
drw-r--rwx 2 root root 32 Oct 2 13:54 nfs-share1
##root新建文件
这个变成nfsnobody了
[root@master nfs]#echo 3test >> 3.txt
[root@master nfs]#ll
total 12
-rw-r--r-- 1 root root 501 Oct 2 13:54 1.txt
-rw-r--r-- 1 root root 501 Oct 2 13:54 2.txt
-rw-r--r-- 1 nfsnobody nfsnobody 6 Oct 2 14:33 3.txt
##root用户被压榨成nfsnobody,root_squash
#这个ID为65534,证明是同一个账户,NFS服务器通过UID来判断
/data/nfs-share1
<world>(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
[root@master nfs]#id nfsnobody
uid=65534(nfsnobody) gid=65534(nfsnobody) groups=65534(nfsnobody)
-rw-r--r-- 1 nfsnobody nfsnobody 6 Oct 2 14:33 3.txt
[root@slave1 nfs-share1]#id nfsnobody
uid=65534(nfsnobody) gid=65534(nfsnobody) groups=65534(nfsnobody)
#我使用普通用户来创建,ikun的uid和gid分别为1004和1006
[ikun@master nfs]$ echo ikun >> ikun.txt
[ikun@master nfs]$ ll
total 16
-rw-r--r-- 1 root root 501 Oct 2 13:54 1.txt
-rw-r--r-- 1 root root 501 Oct 2 13:54 2.txt
-rw-r--r-- 1 nfsnobody nfsnobody 6 Oct 2 14:33 3.txt
-rw-rw-r-- 1 ikun ikun 5 Oct 2 14:37 ikun.txt
[ikun@master nfs]$ id ikun
uid=1004(ikun) gid=1006(ikun) groups=1006(ikun)
#这边只会显示1004和1006的uid+gid,想实现在NFS服务器看到需要创建一个UID和GID和ikun一样的账号才行
[root@slave1 nfs-share1]#ll
total 16
-rw-r--r-- 1 root root 501 Oct 2 13:54 1.txt
-rw-r--r-- 1 root root 501 Oct 2 13:54 2.txt
-rw-r--r-- 1 nfsnobody nfsnobody 6 Oct 2 14:33 3.txt
-rw-rw-r-- 1 1004 1006 5 Oct 2 14:37 ikun.txt
4.修改所有写入的账号映射成同一个账号nfsnobody,包括root
区分是那个账号写入的,也可以使用,统一映射成nfsnobody这个账号,统一UID和GID
可以实现给多个WEB主机写图片,映射到他们的web目录下,比如说/apps/nginx/data/pic下,这样用户写图片的时候就写到nfs的空间,而不是写到web服务器的磁盘上,节省空间,高效云盘即可
vim /etc/exports
/data/nfs-share1 *(rw,all_squash)
#ro只读
#rw读写
#root_squash:映射成nfsnobody
#all_squash:所有映射成nfsnobody
#anonuid:特定用户UID,需要先创建好用户,useradd -u 6666 web -s /sbin/nologin
#anongid:特定用户GID
[root@slave1 nfs-share1]#exportfs -r
[root@slave1 nfs-share1]#exportfs -v
/data/nfs-share1
<world>(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,all_squash)
-rw-rw-r-- 1 nfsnobody nfsnobody 0 Oct 2 16:23 ikun1.txt
-rw-rw-r-- 1 ikun ikun 5 Oct 2 14:37 ikun.txt
-rw-r--r-- 1 nfsnobody nfsnobody 0 Oct 2 16:23 root.txt
[root@slave1 nfs-share1]#id nfsnobody
uid=65534(nfsnobody) gid=65534(nfsnobody) groups=65534(nfsnobody)
针对特定的主机给特定的权限,不要所有人都可以读写,指定给132权限
也可以给多个目录挂载规则
/data/nfs-share1 *(rw,all_squash) 10.0.0.132(ro)
/data/nfs-share2 *(ro)
[root@slave1 nfs-share1]#exportfs -v
/data/nfs-share1
10.0.0.132(sync,wdelay,hide,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)
/data/nfs-share1
<world>(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,all_squash)
[root@rocky nfs]#touch 111
touch: 无法创建 '111': 只读文件系统
5.实现nas设备永久挂载(客户端)/etc/fstab
记得是nfs,写fstab文件的时候
一般内网都是通的
vim /etc/fstab
10.0.0.129:/data/nfs-share1 /data/nfs nfs defaults,_netdev 0 0
mount -a
reboot重启测试
[root@rocky ~]#df -Th | grep nfs
10.0.0.129:/data/nfs-share1 nfs4 98G 17G 82G 17% /data/nfs
6.针对不同的项目写不同的exports规则/etc/exports.d/nginx.exports
假设128是nginx机器
vim /etc/exports.d/nginx.exports
/data/nfs-share2 10.0.0.128(rw)
exportfs -r ##配置文件生效
exportfs -v
/data/nfs-share1
10.0.0.132(sync,wdelay,hide,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)
/data/nfs-share2
10.0.0.128(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
/data/nfs-share1
<world>(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,all_squash)
##nfs-server
chmod 777 /data/nfs-share2/
[root@master nginx]#touch nginx.pic
[root@master nginx]#ll
total 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 Oct 2 17:06 nginx.pic
基于内核实现数据的实时同步inotify
实现方式:inotify+rsync来实现
查看内核文件,在/boot下面
[root@master boot]#grep -i inotify config-3.10.0-1160.71.1.el7.x86_64
CONFIG_INOTIFY_USER=y
#功能已开启
inotify参数说明
[root@master boot]#ll /proc/sys/fs/inotify/
total 0
-rw-r--r-- 1 root root 0 Oct 2 22:06 max_queued_events --->最大队列文件,代表能够监控最大变化事件。生产中调大
-rw-r--r-- 1 root root 0 Oct 2 22:06 max_user_instances --->每个用户创建inotify的最大值
-rw-r--r-- 1 root root 0 Oct 2 22:06 max_user_watches --->可以监控最大的文件个数,生产中调大
可以修改inotify的默认参数
grep -i max_queued_events /etc/sysctl.conf
grep -i max_user_watches
vim /etc/sysctl.conf
sysctl -p
net.nf_conntrack_max = 100000
net.ipv4.ip_forward = 1
fs.inotify.max_queued_events = 66666
fs.inotify.max_user_watches = 66666
安装inotify-tools工具,实现inotifywait
yum -y install inotify-tools
##常用选项
inotifywait -m :保持事件监听
inotifywait -r :递归监控目录的数据变化
-q:输出少量的事件
-e:监听指定的事件
inotifywait -m /data/nfs-share1
touch nfs
[root@master boot]#inotifywait -m /data/nfs
Setting up watches.
Watches established.
/data/nfs/ CREATE nfs
/data/nfs/ OPEN nfs
/data/nfs/ ATTRIB nfs
/data/nfs/ CLOSE_WRITE,CLOSE nfs
--format:输出的格式,可以自定义字样
--timefmt:时间格式
-e:监听指定事件,比如create,delete等
#持续后台监控,并记录日志
inotifywait -o /root/inotify.log -drq /data/www --timefmt "%Y-%m-%d %H:%M:%S" --format "%T %w%f event: %e"
#持续前台监控特定事件,自定义格式
inotifywait -mrq /data/www --timefmt "%F %H:%M:%S" --format "%T %w%f event:%;e" -ecreate,delete,moved_to,close_write,attrib
普通监控和自定义参数监控的区别:不需要额外去关注文件的操作
编辑文件
vim d.txt
/data/nfs-share1/ CREATE d.txt
/data/nfs-share1/ ATTRIB d.txt
/data/nfs-share1/ CLOSE_WRITE,CLOSE d.txt
修改文件:涉及到东西太多,包括attrib,close_write等
删除文件:/data/nfs-share1/ DELETE a.txt
自定义参数:不用担心是否是哪个动作,直接显示时间+event,写入到变化日志中,可以查找,人为不需要去看他的文件具体是啥变化
不记录时间event
--format "%T %w%f event:%;e"
--format '%T %w %f'
inotifywait -mrq --exclude=".*\.swp" --timefmt '%Y-%m-%d %H:%M:%S' --format '%T %w %f' -e create,delete,moved_to,close_write,attrib
2022-10-03 12:50:08 /data/nfs-share1/ e.txt
2022-10-03 12:50:08 /data/nfs-share1/ e.txt
2022-10-03 12:50:08 /data/nfs-share1/ e.txt
实现inotify+rsync脚本同步备份数据
实现rync实现增量复制
rsync和rsync的协议
rsync:实现源目录到目标目录的增量复制,但是需要提前准备好检测目录文件变化的脚本检测方式
逻辑:一检测到nas服务器的/data/nfs-share1和2有变化,通过rsync同步过去
环境:
10.0.0.129 NAS服务器,共享目录
10.0.0.132 NAS备份服务器
rsync常用参数
-a:--archive 归档模式,表示以递归方式传输文件,并保持所有文件属性
-v:--verbose 详细模式输出
-z:-z, --compress 对备份的文件在传输时进行压缩处理
--delete:删除=删除,新建=新建,源+目的
一般
rsync -av 源目录/文件 目的目录/文件
rsync -av 源目录/文件 目的目录/文件
同步文件rsync -a 源 目的
1.在备份机器上安装rsync服务,监听873端口
yum -y install rsync-daemon
systemctl enable --now rsyncd
ss -ntl | grep 873
#主配置文件,共享一个目录出来,重启文件生效
vim /etc/rsyncd.conf
[bak]
##记得要写path,注释不要和具体的配置写在一行上面
path=/data/bak/
##不只读,可写,可以往里面同步数据
read only=no
systemctl restart rsyncd
#访问远程目录,已经显示出来了
rsync rsync://10.0.0.132
[root@slave1 ~]#rsync rsync://10.0.0.132
bak
##修改备份目录的权限,使得others也可以写入,root用户写入被认为是例如nobody等
chmod 777 /data/bak
ll | grep bak
drwxrwxrwx. 2 root root 33 10月 3 09:19 bak
ll /data/bak
总用量 4
-rw-r--r--. 1 root root 0 10月 3 09:13 1.txt
-rw-r--r--. 1 nobody nobody 63 10月 3 09:19 shells
2.从数据机器进行备份
Cent OS7上面是nobody,Cent OS8上面是nfsnobody
这里走的是rsync协议
#尝试将文件同步到这个backup目录下,两周写法均可
rsync /etc/fstab rsync://root@10.0.0.132/bak
rsync /etc/fstab 10.0.0.132::bak
[root@rocky bak]#ls
1.txt shells
#尝试从远端拉取1.txt文件,成功,复制到当前目录.
rsync rsync://root@10.0.0.132/bak/1.txt .
ll /data/bak
总用量 4
-rw-r--r--. 1 root root 0 10月 3 09:13 1.txt
-rw-r--r--. 1 nobody nobody 63 10月 3 09:19 shells
3.实现经过认证授权才可以同步文件,需要用到固定账号
注释和文本不要写在一行!!!
基于账号验证,需要写到固定文件里,也可以expect交互式,最好是不要写到脚本里
##在服务端编写配置文件
vim /etc/rsyncd.conf
uid = root
gid = root
#use chroot = yes
ignore errors
max connections = 0
##不限制连接数
#记录一下日志#
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
exclude = lost+found/
#transfer logging = yes
#timeout = 900
#ignore nonreadable = yes
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 ##不要压缩
[bak]
path = /data/bak/
##记得要写path
read only = no
##不只读,可写
auth users = rsyncuser
##默认用户
secrets file = /etc/rsync.pas
##默认密码
#服务端创建密码文件
echo "rsyncuser:123" > /etc/rsync.pas
chmod 600 /etc/rsync.pas
##加入开机启动
rsync --daemon
systemctl restart rsyncd
##客户端配置密码文件,只需要保留密码,修改权限
echo "123" > /etc/rsync.pas
chmod 600 /etc/rsync.pas
查看、上传和下载
##查看,调用自己客户端的密码文件,在服务端已经定义好了用户名和密码
[root@slave1 ~]#rsync --password-file=/etc/rsync.pas rsync://rsyncuser@10.0.0.132/bak
drwxrwxrwx 46 2022/10/03 10:45:55 .
-rw-r--r-- 0 2022/10/03 09:13:51 1.txt
-rw-r--r-- 719 2022/10/03 10:45:55 fstab
-rw-r--r-- 63 2022/10/03 09:19:59 shells
##上传
rsync -av /etc/group --password-file=/etc/rsync.pas rsync://rsyncuser@10.0.0.132/bak
sent 1,119 bytes received 35 bytes 2,308.00 bytes/sec
total size is 1,028 speedup is 0.89
#查看
rsync --password-file=/etc/rsync.pas rsync://rsyncuser@10.0.0.132/bak
drwxrwxrwx 59 2022/10/03 11:27:30 .
-rw-r--r-- 0 2022/10/03 09:13:51 1.txt
-rw-r--r-- 719 2022/10/03 10:45:55 fstab
-rw-r--r-- 1,028 2022/10/02 12:30:21 group
-rw-r--r-- 63 2022/10/03 09:19:59 shells
#下载,到根目录
rsync -av --password-file=/etc/rsync.pas rsync://rsyncuser@10.0.0.132/bak/fstab .
nas+inotify+rsync+shell实现实时同步文件
环境:
10.0.0.132 备份服务器:搭建rsync同步服务端
10.0.0.129 数据服务器:inotify实现监控挂载到本地的NAS目录文件变化,通过rsync实时同步到服务端,搭建NAS服务给到master服务nginx使用,存放nginx web端的文件(通过映射nobody)
1.基础环境
1.客户端
nginx端:10.0.0.128:/data/nfs
##挂载nas盘
cat /etc/fstab | grep nfs
10.0.0.129:/data/nfs-share1 /data/nfs nfs defaults,_netdev 0 0
mount -a
10.0.0.129:/data/nfs-share1 nfs4 98G 17G 82G 17% /data/nfs
##查看nas
[root@master nfs]#ll
total 0
-rw-r--r-- 1 root root 0 Oct 3 12:04 test.txt
2.10.0.0.129 NAS服务端+inotify监控文件变化+rsync同步,基于/etc/rsync.pas密码文件来实现,inotifywait
监控/data/nfs-share1的数据变化,共享给到10.0.0.128使用
3.10.0.0.132 rsync同步远端目录 /data/bak,基于/etc/rsyncd.conf
2.编写脚本实现实时同步
逻辑:检查到源端有变化,则更新到目的端,10.0.0.132::bak
vim inotify_rsync.sh
##监控NAS目录的变化
SRC='/data/nfs-share1/'
##备份服务器为132的bak,调用rsync的协议
DEST='rsyncuser@10.0.0.132::bak'
rpm -q rsync &> /dev/null || yum -y install rsync
rpm -q inotify-tools &> /dev/null || yum -y install inotify-tools
echo "starting monitor file change..."
sleep 2
#持续前台监控特定事件,定义时间格式、日期格式、动作(新建、删除、移动---重命名、写入、权限变化) + nas目录,输入到while内
inotifywait -mrq --exclude=".*\.swp" --timefmt '%Y-%m-%d %H:%M:%S' --format '%T %w %f' -e create,delete,moved_to,close_write,attrib ${SRC} |while read DATE TIME DIR FILE;do
FILEPATH=${DIR}${FILE}
##表示新建=新建,删除=删除
rsync -az --delete --password-file=/etc/rsync.pas $SRC $DEST
echo "At ${TIME} on ${DATE}, file $FILEPATH was backuped up via rsync" >> /var/log/changelist.log
#日志在129上面,在129上执行的脚本
done
2022-10-03 12:50:08 /data/nfs-share1/ e.txt
刚好4个变量,传参给DATE TIME DIR FILE
FILEPATH=${DIR}${FILE}--->/data/nfs-share1/e.txt
执行脚本,同时监控132的/data/bak
#后台挂起监控,这个东西最好是实时跑的,或是不放心可以整个crontab -e让他实时跑
nohup ./inotify_rsync.sh
starting monitor file change...
crontab -e
* * * * * /root/inotify_rsync.sh
132上0.5监控一次,watch实时监控
watch -n0.5 ls -l /data/bak
#在128nginx机器上实时写入文件
echo "rsync test" >> rsync.txt
在129上查看实时日志,输出格式,查看变化的文件
tail -f /var/log/changelist.log
At 12:27:16 on 2022-10-03, file /data/nfs-share1/a.txt was backuped up via rsync
At 12:27:16 on 2022-10-03, file /data/nfs-share1/a.txt was backuped up via rsync
在132上查看实时rsyncd的日志
tail -f /var/log/rsyncd.log


基于sersync进行自动化同步
使用sersync同步:省去了inotify监控很多不必要监控的事件,也是调用内核的inotify指令,inotify会重复调用rsync命令,造成资源的浪费
1.环境准备
##获取软件包
sersync2.5.4_64bit_binary_stable_final.tar.gz
tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz -C /apps/sersync
ls /apps/sersync
[root@slave1 GNU-Linux-x86]#ls
confxml.xml sersync2
##有关参数:
1.自动修改内核inotify的参数,grep fs.inotify.max_user_watches /etc/sysctl.conf
[root@slave1 GNU-Linux-x86]#./sersync2 -h
set the system param
execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches
execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events
parse the command param
_______________________________________________________
参数-d:启用守护进程模式
参数-r:在监控前,将监控目录与远程主机用rsync命令推送一遍
c参数-n: 指定开启守护线程的数量,默认为10个
参数-o:指定配置文件,默认使用confxml.xml文件
参数-m:单独启用其他模块,使用 -m refreshCDN 开启刷新CDN模块
参数-m:单独启用其他模块,使用 -m socket 开启socket模块
参数-m:单独启用其他模块,使用 -m http 开启http模块
不加-m参数,则默认执行同步程序
________________________________________________________________
2.执行程序,后台运行
./sersync2 -dro confxml.xml
ps aux | grep sersync2
[root@slave1 GNU-Linux-x86]#ps aux | grep sersync2
root 11708 0.0 0.2 92324 4856 ? Ssl 14:59 0:00 ./sersync2 -dro confxml.xml
3.查看同步效果
master写/data/nfs
nas服务器获取新数据,inotify监控
调用rsync同步到远端服务器
watch -n0.5 ls -l /data/bak

2.config.xml的写法
注释的为修改部分
<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
<host hostip="localhost" port="8008"></host>
<debug start="false"/>
<fileSystem xfs="false"/>
<filter start="false">
<exclude expression="(.*)\.svn"></exclude>
<exclude expression="(.*)\.gz"></exclude>
<exclude expression="^info/*"></exclude>
<exclude expression="^static/*"></exclude>
</filter>
<inotify>
<delete start="true"/>
<createFolder start="true"/>
<createFile start="false"/>
<closeWrite start="true"/>
<moveFrom start="true"/>
<moveTo start="true"/>
<attrib start="true"/> <!--修改了属性后更新 -->
<modify start="false"/>
</inotify>
<sersync>
<localpath watch="/data/nfs-share1"> <!--修改同步目录为/data/nfs-share1 -->
<remote ip="10.0.0.132" name="bak"/> <!--修改远端rsync备份服务器和备份目录/bak -->
<!--<remote ip="192.168.8.39" name="tongbu"/>-->
<!--<remote ip="192.168.8.40" name="tongbu"/>-->
</localpath>
<rsync>
<commonParams params="-artuz"/>
<auth start="true" users="rsyncuser" passwordfile="/etc/rsync.pas"/> <!--鉴权用户名,调用本地的password文件 -->
<userDefinedPort start="false" port="874"/><!-- 默认端口port=874 -->
<timeout start="false" time="100"/><!-- timeout=100 -->
<ssh start="false"/> <!--禁用SSH协议 -->
</rsync>
<failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
<crontab start="false" schedule="600"><!--600mins--> <!--先禁用定时任务 -->
<crontabfilter start="false">
<exclude expression="*.php"></exclude>
<exclude expression="info/*"></exclude>
</crontabfilter>
</crontab>
<plugin start="false" name="command"/>
</sersync>
<plugin name="command">
<param prefix="/bin/sh" suffix="" ignoreError="true"/> <!--prefix /opt/tongbu/mmm.sh suffix-->
<filter start="false">
<include expression="(.*)\.php"/>
<include expression="(.*)\.sh"/>
</filter>
</plugin>
<plugin name="socket">
<localpath watch="/opt/tongbu">
<deshost ip="192.168.138.20" port="8009"/>
</localpath>
</plugin>
<plugin name="refreshCDN">
<localpath watch="/data0/htdocs/cms.xoyo.com/site/">
<cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/>
<sendurl base="http://pic.xoyo.com/cms"/>
<regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/>
</localpath>
</plugin>
</head>
基于LNMP架构搭建LB+web+mysql+nas架构,实现从web站点上传的图片自动同步
环境:
10.0.0.128 apache+wordpress服务,数据库主库指向10.0.0.132,基于docker来安装,映射出来,docker安装wordpress
10.0.0.132 MySQL(主),备份服务器
10.0.0.129 MySQL(从),NAS服务器,NAS服务器指向
1.docker搭建wordpress+MySQL
docker run的时候,需要-v映射到nfs的共享目录,单个docker的映射目录()
还是直接docker run得了
docker pull wordpress
docker run --name wordpress -p 8002:80 -v /apps/wordpress:/var/www/html/ -d wordpress
#docker run --name wordpress -p 8002:80 -v /apps/uploads:/var/www/html/wp-content/uploads -d wordpress
docker stop `docker ps | grep wordpress | awk '{print $1}'`
docker rm -f `docker ps -a | grep wordpress | awk '{print $1}'`
##查看工作目录,查看从docker仓库下载下来的docker image镜像
##docker inspect imageID/image name,就是查看dockerfile
[root@master ~]#docker inspect wordpress | grep -i working
"WorkingDir": "/var/www/html",
[root@master ~]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
974257bc8c36 wordpress "docker-entrypoint.s…" 4 seconds ago Up 3 seconds 0.0.0.0:8002->80/tcp, :::8002->80/tcp wordpress
ss -ntl | grep 8002
LISTEN 0 128 *:8002 *:*
LISTEN 0 128 [::]:8002 [::]:*
10.0.0.128:8002
##MySQL操作,需要提前建库和用户
##所有的建站信息全部存放在表里
[(none)]>create database wordpress;
Query OK, 1 row affected (0.01 sec)
[(none)]>grant all on wordpress.* to wp@'%';
Query OK, 0 rows affected (0.01 sec)
[(none)]>flush privileges;
Query OK, 0 rows affected (0.00 sec)
新建一篇文章发布
2.rsync直接同步uploads目录到备份机[wp]
docker搭建映射出来的路径,不能再进行一次挂载,所以说API服务器有两个,IP+相同的端口号,uploads的rsync直接指向到10.0.0.132的复制目录,/data/bak
[root@master uploads]#exportfs -r
exportfs: /apps/wordpress/wp-content/uploads does not support NFS export
如果是多个web前端的话,程序可以控制写到LB的IP,负载均衡两个WEB,两个WEB的图片备份都指向备份机器,且两台WEB之间同步图片
##安装rsync工具和inotify-tools工具
rpm -q rsync &> /dev/null || yum -y install rsync
rpm -q inotify-tools &> /dev/null || yum -y install inotify-tools
#1.站点图片目录,有记录日期,直接同步这个文件夹,发布新文章,新图片上面都有
/apps/wordpress/wp-content/uploads
[root@master 10]#ls
0923test-01-1024x640.jpg 0923test-01-300x188.jpg 0923test-01.jpg image-150x150.png image-1568x842.png image-768x412.png
0923test-01-150x150.jpg 0923test-01-768x480.jpg image-1024x550.png image-1536x825.png image-300x161.png image.png
#2.直接使用sersync或者是脚本同步uploads到备份服务器10.0.0.132
scp sersync2.5.4_64bit_binary_stable_final.tar.gz 10.0.0.128:/root
tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz /apps/sersync
#3.编辑xml文件
vim confxml.xml
<sersync>
<localpath watch="/apps/wordpress/wp-content/uploads"> <!--/apps/wordpress/wp-content/uploads -->
<remote ip="10.0.0.132" name="wp"/> <!--修改远端rsync备份服务器和备份目录 -->
</localpath>
<rsync>
<commonParams params="-artuz"/>
<auth start="true" users="rsyncuser" passwordfile="/etc/rsync.pas"/> <!--鉴权用户名,调用本地的password文件 -->
#4.编辑备份端
rpm -q rsync &> /dev/null || yum -y install rsync
vim /etc/rsyncd.conf
[wp]
path = /data/wordpress/
##记得要写path/
read only = no
##不只读,可写
auth users = rsyncuser
##默认用户
secrets file = /etc/rsync.pas
##默认密码
##重启服务
systemctl restart rsyncd
#5.运行脚本,监控/data/wordpress/2022/10/的变化
#同步前先进行scp同步一遍先
scp /apps/wordpress/wp-content/uploads/* 10.0.0.132:/data/wordpress/
#执行脚本
master:[root@master GNU-Linux-x86]#./sersync2 -dro confxml.xml
nohup ./sersync2 -dro confxml.xml
ps aux | grep ser
root 13227 0.0 0.0 125108 712 ? Ssl 23:02 0:00 ./sersync2 -dro confxml.xml
##监控变化
backup:watch -n0.5 ll /data/wordpress/2022/10/
在wordpress站点发布图片,图片名字为10044444test.jpg

3.rsync使用脚本(在没有包的情况下,常用)
顺便安装了rsync和inotify,可以作为定时任务,或者nohup也行
缺点:调用多次rsync,有点小毛病,调用多次create,attribu等指令
vim inotify_rsync.sh
nohup ./inotify_rsync.sh
##监控NAS目录的变化
SRC='/apps/wordpress/wp-content/uploads/'
##备份服务器为132的bak,调用rsync的协议
DEST='rsyncuser@10.0.0.132::wp'
rpm -q rsync &> /dev/null || yum -y install rsync
rpm -q inotify-tools &> /dev/null || yum -y install inotify-tools
#修改参数,监控文件数量
echo 50000000 > /proc/sys/fs/inotify/max_user_watches
echo 327679 > /proc/sys/fs/inotify/max_queued_events
echo "starting monitor file change..."
sleep 2
#持续前台监控特定事件,定义时间格式、日期格式、动作(新建、删除、移动---重命名、写入、权限变化) + nas目录,输入到while内
inotifywait -mrq --exclude=".*\.swp" --timefmt '%Y-%m-%d %H:%M:%S' --format '%T %w %f' -e create,delete,moved_to,close_write,attrib ${SRC} |while read DATE TIME DIR FILE;do
FILEPATH=${DIR}${FILE}
##表示新建=新建,删除=删除
rsync -az --delete --password-file=/etc/rsync.pas $SRC $DEST
echo "At ${TIME} on ${DATE}, file $FILEPATH was backuped up via rsync" >> /var/log/changelist.log
#日志在129上面,在129上执行的脚本
done
Every 0.5s: tree /data/wordpress/2022/10/
├── test11-1024x640.jpg
├── test11-150x150.jpg
├── test11-300x188.jpg
├── test11-768x480.jpg
nohup 英文全称 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。
4.负载均衡架构
nginx:前端负载均衡
web01,web02:docker部署
备份服务器:web01和web02互相使用rsync脚本同步,同步前先完成一遍复制确保一致
web01和web02再备份一次到备份服务器
3方---4方---多方同步解决
目前只能实现docker单节点部署wordpress,通过脚本自动备份到远端132的机器
1.环境:可以在slave1上面搭建web02站点
搭建docker环境,搭建私有仓库
1.关闭防火墙,SELINUX
sed 's/enable/disabled/g' /etc/config/selinux
2.卸载旧版本的docker包
rpm -qa | grep docker
yum -y remove docker*,删除掉所有的依赖
3.docker安装存储库
yum install -y yum-utils device-mapper-persistent-data lvm2
4.添加阿里云的yum源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
修改内部的gpgcheck
:%s/gpgcheck=1/gpgcheck=0/g
sed -i 's/gpgcheck=1/gpgcheck=0/g' /etc/yum.repos.d/docker-ce.repo
5.安装docker-ce
yum install docker-ce docker-ce-cli containerd.io -y
scp -r /etc/docker/* 10.0.0.129:/etc/docker/
6.修改docker的源daemon.json
systemctl daemon-reload;systemctl restart docker
7.测试安装服务
docker images
docker ps -a
yum -y install httpd php php-mysqlnd php-json
chown apache.apache /var/www/html/*
ll /var/www/html/*
2.拷贝所有web01站点的信息过去,docker需要映射出来
1.配置docker基础环境
--拉取最新镜像
docker pull wordpress
--拉取仓库镜像,运行
docker pull registry
docker run -d -p 5000:5000 --restart=always --name registry -v /apps/myregistry:/var/lib/registry registry
--打标签
docker image tag wordpress 10.0.0.128:5000/wordpress:v1.0
[root@master registry]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
10.0.0.128:5000/wordpress v1.0 c3c92cc3dcb1 9 months ago 616MB
--配置insucure的镜像仓库地址
vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://plqjafsr.mirror.aliyuncs.com"
],
"exec-opts": [
"native.cgroupdriver=systemd"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"insecure-registries": ["10.0.0.128:5000"] ---配置本地仓库
}
--重新加载
systemctl daemon-reload
systemctl restart docker
--推送,查看
docker push 10.0.0.128:5000/wordpress:v1.0
curl http://10.0.0.128:5000/v2/_catalog
{"repositories":["wordpress"]}
--slave1尝试
[root@slave1 ~]#curl http://10.0.0.128:5000/v2/_catalog
{"repositories":["wordpress"]}
2.slave1拉取镜像,运行
--slave1
docker pull 10.0.0.128:5000/wordpress:v1.0
docker run --name wordpress -p 8002:80 --restart=always -v /apps/wordpress:/var/www/html/ -d 10.0.0.128:5000/wordpress:v1.0
docker run --name wordpress -p 8002:80 --restart=always -v /apps/wordpress:/var/www/html/ -d wordpress
docker start `docker ps -a | grep wordpress | awk '{print $1}'`
--拷贝web01的文件到/apps/wordpress
scp -r -p /apps/wordpress/* 10.0.0.129:/apps/wordpress/
rsync -a /apps/wordpress/* 10.0.0.129:/apps/wordpress/
3.试运行
docker stop `docker ps -a | grep wordpress | awk '{print $1}'`
docker start `docker ps -a | grep wordpress | awk '{print $1}'`
docker rm -f `docker ps -a | grep wordpress | awk '{print $1}'`
3.配置WEB01的DNS解析,添加A记录
4.前端添加一个nginx或者是LVS,实现前端负载均衡
#将docker的目录共享出来
/apps/wordpress *(rw,all_squash)
exportfs -r
exportfs -v
/apps/wordpress
<world>(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,all_squash)
#10.0.0.129挂载docker目录
[root@slave1 wordpress]#showmount -e 10.0.0.128
Export list for 10.0.0.128:
/apps/wordpress *
[root@slave1 wordpress]#docker restart ae516f4c8676
ae516f4c8676
[root@slave1 wordpress]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ae516f4c8676 10.0.0.128:5000/wordpress:v1.0 "docker-entrypoint.s…" 4 days ago Up 2 seconds 0.0.0.0:8002->80/tcp, :::8002->80/tcp wordpress
本文作者:catyer
本文链接:https://www.cnblogs.com/catyer/p/16837827.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步