使用sersync实现数据实时同步

sersync诞生过程

sersync作者:前金山公司周洋(花椒直播)
数据实时同步 (inotify+rsync 脚本) —> 开发实时同步程序(inotify+rsync)

原理:https://www.bilibili.com/video/BV1TK411B7hU

代码仓库:https://github.com/omaidb/sersync3
https://code.google.com/archive/p/sersync/source/default/source

项目地址:https://github.com/omaidb/sersync3
https://github.com/wsgzao/sersync

项目下载地址:https://code.google.com/archive/p/sersync/downloads

参考:
https://blog.csdn.net/m0_46095955/article/details/104032057
https://linux.cn/article-6032-1.html

  1. sersync是使用c++编写,而且对Linux系统文件系统产生的临时文件和重复的文件操作进行过滤(详细见附录,这个过滤脚本程序没有实现),所以在结合rsync同步的时候,节省了运行时耗和网络资源。因此更快。
  2. sersync配置起来很简单,其中已经静态编译好2进制文件和xml配置文件,直接使用即可。
  3. sersync使用多线程进行同步,尤其在同步较大文件时,能够保证多个服务器实时保持同步状态。
  4. sersync有出错处理机制,通过失败队列对出错的文件重新同步,如果仍旧失败,则按设定时长对同步失败的文件重新同步。
  5. sersync不仅可以实时同步,另外还自带crontab功能,只需在xml配置文件中开启,即可按需求隔一段时间整体同步一次。无需再额外配置crontab功能。
  6. sersyncsockethttp插件扩展,满足二次开发的需要。

部署前提

  • 已安装inotify-tools
  • rsync为守护进程模式或已配置ssh免密
# 安装inotify-tools
yum install -y inotify-tools

# 安装rsync
yum install -y rsync

配置rsync服务端

https://blog.csdn.net/omaidb/article/details/121746997


部署sersync

一般情况下部署在rsyncclient端

  1. 下载软件二进制包

https://github.com/omaidb/qiaofei_notes/tree/main/shell_code/sersync

https://github.com/wsgzao/sersync
sersync2.5.4是软件的最后版本。

# 下载sersync二进制包
wget -c https://raw.githubusercontent.com/wsgzao/sersync/master/sersync2.5.4_64bit_binary_stable_final.tar.gz
  1. 解压软件, 并保存到相应目录中
# 创建目录
mkdir -p /usr/local/sersync

# 解压文件
tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz

# 查看解压的目录结构
tree GNU-Linux-x86

image.png

# 将sersync2修改为sersync
mv GNU-Linux-x86/sersync2 GNU-Linux-x86/sersync

