-
2019-09-02 11:33:09
1、sersync是基于Inotify开发的,类似于Inotify-tools的工具
2、sersync可以记录下被监听目录中发生变化的(包括增加、删除、修改)具体某一个文件或某一个目录的名字,然后使用rsync同步的时候,只同步发生变化的这个文件或者这个目录。
二、Rsync+Inotify-tools与Rsync+sersync这两种架构有什么区别?
(1):Inotify-tools只能记录下被监听的目录发生了变化(包括增加、删除、修改),并没有把具体是哪个文件或者哪个目录发生了变化记录下来;
(2):rsync在同步的时候,并不知道具体是哪个文件或者哪个目录发生了变化,每次都是对整个目录进行同步,当数据量很大时,整个目录同步非常耗时(rsync要对整个目录遍历查找对比文件),因此,效率很低。
(1):sersync可以记录下被监听目录中发生变化的(包括增加、删除、修改)具体某一个文件或某一个目录的名字;
(2):rsync在同步的时候,只同步发生变化的这个文件或者这个目录(每次发生变化的数据相对整个同步目录数据来说是很小的,rsync在遍历查找比对文件时,速度很快),因此,效率很高。
小结:当同步的目录数据量不大时,建议使用Rsync+Inotify-tools;当数据量很大(几百G甚至1T以上)、文件很多时,建议使用Rsync+sersync。
操作系统:CentOS 7.4
源服务器:192.168.1.10 (Sersync+web)(Master 作为主发布服务器)
目标服务器: 192.168.1.11、(Rsync+web)(此处可逐步增加集群的slave)
目的:把源服务器上/home/rsync目录实时同步到目标服务器的/home/Sync下
第一部分:分别在两台目标服务器192.168.1.11上操作
#vi /etc/selinux/config #编辑防火墙配置文件
#vi /etc/sysconfig/iptables #编辑防火墙配置文件
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -ptcp --dport 873 -j ACCEPT
#systemctl restart firewalld.service #最后重启防火墙使配置生效
#yum install rsync xinetd -y #安装
# vi /etc/rc.d/rc.local #设置开机启动
/usr/bin/rsync --daemon --config=/etc/rsyncd.conf
# chmod +x/etc/rc.d/rc.local #否则重启不执行
# systemctl start xinetd #启动(CentOS中是以xinetd来管理Rsync服务的)
#vi /etc/rsyncd.conf #创建配置文件,添加以下代码
log file =/var/log/rsyncd.log #日志文件位置,启动rsync后自动产生这个文件,无需提前创建
pidfile =/var/run/rsyncd.pid #pid文件的存放位置
lock file =/var/run/rsync.lock #支持max connections参数的锁文件
secretsfile = /etc/rsync.pass #用户认证配置文件,里面保存用户名称和密码,后面会创建这个文件
motd file =/etc/rsyncd.Motd #rsync启动时欢迎信息页面文件位置(文件内容自定义)
path = /home/rsync/#rsync服务端数据目录路径
comment = rsync#模块名称与[md]自定义名称相同
use chroot= no #默认为true,修改为no,增加对目录文件软连接的备份
read only =no #设置rsync服务端文件为读写权限
auth users= Sync #执行数据同步的用户名,可以设置多个,用英文状态下逗号隔开
hosts allow= 192.168.1.10 #允许进行数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开
hosts deny= #禁止数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开
:wq! #保存,退出(贴进配置文件将中文去掉,否则可能造成无法识别模块)
log file = /var/log/rsyncd.log
lock file = /var/run/rsync.lock
#vi/etc/rsync.pass #配置文件,添加以下内容,添加允许传输用户和密码
rsync:abc123456 #格式,用户名:密码,可以设置多个,每行一个用户名:密码
#chmod 600 /etc/rsyncd.conf #设置文件所有者读取、写入权限
#chmod 600 /etc/rsync.pass #设置文件所有者读取、写入权限
# systemctl restart xinetd #重新启动
#vi /etc/selinux/config #编辑防火墙配置文件
2、开启防火墙tcp 873端口(Rsync默认端口,做为客户端的Rsync可以不用开启873端口)
#vi /etc/sysconfig/iptables #编辑防火墙配置文件
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -ptcp --dport 873 -j ACCEPT
# systemctl restartfirewalld.service #最后重启防火墙使配置生效
#whereisrsync #查看系统是否已安装rsync,出现下面的提示,说明已经安装
rsync:/usr/bin/rsync /usr/share/man/man1/rsync.1.gz
#yum install xinetd #只安装xinetd即可,CentOS中是以xinetd来管理rsync服务的
#yum install rsync xinetd #如果默认没有rsync,运行此命令进行安装rsync和xinetd
log file = /var/log/rsyncd.log
lock file = /var/run/rsync.lock
# chmod +x /etc/rc.d/rc.local #否则重启不执行
#systemctl start xinetd #启动(CentOS中是以xinetd来管理rsync服务的)
#vi /etc/passwd.txt #编辑文件,添加以下内容,该密码应与目标服务器中的/etc/rsync.pass中的密码一致,
#chmod 600 /etc/passwd.txt #设置文件权限,只设置文件所有者具有读取、写入权限即可
5、测试源服务器192.168.1.10到目标服务器 192.168.1.11,之间的数据同步
#mkdir -p /home/rsync/test #在源服务器上创建测试文件夹,然后在源服务器运行下面1行命令
rsync -avH --port=873 --progress--delete /home/rsync/ rsync@192.168.1.11::rsync--password-file=/etc/passwd.txt
运行完成后,分别在目标服务器192.168.1.11上查看,在/home/Sync/目录下有ceshi文件夹,说明数据同步成功,命令中目录可以随意目录,传输到目标服务器目录时文件(或目录)均放到/etc/rsyncd.conf配置的服务器目录路径,如果源目录改变了,那么传输时两个目录将进行目录匹配,会有增删动作,因此需要注意。
ll /proc/sys/fs/inotify #列出文件目录,出现下面的内容,说明服务器内核支持inotify
-rw-r--r-- 1 root root 0 Mar 7 02:17 max_queued_events
-rw-r--r-- 1 root root 0 Mar 7 02:17 max_user_instances
-rw-r--r-- 1 root root 0 Mar 7 02:17 max_user_watches
备注:Linux下支持inotify的内核最小为2.6.13,可以输入命令:#uname -a查看内核
CentOS 7.4内核为3.10.0,默认已经支持inotify
2、修改inotify默认参数(inotify默认内核参数值太小)
sysctl -a | grep max_queued_events
结果是:fs.inotify.max_queued_events= 16384
sysctl -a | grep max_user_watches
结果是:fs.inotify.max_user_watches= 8192
sysctl -a | grep max_user_instances
结果是:fs.inotify.max_user_instances= 128
#sysctl -wfs.inotify.max_queued_events="99999999"
#sysctl -w fs.inotify.max_user_watches="99999999"
#sysctl -wfs.inotify.max_user_instances="65535"
fs.inotify.max_queued_events=99999999
fs.inotify.max_user_watches=99999999
fs.inotify.max_user_instances=65535
inotify队列最大长度,如果值太小,会出现"** Event QueueOverflow **"错误,导致监控文件不准确
要同步的文件包含多少目录,可以用:find /home/Sync-type d | wc -l 统计,必须保证max_user_watches值大于统计结果(这里/home/Sync为同步文件目录)
sersync下载地址:https://sersync.googlecode.com/files/sersync2.5.4_64bit_binary_stable_final.tar.gz
上传sersync2.5.4_64bit_binary_stable_final.tar.gz到/usr/local/src目录下
#tar zxvfsersync2.5.4_64bit_binary_stable_final.tar.gz #解压
#mv GNU-Linux-x86 /usr/local/sersync #移动目录到/usr/local/sersync
#cd /usr/local/sersync #进入sersync安装目录
#cp confxml.xml confxml.xml-bak #备份原文件
<?xmlversion="1.0" encoding="ISO-8859-1"?>
<host hostip="localhost"port="8008"></host>
<excludeexpression="(.*)\.svn"></exclude>
<excludeexpression="(.*)\.gz"></exclude>
<excludeexpression="^info/*"></exclude>
<exclude expression="^static/*"></exclude>
<localpath watch="/home/rsync">
<remote ip="192.168.1.11" name="rsync"/>
<!--<remoteip="192.168.1.40" name="tongbu"/>-->
<!--<remoteip="192.168.1.40" name="tongbu"/>-->
<commonParams params="-artuz"/>
<auth start="true" users="rsync"passwordfile="/etc/passwd.txt"/>
<userDefinedPortstart="false" port="874"/><!-- port=874 -->
<timeoutstart="false" time="100"/><!-- timeout=100 -->
<failLogpath="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--defaultevery 60mins execute once-->
<crontab start="true" schedule="600"><!--600mins-->
<excludeexpression="*.php"></exclude>
<excludeexpression="info/*"></exclude>
<plugin start="false"name="command"/>
<paramprefix="/bin/sh" suffix=""ignoreError="true"/> <!--prefix /opt/tongbu/mmm.sh suffix-->
<includeexpression="(.*)\.php"/>
<includeexpression="(.*)\.sh"/>
<localpathwatch="/opt/tongbu">
<deshostip="192.168.1.20" port="8009"/>
<localpathwatch="/data0/htdocs/cms.xoyo.com/site/">
<cdninfodomainname="ccms.chinacache.com" port="80"username="xxxx" passwd="xxxx"/>
<sendurlbase="http://pic.xoyo.com/cms"/>
<regexurlregex="false"match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/>
localpath watch="/home/rsync":#源服务器同步目录
name="rsync": #目标服务器rsync同步目录模块名称
users="rsync": #目标服务器rsync同步用户名
passwordfile="/etc/passwd.pass": #目标服务器rsync同步用户的密码在源服务器的存放路径
remote ip="192.168.1.11": #目标服务器ip,每行一个
failLogpath="/tmp/rsync_fail_log.sh" #脚本运行失败日志记录
start="true" #设置为true,每隔600分钟执行一次全盘同步
#vi /etc/rc.d/rc.local #编辑,在最后添加一行
/usr/local/sersync/sersync2 -d -r -o /usr/local/sersync/confxml.xml #设置开机自动运行脚本
# chmod +x /etc/rc.d/rc.local #否则重启不执行
#vi /home/crontab/check_sersync.sh #编辑,添加以下代码
sersync="/usr/local/sersync/sersync2"
confxml="/usr/local/sersync/confxml.xml"
status=$(ps -aux |grep 'sersync2'|grep -v 'grep'|wc -l)
#chmod +x /home/crontab/check_sersync.sh#添加脚本执行权限
#vi /etc/crontab #编辑,在最后添加下面一行
*/5 * * * * root /home/crontab/check_sersync.sh >/dev/null 2>&1 #每隔5分钟执行一次脚本
#systemctl restart crond.service
6、测试sersync实时触发rsync同步脚本是否正常运行
在源服务器192.168.1.10上创建文件inotify_rsync_ceshi
#mkdir /home/rsync/inotify_rsync_ceshi
等系统启动之后,查看两台目标服务器 192.168.1.30,192.168.1.31的/home/Sync下是否有inotify_rsync_ceshi文件夹
然后再在源服务器192.168.1.10创建文件夹inotify_rsync_ceshi_new
mkdir /home/rsync/inotify_rsync_ceshi_new
继续查看两台目标服务器 192.168.1.30,192.168.1.31的//home/rsync下是否有inotify_rsync_ceshi_new文件夹
如果以上测试都通过,说明inotify实时触发rsync同步脚本运行正常。
至此,Linux下Rsync+sersync实现数据实时同步完成。
-c, --checksum 打开校验开关,强制对文件传输进行校验
-a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
-b, --backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀。
--backup-dir 将备份文件(如~filename)存放在在目录下。
-u, --update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件。(不覆盖更新的文件)
-L, --copy-links 想对待常规文件一样处理软链结
--copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结
--safe-links 忽略指向SRC路径目录树以外的链结
-S, --sparse 对稀疏文件进行特殊处理以节省DST的空间
-x, --one-file-system 不要跨越文件系统边界
-B, --block-size=SIZE 检验算法使用的块尺寸,默认是700字节
-e, --rsh=COMMAND 指定使用rsh、ssh方式进行数据同步
--rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息
-C, --cvs-exclude 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件
--existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件
--delete-excluded 同样删除接收端那些被该选项指定排除的文件
--partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输
--numeric-ids 不将数字的用户和组ID匹配为用户名和组名
-I, --ignore-times 不跳过那些有同样的时间和长度的文件
--size-only 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间
--modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口,默认为0
--compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份
-z, --compress 对备份的文件在传输时进行压缩处理
--exclude=PATTERN 指定排除不需要传输的文件模式
--include=PATTERN 指定不排除而需要传输的文件模式
--exclude-from=FILE 排除FILE中指定模式的文件
--include-from=FILE 不排除FILE指定模式匹配的文件
--config=FILE 指定其他的配置文件,不使用默认的rsyncd.conf文件
-stats 给出某些文件的传输状态
--password-file=FILE 从FILE中得到密码
更多相关内容 -
linux下实现web数据同步的四种方式(性能比较)
2021-01-11 03:50:27实现web数据同步的四种方式 ======================================= 1、nfs实现web数据共享2、rsync +inotify实现web数据同步3、rsync+sersync更快更节约资源实现web数据同步4、unison+inotify实现web数据双向同步... -
Linux下rsync远程数据同步命令的详细介绍
2020-09-15 11:21:18rsync是一款开源的、快速的、多功能的、可实现全量及增量的本地或远程数据同步备份的优秀工具。rsync软件适用于unix/linux/windows等多种操作系统平台。下面这篇文章主要介绍了Linux下rsync命令的相关资料,需要的... -
玩转Linux FTP数据同步.pdf
2021-09-06 23:49:00玩转Linux FTP数据同步.pdf -
Linux下sersync数据实时同步
2020-09-15 05:20:18主要为大家详细介绍了Linux下sersync数据实时同步的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
rsync 数据同步 实时同步 linux
2018-11-09 16:57:03亲测,有疑问可以加我,共同讨论学习! -
将数据从一个Postgres数据库同步到另一个数据库-Linux开发
2021-05-27 16:07:59pgsync在数据库之间同步Postgres数据。 设计用于:速度-在4核计算机安全性上比传统工具快4倍-内置方法可防止敏感数据永远离开服务器的便利性-sync pgsync在数据库之间同步Postgres数据。 设计用于:速度-在4核计算机... -
Linux系统下如何使用rsync进行数据同步
2020-07-30 21:09:55本文教你Linux系统下如何使用rsync进行数据同步。 -
cwrsync实现从linux到windows的数据同步备份
2020-09-30 22:47:54rsync是Linux系统下的数据镜像备份工具,从软件的命名上就可以看出来了——remote sync。rsync支持大多数的类Unix系统,无论是Linux、Solaris还是BSD上都经过了良好的测试。 -
Linux内核数据同步经典方法
2013-04-14 15:08:54Linux内核数据同步经典方法介绍 来自于英本教育内部资料 内带详细讲解和代码 希望对大家有所帮助 -
Linux 通过Rsync+Inotify实现本、异地远程数据实时同步功能
2020-09-14 20:08:57主要介绍了Linux 通过Rsync+Inotify实现本、异地远程数据实时同步功能,需要的朋友可以参考下 -
linux两台服务器实现自动同步文件
2020-09-14 18:46:57主要介绍了linux两台服务器实现自动同步文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 -
linux下指定mysql数据库服务器主从同步的配置实例
2020-12-15 14:40:42一、 概念: ① 数据库同步 (主从同步 — 主数据库写的同时 往从服务器写数据)② 数据库同步 (主主同步 — 两台数据库服务器互相写数据) 二、 举例数据库服务器(A) 主数据库 IP:192.168.1.134数据库服务器... -
Linux安装ElasticSearch与MongoDB分布式集群环境下数据同步
2018-03-23 14:42:42Linux安装ElasticSearch与MongoDB分布式集群环境下数据同步 -
linux下Rsync+sersync实现文件数据实时同步
2016-03-23 11:31:23linux下Rsync+sersync实现文件数据实时同步 -
linux文件双向同步案例
2017-04-18 11:12:40linux文件双向同步案例:是对linux文件的同步备份机制,一方有变动,另一方时时更新数据,保证数据的备份工作。 -
Linux下指定mysql数据库数据配置主主同步的实例
2020-09-10 23:07:33Linux下指定数据库数据配置主主同步的实例,有需要的朋友可以参考下 -
linux下多线程同步串口通信
2016-10-20 09:46:17主要完成:根据特定的通信协议实现串口与PC上特定串口通信软件的通信。测试版,只是完成主要框架,没有完全将协议的所有通信方式方法做完。其中包含的测试功能有:监听主机(PC上的软件)发送的特定请求,能够识别... -
Linux下rsync实现数据实时同步
2019-08-01 16:45:24与传统的 cp、tar 备份方式相比,rsync 具有安全性高、备份迅速、支持增量备份等优点,通过 rsync 可以解决对实时性要求不高的数据备份需求,例如定期的备份文件服务器数据到远端服务器,对本地磁盘定期做数据镜像等...一、软件说明 (内容来自网络)
1.rsync
与传统的 cp、tar 备份方式相比,rsync 具有安全性高、备份迅速、支持增量备份等优点,通过 rsync 可以解决对实时性要求不高的数据备份需求,例如定期的备份文件服务器数据到远端服务器,对本地磁盘定期做数据镜像等,随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync 在高端业务系统中也逐渐暴露出了很多不足,首先,rsync 同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的。而且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。其次,rsync 不能实时的去监测、同步数据,虽然它可以通过 linux 守护进程的方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。基于以上原因,rsync+inotify 组合出现了!
2.inotify
Inotify 是一种强大的、细粒度的、异步的文件系统事件监控机制,linux 内核从 2.6.13 起,加入了 Inotify支持,通过 Inotify 可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而 inotify-tools 就是这样的一个第三方软件。 在上面章节中,我们讲到,rsync 可以实现触发式的文件同步,但是通过 crontab 守护进程方式进行触发,同步的数据和实际数据会有差异,而 inotify 可以监控文件系统的各种变化,当文件有任何变动时,就触发rsync 同步,这样刚好解决了同步数据的实时性问题。
注:
rsync inotify 需要逆向思考,当只做rsync不实时同步时,我们一般是从rsync服务端向rsync客户端同步数据。当需要添加inotify实现实时同步数据时,我们就需要从rsync客户端向各rsync服务端同步数据,这样rsync客户端就变成了主服务器,而rsync服务端就变成了副服务器。
原理:当inotify监测的本地目录,也就是需要同步的目录发生变化时,比如有文件改名、更新、删除、权限变化,此时就使用inotify命令查找这些变化,进行相应的同步工作。
二、系统环境:
操作系统
rsync
inotify
Centos6.5
系统自带
3.1.3
三、拓扑图
四、配置过程
Rsync服务端安装在备份服务器上,千万不要弄错(教训!!!)
4.1、配置rsync服务端
检查服务器是否安装rsync。
[root@dbbak]# rpm -qa |grep rsync
rsync-3.0.6-12.el6.x86_64
(centos6.5默认已经安装好,没有安装的可以用yum或者编译安装,在此不详细写了)
rsync服务器主要有三个配置文件:rsync.conf,rsync.passwd和rsyncd.motd。而rsync安装后并没有自动创建相关配置文件,因此我们还需手动创建:
[root@dbbak]# mkdir /etc/rsync #创建主配置文件目录
[root@dbbak]# touch /etc/rsync/rsync.conf #创建主配置文件
[root@dbbak]# touch /etc/rsync/rsync.passwd #创建用户密码文件
[root@dbbak]# chmod 600 /etc/rsync/rsync.passwd #修改用户密码文件权限
[root@dbbak]# touch /etc/rsync/rsync.motd #创建定义服务信息的文件
4.2、配置rsync文件,我配置了2个节点
[root@dbbak]# vi /etc/rsync/rsync.conf
uid = root
gid = root
use chroot = no #是否使用chroot
max connections = 10 #最大连接数为10
pid file = /var/run/rsyncd.pid #rsync pid存放位置
lock file = /var/run/rsync.lock #支持max connections参数的锁文件
log file = /var/log/rsyncd.log #LOG存放位置
[databak] #自定义节点名称
path = /data/bak/ #rsync服务端备份数据存的储路径
ignore errors #忽略错误
read only = no #设置rsync服务端权限
comment = databak #设置的和节点名称一样
hosts allow = 192.168.1.0/24 #允许的号段
hosts deny = * #拒绝的主机号段,*号表示不拒绝
auth users = bak #自动连接的账户名称
secrets file = /etc/rsync/rsync.passwd #用户名密码存放位置
[zmmisbak]
path = /data/bak/
ignore errors
read only = no
comment = zmmisbak
hosts allow = 192.168.1.0/24
hosts deny = *
auth users = bak
secrets file = /etc/rsync/rsync.passwd
4.3、配置rsync服务端用户名和密码
添加用户和密码
[root@dbbak]# vi etc/rsync/rsync.passwd
bak:bak #格式为前面为用户名,后面为密码
4.4、启动rsync服务端
[root@dbbak]# /usr/bin/rsync --daemon --config=/etc/rsync/rsync.conf #以守护进程启动rsync
[root@dbbak]# echo "/usr/bin/rsync --deamon --config=/etc/rsync/rsync.conf" >> /etc/rc.d/rc.local #添加到开机启动
这里的启动方式比较特殊,如果你要重启,需要kill掉rsync的进程,再重新运行!
另外还有另外一种启动rsync的方式,CentOS 默认以 xinetd 方式运行 rsync 服务。
要配置以 xinetd 运行的 rsync 服务需要执行如下的命令:
[root@dbbak]# vi /etc/xinetd.d/rsync
disable = no #默认是yes,改成no
socket_type = stream
wait = no
user = root
server = /usr/bin/rsync #路径改为自己路径
server_args = --daemon --config=/etc/rsyncd/rsyncd.conf # 这里添加rsync的服务选项!
log_on_failure += USERID
}
[root@dbbak]# service xinetd restart #重启xinetd服务
[root@dbbak]# chkconfig xinetd on #添加到开机启动
4.5、配置rsync客户端+inotify
rsync客户端安装在主服务器上,千万不要弄错。
rsync的客户端配置比较简单,只需要添加一个密码文件,配置好开机启动就可以了。
[root@dbbak]# mkdir /etc/rsync #创建rsync客户端目录
[root@dbbak]# touch /etc/rsync/rsync.conf #创建rsync主文件
[root@dbbak]# echo "bak" > /etc/rsync/rsync.passwd #创建密码文件
#这里只需配置密码即可,不用配置用户名。密码和服务端的一样。
[root@dbbak]# chmod 600 /etc/rsync/rsync.password #为了安全权限设置为600
[root@dbbak]# /usr/bin/rsync --daemon --config=/etc/rsync/rsync.conf #启动rsync
[root@dbbak]# echo "/usr/bin/rsync --daemon --config=/etc/rsync/rsync.conf" >> /etc/rc.d/rc.local #配置rsync客户端开机启动
4.6、测试rsync
从主服务器推送文件到备份服务器
在主服务器上执行:
[root@dbbak]# rsync -avP --password-file=/etc/rsync/rsync.passwd /data/dbf bak@192.168.1.2::databak
参数说明 -a , --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD;
-v, --verbose 详细模式输出;
-P ,--progress 显示备份过程;
-z, --compress 对备份的文件在传输时进行压缩处理(可选)。
更多参数请参考:rsync配置详细版 - Linux操作系统:Ubuntu_Centos_Debian - 红黑联盟
--password-file=/etc/rsync/rsync.passwd #指定密码文件位置
/data/dbf #本地主服务器的数据存储路径
bak #rsync用户名
@192.168.1.2 #目的主机:备份服务器的IP地址
::databak #::分隔符后是备份服务器rsync服务端中配置的节点名称,对应的是备份服务器的数据存储路径。
意思为:把本地目录/data/dbf下的数据上传到192.168.1.2服务器的databak节点下对应/data/bak目录下
4.7、创建一个脚本,加到crontab定时执行一下
/usr/local/bin/rsync -avP --password-file=/etc/rsync/rsync.passwd /backup/databak bak@172.16.1.4::databak
echo "${files} was rsynced" >> /var/log/databak.log 2>&14.8、测试,先在主服务器建一个文件夹,然后执行下脚本文件,最后看下备份服务器有内容的话,同步成功
备份服务器已经有文件夹了
-
Linux安装canal实现增量数据同步
2021-11-11 16:43:34前言:本文章将采用docker方式安装canal canal主要用途是基于 MySQL 数据库增量日志解析,并能提供增量数据订阅和消费。 github地址:... Canal应用场景 1.电商场景下商品、用户实时更新同步到至Ela前言:本文章将采用docker方式安装canal
canal主要用途是基于 MySQL 数据库增量日志解析,并能提供增量数据订阅和消费。
- github地址:https://github.com/alibaba/canal
- 版本下载地址:https://github.com/alibaba/canal/releases
- 文档地址:https://github.com/alibaba/canal/wiki/Docker-QuickStart
Canal应用场景
1.电商场景下商品、用户实时更新同步到至Elasticsearch、solr等搜索引擎;
2.价格、库存发生变更实时同步到redis;
3.数据库异地备份、数据同步;
4.代替使用轮询数据库方式来监控数据库变更,有效改善轮询耗费数据库资源。一、安装mysql
1、在/tmp目录下创建mysql数据卷挂载目录
注:创建数据卷是为了方便修改mysql的配置
1.1、创建配置文件挂载目录:
[root@k8s-master1 /]# mkdir -p /tmp/mysql/conf
1.2、创建配置文件并添加如下内容
[root@k8s-master1 /]# vim /tmp/mysql/conf/hmy.cnf
[mysqld] skip-name-resolve character_set_server=utf8 datadir=/var/lib/mysql # 开启 binlog,方便后续对接canal log-bin=/var/lib/mysql/mysql-bin # 选择 ROW 模式,方便后续对接canal binlog-format=ROW # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复 server-id=1000
1.3、创建mysql数据卷挂载目录
[root@k8s-master1 /]# mkdir -p /tmp/mysql/data
2、docker安装mysql
[root@k8s-master1 /]# docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf -v /tmp/mysql/data:/var/lib/mysql -d mysql:5.7.25
3、创建数据库用户并授权
授权 canal 链接 MySQL 账号具有作为 MySQL slave 的权限,在数据库连接工具里面,执行下面的语句即可:
create user canal@'%' IDENTIFIED by 'canal'; GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT,SUPER ON *.* TO 'canal'@'%'; FLUSH PRIVILEGES;
4、查看bin-log是否已开启
二、安装canal
1、拉取镜像
[root@k8s-master1 /]# docker pull canal/canal-server:v1.1.1
2、安装canal-server容器
[root@k8s-master1 /]# docker run -p 11111:11111 --name canal -d canal/canal-server:v1.1.1
注意:若canal服务启动后自动停止,则需注意虚拟机内存,将暂时不用的服务关掉,再重启canal即可!
3、修改canal-server配置
1、进入canal容器内部,修改/home/admin/canal-server/conf/canal.properties,将它的id属性修改成和mysql数据库中server-id不同的值。
注意:容器默认进入/home/admin目录下!!
注意:容器默认进入/home/admin目录下!!
注意:容器默认进入/home/admin目录下!!
[root@k8s-master1 /]# docker exec -it canal bash [root@43d1c9546cf0 admin]# ls app.sh bin canal-server health.sh [root@43d1c9546cf0 admin]# cd canal-server/ [root@43d1c9546cf0 canal-server]# ls bin conf lib logs [root@43d1c9546cf0 canal-server]# cd conf/ [root@43d1c9546cf0 conf]# ls canal.properties example logback.xml metrics mq.yml spring [root@43d1c9546cf0 conf]# vi canal.properties
2、修改/home/admin/canal-server/conf/example/instance.properties,配置要监听的数据库服务地址和监听数据变化的数据库以及表,修改如下:[root@43d1c9546cf0 admin]# cd /home/admin/canal-server/conf/example [root@43d1c9546cf0 example]# ls h2.mv.db instance.properties [root@43d1c9546cf0 example]# vi instance.properties
其中,属性canal.instance.filter.regex:的说明如下mysql 数据解析关注的表,Perl正则表达式. 多个正则之间以逗号(,)分隔,转义符需要双斜杠(\\) 常见例子: 1. 所有表:.* or .*\\..* 2. canal schema下所有表: canal\\..* 3. canal下的以canal打头的表:canal\\.canal.* 4. canal schema下的一张表:canal.test1 5. 多个规则组合使用:canal\\..*,mysql.test1,mysql.test2 (逗号分隔) 注意:此过滤条件只针对row模式的数据有效(ps. mixed/statement因为不解析sql,所以无法准确提取tableName进行过滤)
3、退出容器并重启容器
[root@k8s-master1 /]# docker restart canal
三、springboot整合canal,实现增量数据同步
参考地址:https://github.com/NormanGyllenhaal/canal-client
1、pom文件
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>miaosha-service</artifactId> <groupId>com.miaosha</groupId> <version>0.0.1-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>miaosha-canal</artifactId> <dependencies> <!--canal--> <dependency> <groupId>top.javatool</groupId> <artifactId>canal-spring-boot-autoconfigure</artifactId> <version>1.2.1-RELEASE</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <!-- 指定该Main Class为全局的唯一入口 --> <mainClass>com.miaosha.CanalApplication</mainClass> <layout>ZIP</layout> </configuration> <executions> <execution> <goals> <goal>repackage</goal><!--可以把依赖的包都打包到生成的Jar包中--> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
2、yaml文件
server: port: 8088 #Canal配置 canal: server: canal-server:11111 destination: example #日志 logging: level: root: error
3、创建SkuHandler并实现EntryHandler接口。
@Component //监控数据表 @CanalTable(value = "tb_sku") public class SkuHandler implements EntryHandler<Sku> { /*** * 增加数据 * @param sku */ @Override public void insert(Sku sku) { //添加业务操作 } /*** * 修改数据 * @param before * @param after */ @Override public void update(Sku before, Sku after) { //修改业务操作 } /*** * 删除数据 * @param sku */ @Override public void delete(Sku sku) { //删除业务操作 } }
自此,完成!!!
-
linux中的datax数据同步json脚本用于同步两台互通服务器数据库上的表数据---aaa.json
2021-06-17 16:13:40linux中的datax数据同步json脚本用于同步两台互通服务器数据库上的表数据---aaa.json -
rsync rsync是linux系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync可以远程同步
2019-01-24 11:09:16rsync是linux系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH、rsync主机同步 -
Linux服务器数据实时同步备份的方案
2014-02-20 14:27:14简单有效的Linux服务器数据实时同步备份方案,对oracle数据库有参考。 -
Linux下文件实时自动同步备份
2020-03-24 11:19:42前言 我们都知道一旦 Linux 系统被入侵了,或者 Linux 系统由于...本篇文章将对 Linux 主机之间文件实时自动同步备份进行讲解,使用 rsync+inotify 组合的方式来实现,避免由于硬件或者软件导致的 Linux 系统死机...本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 chaodev 即可关注。
文章目录
前言
我们都知道一旦 Linux 系统被入侵了,或者 Linux 系统由于硬件关系而死机,如何快速恢复系统呢?当然,如果有备份数据的话,那么恢复系统所花费的时间与成本将会很少。平时最好就养成备份的习惯,可以避免发生突发事件时束手无策。
本篇文章将对 Linux 主机之间文件实时自动同步备份进行讲解,使用 rsync+inotify 组合的方式来实现,避免由于硬件或者软件导致的 Linux 系统死机或损坏造成的损失。
文章重点
1、rsync+inotify 简介
2、整体架构
3、同步节点部署(rsync)
4、源服务器节点部署(rsync+inotify)
5、实时同步备份验证
6、遇到的问题及解决方法
一、rsync+inotify 简介
1、rsync简介
rsync(remote synchronize)是 Liunx/Unix 下的一个远程数据同步工具,它可通过 LAN/WAN 快速同步多台主机间的文件和目录。
Linux 之间同步文件一般有两种方式,分别是 rsync 与 scp 。scp 相当于复制,粘贴,文件不存在则新建,若存在则覆盖,而 rsync 则是比较两边文件是否相同,不相同才进行更新。所以 rsync 和 scp 在文件夹存在的情况下差异很大,因为 scp 是复制和覆盖,从执行性能来说 rsync 更胜一筹。而且 rsync 能将文件夹、文件的权限等信息也保存下来。
但是 rsync 也有一定的缺点,在同步数据时,需要扫描所有文件后进行比对,如果文件数量相当大时,扫描文件就非常耗费时间和性能。其次,rsync 不能够实时监测、同步数据,这就可能导致一些时间段数据不一致。解决这个问题的方法就是实时同步,所以需要使用 rsync+inotify 组合。
2、inotify简介
inotify 是一种强大的、细粒度的、异步的文件系统事件监控机制,Linux 内核从2.6.13版本起,加入了对 inotify 的支持。通过 inotify 可以监控文件系统中添加、删除、修改、移动等各种事件,利用这个内核接口,inotify-tools 便可以监控文件系统下文件的各种变化情况了。
首先检查系统内核是否支持 inotify
uname -r ll /proc/sys/fs/inotify
出现以下三个文件表示系统默认支持 inotify,如下所示。
[root@localhost ~]# uname -r #查询系统内核版本 3.10.0-327.el7.x86_64 [root@localhost ~]# ll /proc/sys/fs/inotify total 0 -rw-r--r-- 1 root root 0 Mar 11 09:34 max_queued_events -rw-r--r-- 1 root root 0 Mar 11 09:34 max_user_instances -rw-r--r-- 1 root root 0 Mar 11 09:34 max_user_watches
二、整体架构
这里我使用两个 Linux 服务器节点来做演示,实现两个节点间文件的实时同步,node1 为源服务器节点,就是需要同步数据的节点,部署 rsync+inotify ,node2 为同步节点,也就是接收同步数据的节点,只需要部署 rsync,如下所示。
主机 节点名 系统 ip 角色 软件 node1 源服务器节点 CentOS7 64位 192.168.157.129 Server rsync,inotify node2 同步节点 CentOS7 64位 192.168.157.130 Client rsync node1 中的 inotify 用于监控文件或文件夹的各种变化情况,一旦变动则利用 rsync 来进行文件的同步,具体架构图如下所示。
三、同步节点部署(rsync)
同步节点,也就是node2 192.168.157.130,只需要安装配置 rsync 即可,具体步骤如下。
1、安装rsync
(1)直接使用yum命令安装
yum -y install rsync
(2)使用编译安装
官网:https://rsync.samba.org/
下载地址:https://rsync.samba.org/ftp/rsync/ ,目前最新版本是3.1.3 。
下载完成后解压安装,如下
# 解压 tar zxvf rsync-3.1.3.tar.gz cd rsync-3.1.3/ # 配置 ./configure # 编译及安装 make && make install
安装完成后,使用
rsync –-help
命令可查看 rsync 相关信息
2、配置rsync
rsync 安装好之后,在 etc 目录下有一个 rsyncd.conf 文件,修改rsync配置文件。
vim /etc/rsyncd.conf
修改内容如下
uid = nobody gid = nobody use chroot = yes max connections = 10 strict mode=yes pid file = /var/run/rsyncd.pid lock file=/var/run/rsync.lock log file=/var/log/rsyncd.log [backup] path = /backup129/ comment = backup file ignore errrors read only=no write only=no hosts allow=192.168.157.129 hosts deny=* list=false uid=root gid=root auth users=yxc secrets file=/etc/rsync.password
其中需要用到一个密码文件,也就是上面配置的 secrets file 的值 /etc/rsync.password,在 rsync3.1.3 版本中默认没有密码文件,需要手动创建,内容格式为:user:password,user 就是上面配置的 yxc,password 就是密码,如下所示。
echo "yxc:123456" > /etc/rsync.password
然后需要给密码文件600权限
chmod 600 /etc/rsync.password
启动 rsync 守护进程
/usr/local/bin/rsync --daemon
启动之后可查看 rsync 进程,如下
ps -ef | grep rsync
如有需要可加入系统自启动文件
echo "/usr/local/bin/rsync --daemon" >> /etc/rc.local
rsync 默认端口为873,所以开放873端口
firewall-cmd --add-port=873/tcp --permanent --zone=public #重启防火墙(修改配置后要重启防火墙) firewall-cmd --reload
四、源服务器节点部署(rsync+inotify)
源服务器节点,也就是 node1 192.168.157.129,需要部署 rsync 和 inotify。
1、安装rsync
rsync 安装方式和上面相同,就不详细讲解了。
# 解压 tar zxvf rsync-3.1.3.tar.gz cd rsync-3.1.3/ # 配置 ./configure # 编译及安装 make && make install
2、配置rsync
源服务器节点中只需要配置认证密码文件,首先在 etc 文件夹下创建文件 rsync.password,只需要密码,不需要用户,密码需要和同步节点 node2 中的一致,我这里也就是123456。
vim /etc/rsync.password
修改密码文件权限
#需要给密码文件600权限 chmod 600 /etc/rsync.password
启动 rsync 守护进程
/usr/local/bin/rsync --daemon
如有需要可加入系统自启动文件
echo "/usr/local/bin/rsync --daemon" >> /etc/rc.local
同样开放873端口,如下所示
firewall-cmd --add-port=873/tcp --permanent --zone=public #重启防火墙(修改配置后要重启防火墙) firewall-cmd --reload
3、手动同步测试
先在源服务器节点的 /root/data/backuptest/ 目录下新建一个 test 文件夹
mkdir data/backuptest/test
然后使用如下命令进行同步测试,其中一些参数要和同步节点配置文件中相对应,比如下面的认证模块名 backup、用户名 yxc 等。
rsync -avH --port 873 --delete /root/data/backuptest/ yxc@192.168.157.130::backup --password-file=/etc/rsync.password
可以看到 node1 中文件夹 test 已经发送,查看同步节点 node2 中,如下
test 文件夹已经同步到 node2,所以我们的 rsync 配置成功,可以进行文件同步,接下来就是部署 inotify 实现实时同步,通过inotify监听文件或文件夹,如果有变动就进行同步。
4、部署inotify
(1)下载安装
inofity-tools下载地址:http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
inotify-tools 的详细介绍可以看:https://github.com/rvoicilas/inotify-tools/wiki下载完成后,进行解压安装,如下
# 解压 tar zxvf inotify-tools-3.14.tar.gz cd inotify-tools-3.14/ # 配置 ./configure # 编译及安装 make && make install
(2)创建rsync同步的shell脚本
安装完成之后需要创建用于 rsync 同步的 shell 脚本,如果添加、修改、删除了文件或文件夹,inotify 可以监控到,然后通过 rsync 进行同步,这里我们就在需要进行监控的目录创建这个脚本
vim /root/data/backuptest/inotifyrsync.sh
#!/bin/bash host1=192.168.157.130 src=/root/data/backuptest/ dst1=backup user1=yxc /usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e close_write,delete,create,attrib $src \ | while read files do /usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/rsync.password $src $user1@$host1::$dst1 > /dev/null 2>&1 echo "${files} was rsynced." >> /tmp/rsync.log 2>&1 done
其中 host 是 client 的 ip,src 是 server 端要实时监控的目录,des 是认证的模块名,需要与 client 一致,user 是建立密码文件里的认证用户。
然后给这个脚本赋予权限
chmod 755 /root/data/backuptest/inotifyrsync.sh
后台运行这个脚本
/root/data/backuptest/inotifyrsync.sh &
有需要可以将脚本加入系统自启动文件中
echo "/root/data/backuptest/inotifyrsync.sh &" >> /etc/rc.local
五、实时同步备份验证
在 node1 节点中添加删除修改文件或文件夹,看 node2 中是否会自动同步,首先在 node1 中创建一个文件夹 hello
查看 node2 中 backup129 文件夹,hello 文件夹已经同步,如下
再在 node1 中创建、删除或修改一些文件或文件夹
在 node2 中都会进行实时的同步备份,如下所示
所以经验证,实时自动同步备份功能成功实现。
六、遇到的问题及解决方法
1、手动同步测试时出现如下错误。
[root@oraserver ~]# rsync -avH --port 873 --delete /root/data/backuptest/ yxc@192.168.157.130::backup --password-file=/etc/rsync.password @ERROR: chroot failed rsync error: error starting client-server protocol (code 5) at main.c(1657) [sender=3.1.3] [root@oraserver ~]#
出现这个错误的原因是服务器端的目录不存在或无权限。查看130节点日志,如下
[root@localhost backup129]# cat /var/log/rsyncd.log 2020/03/11 15:46:17 [90120] rsync: chroot /backup129 failed: No such file or directory (2)
果然backup129 这个目录不存在,创建这个目录即可解决问题。
2、启动rsync失败,提示pid文件已经存在
[root@localhost data]# /usr/local/bin/rsync --daemon [root@localhost data]# failed to create pid file /var/run/rsyncd.pid: File exists
删除pid文件即可
rm -rf /var/run/rsyncd.pid
3、启动inotifyrsync.sh这个shell脚本时,发生错误
[root@oraserver ~]# /root/data/backuptest/inotifyrsync.sh & [1] 30084 [root@oraserver ~]# /root/data/backuptest/inotifyrsync.sh: line 6: /usr/local/inotify/bin/inotifywait: No such file or directory /root/data/backuptest/inotifyrsync.sh: line 7: syntax error near unexpected token `|' /root/data/backuptest/inotifyrsync.sh: line 7: `| while read files ' [1]+ Exit 2 /root/data/backuptest/inotifyrsync.sh
原因:/usr/local/inotify/bin/inotifywait 路径不对,是 /usr/local/bin/inotifywait ,修改即可。
觉得有帮助点个赞吧!!!
原创不易,转载请注明出处。微信扫一扫下方二维码即可关注我的公众号
-
运维基本功(十八): Linux系统下数据同步服务RSYNC解决方案
2021-05-06 21:22:43运维基本功(一):Linux系统安装 运维基本功(二):Linux基本命令 运维基本功(三):Linux文件管理 运维基本功(四):Linux文件管理-Vim编辑器概述 运维基本功(五):Linux文件管理-用户管理 运维基本功(六)... -
Linux两台服务器相互同步数据方法
2019-04-05 10:12:32使用cp命令的-n参数即可跳过相同的文件 ,但scp却没这个参数,如何实现呢? rsync 它比scp更强大,支持“不覆盖”原目录 例子:rsync -avz --progress /root/client/ root@202.112.23.12:/home/work/ ... -
rsync Server是linux系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync可以远程同步,支持本地...
2019-01-24 11:10:26rsync是linux系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH、rsync主机同步 -
使用rsync同步linux或windows数据到windows
2021-07-15 10:52:56linux同步到windows3.1 准备工作3.2 同步4. windows同步到windows 更多内容请查看rsync的github链接 1. Windows自带的远程连接桌面使用 win + R打开运行界面 输入mstsc打开远程连接桌面 输入要连接的计算机... -
Linux下rsync实现多服务器数据双向实时同步
2019-03-07 16:18:02Linux下rsync实现多服务器数据双向实时同步 话不多说,直接上方式 下载rsync yum -y install rsync rsync.conf rpm包安装的配置文件一般都在 /etc/rsync.conf 根目录下的etc rsync.conf 配置详细(每台...