由于平台要上负载均衡,后面有4个emc节点,每次更新系统都比较麻烦,所以这里记录一下收集到的一个看着靠谱的同步方案
出处:Linux中文件实时同步 - 刘新元 - 博客园
注意:看着靠谱,暂时没有实验过,等实验后也许会更新本文。
目录
Rsync是一个文件同步工具,在同步的时候,只同步发生变化的文件或者是目录(每次发生变化的数据对整个同步目录数据来说是很小的,rsync在遍历查找文件时,速度很快)
rsync有两种工作模式,客户端和服务器端,即rsync的客户端和服务器端是同一个程序,名字都叫rsync,你用它启动了服务作为守护进程,他就是服务器端,你没启动服务,而是直接调用它的命令,那么他就是客户端。
假设有A、B两台服务器,我们要把A的文件同步到B,由于rsync的工作模式分为客户端从服务器端下载文件(pull操作),或者客户端把文件推送到服务器端(push操作),所以我们要讨论一个问题,A、B谁做客户端,谁做服务器端?
3.1 方案一
假设A做服务器端,B做客户端,那么B要从A中同步文件,就要启动定时任务,每隔一段时间执行一次同步命令,该命令会把A中的变化数据同步过来(实际上是做rsync客户端做pull操作)。
3.2 方案二
假设A做客户端,B做服务器端,A定时运行同步命令,把变化文件推送到B(rsync客户端做push操作)
这两个方案感觉都可以,那到底哪个好呢?
假设我们还有C、D两台服务器也要从A同步文件,也就是B、C和D都从A同步文件,假设用方案一,那么B、C和D都要设置一个定时任务,定时从A中拉取文件进行同步,但这有一个问题,无法实时同步,因为B、C和D都不知道A什么时候更新了文件,只能定时去同步。
如果使用方案二,则B、C和D都是rsync的服务器端(都要启动一个rsync守护进程),而客户端只有一个,就是A。假如我们在A中添加定时任务,定时执行同步命令,把A中的文件推送到B、C和D,那感觉和方案一没什么区别,也是无法实时同步文件。
但是,在方案二中,我们可以利用serync来检测哪些文件更新了,然后用serync调用rsync同步命令,把更新变化的文件推送到B、C、D服务器。
使用方案二 push操作
192.168.28.100 客户端
192.168.29.101 服务端
4.1 配置服务端
192.168.29.101
4.1.1 安装rsync和修改配置文件
[root@node2 ~]# yum -y install rsync
[root@node2 ~]# cat /etc/rsyncd.conf
#指定运行的用户名或ID号(rsync客户端推送过来的文件所有者会被创建为uid指定的所有者)
uid = root
#指定运行的组名或组ID号(rsync客户端推送过来的文件所属组会被创建为gid指定的所属组)
gid = root
#切换目录
use chroot = no
#最大连接数
max connections = 10
#pid文件路径
pid file = /var/run/rsyncd.pid
#锁文件路径
lock file = /var/run/rsyncd.lock
#日志文件路径(可通过log format参数设置日志格式)
log file = /var/run/rsyncd.log
#传输日志
transfer logging = yes
#超时时间
timeout = 900
#忽略无法读取的文件
ignore nonreadable = yes
#忽略部分io错误
ignore errors
#是否只读(false就接受上传,即puhs,否则只接受下载,即pull)
read only = false
#下载(pull)操作时,如果没写下载哪个模块,则会列出模块
list = false
#允许的客户端ip或ip段(24也可写成255.255.255.0,这是网段,或子网掩码)
#host allow = 10.37.129.5/24
host allow = *
#除了允许的ip或ip段外禁止其他ip或ip段
#host deny = 0.0.0.0/32 #也可以直接写*号
#认证用户(客户端执行同步操作时,需要用user@ip来指定用户名,就跟ssh登录一个道理,这里写users是因为可配置多个用户,用逗号隔开即可)
auth users = xiebruce
#认证密码文件(后面会创建该文件,其实内容就是“用户名:密码”,一行一个用户)
secrets file = /etc/rsyncd.secrets
#如果用-az指定了打包压缩同步的文件,则指定这些后缀可以不压缩这些文件。
# dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
############# 自定义的传输模块2 ##################
[ftpdata]
#同步路径
path = /data
#注释
comment = website
#不接受的目录(该目录位于path指定的目录下)
exclude = cache
可以用man查看相应的配置
个别参数的详解
use chroot = no
如果为yes, rsync会首先进行chroot设置,将根映射在path参数路径下,对客户端而言,系统的根就是path参数指定的路径。但这样做需要root权限,并且在同步符号连接资料时只会同步名称,不会同步内容,所以我们一般设置为no。
4.2 在客户端服务器创建登录服务端的密码文件
sudo echo "123456" > /etc/rsyncd.password
4..3 在服务器端创建用户密码对
sudo echo "xiebruce:123456" > /etc/rsyncd.secrets
注意:服务器端的用户密码文件是“用户名:密码”,而客户端只需要密码
4.4 修改客户端和服务端的密码文件权限
服务端
sudo chmod 600 /etc/rsyncd.secrets
sudo chown root:root /etc/rsyncd.secrets
客户端
sudo chmod 600 /etc/rsyncd.password
sudo chown root:root /etc/rsyncd.password
注意:一定要服务端和客户端都要设置
4.5 启动服务进行在客户端推数据进行测试
systemctl start rsyncd
systemctl enable rsyncd
rsync -avz --partial /data [email protected]::/data/ --password-file=/etc/rsyncd.password
5.1 配置文件如下
[root@node1 sersync]# cat confxml.xml
5.2 客户端启动
sersync2 -o /usr/local/sersync/confxml.xml -d
现在,你可以测试一下在100服务器的同步目录上添加文件,修改文件内容,看101服务器是否会修改.
解释一下这个参数配置
前面配置文件里的注释也说了,由于各种原因(如网络很差或延迟非常大)可能会有传输失败的情况,那为什么记录传输失败的文件不叫.log,而叫.sh呢?
下图就是我传输失败后自动成的/tmp/rsync_fail_log.sh文件的内容:
6.1 介绍
Lsyncd是一个辅助文件同步工具。它通过监听系统的文件变化事件,调用rsync进行同步。注意“辅助”二字,辅助的意思是:同步文件本身并不是由lsyncd来实现,它只负责监测哪些文件改变了,进而调用rsync来完成同步,真正同步文件的是rsync,如果你不知道什么是rsync,请查看使用sersync +rsync进行实时文件同步中的rsync部分。
6.2 Lsyncd的三种同步模式
为了方便,我们直接把它们称为rsync、rsyncssh、direct
6.2.1 rsync同步模式
rsync配置如上
环境如上
6.1 安装Lsyncd
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm # 安装 epel 源
yum -y install lsyncd rsync # 安装
vim /etc/lsyncd.conf # 配置
6.2 配置文件
-- 由于该配置文件实际上是lua语言的语法,所以写注释要用--,--是lua语言的注释符号
-- Lsyncd本身的配置
settings {
-- 指定日志文件位置
logfile = "/var/log/lsyncd/lsyncd.log",
-- 指定状态文件位置
statusFile = "/var/log/lsyncd/lsyncd.status",
-- inotify事件模式,什么事件才同步,CloseWrite表示文件关闭的时候同步(创建文件,修改文件后保存都会触发CloseWrite事件)
inotifyMode = "CloseWrite",
-- 最大同步进程数(default.rsyncssh模式,则必须设置为1,这就是rsyncssh模式的缺点了,如果是default.rsync模式则可以设置大于1,这样会有多个同步进程,速度更快)
maxProcesses = 8,
-- maxProcesses = 1,
-- 配合下面的delay选项使用,delay单位是秒,当delay时间到了,不管maxDelays设置多少,都会同步,同样,当maxDelays达到了设定值,不管是否到delay时间,都会同步,即两个选项有一个满足即会触发同步,为了实时同>步,我们一般设置为1,表示即使只有一个文件改变也同步
maxDelays = 1,
-- 是否以后台的方式运行,注意它是nodaemon,所以是双重否定,如果填false,意思就是“不要不后台运行”(即后台运行),非后台运行一般用于调试,把rsync的verbose也设置为true,这样会把同步的细节输出到控制台,方便调试
nodaemon = false,
}
---- 同步配置default.rsync模式(比如配置从哪同步到哪,要忽略哪些文件,多久同步一次等),可以有多个sync模块,每个模块用于设置一台目标机器
sync {
-- 有default.rsync/default.direct/default.rsyncssh三种模式,我们默认都用default.rsync即可。
default.rsync,
-- 同步源目录(本机某个目录)
source = "/data/",
-- 同步目标地址,不同同步模式有不同写法,由于绝大多数情况都采用rsync同步,所以这里写的是rsync的同步地址
target = "[email protected]::ftpdata",
-- 默认true,允许删除目录服务器中的某些文件(即删除“那些在源服务器中不存在的文件”),可选值有: true/false/startup/running,startup就是只在启动lsyncd服务的时候判断目标服务器中有哪些文件在源服务器中没有,然后把这些文件删除,但启动之后如果目标服务器又新增了文件,这些文件即使在源服务器不存在,也不会被删除;而running与startup正好相反,是在启动的时候不会删除,启动之后会删除,true=running+startup,false相当于running和startup都不做。
delete = false,
-- 哪些文件不同步(可用正则))
-- exclude = {
-- '.**',
-- '.git/**',
-- '*.bak',
-- '*.tmp',
-- 'runtime/**',
-- 'cache/**'
-- },
-- 与上边的maxDelays配合,maxDelays是累计事件数(单位:个),delay是时间(单位:秒),这两个只要有一个符合条件就会同步一次,但为了确保实时同步,maxDelays我们一般设置为1,也就是只要有一个文件变化事件,就会同步一次,而delay是比较大的,默认是15。当然,假如我们把maxDelays设置为100,那可能15秒到了也没有达到100个文件变化,但由于到达时间了,它也会同步。
delay = 15,
-- 当init = false时只同步进程启动以后发生改动事件的文件,原有的目录即使有差异也不会同步,如果为true,则启动后如果源目录与目标目录的文件有差异,就会同步,我们当然要设置为true,默认为true,所以这个设置可以不写,写在这里是为了解释它。
-- init = false,
-- rsync的配置(这是default.rsync模式,如果是default.rsyncssh模式,该模块的配置会有所不同)
rsync = {
-- rsync可执行文件的绝对路径
binary = "/usr/bin/rsync",
-- 密码文件路径(default.rsyncssh模式不需要该项)
password_file = "/etc/rsyncd.password",
-- 打包后再同步(注意,打包不等于压缩,打包即可以压缩也可以不压缩)
archive = true,
-- 压缩后再同步
compress = false,
-- 输出同步信息(由于是后台执行,所以没必要输出,如果非后台执行可以设置为true,非后台执行主要用于调试)
verbose = false,
-- 由于rsync有非常多的选项(请自己rsync --help查看),部分非主要选项可以用_extra的方式指定,双引号引住,逗号分隔(bwlimit中的bw是bandwith,即带宽,整个意思是带宽限制,omit-link-times忽略符号链接的修改时间)
_extra = {"--bwlimit=200", "--omit-link-times"}
}
}
格式如下,每台目标服务器一个sync模块即可,每个sync模块都像上边说的那样写就行,其实就只是ip不同,其他都一样:
settings {
logfile = "/var/log/lsyncd/lsyncd.log",
inotifyMode = "CloseWrite or Modify",
-- statusFile = "/var/log/lsyncd/lsyncd.status",
}
-- B服务器配置
sync {
default.rsync,
source = "/etc/nginx/",
target = "rsync://[email protected]:1873/nginx/",
exclude = { ".*", "*.tmp", "*.swp", "*.bak", "*.log", "*.swx", "*~", "sets/config.json", "listen_local_*" },
delay = 2,
init = false,
rsync = {
password_file = "/etc/rsyncd.passwd",
archive = true,
compress = true,
verbose = true,
checksum = true,
ignore_times = true
}
}
-- C服务器配置
sync {
default.rsync,
source = "/data/web/",
target = "rsync://[email protected]:1873/web/",
exclude = { ".*", "*.tmp", "*.swp", "*.bak", "*.log", "*.out", "*/logs/*", "*.swx", "*~" },
delay = 120,
init = false,
rsync = {
password_file = "/etc/rsyncd.passwd",
archive = true,
compress = true,
verbose = true,
checksum = true,
ignore_times = true
}
}
-- D服务器配置
sync {
default.rsync,
source = "/data/script/",
target = "rsync://[email protected]:1873/script/",
exclude = { ".*", "*.tmp", "*.swp", "*.bak", "*.log", "*.out", "*/logs/*", "*.swx", "*~" },
delay = 2,
init = false,
rsync = {
password_file = "/etc/rsyncd.passwd",
archive = true,
compress = true,
verbose = true,
checksum = true,
ignore_times = true
}
}
详情介绍请见如下连接
CentOS7部署lsyncd+rsync实现服务器文件实时同步 - 系统运维 - 亿速云