# 将目录下文件移动到/usr/local/sersync/
mv GNU-Linux-x86/* /usr/local/sersync/

配置sersync的path变量

vim /etc/profile.d/sersync.sh

# 指定sersync程序的路径
export PATH="$PATH:/usr/local/sersync"

使path变量生效
source /etc/profile.d/sersync.sh


修改sersync配置文件

vim /usr/local/sersync/confxml.xml

带有详细注释配置文件
https://github.com/omaidb/qiaofei_notes/tree/main/config_bak/sersync
2个配置文件

  • rsyncd守护进程模式配置:rsyncd_confxml.xml
  • ssh免密模式配置:ssh_key_confxml.xml

sersync常用参数

image.png

# 查看 sersync 参数
sersync -h
参数解释
-d启用守护进程模式
-r在监控前,将监控目录与远程主机用rsync命令推送一遍
-n指定开启守护线程的数量,默认为10个
-o指定配置文件,默认使用confxml.xml文件
-m refreshCDN启用刷新CDN模块-插件
-m socket启用socket模块-插件
-m http启用http模块-插件
不加-m参数则默认执行同步程序
# 后台启动sersync同步服务程序
## -d 启用守护进程模式
## -r 在监控前,将监控目录与远程主机用rsync命令推送一遍
## -o 指定配置文件
sersync -dro /usr/local/sersync/confxml.xml

使用服务文件实现开机自启动

vim /etc/systemd/system/sersync.service

# /etc/systemd/system/sersync.service
[Unit]
Description= sersync数据实时同步服务
# 当指定的配置文件存在时,服务才会启动
ConditionPathExists=/usr/local/sersync/confxml.xml

[Service]
# 启动命令,不要加-d
ExecStart=/usr/local/sersync/sersync -ro /usr/local/sersync/confxml.xml
# 服务停止时的命令
## 命令要以绝对路径执行
ExecStop=/usr/bin/killall sersync

[Install]
WantedBy=multi-user.target

保存后,重载服务

# 重载服务
systemctl daemon-reload

# 设置开机自启动
systemctl enable --now sersync.service

实时同步服务debug

修改配置文件参数,进行调试
vim /usr/local/sersync/confxml.xml

<!-- 开启debug模式 -->
<debug start="true"/>

修改完debug模式重启服务

# 重启服务
systemctl restart sersync

# journalctl实时查看日志
journalctl -u sersync -f

使用前台运行查看详细日志

# 停止服务
systemctl stop sersync

# 不加-d以前台模式打印日志输出
sersync -ro /usr/local/sersync/confxml.xml

rsync+inotify[实时备份脚本]

https://www.cnblogs.com/drgcaosheng/p/12186740.html

#!/bin/bash
# Filename: backrsync.sh
# 作者:cs
# 更新时间:2020-1-13

# 使用方式及其相关备注:
# 本脚本采用rsync+ssh-keygen(免密)+inotify[监控文件系统操作] 进行时时备份数据至其它的服务器上面

# ssh-keygen 使用步骤
# 在需要备份数据的服务器上面运行
# ssh-keygen
# 然后一路回车
# 通过ssh-copy-id 将公钥复制到远程机器中
# ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.1.221
# 输入一下192.168.1.221的密码即可

# Inotify 使用步骤
# 使用前需要确保 Linux的内核高于2.6.13版本[目前使用的都是Centos 6.9/10及其7.*以上的版本,看都高于此版本]
# uname -r  【查看内核版本】
# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
# yum -y install inotify-tools
# rpm -qa inotify-tools

#printlog 函数说明
#两个参数,一,是否打印日志,二,日志内容
#一参数可选,0表示不打印日志内容出来,1表示打印日志内容出来
LOGFILE_PATH="/var/log/zdrsynclog"
NOWTIME=`date "+%Y-%m-%d %H:%M:%S"`
function printlog()
{
    LOG_CONTENT="$NOWTIME $2"
    #echo $LOG_CONTENT
    if [ $1 -ne 0 ]; then
        echo $LOG_CONTENT
        echo $LOG_CONTENT>>$LOGFILE_PATH
    else
        echo $LOG_CONTENT>>$LOGFILE_PATH
    fi  
}

#检查上一条命令执行是否正常,不正常退出
check_error_exit()
{
    #echo $?"+++++++++++"
    RUSELT=$?
    if [ ${RUSELT} -ne 0 ]; then
        printlog 1 "#[ERROR] >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
        printlog 1 "#[ERROR] 恭喜,光荣而伟大的报错了 : "$1
        printlog 1 "#[ERROR] <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
        exit 1
    fi  
}

#输出颜色字体
function echo_colour()
{
    if [ $1 -eq 0 ]; then
        echo -e "\033[41;37m ${2} \033[0m"
        return 0
    fi

    if [ $1 -eq 1 ]; then
        echo -e "\033[43;37m ${2} \033[0m"
        return 0
    fi

    if [ $1 -eq 2 ]; then
        echo -e "\033[47;30m ${2} \033[0m"
        return 0
    fi
}


#打印结束符
print_end()
{
    printlog 1 "<<<<<<<<<<<<<<<<<<<<<<END<<<<<<<<<<<<<<<<<<<<<<<<<<"
}

####################################################################
#脚本即将开始运行
####################################################################
printlog 1 "<<<<<<<<<<<<<<<<<<<<<<Start<<<<<<<<<<<<<<<<<<<<<<<<<<"


#定义目的服务器及其需要备份的文件夹、备份的目的路径
Backup_Server=192.168.1.221
Path=/root/aa_inotify
Backup_Server_Path=/test_inotify

#以下语句带有--delete
rsync -Rraz --delete -e ssh $Path root@${backup_Server}:${Backup_Server_Path}
/usr/bin/inotifywait -mrq --format '%w%f' -e create,close_write,delete $Path | while read line
do
    rsync -Rraz --delete -e ssh ${line} root@${Backup_Server}:${Backup_Server_Path}
done

# 以下为旧版本的备份
#主要是下面的这句了,检查一下有没有rsync进程,如果有就直接提示有在运行,写到日志中,然后再等下一步循环了
#ps -ef|grep 'rsync'|grep -v 'grep'|grep -v 'backrsync'
#if [ $? -ne 0 ]
#then
#    printlog 1 "start process..."
#    printlog 0 "$NOWTIME: crontab start"
#    /usr/bin/rsync -rav /home/mailbox /mailbackup/
#    printlog 0 "Success Rsync"
#else
#    printlog 1 "runing...."
#    printlog 0 "$NOWTIME: running... start"
#fi

print_end
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

识途老码

赞赏是第一生产力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值