当前位置: 首页 > news >正文

rsync+xinetd+inotify+sersync

一、介绍

 

1.1、rsync 对比 scp

相同:
都有拷贝的功能不同:
rsync:具有增量复制,每次复制的时候,会扫描对端是否在同路径下有我要发送的一样的文件或者目录,如果,如果存在,则不进行复制。边复制,边统计,边比较。而且rsync是先对比后,在传输,所以会发现使用rsync 传输后,发现会卡在那
scp: 不具备增量复制 Rysnc特性和优点:
可以镜像保存整个目录树和文件系统
可以很容易做到保持原来文件的权限、时间、软硬链接等等无须特殊权限即可安装。
快速:第一次同步时 rsync 会复制全部内容,但在下一次只传输修改过的文件
压缩传输: rsync 在传输数据的过程中可以实行压缩及解压缩操作,因此可以使用更少的带宽. 跟http一样压缩传输
安全: 可以使用scp、ssh等方式来传输文件,当然也可以通过直接的socket连接支持匿名传输,以方便进行网站镜象。
选择性保持:符号连接,硬链接,文件属性,权限,时间等Rysnc缺点:每次都需要扫面,所以会占用I/O,cpu等

Linux 系统默认安装rsync(最小化安装没有rsync)
Linux 不依赖ssh,需要两端都有rsync

1.2、rsync的默认算法

man rsync的文档里可以看到:

Rsync finds files that need to be transferred using a "quick check" algorithm (by default) that looks for files that have changed in size or in last-modified time.

Any changes in the other preserved attributes (as requested by options) are made on the destination file directly when the quick check indicates that the file』s data does not need to be updated.

即默认rsync只会比较文件大小和最后修改时间,只要这两者一样,rsync即认为文件相同。其它属性(包括文件内容)的不同,并不会让rsync同步该文件!

1.3、查看rsync版本 

rsync --version

1.4、rsync传输模式(数据同步方式)

推push: 一台主机负责把数据传送给其他主机,服务器开销很大,比较适合后端服务器少的情况(比如大于10台,考虑节点量很大,发送到第10期间,有新的数据,可能存在再一次给第一个机器发送数据进行)
拉pull: 所有主机定时去找一主机拉数据,可能就会导致数据缓慢---- 自动化& 虚拟化 --> CI/CD docker

