rsync+sersync实现数据文件实时同步

时间:2022-12-22 07:25:35

使用rsync+sersync,实现nfs与backup服务器间实时数据同步

一、数据同步工具介绍

rsync是一款开源的、快速的、多功能的、可实现全量及增量的本地或远程数据同步备份的优秀工具。rsync软件适用于unix/linux/windows等多种操作系统平台。

rsync和ssh带的scp命令比较相似,但又优于scp命令的功能,scp每次都是全量拷贝,而rsync可以进行增量拷贝。当然,rsync还可以在本地主机的不同分区或目录之间全量及增量的复制数据,这又类似cp命令,但同样也优于cp命令,cp每次都是全量拷贝,而rsync可以增量拷贝.利用rsync还可以实现删除文件和目录功能,这又相当于rm命令。

sersync是基于Inotify开发的,类似于Inotify-tools的工具;

sersync可以记录下被监听目录中发生变化的(包括增加、删除、修改)具体某一个文件或某一个目录的名字;

rsync在同步的时候,只同步发生变化的这个文件或者这个目录(每次发生变化的数据相对整个同步目录数据来说是很小的,rsync在遍历查找比对文件时,速度很快),因此,效率很高;

:当同步的目录数据量不大时,建议使用Rsync+Inotify-tools;当数据量很大(几百G甚至1T以上)、文件很多时,建议使用Rsync+sersync。

二、实操部分

1、rsync以守护进程(socket)的方式传输数据

这个是rsync自身的重要功能,我们实验的机器如下:

服务端IP:172.16.1.41

客户端IP:172.16.1.31

服务端配置

先新建配置文件,请注意rsyncd.conf配置文件只用在服务端新建就好。

vim /etc/rsyncd.conf

以下只是配置文件中最常用的部份,更多的请使用命令man rsyncd.conf查看。

uid = rsync       # 运行rsync的用户和组id

gid = rsync

use chroot = no       # bug信息的处理,一种安全方式

max connections = 200    # 最大的连接数

timeout = 300           # 超时时间

pid file = /var/run/rsyncd.pid            # pid进程号文件

lock file = /var/run/rsync.lock           # 锁文件

log file = /var/run/rsyncd.log            # 日志文件

[backup]           # 需要同步的模块,这是其中一个,可以有多个,对应不同的目录,客户端可以

                                     # 选择要同步的目录

path = /backup                   # 同步的根目录

ignore errors             # 忽略错误

read only = false                # 只读falsh 表示可读可写

list = false                            # 不可列表

hosts allow = 172.16.1.0/24             # 允许访问的网段

#hosts deny = 0.0.0.0/32                            # 拒绝访问的网段,允许与拒绝不能同时设置

auth users = rsync_backup               # 用户名

secrets file = /etc/rsync.password           # 密码文件路径,密码文件权限要设置成600

以守护进程的方式启动rsync

[root@backup ~]# rsync --deamon

查看是否启动成功,rsyncd的默认端口是873

[root@backup ~]# netstat -lntup | grep 873

[linguang@backup tmp]$ ps -ef|grep rsync|grep -v grep

[linguang@backup tmp]$ lsof -i :873

-l显示监控中的服务器的Socket;-n不通过域名服务器;p显示正在使用Socket的PID和程序名

如果启动出错,我们就需要查看一下系统日志,我们这里日志显示正常启动

[root@backup /]# cat /var/run/rsyncd.log

2018/12/20 15:02:04 [18822] rsyncd version 3.0.6 starting, listening on port 873

创建一个不需要登录的系统用户

[root@backup ~]# useradd rsync -s /bin/nologin -M        

[root@backup ~]# id rsync

uid=501(rsync) gid=501(rsync) 组=501(rsync)

下面我们创建需要同步的目录,并给予相应的权限

[root@backup ~]# mkdir -p /backup

[root@backup /]# chown -R rsync.rsync backup

将用户名和密码重定义输出到我们的密码存放文件

# rsync_backup是用户名,linguang是密码

[root@backup /]# cat /etc/rsync.password

rsync_backup:linguang

[root@backup /]# chmod 600 /etc/rsync.password

重启rsync服务:

[root@backup ~]# lsof -i:873

COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

rsync   19553 root    4u  IPv4  62838      0t0  TCP *:rsync (LISTEN)

rsync   19553 root    5u  IPv6  62839      0t0  TCP *:rsync (LISTEN)

[root@backup ~]# pkill rsync

