文件共享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,对外提供服务

image-20221002115415916

基于RPC服务/协议来进行连接的(监听端口111),RPMBIND服务

先连接注册中心---访问到NAS服务---通过RPC服务(TCP)协议,连接到RPC,从而访问NFS服务,不管是mount也好还是访问/修改文件也好

image-20221002120706357

搭建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

image-20221002122141926

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 103 09:19 bak

ll /data/bak
总用量 4
-rw-r--r--. 1 root   root    0 103 09:13 1.txt
-rw-r--r--. 1 nobody nobody 63 103 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 103 09:13 1.txt
-rw-r--r--. 1 nobody nobody 63 103 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)

image-20221003115501789

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
image-20221003131013163 image-20221003131143435

基于sersync进行自动化同步

使用sersync同步:省去了inotify监控很多不必要监控的事件,也是调用内核的inotify指令,inotify会重复调用rsync命令,造成资源的浪费

image-20221003145413888

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
image-20221003150955537

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)


image-20221003210709016

新建一篇文章发布

image-20221003211323517

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
image-20221003233819624

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 中国大陆许可协议进行许可。

posted @   Catyer  阅读(286)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起