推:目的主机配置为rsync服务器,源主机周期性的使用rsync命令把要同步的目录推过去需要备份的机器是客户端,存储备份的机器是服务端)
拉:源主机配置为rsync服务器,目的主机周期性的使用rsync命令把要同步的目录拉过来(需要备份的机器是服务端,存储备份的机器是客户端两种方案,rsync都有对应的命令来实现

1.5、xinetd

Xinetd 是管理 Rsync 的工具,他还可以管理其他的工具比如FTFP, 类似 (TFTP) 进行管理轻量级的小服务,默认Linux 6 版本都是通过xinetd服务进行管理的,默认在xinetd目录下,在比如 tftp 保存在xinetd目录下,7版本rsync可以自己管理

PXE:无人值守

二、部署

2.1、规划

IP              hostname  /etc/redhat-release
192.168.206.5   master01  CentOS Linux release 7.5.1804 (Core)
192.168.206.6   master02  CentOS Linux release 7.5.1804 (Core)

2.2 、安装rsync(都需要)

yum install -y rsync xinetd   # xintend   可以不装,由于我是最小化安装Centos,所以需要安装rsync
[root@master01 ~]# rpm -qa rsync
rsync-3.1.2-12.el7_9.x86_64
[root@master01 ~]# rpm -qa xinetd
xinetd-2.3.15-14.el7.x86_64[root@master01 ~]# rpm -ql rsync
/etc/rsyncd.conf
/etc/sysconfig/rsyncd
/usr/bin/rsync
/usr/lib/systemd/system/rsyncd.service
/usr/lib/systemd/system/rsyncd.socket
/usr/lib/systemd/system/rsyncd@.service
/usr/share/doc/rsync-3.1.2
/usr/share/doc/rsync-3.1.2/COPYING
/usr/share/doc/rsync-3.1.2/NEWS
/usr/share/doc/rsync-3.1.2/OLDNEWS
/usr/share/doc/rsync-3.1.2/README
/usr/share/doc/rsync-3.1.2/support
/usr/share/doc/rsync-3.1.2/support/Makefile
/usr/share/doc/rsync-3.1.2/support/atomic-rsync
/usr/share/doc/rsync-3.1.2/support/cvs2includes
/usr/share/doc/rsync-3.1.2/support/deny-rsync
/usr/share/doc/rsync-3.1.2/support/file-attr-restore
/usr/share/doc/rsync-3.1.2/support/files-to-excludes
/usr/share/doc/rsync-3.1.2/support/git-set-file-times
/usr/share/doc/rsync-3.1.2/support/instant-rsyncd
/usr/share/doc/rsync-3.1.2/support/logfilter
/usr/share/doc/rsync-3.1.2/support/lsh
/usr/share/doc/rsync-3.1.2/support/lsh.sh
/usr/share/doc/rsync-3.1.2/support/mapfrom
/usr/share/doc/rsync-3.1.2/support/mapto
/usr/share/doc/rsync-3.1.2/support/mnt-excl
/usr/share/doc/rsync-3.1.2/support/munge-symlinks
/usr/share/doc/rsync-3.1.2/support/rrsync
/usr/share/doc/rsync-3.1.2/support/rsync-no-vanished
/usr/share/doc/rsync-3.1.2/support/rsync-slash-strip
/usr/share/doc/rsync-3.1.2/support/rsyncstats
/usr/share/doc/rsync-3.1.2/support/savetransfer.c
/usr/share/doc/rsync-3.1.2/tech_report.tex
/usr/share/man/man1/rsync.1.gz
/usr/share/man/man5/rsyncd.conf.5.gz[root@master01 ~]# rpm -ql xinetd
/etc/sysconfig/xinetd
/etc/xinetd.conf
/etc/xinetd.d/chargen-dgram
/etc/xinetd.d/chargen-stream
/etc/xinetd.d/daytime-dgram
/etc/xinetd.d/daytime-stream
/etc/xinetd.d/discard-dgram
/etc/xinetd.d/discard-stream
/etc/xinetd.d/echo-dgram
/etc/xinetd.d/echo-stream
/etc/xinetd.d/tcpmux-server
/etc/xinetd.d/time-dgram
/etc/xinetd.d/time-stream
/usr/lib/systemd/system/xinetd.service
/usr/sbin/xinetd
/usr/share/doc/xinetd-2.3.15
/usr/share/doc/xinetd-2.3.15/CHANGELOG
/usr/share/doc/xinetd-2.3.15/COPYRIGHT
/usr/share/doc/xinetd-2.3.15/README
/usr/share/doc/xinetd-2.3.15/empty.conf
/usr/share/doc/xinetd-2.3.15/sample.conf
/usr/share/man/man5/xinetd.conf.5.gz
/usr/share/man/man5/xinetd.log.5.gz
/usr/share/man/man8/xinetd.8.gz
[root@master01 ~]#
可以看到 xinetd 下已经没有 rsync
[root@master01 ~]# ll /etc/xinetd.d/
-rw-------. 1 root root 1157 4月   1 2020 chargen-dgram
-rw-------. 1 root root 1159 4月   1 2020 chargen-stream
-rw-------. 1 root root 1157 4月   1 2020 daytime-dgram
-rw-------. 1 root root 1159 4月   1 2020 daytime-stream
-rw-------. 1 root root 1157 4月   1 2020 discard-dgram
-rw-------. 1 root root 1159 4月   1 2020 discard-stream
-rw-------. 1 root root 1148 4月   1 2020 echo-dgram
-rw-------. 1 root root 1150 4月   1 2020 echo-stream
-rw-------. 1 root root 1212 4月   1 2020 tcpmux-server
-rw-------. 1 root root 1149 4月   1 2020 time-dgram
-rw-------. 1 root root 1150 4月   1 2020 time-stream
[root@master01 ~]#

2.3 、rsync 服务启动(都需要)

[root@master01 ~]# rsync --daemon
[root@master01 ~]# netstat -tulpn |grep 873
tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      19367/rsync
tcp6       0      0 :::873                  :::*                    LISTEN      19367/rsync
[root@master01 ~]#

2.4、rsync 参数 (标红重点

rsync命令和scp命令很相似


-a,--archive archive mode 权限保存模式, 相当于 -rlptgoD 参数,存档,递归,保持属性等

-r,--recursive 复制所有下面的资料,递归处理

-l,--links 复制所有的连接,拷贝连接文件
-p,--perms 保留档案权限 ,文件原有属性
-t,--times 保留时间点,文件原有时间
-g,--group 保留原有属组
o,--owner 保留档案所有者(root onlv
D,--devices 保留device资讯(root only)


-z,--compress 压缩模式, 当资料在传送到目的端时候,在传输的时候,会对源文件进行压缩处理,在传递给目标后进行解压,只是提高传输速度,压缩过程是rsync内部进行转换,并不会对源有文件进行修改
H.--hard-links 保留硬链接文件
A, --acls 保留ACL属性文件,需要配合--perms
P, -P参数和 --partial --progress 相同.只是为了把参数简单化,表示传输进度
--version,输出rsync版本
-v,--verbose 执行过程中,显示复杂的详细输出信息

-u, --update 仅仅进行更新,也就是跳过已经存在的目标位置,并且文件时间要晚于要备份的文件,不覆盖新的文件。也就是如果DEST中的文件比SRC新,则不同步即。默认rsync只会比较文件大小和最后修改时间,只要这两者一样,rsync即认为文件相同。其它属性(包括文件内容)的不同,并不会让rsync同步该文件,加上-u 参数,不会判断文件大小。

--port=PORT,定义rsyncd(daemon)要运行的port(预设为tcp 873)

-delete,删除那些目标位置有的文件而备份源没有的文件,比如拷贝目录www,在www中源文件有www/html/123.html,而目标目录也有一个www目录,切也有www/html/123.html,则删除目标www/html/123.html,拷贝源文件的www/html/123.html,期间不会影响源文件的www/html/123.html。此命令慎用,万一目标目录此文件有用,则会删除,故如果是单纯的完全一致拷贝,可使用。–delete 选项,表示客户端上的数据要与服务器端完全一致,多则删之,少则补之

-password-file=FILE ,从 FILE 中得到密码

-bwlimit=KBPS,限制 1/O 带宽
-filter "-filename”,需要过滤的文件
--exclude=filname,需要过滤的文件
-progress,显示备份过程
常用的-avz

2.5、详细讲解-u, -a,-delete 参数

master01:
[root@master01 ~]# mkdir /data/test1
[root@master01 ~]# cd /data/test1/
[root@master01 test1]# echo "nihao" >1.txt
[root@master01 test1]# echo "shijie" >2.txt
[root@master01 test1]# ll
-rw-r--r-- 1 root root 6 3月   2 06:59 1.txt
-rw-r--r-- 1 root root 7 3月   2 06:59 2.txtmaster02:
[root@master02 ~]# mkdir /data/test1
[root@master02 ~]# cd /data/test1/
[root@master02 test1]# echo "nihao hsijie" >1.txt
[root@master02 test1]# ll
-rw-r--r-- 1 root root 13 3月   2 06:59 1.txt

rsync -av

[root@master01 test1]# rsync -av /data/test1/ root@192.168.206.6:/data/test1/
root@192.168.206.6's password:
sending incremental file list
./
1.txt
2.txtsent 190 bytes  received 63 bytes  101.20 bytes/sec
total size is 13  speedup is 0.05[root@master02 test1]# ll
总用量 8
-rw-r--r-- 1 root root 6 3月   2 06:59 1.txt
-rw-r--r-- 1 root root 7 3月   2 06:59 2.txt
[root@master02 test1]# cat 1.txt
nihao
[root@master02 test1]#

总结:目标文件有1.txt,只是添加了 -a 参数,会把目标文件有1.txt 进行替换,那到底谁替换了

rsync -rv  和 rsync -lv 

[root@master01 test1]# rsync -rv /data/test1/ root@192.168.206.6:/data/test1/
root@192.168.206.6's password:
sending incremental file list
1.txtsent 135 bytes  received 41 bytes  50.29 bytes/sec
total size is 13  speedup is 0.07[root@master02 test1]# cat 1.txt
nihao
[root@master02 test1]# echo "nihao hsijie" >1.txt[root@master01 test1]# rsync -lv /data/test1/ root@192.168.206.6:/data/test1/
root@192.168.206.6's password:
skipping directory .sent 16 bytes  received 12 bytes  8.00 bytes/sec
total size is 0  speedup is 0.00[root@master02 test1]# cat 1.txt
nihao hsijie[root@master02 test1]# ll
-rw-r--r-- 1 root root 13 3月   2 07:04 1.txt
-rw-r--r-- 1 root root  7 3月   2 06:59 2.txt
[root@master02 test1]# rm -f 2.txt[root@master01 test1]# rsync -lv /data/test1/ root@192.168.206.6:/data/test1/
root@192.168.206.6's password:
skipping directory .sent 16 bytes  received 12 bytes  11.20 bytes/sec
total size is 0  speedup is 0.00[root@master02 test1]# ll
-rw-r--r-- 1 root root 13 3月   2 07:04 1.txt

总结:很明显,是参数-r 将目标文件有1.txt 替换,但是问题来了,没有 -r ,rsync根本无法拷贝复制,这个参数是基础,故-r必须有,亦或者说-a必须有,那如何才能让目标文件1.txt 不被替换,就是忽略已经存在的文件

rsync -au  

[root@master02 test1]# ll
-rw-r--r-- 1 root root 13 3月   2 07:04 1.txt
[root@master02 test1]#[root@master01 test1]# rsync -auv /data/test1/ root@192.168.206.6:/data/test1/
root@192.168.206.6's password:
sending incremental file list
./
2.txtsent 141 bytes  received 38 bytes  71.60 bytes/sec
total size is 13  speedup is 0.07
[root@master01 test1]#[root@master02 test1]# cat 1.txt
nihao hsijie
[root@master02 test1]#

总结:-u 参数,让目标文件1.txt 不被替换,就是忽略已经存在的文件

rsync --delete 

[root@master02 test1]# ll
-rw-r--r-- 1 root root 13 3月   2 07:21 1.txt
-rw-r--r-- 1 root root 13 3月   2 07:28 3.txt
[root@master02 test1]# cat 1.txt
nihao hsijie[root@master01 test1]# ll
-rw-r--r-- 1 root root 6 3月   2 06:59 1.txt
-rw-r--r-- 1 root root 7 3月   2 06:59 2.txt
[root@master01 test1]#
[root@master01 test1]# cat 1.txt
nihao[root@master01 test1]# rsync -avz --delete /data/test1/ root@192.168.206.6:/data/test1/
root@192.168.206.6's password:
sending incremental file list
deleting 3.txt
./
1.txt
2.txtsent 187 bytes  received 72 bytes  19.19 bytes/sec
total size is 13  speedup is 0.05[root@master02 test1]# ll
总用量 8
-rw-r--r-- 1 root root 6 3月   2 06:59 1.txt
-rw-r--r-- 1 root root 7 3月   2 06:59 2.txt
[root@master02 test1]# cat 1.txt
nihao

总结:--delete 参数会把,目前目录中3.txt,在源文件中没有删除,1.txt 有则覆盖,说白了,就是删除目录中所有的文件,然后全部复制。

rsync -avzu --delete 

[root@master01 test1]# ll
-rw-r--r-- 1 root root 6 3月   2 06:59 1.txt
-rw-r--r-- 1 root root 7 3月   2 06:59 2.txt
[root@master01 test1]# mkdir 123
[root@master01 test1]# cd 123/
[root@master01 123]# echo "shijie" >2.txt
[root@master01 123]# echo "shijie" >1.txt[root@master02 test1]# cat 1.txt
nihao hsijie
[root@master02 test1]# mkdir 456
[root@master02 test1]# mkdir 123;cd 123/
[root@master02 123]# echo "nihao hsijie" >1.txt[root@master01 test1]# rsync -avzu --delete /data/test1/ root@192.168.206.6:/data/test1/
root@192.168.206.6's password:
sending incremental file list
./
2.txt
123/
123/2.txtsent 271 bytes  received 65 bytes  61.09 bytes/sec
total size is 27  speedup is 0.08
[root@master01 test1]#[root@master02 test1]# ll
drwxr-xr-x 2 root root 32 3月   2 07:35 123
-rw-r--r-- 1 root root 13 3月   2 07:34 1.txt
-rw-r--r-- 1 root root  7 3月   2 06:59 2.txt
[root@master02 test1]# cat 1.txt
nihao hsijie
[root@master02 test1]# cd 123/
[root@master02 123]# ll
-rw-r--r-- 1 root root 13 3月   2 07:38 1.txt
-rw-r--r-- 1 root root  7 3月   2 07:35 2.txt
[root@master02 123]# cat 1.txt
nihao hsijie
[root@master02 123]#

总结:–delete 选项,表示客户端上的数据要与服务器端完全一致,多则删之,少则补之,意思是要保证完全一致,比如 rsync -avz --delete 相当于删除目标目录下的所有的文件,然后从源文件全部拷贝过去。期间添加-u参数,  rsync -avzu --delete 可以忽略如果目标文件中,已经存在的文件或者目录,则不替换源文件。

如果,只是想在目标目录中,添加目标目录中没有的文件或者目录,不需要删除目录的文件,使用 rsync -avzu 

2.6、停止rsync

直接 kill 掉

[root@master02 web-back-1]# ps -ef |grep rsync
root     17332     1  0 06:10 ?        00:00:00 rsync --daemon
root     18432  2692  0 06:37 pts/0    00:00:00 grep --color=auto rsync[root@master02 web-back-1]# kill 17332
[root@master02 web-back-1]# ps -ef |grep rsync
root     18552  2692 21 06:37 pts/0    00:00:00 grep --color=auto rsync
[root@master02 web-back-1]#

三、使用root账户传输案例

使用 rsync 备份网站目录,对 master 01 网站目录 /var/www/html (yum 安装httpd) 目录进行备份到master02的/data/web-back下

不推荐使用如下:

不推荐拷贝过程使用非root账号,如果使用非root账号,比如传输过程中,使用rsync账户传输,会导致在源文件中,存在所属主、所属组是nginx ,或者是root,在传输后,都变成 rsync,因为rsync只能创建 rsync 所属主、所属组

建立用户(两个节点),rsync 尽可能不要使用 root,故新建一个用户rsync,名字随意
groupadd rsync
useradd rsync -g rsync给用户修改密码
echo rsync:123456|chpasswd准备文件
[root@master01 ~]# ll /var/www/html/
-rw-rwxr--+ 1 root root  0 12月 27 18:05 123
-rw-r--r--  1 root root 12 2月  20 13:39 index.html
drwxr-xr-x. 2 root root  6 12月 27 18:07 wenjianjia[root@master02 ~]# mkdir /data/web-back默认给/var/www/html 提所属主和组(chown),但是不建议,其他用户不能访问,故可以为文件设置单独的文件权限(文件ACL)
[root@master01 ~]# getfacl /var/www/html/
getfacl: Removing leading '/' from absolute path names
# file: var/www/html/
# owner: root
# group: root
user::rwx
user:rget1:rwx
group::r-x
mask::rwx
other::r-x[root@master01 ~]# setfacl -R -m user:rsync:rwx /var/www/html/
[root@master01 ~]# getfacl /var/www/html/
getfacl: Removing leading '/' from absolute path names
# file: var/www/html/
# owner: root
# group: root
user::rwx
user:rget1:rwx
user:rsync:rwx
group::r-x
mask::rwx
other::r-x[root@master01 ~]# setfacl -R -m default:rsync:rwx /var/www/html/
[root@master01 ~]# getfacl /var/www/html/
getfacl: Removing leading '/' from absolute path names
# file: var/www/html/
# owner: root
# group: root
user::rwx
user:rget1:rwx
user:rsync:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:rsync:rwx
default:group::r-x
default:mask::rwx
default:other::r-x[root@master01 ~]# ll /var/www/html/
-rw-rwxr--+ 1 root root  0 12月 27 18:05 123
-rw-rwxr--+ 1 root root 12 2月  20 13:39 index.html
drwxrwxr-x+ 2 root root  6 12月 27 18:07 wenjianjia
[root@master01 ~]#目标目录提所属主、组,要不无法复制使用rsync账户
chown -R /data/web-back[root@master01 opt]# rsync -azv --delete /opt/fastdfs/ rsync@192.168.206.6:/data/web-back-2/

 使用 root 传输

[root@master01 ~]# cd /opt/fastdfs/
[root@master01 fastdfs]# ll
drwxr-xr-x   2 nginx nginx    6 3月   2 06:19 123
-rw-r--r--   1 nginx nginx    0 3月   2 06:19 456
drwxr-xr-x.  5 root  root    80 2月   2 14:18 data
lrwxrwxrwx.  1 root  root    13 2月   2 14:09 fastdfs -> fastdfs-6.08/
drwxrwxr-x. 13 root  root  4096 3月   3 2022 fastdfs-6.08
lrwxrwxrwx   1 root  root    26 2月   3 13:59 fastdfs-nginx-module -> fastdfs-nginx-module-1.22/
drwxrwxr-x   3 root  root    47 11月 19 2019 fastdfs-nginx-module-1.22
lrwxrwxrwx.  1 root  root    21 2月   2 14:03 libfastcommon -> libfastcommon-1.0.57/
drwxrwxr-x.  6 root  root   182 2月   2 14:04 libfastcommon-1.0.57
lrwxrwxrwx.  1 root  root    22 2月   2 14:08 libserverframe -> libserverframe-1.1.15/
drwxrwxr-x.  4 root  root   142 6月   6 2022 libserverframe-1.1.15[root@master02 web-back-2]# mkdir /data/web-back-1注意:/opt/fastdfs/ 加/代表不拷贝目录,只要fastdfs下的文件
[root@master01 ~]# rsync -azv --delete /opt/fastdfs/ root@192.168.206.6:/data/web-back-1[root@master02 web-back-2]# cd /data/web-back-1
[root@master02 web-back-1]# ll
总用量 0
drwxr-xr-x  2 nginx nginx   6 3月   2 06:19 123
-rw-r--r--  1 nginx nginx   0 3月   2 06:19 456
drwxr-xr-x  5 root  root   80 2月   2 14:18 data
lrwxrwxrwx  1 root  root   13 2月   2 14:09 fastdfs -> fastdfs-6.08/
drwxrwxr-x 13 root  root  322 3月   3 2022 fastdfs-6.08
lrwxrwxrwx  1 root  root   26 2月   3 13:59 fastdfs-nginx-module -> fastdfs-nginx-module-1.22/
drwxrwxr-x  3 root  root   47 11月 19 2019 fastdfs-nginx-module-1.22
lrwxrwxrwx  1 root  root   21 2月   2 14:03 libfastcommon -> libfastcommon-1.0.57/
drwxrwxr-x  6 root  root  182 2月   2 14:04 libfastcommon-1.0.57
lrwxrwxrwx  1 root  root   22 2月   2 14:08 libserverframe -> libserverframe-1.1.15/
drwxrwxr-x  4 root  root  142 6月   6 2022 libserverframe-1.1.15
[root@master02 web-back-1]#

传出过程中会有进行

[root@master02 web-back-1]# ps -ef |grep rsync
root     17332     1  0 06:10 ?        00:00:00 rsync --daemon
root     18348 18271 30 06:36 ?        00:00:00 rsync --server -vlogDtpre.iLsfxC --delete . /data/web-back-1/
root     18353 18348  0 06:36 ?        00:00:00 rsync --server -vlogDtpre.iLsfxC --delete . /data/web-back-1/
root     18355  2692  5 06:36 pts/0    00:00:00 grep --color=auto rsync

四、配置文件启动

4.1、参数

uid = root  # 使用那个用户启动rsync
gid = root  # 用户对应的组
address = 192.168.206.5   # 使用那个网卡进启动rsync
port = 873 # 端口# 允许哪些IP能通过rsync进行获取数据
# 可以是IP、网段(192.168.19.0/255.255.255.0 或者 192.168.19.0/24)、或者*
host allow = 192.168.206.0/24# 是否牢笼机制,yes锁定家目录,如果被黑客攻击,无法访问rsync定义的家目录之外
use chroot = yes# 最大的连接数量,比如=4,最大有4个同时连接我rsync
max connections = 4# pid 文件
pid file = /var/run/rsyncd.pid# rsync 启动后,锁定不让其他程序再次使用
lock file = /var/run/rsync.lock# 日志文件
log file = /var/log/rsyncd.log# 自定义提示,在使用rsync进行传输的时候,会弹出来
motd file =/etc/rsyncd.motd[wwwroot]          # 定义模块的名字
path = /web/back/  # 同步到哪里去
read only = false  # 关闭只读模式,就等于是读写模式
list = yes         # 是否允许查看模块信息
auth users = rsyncuser  # 自定义用户,此用户并非是系统用户,此用于rsync服务端向我这个模块信息发送数据的时候,使用的用户名,加上下述配置的密码
secrets file = /etc/rsync.passwd  # 定义密码存放路径

4.2、演示

master 01 作为数据源(可以做可以不做,可以使用默认的参数):

[root@master01 ~]# cat /etc/rsyncd.conf
# /etc/rsyncd: configuration file for rsync daemon mode# See rsyncd.conf man page for more options.# configuration example:# uid = nobody
# gid = nobody
# use chroot = yes
# max connections = 4
# 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# [ftp]
#        path = /home/ftp
#        comment = ftp export areauid = root
gid = root
address = 192.168.206.5
port = 873
host allow = 192.168.206.0/24
use chroot = yes
max connections = 4
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
motd file =/etc/rsyncd.motd

master 02 作为备份:

uid = root
gid = root
address = 192.168.206.6
port = 873
host allow = 192.168.206.0/24
use chroot = yes
max connections = 4
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
motd file =/etc/rsyncd.motd[wwwroot]
path = /web/back/
read only = false
list = yes 
auth users = rsyncuser
secrets file = /etc/rsync.passwd

在master 02 上制作rsync的/etc/rsync.passwd 和 /etc/rsyncd.motd

[root@master02 ~]# echo "nginx backup server" > /etc/rsyncd.motd
[root@master02 ~]# echo "rsyncuser:123abcd" > /etc/rsync.passwd
[root@master02 ~]# chmod 600 /etc/rsync.passwd    # 必须是600或者是700 ,否则会验证失败

重启rsync

[root@master01 ~]# ps -ef |grep rsync
root      9166  6070  0 03:20 pts/0    00:00:00 grep --color=auto rsync[root@master01 ~]# rsync --daemon --config=/etc/rsyncd.conf   # 必须指定使用的配置文件
[root@master01 ~]# ps -ef |grep rsync
root      9330     1  0 03:21 ?        00:00:00 rsync --daemon --config=/etc/rsyncd.conf
root      9339  6070  0 03:21 pts/0    00:00:00 grep --color=auto rsync[root@master01 ~]# netstat -tulpn |grep rsync
tcp        0      0 192.168.206.5:873       0.0.0.0:*               LISTEN      9330/rsync

验证rsync

[root@master02 ~]# mkdir -p /web/back/[root@master01 ~]# rsync -azvu /var/www/html/ rsyncuser@192.168.206.6::wwwroot
nginx backup serverPassword:
sending incremental file list
./
123
index.html
wenjianjia/sent 231 bytes  received 65 bytes  84.57 bytes/sec
total size is 12  speedup is 0.04
[root@master01 ~]#

注意事项:使用rsyncuser@192.168.206.6::wwwroot  和 root@192.168.206.6:/web/back/ 区别

root@192.168.206.6:/web/back/

[root@master01 html]# ll
-rw-rw-r--+ 1 elasticsearch elasticsearch  0 3月   3 03:54 1111111
-rw-rwxr--+ 1 root          root           0 12月 27 18:05 123
-rw-rw-r--+ 1 elasticsearch elasticsearch  0 3月   3 03:50 456
-rw-rwxr--+ 1 root          root          12 2月  20 13:39 index.html
-rw-rw-r--+ 1 nginx         nginx          0 3月   3 03:40 nginx
drwxrwxr-x+ 2 nginx         nginx          6 3月   3 03:40 nginx_123
-rw-rw-r--+ 1 rsync1        rsync1         0 3月   3 04:11 rsync123
drwxrwxr-x+ 2 root          root           6 12月 27 18:07 wenjianjia[root@master01 html]# id rsync1
uid=1005(rsync1) gid=1005(rsync1) 组=1005(rsync1)[root@master01 html]# id elasticsearch
uid=1002(elasticsearch) gid=1002(elasticsearch) 组=1002(elasticsearch)[root@master02 back]# id rsync1
id: rsync1: no such user[root@master01 html]# rsync -azvu /var/www/html/ root@192.168.206.6:/web/back/
sending incremental file list
./
1111111
123
456
index.html
nginx
rsync123
nginx_123/
wenjianjia/sent 560 bytes  received 145 bytes  1,410.00 bytes/sec
total size is 12  speedup is 0.02[root@master02 back]# ll
-rw-rw-r-- 1 elasticsearch elasticsearch  0 3月   3 03:54 1111111
-rw-rwxr-- 1 root          root           0 12月 27 18:05 123
-rw-rw-r-- 1 elasticsearch elasticsearch  0 3月   3 03:50 456
-rw-rwxr-- 1 root          root          12 2月  20 13:39 index.html
-rw-rw-r-- 1 nginx         nginx          0 3月   3 03:40 nginx
drwxrwxr-x 2 nginx         nginx          6 3月   3 03:40 nginx_123
-rw-rw-r-- 1          1005          1005  0 3月   3 04:11 rsync123
drwxrwxr-x 2 root          root           6 12月 27 18:07 wenjianjia
[root@master02 back]#[root@master02 back]# id elasticsearch
uid=997(elasticsearch) gid=995(elasticsearch) 组=995(elasticsearch)

从上述看,root@192.168.206.6:/web/back/ 拷贝后,rsync自动为你找到,符合拷贝之前的所属所属主、跟组 (按照名字) 。如果备份机器没有此用户,则显示备份前宿主机的用户uuid guid。如果是SCP,直接拷贝后都是使用的传输账户的属主、跟组

使用rsyncuser@192.168.206.6::wwwroot

[root@master01 html]# rsync -azvu /var/www/html/ rsyncuser@192.168.206.6::wwwroot[root@master01 html]# ll
-rw-rw-r--+ 1 elasticsearch elasticsearch  0 3月   3 03:54 1111111
-rw-rwxr--+ 1 root          root           0 12月 27 18:05 123
-rw-rw-r--+ 1 elasticsearch elasticsearch  0 3月   3 03:50 456
-rw-rwxr--+ 1 root          root          12 2月  20 13:39 index.html
-rw-rw-r--+ 1 nginx         nginx          0 3月   3 03:40 nginx
drwxrwxr-x+ 2 nginx         nginx          6 3月   3 03:40 nginx_123
-rw-rw-r--+ 1 rsync1        rsync1         0 3月   3 04:11 rsync123
drwxrwxr-x+ 2 root          root           6 12月 27 18:07 wenjianjia[root@master01 html]# id elasticsearch
uid=1002(elasticsearch) gid=1002(elasticsearch) 组=1002(elasticsearch)
[root@master01 html]# id nginx
uid=1001(nginx) gid=1001(nginx) 组=1001(nginx)
[root@master01 html]# id rsync1
uid=1005(rsync1) gid=1005(rsync1) 组=1005(rsync1)[root@master02 back]# ll
-rw-rw-r-- 1 rsync rsync  0 3月   3 03:54 1111111
-rw-rwxr-- 1 root  root   0 12月 27 18:05 123
-rw-rw-r-- 1 rsync rsync  0 3月   3 03:50 456
-rw-rwxr-- 1 root  root  12 2月  20 13:39 index.html
-rw-rw-r-- 1 rget1 rget1  0 3月   3 03:40 nginx
drwxrwxr-x 2 rget1 rget1  6 3月   3 03:40 nginx_123
-rw-rw-r-- 1  1005  1005  0 3月   3 04:11 rsync123
drwxrwxr-x 2 root  root   6 12月 27 18:07 wenjianjia[root@master02 back]# id rsync
uid=1002(rsync) gid=1002(rsync) 组=1002(rsync)[root@master02 back]# id rget1
uid=1001(rget1) gid=1001(rget1) 组=1001(rget1)

从上述看,rrsyncuser@192.168.206.6::wwwroot 拷贝后,rsync自动为你找到,符合拷贝之前的所属所属主、跟组 (uuid guid) 。

4.3 、自动化

如果不使用ssh,使用rsync的密码,每次输入不能实现自动化,故在发送端写好,直接调用

[root@master01 html]# echo "123abcd" > /opt/passwd
[root@master01 html]# chmod 600 /opt/passwd
[root@master01 html]# rsync -azvu /var/www/html/ rsyncuser@192.168.206.6::wwwroot --password-file=/opt/passwd
nginx backup serversending incremental file list
./
1111111
123
456
index.html
nginx
rsync123
nginx_123/
wenjianjia/sent 564 bytes  received 145 bytes  1,418.00 bytes/sec
total size is 12  speedup is 0.02

简单的脚本自动化

[root@master01 html]# cat /opt/rsync.sh
#!/bin/bash
# 2023/03/03 04:33
# Used to backup
# Auther by Jerry
rsync -azvu /var/www/html/ rsyncuser@192.168.206.6::wwwroot --password-file=/opt/passwd[root@master01 html]# bash /opt/rsync.sh  # 查看无问题
[root@master01 html]# echo "01 3 * * * /bin/bash /opt/rsync.sh &" >> /var/spool/cron/root
[root@master01 html]# crontab -l
01 3 * * * /bin/bash /opt/rsync.sh &

五、inotify

目前是 通过 crontab 定时任务触发 rsync  同步,如何实现实时同步,inotify 通过触发式更新,此软件用于监控目录发生的变化,但是不能监控文件是否发生改变,故发生目录变化后,告知rsync,rsync 在通过自己的机制,对目录进行增量差异对比,在进行判断同步那个文件或者目录。当然现在有更好的软件,是基于监控文件的,故就不需要再让rsync 进行判断,故使用sersync + rsync。

六、sersync + rsync

为什么要用rsync+sersync架构?

sersync 是及基于 inotify 开发的,类似于 inotify-tool 的工具
sersync可以记录下被监听目录中发生变化的(包括加、删除、修改)具体某一个文件或者某一个目录的名字,然后使用rsync同步的时候,只同步发生变化的文件或者目录

rsync+inotify-tools与rsync+sersync架构的区别?

1、rsync+inotify-tools
a、inotify只能记录下被监听的目录发生了变化(增,删,改)并没有把具体是哪个文件或者哪个目录发生了变化记录下来;

b、rsync在同步的时候,并不知道具体是哪个文件或目录发生了变化,每次都是对整个目录进行同步,当数据量很大时,整个目录同步非常耗时(rsync要对整个目录遍历查找对比文件),因此效率很低

2、rsync+sersync
a、sersync可以记录被监听目录中发生变化的(增,删,改)具体某个文件或目录的名字
6、rsync在同步时,只同步发生变化的文件或目录(每次发生变化的数据相对整个同步目录数据来说很小,rsync在遍历查找对比文件时,速度很快),大此效率很高。

规划:sersync服务器(master 01) rsync服务器(master 02)

6.1、 部署

[root@master01 src]# yum -y install inotify-tools
[root@master01 src]# wget https://raw.githubusercontent.com/wsgzao/sersync/master/sersync2.5.4_64bit_binary_stable_final.tar.gzwget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/sersync/sersync2.5.4_64bit_binary_stable_final.tar.gz[root@master01 src]# tar -zxvf sersync2.5.4_64bit_binary_stable_final.tar.gz
[root@master01 src]# cp -a GNU-Linux-x86 /usr/local/sersync
[root@master01 src]# mv /usr/local/sersync/sersync2  /usr/local/sersync/sersync
[root@master01 src]# echo 'PATH=/usr/local/sersync:$PATH' >> /etc/profile
[root@master01 src]# source /etc/profile

6.2、修改配置文件

vi /usr/local/sersync/confxml.xml

     23     <sersync> #  <!--需要监控的目录-->24         <localpath watch="/var/www/html">    # 添加监控的目录25             <remote ip="192.168.206.6" name="wwwroot"/>  # IP:将监控的文件发送给谁,name: rsync模块名字,所以远端要以daemon模式先运行好rsync26             <!--<remote ip="192.168.8.39" name="tongbu"/>-->  # 不用修改<!--是注释,除非下面开启了ssh start,此时name为远程shell方式运行时的目标目录27             <!--<remote ip="192.168.8.40" name="tongbu"/>-->28         </localpath>29         <rsync>   # 配置rsync30             <commonParams params="-artuz"/>31             <auth start="false" users="rsyncuser" passwordfile="/opt/passwd"/>  # auth start = true 打开开启,users 是模块的用户名,pass就是密码存放位置,如果是ssh形式,需要做ssh免密,这里pass只能给模块用,所以passwordfile=''32             <userDefinedPort start="true" port="873"/><!-- port=873 -->    # 端口,# 设置rsync远程服务端口,非默认端口需要打开自定义(若开启rsync+ssh, 则这里需定义SSH端口)33             <timeout start="false" time="100"/><!-- timeout=100 --> # 设置超时时间34             <ssh start="false"/> # 是否使用远程shell模式而非rsync daemon运行rsync命令35         </rsync>36         <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once--> # 错误重传。sersync传输失败日志脚本路径,每隔60会重新执行该脚本,执行完毕会自动清空。37         <crontab start="false" schedule="600"><!--600mins--> # 是否开启crontab功能,默认关闭38             <crontabfilter start="false">  # crontab定时传输的筛选功能39                 <exclude expression="*.php"></exclude>40                 <exclude expression="info/*"></exclude>41             </crontabfilter>42         </crontab>43         <plugin start="false" name="command"/>44     </sersync>4546     <plugin name="command">         # 插件脚本范例47         <param prefix="/bin/sh" suffix="" ignoreError="true"/>  <!--prefix /opt/tongbu/mmm.sh suffix-->48         <filter start="false">49             <include expression="(.*)\.php"/>50             <include expression="(.*)\.sh"/>51         </filter>52     </plugin>5354     <plugin name="socket">       # 插件脚本范例55         <localpath watch="/opt/tongbu">56             <deshost ip="192.168.138.20" port="8009"/>57         </localpath>58     </plugin>59     <plugin name="refreshCDN">60         <localpath watch="/data0/htdocs/cms.xoyo.com/site/">61             <cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/>62             <sendurl base="http://pic.xoyo.com/cms"/>63             <regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/>64         </localpath>65     </plugin>66 </head>

6.3、以后台方式执行同步

-d 后台 -r 递归 -o 指定配置文件

[root@master01 sersync]# sersync -d -r -o /usr/local/sersync/confxml.xmlset 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
option: -d      run as a daemon
option: -r      rsync all the local files to the remote servers before the sersync work
option: -o      config xml name:  /usr/local/sersync/confxml.xml
daemon thread num: 10                    # 后台启动
parse xml config file
host ip : localhost     host port: 8008  # 占用端口
daemon start,sersync run behind the console
use rsync password-file :
user is rsyncuser
passwordfile is         /opt/passwd      # 调用rsync的密码
config xml parse success
please set /etc/rsyncd.conf max connections=0 Manually
sersync working thread 12  = 1(primary thread) + 1(fail retry thread) + 10(daemon sub threads)
Max threads numbers is: 22 = 12(Thread pool nums) + 10(Sub threads)
please according your cpu ,use -n param to adjust the cpu rate
------------------------------------------
rsync the directory recursivly to the remote servers once
working please wait...
execute command: cd /var/www/html && rsync -artuz -R --delete ./  --port=873  rsyncuser@192.168.206.6::wwwroot --password-file=/opt/passwd >/dev/null 2>&1  指定rsyncd的命令
run the sersync:
watch path is: /var/www/html

说明:还有些其他参数,使用“-h”选项查看。
参数-d:启用守护进程模式,让sersync运行在后台
参数-r: 在监控前,将监控目录与远程主机用rsync命令推送一遍,
            即首先让远端目录和本地一致,以后再同步则通过监控实现增量同步
参数-n:指定开启守护线程的数量,默认为10个
参数-o:指定配置文件,默认使用confxml.xml文件
参数-m:单独启用其他模块,使用 -m refreshCDN 开启刷新CDN模块
参数-m:单独启用其他模块,使用 -m socket 开启socket模块
参数-m:单独启用其他模块,使用 -m http 开启http模块
不加-m参数,则默认执行同步程序

6.4、观察过程

备份机器执行watch查看
[root@master02 ~]# cd /web/back/
[root@master02 back]# watch ls -lmaster机器执行touch
[root@master02 ~]# cd /var/www/html/
[root@master02 ~]# touch file

6.5 、增加启动脚本

[root@master01 sersync]# pwd
/usr/local/sersync[root@master01 sersync]# cat shutdown.sh
#!/bin/bashstatus=`ps aux |grep 'sersync \-d \-r \-o \/usr/local/sersync/bbs_confxml.xml'|wc -l`if [ $status -ne 0 ]; thenkill -9 `ps aux |grep 'sersync \-d \-r \-o \/usr/local/sersync/bbs_confxml.xml'|awk -F ' ' '{print $2}'` >>./sersync.log
elseexit 0;
fi[root@master01 sersync]# cat startup.sh
#!/bin/bash
sersync='/usr/local/sersync/sersync'
confxml='/usr/local/sersync/confxml.xml'status=$(ps aux |grep 'ps aux |grep 'sersync \-d \-r \-o \/usr/local/sersync/bbs_confxml.xml'|wc -l)if [ $status -eq 0 ]; then$sersync -d -r -o $confxml >>./sersync.log &
elseexit 0;
fi[root@master01 sersync]# chmod 755 startup.sh shutdown.sh

6.6、监控另一个目录

使用ssh形式

[root@master01 sersync]# pwd
/usr/local/sersync[root@master01 sersync]# ll
-rwxr-xr-x  1 root root    2205 3月   3 07:04 bbs_confxml.xml
-rwxr-xr-x  1 root root    2222 3月   3 06:17 confxml.xml
-rwxr-xr-x  1 root root 1810128 10月 26 2011 sersync
-rw-r--r--  1 root root    1182 3月   3 06:45 sersync.log
-rwxr-xr-x+ 1 root root     194 3月   3 06:50 shutdown.sh
-rwxr-xr-x  1 root root     235 3月   3 06:51 startup.sh[root@master01 sersync]# cat bbs_confxml.xml<sersync><localpath watch="/var/www/bbs/"><remote ip="192.168.206.6" name="/data/bbs/"/>  # name 目标目录<!--<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="root" passwordfile=""/>  # 密码是空,要做免密,ssh用户root<userDefinedPort start="true" port="22"/><!-- port=22 -->  # 22<timeout start="false" time="100"/><!-- timeout=100 --><ssh start="true"/>  # true</rsync>
[root@master01 sersync]# sersync -d -r -o /usr/local/sersync/bbs_confxml.xml

相关文章:

rsync+xinetd+inotify+sersync

一、介绍 1.1、rsync 对比 scp 相同&#xff1a; 都有拷贝的功能不同&#xff1a; rsync:具有增量复制&#xff0c;每次复制的时候&#xff0c;会扫描对端是否在同路径下有我要发送的一样的文件或者目录&#xff0c;如果&#xff0c;如果存在&#xff0c;则不进行复制。边复制&…...

CSS - 扫盲

文章目录1. 前言2. CSS2.1 css 的引入方式2.2 选择器2.3 CSS 常用属性2.3.1 字体属性2.3.2 文本属性2.3.3 背景属性2.4 圆角矩形2.5 元素的显示模式2.6 盒子模型2.7 弹性布局1. 前言 上文我们简单 将 HTML 过了一遍 &#xff0c; 知道了 HTML 知识表示页面的结构和内容 &#x…...

ChatGPT能完全取代软件开发吗,看看它怎么回答?

最近网上一直疯传&#xff0c;ChatGPT 最可能取代的 10 种工作。具体包括①、技术类工作&#xff1a;程序员、软件工程师、数据分析师②、媒体类工作&#xff1a;广告、内容创作、技术写作、新闻③、法律类工作&#xff1a;法律或律师助理④、市场研究分析师⑤、教师⑥、金融类…...

Vue3学习笔记

一、Ref ref, isRef, shallowRef, triggerRef, customRef ref返回的是es6的一个class类&#xff0c;取值和修改都要加上.valueref 和 shallowRef不能一起写&#xff0c;会引起shallowRef的视图更新ref shallowRef triggerRef <template><div class"home&quo…...

【React】pro-mobile

1.项目介绍 实现react移动端项目 2.目标&#xff1a; 能够应用CRAReactMobxAntd-mobile开发C端项目掌握基于React的C端项目开发流程学会如何应用next优化项目 3.使用技术栈 脚手架&#xff1a;cra dva-cliumi 脚本&#xff1a;ts react版本&#xff1a;react v18 2022年更…...

Substrate 基础教程(Tutorials) -- 授权特定节点

五、授权特定节点 在添加可信节点中&#xff0c;您看到了如何使用一组已知的验证器节点构建一个简单的网络。该教程演示了一个简化版的许可网络&#xff08;permissioned network&#xff09;。在一个被许可的网络中&#xff0c;只有被授权的节点&#xff08;authorized nodes…...

使用qemu-img转换镜像格式

qemu功能强大&#xff0c;详细了解其功能请到官网查看 https://www.qemu.org/docs/master/system/images.html qemu-img能将RAW、qcow2、VMDK、VDI、VHD&#xff08;vpc&#xff09;、VHDX、qcow1或QED格式的镜像转换成VHD格式&#xff0c;也可以实现RAW和VHD格式的互相转换。 …...

Springboot怎么集成Thymeleaf模板引擎?

Thymeleaf介绍Thymeleaf&#xff0c;是一个XML/XHTML/HTML模板引擎&#xff0c;开源的java库&#xff0c;可以用于SpingMVC项目中&#xff0c;用于代替JSP、FreeMarker或者其他的模板引擎&#xff1b;页面与数据分离&#xff0c;提高了开发效率&#xff0c;让代码重用更容易。S…...

LiveGBS国标GB/T28181视频流媒体平台-功能视频集中录制存储云端录像H264|H265|HEVC视频存储

LiveGBS国标GB/T28181视频流媒体平台-视频集中录制存储云端录像H264|H265|HEVC视频存储1、云端录像存储2、手动配置录像2.1、按需录像2.2、一直录像3、录像计划3.1、录像计划入口3.2、新增录像计划3.3、编辑录像计划3.4、关联通道4、查看云端录像4.1、查看录像4.1.1、时间轴模式…...

IntelliJ IDEA如何整合Maven图文教程详解

Maven 1.Maven简述 Maven是一个构建工具,服务与构建.使用Maven配置好项目后,输入简单的命令,如:mvn clean install,Maven会帮我们处理那些繁琐的任务. Maven是跨平台的. Maven最大化的消除了构建的重复. Maven可以帮助我们标准化构建过程.所有的项目都是简单一致的,简化了学习…...

图数据库认证考试 NGCP 错题解析 vol.02:这 10 道题竟无一人全部答对

如果你读过「NebulaGraph 错题解析第一期」&#xff0c;大概知道在错题解析未出来之前&#xff0c;NebulaGraph 专业技能认证 NGCP&#xff08;全称 NebulaGraph Certified Professional&#xff09;的通过率仅有 16.7%。但是&#xff0c;经过上一轮 NebulaGraph 认证考试出题人…...

188888

81. 一个敏捷项目正在进行八次迭代中的第五次迭代。在最后一次迭代计划之后&#xff0c;团队得知市场上出现一个新的竞争对手&#xff0c;有必要更快地加快进程来确保不失去市场份额。 项目经理应该怎么做&#xff1f; A 将竞争对手的功能添加到产品积压待办清单中&#xff0c;…...

华为机试题:HJ99 自守数(python)

文章目录&#xff08;1&#xff09;题目描述&#xff08;2&#xff09;Python3实现&#xff08;3&#xff09;知识点详解1、input()&#xff1a;获取控制台&#xff08;任意形式&#xff09;的输入。输出均为字符串类型。1.1、input() 与 list(input()) 的区别、及其相互转换方…...

如何提高推广邮件的发送成功率?

随着经济的发展&#xff0c;国际之间的贸易往来越加频繁&#xff0c;很多外贸企业需要发送大量的商业推广邮件&#xff0c;来获得销售订单开拓公司业务市场。 随之而来的问题也是越来越多&#xff0c;给众多的外贸企业带来诸多的困扰。外贸企业在发送推广邮件中究竟会遇到什么问…...

关于提高PX4抗风性

滚转角速率控制器&#xff1a;&#xff08;MC_ROLLRATE_P&#xff0c; MC_ROLLRATE_I&#xff0c; MC_ROLLRATE_D&#xff09; 滚转角速率控制器&#xff1a;&#xff08;MC_PITCHRATE_P&#xff0c; MC_PITCHRATE_I&#xff0c;MC_PITCHRATE_D&#xff09; 滚转角速率控制器…...

AVL 树实现

AVL 树的概念 也许因为插入的值不够随机&#xff0c;也许因为经过某些插入或删除操作&#xff0c;二叉搜索树可能会失去平衡&#xff0c;甚至可能退化为单链表&#xff0c;造成搜索效率低。 AVL Tree 是一个「加上了额外平衡条件」的二叉搜索树&#xff0c;其平衡条件的建立是…...

跟我学c++高级篇——模板元编程之八惰性加载

一、Lazy evaluation 惰性加载或者延迟计算&#xff0c;在前面的文章《跟我学c中级篇——迟延计算》中分析过。叫法怎么叫都可以&#xff0c;只要大家明白这个意思即可。Lazy evaluation一般可用于下面的情况&#xff1a; 1、模板中的对象非立刻的模板实例化&#xff0c;也就是…...

【Python入门第二十二天】Python 类和对象

Python 类/对象 Python 是一种面向对象的编程语言。 Python 中的几乎所有东西都是对象&#xff0c;拥有属性和方法。 类&#xff08;Class&#xff09;类似对象构造函数&#xff0c;或者是用于创建对象的“蓝图”。 创建类 如需创建类&#xff0c;请使用 class 关键字&…...

qml的进度条

QML是一种用于创建动态用户界面的声明式语言&#xff0c;它支持使用JavaScript表达式来定义属性绑定和信号处理器。在本文中&#xff0c;我们将介绍如何使用JavaScript在QML中绘制一个进度条&#xff08;ProgressBar&#xff09;&#xff0c;并设置其前景色和背景色。进度条是一…...

Pycharm补丁包使用教程

虽然社区版在大多情况下已经够用&#xff0c;但是有很多功能都是没有的&#xff0c;对照起一些教程之类的就很不方便 现在直接教一种简单中的简单的补丁包使用方法 我这里用的是 pycharm 19.2.6 注意右下角的configure 一般别的方法都是 打开&#xff0c;然后添加路径&#…...

用VAE生成图像

用VAE生成图像自编码器AE&#xff0c;auto-encoderVAE讲讲为什么是log_var为什么要用重参数化技巧用VAE生成图像变分自编码器是自编码器的改进版本&#xff0c;自编码器AE是一种无监督学习&#xff0c;但它无法产生新的内容&#xff0c;变分自编码器对其潜在空间进行拓展&#…...

你只会说MVC模型是什么但是不会实现?今天带你走通Web、Servlet、MVC、SpringMVC。代码演示很清晰

文章目录HTTP请求和HTTP响应从0手写一个Web服务器&#xff0c;看看能有多累人使用Servlet实现一个服务器&#xff0c;看看多简单Serlvet的创建Servlet的运行Servlet的其他问题Servlet这么爽&#xff0c;我们简单地探索一下它的原理JSP跟Servlet合作啦&#xff0c;我们来看一下他…...

C++中邻接矩阵、邻接表、链式前向星具体用法及讲解

图论在提高组中几乎占据半壁江山&#xff0c;而今天要讲的就是如何存储一个图一.邻接矩阵原理要建立一个图&#xff0c;根本的要素就是边和点而想要让计算机存储边和点就需要用到一些数据结构邻接矩阵是最简单的他使用了一个二维数组&#xff0c;来表示一个图假设数组名为map那…...

appium的安装详解

安装appium 爬虫手机APP需要实现自动化&#xff0c;所以要使用appnium来实现点击&#xff0c;输入&#xff0c;滑动等操作。由于appnium的安装较为繁琐&#xff0c;所以特意整理一篇文章来展示安装的详细过程过程中。 安装appnium共有3个步骤 安装 Android SDK安装 JDK安装 …...

STM32之 串口

串口通信串行接口简称串口&#xff0c;也称串行通信接口或串行通讯接口&#xff08;通常指COM接口&#xff09;&#xff0c;是采用串行通信方 式的扩展接口。串行接口&#xff08;Serial Interface&#xff09;是指数据一位一位地顺序传送。其特点是通信线路简 单&#xff0c;只…...

CSDN 编程竞赛三十三期题解

竞赛总览 CSDN 编程竞赛三十三期题解&#xff1a;比赛详情 (csdn.net) 竞赛题解 题目1、奇偶排序 给定一个存放整数的数组&#xff0c;重新排列数组使得数组左边为奇数&#xff0c;右边为偶数&#xff08;奇数和偶数的顺序根据输入的数字顺序排列&#xff09;。 第七期竞赛…...

逆向练习之 mingyue.exe wp

目录 一.查壳 二.主函数 三.operate函数 四.storage函数及4618和4620指针功能的解释 五.judge函数 六.求解flag 七.其他--ida字符识别问题 一.查壳 64位无壳 二.主函数 1.这里的pointer_4618和4620是两个相邻的八字节内存单元,其中4620是字符串链表表头head 2.puts和s…...

LeetCode 热题 HOT 100 Java 题解 -- Part 3

练习地址 Part 1 : https://blog.csdn.net/qq_41080854/article/details/128829494 Part 2 : https://blog.csdn.net/qq_41080854/article/details/129278336 LeetCode 热题 HOT 100 Java 题解 -- Part 376. 最佳买卖股票时机含冷冻期77. 戳气球78. 零钱兑换79. 打家劫舍 III…...

QML键盘事件

在QML中&#xff0c;当有一个按键按下或释放时&#xff0c;会产生一个键盘事件&#xff0c;将其传递给获得有焦点的QML项目&#xff08;讲focus属性设置为true&#xff0c;则获得焦点&#xff09;。 按键处理的基本流程&#xff1a; Qt接收密钥操作并生成密钥事件。如果 QQuic…...

跨域问题怎么解决

解决跨域&#xff0c;原因&#xff1a;域名不同&#xff0c;域名相同端口不同&#xff1b;二级域名不同 什么是跨域&#xff1f; 就是两个项目之间通讯&#xff0c;如果访问的域名与ajax访问的地址不一致情况&#xff0c;默认情况浏览器有一个安全机制。 postman不一定能测试…...

网站开发前端和后端的区别/北京seo排名服务

这篇文章主要介绍了简单了解python数组的基本操作,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一&#xff0c;创建列表 创建一个列表&#xff0c;只要把逗号分隔的不同的数据项使用方括号括起来&#xff1a;…...

外贸网站布局/谷歌商店官网

文章目录1.判断单链表是否带环为什么快指针走2步&#xff0c;慢指针走1步一定可以相遇如果快指针每次不是走两个节点&#xff0c;是否还会相遇2.找入环点1.判断单链表是否带环 给定一个单链表&#xff0c;如果带环返回true&#xff0c;不带环返回false. 这里设了两个指针&…...

360网站制作潍坊/网络营销案例分析题

2019独角兽企业重金招聘Python工程师标准>>> 想当初我是新手&#xff0c;对plist的操作也是一知半解&#xff0c;想发个贴&#xff0c;让大家可以方便一点&#xff0c;解除疑惑&#xff0c;先说明很多人不知道操作plist的一个主要原因是因为很多人把plist建在了工程…...

西安网站建设咪豆互联/互联网营销课程体系

此函数允许创建方向强度直方图&#xff0c;也称为“风玫瑰”。这个工具可以用来表示这种图形。 This function allows to create a Direction-intensity histogram, also known as “Wind Roses”. This tool can be used for representing this kind of graphics. 它还能够将…...

易名中国网站/seo基础入门免费教程

酷睿i5-9400F基于14nm制程工艺&#xff0c;原生6核6线程&#xff0c;默认主频2.9Ghz&#xff0c;最大睿频4.1Ghz&#xff0c;设计功耗65W&#xff0c;无内置核心显卡 组装电脑 选i7 8700还是i5 9400f这些点很重要!看完你就知道了https://diannao.jd.com/diannao.html? i7-670…...

怎么区分网站是模板做的/淘宝新店怎么快速做起来

为什么80%的码农都做不了架构师&#xff1f;>>> canvas 英音 /knvəs/ 美音 /knvəs/ 帆布&#xff0c; 画布 canvas的基本介绍 canvas是html5中新增的一个画布标签。这个标签的默认宽高为300*150设置canvas标签的宽高需要使用表格的形式&#xff0c;width和height…...