[root@backup ~]# lsof -i:873

[root@backup ~]# rsync --daemon

rsync服务添加到开机启动脚本中:

[root@backup ~]# echo 'rsync --daemon'>>/etc/rc.local

[root@backup ~]# tail -1 /etc/rc.local

rsync --daemon

同时我们需要关闭防火樯

[root@backup date]# /etc/init.d/iptables stop    /status查看状态

客户端配置

将密码保存在密码配置文件,同是为了与服务端统一,我们使用相当的文件名,注意这里我们只需要放入密码即可

[root@vagrant-centos65 ~]# echo "linguang" >/etc/rsync.password

[root@vagrant-centos65 ~]# chmod 600 /etc/rsync.password

[root@vagrant-centos65 ~]# cat /etc/rsync.password

linguang

rsync通过daemon方式远程传输的语法为:

Access via rsync daemon:

Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]

rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]

Push: rsync [OPTION...] SRC... [USER@]HOST::DEST

rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

在客户端进行拉取实例:

先看看server端的目录结构

[root@backup backup]# pwd

/backup

[root@backup backup]# mkdir date/{run,log}/linguang -p

[root@backup backup]# tree

.

`-- date

    |-- log

    |   `-- linguang

    `-- run

        `-- linguang

 

5 directories, 0 files

开始提取数据

##backup(模块名) 即服务端/backup

 [root@nfs01 tmp]# rsync -avzP rsync_backup@172.16.1.41::backup /tmp --password-file=/etc/rsync.password     ##自动读取密码,参数--password-file=/etc/rsync.password

receiving incremental file list

./

date/

date/log/

date/log/linguang/

date/run/

date/run/linguang/

sent 87 bytes  received 221 bytes  616.00 bytes/sec

total size is 0  speedup is 0.00

[root@nfs01 tmp]# tree

.

└── date

    ├── log

    │   └── linguang

    └── run

        └── linguang

 

5 directories, 0 files

在客户端进行推送实例

[linguang@nfs01 tmp]$ sudo touch teach{1..20}

[linguang@nfs01 tmp]$ rsync -avzP /tmp/ rsync_backup@172.16.1.41::backup/nfs01back/tmp --password-file=/etc/rsync.password

rsync: could not open password file "/etc/rsync.password": Permission denied (13)

Password:

@ERROR: auth failed on module backup

rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6]

[linguang@nfs01 tmp]$ sudo rsync -avzP /tmp/ rsync_backup@172.16.1.41::backup/nfs01back/tmp --password-file=/etc/rsync.password

sending incremental file list

created directory nfs01back/tmp

./

teach1

           0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=25/27)

。。。。。。。。。

date/run/

date/run/linguang/

sent 1068 bytes  received 415 bytes  2966.00 bytes/sec

total size is 0  speedup is 0.00

 其它语法

排除连续的文件,推送文件到服务端

[root@nfs01 ~]# rsync -avz /root/ rsync://rsync_backup@172.16.1.41:873/backup/nfs01 --exclude=student{10..15} --password-file=/etc/rsync.password  

sending incremental file list

created directory nfs01

./

.bash_history

.bash_logout

.bash_profile

.bashrc

提取服务端文件到本地目录下

[root@nfs01 ~]# rsync -avzP rsync://rsync_backup@172.16.1.41:873/backup/test/ /tmp --password-file=/etc/rsync.password  

receiving incremental file list

./

a/

a/girld/

b/

b/girld/

sent 83 bytes  received 169 bytes  504.00 bytes/sec

total size is 0  speedup is 0.00

限速传输:

[root@nfs01 ~]# dd if=/dev/zero of=logfile.tar bs=1M count=128

记录了128+0 的读入

记录了128+0 的写出

134217728字节(134 MB)已复制,5.06455 秒,26.5 MB/秒

[root@nfs01 ~]# rsync -avzP /root/logfile.tar rsync_backup@172.16.1.41::backup/logfile --bwlimit=100 --password-file=/etc/rsync.password 

sending incremental file list

