Linux数据同步服务(包含案例解析)
数据同步服务基本介绍在CentOS Stream 9中数据同步服务Rsync是一个开源的多功能的用于在本地和远程系统之间高效同步和备份文件的工具通过只传输变化的数据来节省带宽和时间。同步方式: 定时同步 和 实时同步node1和node2安装数据同步服务dnf install rsync -y 注意 需要数据同步双方均安装rsync同时配置了SSH密钥否则需要输入密码rsync --versionRSYNC基本语法rsync [选项] 源路径... 目标路径常用选项-v详细模式输出显示传输过程中的文件信息。-a归档模式表示递归传输文件并保持所有文件属性。-z对备份的文件在传输时进行压缩处理。-P显示进度条。--delete删除目标目录中源目录中没有的文件可选用于实现双向同步-e用于指定用于传输文件的远程 shell 程序 默认为 ssh也可以选择其他如rsh或者自定义的ssh端口示例:本地同步 rsync -av /src/directory/ /dest/directory/ 远程同步 rsync -avz /src/directory/ root192.168.88.105:/dest/directory/ 拉取远程数据到本地 rsync -avz user192.168.88.105:/src/directory/ /dest/directory/ 注意:/src/directory/ 与/src/directory的不同 第一个是传输directory文件夹中的文件,不包括目录 第二个是包括directory目录以及目录里的所有文件【综合案例】实现定时与增量备份需求说明在centos stream 9的 /var/log目录下 存储了大量的关于系统的日志如messages文件存储大量的系统日志信息secure日志文件存储了大量的与系统安全的日志。请对此目录中的messages、secure日志文件进行定时的备份到node2节点的/export/data/node1_backup_system_log目录中 要求每日凌晨2点进行备份一次。数据同步 数据源: node1本地 /var/log/messages /var/log/secure 目的地远端 node2 root192.168.88.102:/export/data/node1_backup_system_log 确认目的地路径是否存在没有就创建 在node1远程执行命令 ssh root192.168.88.102 mkdir -p /export/data/node1_backup_system_log;tree /export 同步命令 rsync -avz /var/log/messages /var/log/secure root192.168.88.102:/export/data/node1_backup_system_log 定时操作 技术点 crontab 回顾 crontab 基本使用格式 格式 crontab [选项] 选项 -l 查看当前有哪些定时的任务 -e 打开定时任务编辑窗口 设置定时任务 如何编写定时任务 分 时 日 月 周 执行的命令(命令建议是绝对路径) 取值范围 分 0~59 时 0~23 日 1~31 月 1~12 周 0~7 其中0 和 7 表示周日 相关符号 * 任意 /: 每搁多少时间 - 一段连接的周期 ,: 表示某个时间内的多个值 如何获取命令的绝对路径 which 命令 编写定时任务要求每日凌晨2点进行备份一次 0 2 * * * /usr/bin/rsync -avz /var/log/messages /var/log/secure root192.168.88.102:/export/data/node1_backup_system_log执行定时操作在node1执行: crontab -e 输入 i 进入插入模式 填写以下内容 0 2 * * * /usr/bin/rsync -avz /var/log/messages /var/log/secure root192.168.88.105:/export/data/node1_backup_system_log 输入完成后 按下 ecs键 输入:x 保存退出【综合案例】结合INOTIFY实现实时同步需求说明目前在企业服务node1节点中/export/data/logs目录是公司各个系统日志存储目录公司希望能够实时监控备份这些日志数据到node2的/export/data/node1_exe_backup_log目录下请运维工程师来实现。解决思路解决思路rsync工具 仅是一个数据同步的工具 执行一次这个命令 就会触发一次数据同步操作 本身并不具备定时或者实时同步的能力如果要做定时或者实时 都需要借助一些其他的工具来完成例如如果要进行定时 就可以结合linux中提供的crontab那么对于实时同步最为核心的事情 能够实时感知到目录下文件的变化(创建、修改、删除、移动)这样只要能感知到 我们就可以让数据同步工具触发执行一次从而完成实时同步在Linux中 如果想要感知到linux目录或者文件的变化就得使用Linux提供的INOTIFY工具INOTIFY在 Shell 中可以使用inotify-tools工具包来监控文件系统事件。inotify-tools提供了两个主要的命令行工具inotifywait和inotifywatch其中inotifywait是最常用的工具用于实时监控文件或目录的变化。基本使用1- 安装INOTIFY【node1安装】dnf install inotify-tools2- 使用方式格式 inotifywait [选项] 文件或目录常用选项 -m持续监控默认只监控一次后退出。 -r递归监控目录及其子目录。 -e指定要监控的事件类型如 create、delete、modify 等。 -q静默模式减少输出信息。 --format自定义输出格式。 常用事件类型 create文件或目录被创建。 delete文件或目录被删除。 modify文件内容被修改。 attrib文件属性如权限被修改。 move文件或目录被移动。实例用法1. 监控目录中的文件创建和删除事件 inotifywait -m -e create,delete /path/to/dir 2. 递归监控目录及其子目录的文件修改事件 inotifywait -m -r -e modify /path/to/dir输出配置INOTIFY客户端实现实时同步(借助SSH)前提是双方ssh已经免密 具体操作请看上一篇文章编写INOTIFY监控脚本#! /bin/bash # # 定义源目录和目标目录目标目录是远程服务器的目录 user1_dir/root/ user2_dirroot192.168.88.105:/tmp/log/ cd /var/log/ touch rsync.log # 日志文件 log_file/var/log/rsync.log # 使用inotifywait监听${user1_dir}目录中的文件变化 inotifywait -m -r -e create,delete,modify,attrib,move $user1_dir | while read path action file do echo $(date %F),目录$path下的文件$file被$action $log_file echo $(date %F),目录$path下的文件$file被$action # 执行rsync同步操作 rsync -avz --delete -e ssh $user1_dir $user2_dir $log_file echo $(date %F),目录$path下的文件$file已完成同步 $log_file echo $(date %F),目录$path下的文件$file已完成同步 done解析inotifywait -m -r -e create,modify,delete,move这个命令用来监听源目录的创建、修改、删除和移动事件。-m参数表示持续监听-r表示递归地监听子目录。rsync -avz --delete -e ssh当监测到文件变化时使用rsync同步源目录到远程目标目录。-e ssh表示使用 SSH 连接远程服务器进行同步--delete参数保证如果源目录删除了文件目标目录也会同步删除这些文件。日志记录每次文件变化和同步都会记录到/var/log/rsync_realtime_sync.log中方便查看。3- 设置脚本可执行权限chmod x /root/real_time_sync.sh4- 测试是否可以实时同步启动后 开启一个新窗口 尝试向node1的/export/data/logs路径放入文件 观察node2 是否能够立即同步过来 测试成功后 可以采用 nohup ./real_time_sync.sh 挂载在后 台使用 jobs -l kill %1杀死脚本 此种方式有一个弊端 如果服务器重启后 需要手 动开启实时同步脚本此种方式有一个弊端 如果服务器重启后 需要手动开启实时同步脚本4.使用systemd创建服务系统服务vim /etc/systemd/system/rsync_inotify.service 内容如下 [Unit] DescriptionReal-time Rsync Sync with Inotify Afternetwork.target [Service] ExecStart/root/ceshi.sh Restartalways Userroot Grouproot [Install] WantedBymulti-user.target 保持退出后 systemctl daemon-reload systemctl start rsync_inotify systemctl enable rsync_inotify基于RSYNC服务的方式实现同步5.1 node2设置Rsync为守护进程设置Rsync为服务型指的是让Rsync已守护进程daemo的模式运行在后台持续运行等待来自客户端的连接和同步请求。设置操作步骤1- 配置rsync.confvim /etc/rsyncd.conf # 全局设置 uid rsync gid rsync use chroot no port 873 max connections 200 pid file /var/run/rsyncd.pid log file /var/log/rsyncd.log transfer logging yes ignore nonreadable yes [node1_logs] path /export/data/node1_exe_backup_log comment Backup Directory read only no secrets file /etc/rsyncd.passwd hosts allow 192.168.88.0/24 hosts deny * auth users backup_user# 此处采用的rsync,建议可以先创建这两个用户: useradd rsync useradd backup_user 并为其设置密码 均为123456各个参数详细说明# 各个参数详细说明 # 全局设置 uid rsync # 运行rsync守护进程的用户 gid rsync # 运行rsync守护进程的组 use chroot no # 是否使用chroot环境一般设置为no port 873 # 指定Rsync守护进程监听的端口号默认是873。 max connections 200 # 最大连接数 pid file /var/run/rsyncd.pid # 进程ID文件位置 log file /var/log/rsyncd.log # 日志文件位置 transfer logging yes # 启用传输日志记录记录每次文件传输的详细信息 ignore nonreadable yes # 忽略无法读取的文件不尝试同步它们 # 模块定义 [node1_logs] path /export/data/node1_exe_backup_log # 同步的目录 comment Backup Directory # 模块描述 read only no # 设置为false/no允许写操作 secrets file /etc/rsyncd.passwd # 密码文件位置 hosts allow 192.168.88.0/24 # 允许访问的IP地址段 hosts deny * # 拒绝所有其他主机的访问 auth users backup_user # 认证同步的用户必须是backup_user如果不配置可以是任意用户 请注意将uid和gid设置为root以及auth users设置为root可能带来安全风险因为这意味着任何通过认证的用户都将能够以root权限访问和修改文件。在生产环境中通常建议创建专门的用户和组来运行Rsync守护进程并限制对敏感文件的访问。 注意 全局配置的用户 是指的用于管理服务进程并且执行相关的同步操作 在模块中定义的用户 用户基于这个模块来干活的用户是谁如果不是这个用户,无法读取这个模块相关配置2- 创建密码文件在配置文件中指定的secrets file需要包含用户和密码格式为username:password。例如echo backup_user:123456 /etc/rsyncd.passwd # 设置密码文件的权限为600确保该文件只有 RSYNC 服务可以读取 chmod 600 /etc/rsyncd.passwd3- 启动rsync服务rsync --daemon测试是否可以正常访问 在node1执行 # 输出目录 rsync rsync://backup_user192.168.88.102/node1_logs 注意在node2需要开放端口 firewall-cmd --permanent --add-port873/tcp firewall-cmd --reload firewall-cmd --list-all在配置第四项内容的时候设置开机自启动,请现将rsync服务关闭才可以进行后续的操作-- 查看进程 ps -ef | grep rsync -- 查看进程ID -- 杀死进程 kill -9 rsync的进程ID4- 设置开机自启动说明 由于rsync并不是一个系统服务简单判断通过systemctl启动和关闭的服务故需要先设置为系统服务后才可以设置vim /etc/systemd/system/rsyncd.service [Unit] DescriptionRsync Daemon Afternetwork.target [Service] ExecStart/usr/bin/rsync --daemon --config/etc/rsyncd.conf --no-detach ExecReload/bin/kill -HUP $MAINPID Restartalways [Install] WantedBymulti-user.target5- 重新加载system配置并启用rsyncsystemctl daemon-reload systemctl enable rsyncd systemctl start rsyncd6- 验证服务状态systemctl status rsyncd5.2 如何基于RSYNC服务进行数据同步连接RSYNC服务的格式用户名主机地址::模块名称 或 rsync://用户名主机地址/模块名称 说明 模块名 指的是配置到rsync.conf 中 【】的内容 用户名 指的是模块中指定的用户名 如果没有指定 可以是主机存在的用户名即可前提是该用户需要有权限 例如 rsync -avz /export/data/logs/ rsync://backup_user192.168.88.105/node1_logs基于手动同步方式完成数据同步# 注意在执行手动数据同步之前 需要先在/export/data/logs/创建了日志文件 以保证在同步的时候有数据 echo 11111 /export/data/logs/a.log rsync -avz /export/data/logs/ backup_usernode2::node1_logs5.4 配置INOTIFY客户端实现实时同步(借助rsync)vi /root/real_time_sync.sh 添加以下内容是基于RSYNC服务的脚本文件 #!/bin/bash # 定义源目录和目标目录目标目录是远程服务器的目录 SOURCE_DIR/export/data/logs #TARGET_DIRroot192.168.88.102:/export/data/node1_exe_backup_log # 替换为目标服务器的用户名和目录 # 使用RSYNC服务进行数据同步 TARGET_DIRbackup_user192.168.88.102::node1_logs # 日志文件 LOG_FILE/var/log/rsync_realtime_sync.log # 使用inotifywait监听${WATCH_DIR}目录中的文件变化 inotifywait -m -r -e modify,create,delete,move ${SOURCE_DIR} | while read path action file; do echo Detected ${action} on ${file} in ${path}. Starting rsync... $LOG_FILE # 执行rsync同步操作 rsync -avz --port873 --delete --password-file/etc/rsync.password ${SOURCE_DIR}/ ${TARGET_DIR} $LOG_FILE 21 echo Sync completed for ${file} in ${path}. $LOG_FILE done