logfile.tar

   134217728 100%   93.20MB/s    0:00:01 (xfer#1, to-check=0/1)

sent 130594 bytes  received 27 bytes  29026.89 bytes/sec

total size is 134217728  speedup is 1027.54

[root@nfs01 ~]# rsync -avzP /root/logfile.tar rsync_backup@172.16.1.41::backup/logfile --bwlimit=10 --password-file=/etc/rsync.password

sending incremental file list

logfile.tar

   134217728 100%    9.12MB/s    0:00:14 (xfer#1, to-check=0/1)

sent 130594 bytes  received 27 bytes  8427.16 bytes/sec

total size is 134217728  speedup is 1027.54

2、下载sersync压缩包

[root@nfs01 /]# mkdir application

[root@nfs01 /]# cd application

[root@nfs01 application]# wget https://github.com/wsgzao/sersync/raw/master/sersync2.5.4_64bit_binary_stable_final.tar.gz

[root@nfs01 sersync]# tree

.

├── bin

│   └── sersync

├── conf

│   └── confxml.xml

└── logs

 

1.1.1.2  配置文件介绍

[root@nfs01 data]# cat /application/sersync/conf/confxml.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监控事件情况设置

   <inotify>

<delete start="true"/>

<createFolder start="true"/>

<createFile start="false"/>

<closeWrite start="true"/>

<moveFrom start="true"/>

<moveTo start="true"/>

<attrib start="false"/>

<modify start="false"/>

   </inotify>

        #修改需要监控的目录

   <sersync>

<localpath watch="/data">

    #修改成备份服务器ip、模块名称,而不是本机ip地址,可以有多台备份服务器

    <remote ip="192.168.90.41" name="nfsbackup"/>

    <!--<remote ip="192.168.8.39" name="tongbu"/>-->

    <!--<remote ip="192.168.8.40" name="tongbu"/>-->

</localpath>

<rsync>

    #下面的是rsync使用的参数,可自定义,也可以根扩展--delete等,来实现想要的备份方式

    <commonParams params="-avz"/>

    #下面是是否要启动,改成true即可,users为用于rsync鉴权的用户名,在rsync服务器上设置

    <auth start="true" users="rsync_backup" passwordfile="/etc/rsync.password"/>

    <userDefinedPort start="false" port="874"/><!-- port=874 -->

    #下面这个可以设置超时时间

    <timeout start="true" time="100"/><!-- timeout=100 -->

    <ssh start="false"/>

</rsync>

    #下面这个也需要注意,根据实际情况去修改

<failLog path="/application/logs/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>

 测试sersync命令:

[root@nfs01 data]# /application/sersync/bin/sersync -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命令推送一遍

参数-n: 指定开启守护线程的数量,默认为10个

参数-o:指定配置文件,默认使用confxml.xml文件

参数-m:单独启用其他模块,使用 -m refreshCDN 开启刷新CDN模块

参数-m:单独启用其他模块,使用 -m socket 开启socket模块

参数-m:单独启用其他模块,使用 -m http 开启http模块

不加-m参数,则默认执行同步程序

[root@nfs01 data]# /application/sersync/bin/sersync -d -r -n 8 -o /application/sersync/conf/confxml.xml

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

option: -d      run as a daemon

option: -r      rsync all the local files to the remote servers before the sersync work

option: -n      thread num is:  8

option: -o      config xml name:  /application/sersync/conf/confxml.xml

parse xml config file

host ip : localhost     host port: 8008

daemon start,sersync run behind the console

use rsync password-file :

user is rsync_backup

passwordfile is         /etc/rsync.password

config xml parse success

please set /etc/rsyncd.conf max connections=0 Manually

sersync working thread 10  = 1(primary thread) + 1(fail retry thread) + 8(daemon sub threads)

Max threads numbers is: 18 = 10(Thread pool nums) + 8(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 /data && rsync -avz -R --delete ./ rsync_backup@172.16.1.41::nfsbackup --password-file=/etc/rsync.password >/dev/null 2>&1

run the sersync:

watch path is: /data

[root@nfs01 data]# ps -ef |grep sersync

[root@nfs01 data]# pkill sersync

添加到开机启动项:

[root@nfs01 data]# tail -1 /etc/rc.local

#/application/sersync/bin/sersync -d -r -n 8 -o /application/sersync/conf/confxml.xml

 

3、高并发数据实时同步方案小结及拓展

1)inotify(sersync)+rsync,是文件级别的。

2)drbd文件系统级别,文件系统级别,基于block块同步,缺点:备节点数据不可用。

3)第三方软件的同步功能:mysql同步,oracle,mongodb。

4)程序双写,直接写两台服务器。

5)利用产品业务逻辑解决(读写分离,备读不到,读主)

6)NFS集群:1,4,5方案整合,双写主存储,备存储用inotify(sersync)+rsync,备没有找主解决延迟问题)