Linux服务器同步是确保多台服务器数据一致、业务连续性的关键技术,广泛应用于负载均衡、高可用集群、灾备备份等场景,通过同步机制,可以将源服务器的文件、配置、数据库等数据实时或定期复制到目标服务器,避免因数据不一致导致的服务异常,本文将详细介绍Linux服务器同步的常用工具、应用场景、配置方法及注意事项。
Linux服务器同步的核心需求与工具选择
服务器同步的核心需求包括数据一致性、同步效率、实时性及安全性,根据不同场景,可选择以下工具:
- rsync:经典增量同步工具,通过文件差异对比实现高效传输,适用于文件级同步,支持全量与增量模式,常用于定期备份或非实时同步。
- inotify+rsync:结合inotify内核监控与rsync传输,实现文件系统事件的实时同步(如创建、修改、删除),适用于对实时性要求高的场景。
- unison:双向同步工具,支持多平台,能自动解决冲突,适用于双向数据同步(如多台服务器配置文件互相同步)。
- 数据库同步工具:如MySQL的主从复制(基于binlog)、PostgreSQL的流复制,或第三方工具pt-table-sync,专注于数据库数据的一致性同步。
- 配置管理工具:如Ansible、SaltStack,通过推送配置文件或脚本实现服务器配置同步,适用于集群环境下的统一管理。
常用同步工具详解与配置示例
rsync:增量同步的“瑞士军刀”
rsync通过“快速文件算法”对比源文件与目标文件的差异,仅传输变化部分,大幅提升同步效率,其核心参数包括:
-a
:归档模式,保留权限、时间戳等元数据;-v
:显示详细过程;-z
:传输过程中压缩;--delete
:删除目标服务器中源服务器不存在的文件(确保完全一致);--exclude
:排除特定文件或目录。
配置示例(单向同步):
源服务器(IP:192.168.1.10)同步目录/data/web
到目标服务器(IP:192.168.1.20)的/backup/web
,使用SSH免密认证:
# 源服务器生成SSH密钥并推送到目标服务器 ssh-keygen -t rsa ssh-copy-id user@192.168.1.20 # 执行同步(全量+增量) rsync -avz --delete /data/web/ user@192.168.1.20:/backup/web/
若需定期同步,可配合cron定时任务,例如每天凌晨2点同步:
0 2 * * * /usr/bin/rsync -avz --delete /data/web/ user@192.168.1.20:/backup/web/
inotify+rsync:实时同步的“黄金组合”
当服务器文件频繁变化时,rsync手动或定时同步无法满足实时性需求,此时可通过inotify监控文件系统事件,触发rsync同步。
配置步骤:
(1)安装inotify-tools(源服务器):
yum install inotify-tools -y # CentOS/RHEL apt install inotify-tools -y # Debian/Ubuntu
(2)编写监控脚本(如/usr/local/bin/inotify_rsync.sh
):
#!/bin/bash src="/data/web" # 源目录 dst="user@192.168.1.20:/backup/web" # 目标服务器路径 inotifywait -mrq -e create,delete,modify,move,attrib "$src" | while read events do rsync -avz --delete "$src/" "$dst" done
(3)启动脚本并设置开机自启:
chmod +x /usr/local/bin/inotify_rsync.sh nohup /usr/local/bin/inotify_rsync.sh & echo $! > /var/run/inotify_rsync.pid echo "nohup /usr/local/bin/inotify_rsync.sh &" >> /etc/rc.local
优化:若文件并发量高,可调整inotify内核参数(/etc/sysctl.conf
):
fs.inotify.max_queued_events = 16384 # 事件队列长度 fs.inotify.max_user_watches = 524288 # 最大监控文件数 fs.inotify.max_user_instances = 1024 # 最大监控实例数 sysctl -p # 生效
数据库同步:以MySQL主从复制为例
数据库同步需保证事务一致性,MySQL主从复制通过binlog日志实现数据同步,适用于读写分离、高可用架构。
配置步骤:
(1)主服务器(Master)配置:
- 修改
my.cnf
,开启binlog并配置server-id:[mysqld] server-id = 1 log-bin = mysql-bin binlog-format = ROW # 行模式,避免数据不一致
- 重启MySQL,创建同步用户并授权:
CREATE USER 'repl'@'192.168.1.30' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.30'; FLUSH PRIVILEGES;
- 导出数据并传从服务器(锁表避免数据变更):
FLUSH TABLES WITH READ LOCK; mysqldump -uroot -p --all-databases > master_data.sql UNLOCK TABLES; scp master_data.sql root@192.168.1.30:/tmp/
(2)从服务器(Slave)配置:
- 导入数据并配置
my.cnf
(server-id与主不同):[mysqld] server-id = 2
- 启动复制并指定主服务器信息:
mysql -uroot -p < master_data.sql CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.1.10', SOURCE_USER='repl', SOURCE_PASSWORD='password', SOURCE_LOG_FILE='mysql-bin.000001', SOURCE_LOG_POS=154; -- 通过SHOW MASTER STATUS获取 START REPLICA;
- 验证状态:
SHOW REPLICA STATUSG
,确保Slave_IO_Running
和Slave_SQL_Running
为YES。
服务器同步的注意事项
- 安全性:同步过程需加密传输(如SSH、SSL),避免数据泄露;限制同步用户权限,遵循最小权限原则。
- 性能优化:
- rsync可通过
--bwlimit
限制带宽(如--bwlimit=1000
限速1MB/s); - 大文件同步前可分卷压缩(tar+gzip),减少网络传输压力。
- rsync可通过
- 数据一致性校验:同步后使用
md5sum
或sha256sum
校验文件哈希值,或使用rsync的--checksum
参数(基于校验和而非文件大小/时间)。 - 错误处理:记录同步日志(如rsync的
--log-file
),监控同步状态,避免因网络中断或权限问题导致数据不一致。 - 网络环境:跨机房同步需考虑延迟与丢包,可使用专用网络或加速工具(如UDP加速)。
常用同步工具对比
工具名称 | 同步类型 | 实时性 | 适用场景 | 优点 | 缺点 |
---|---|---|---|---|---|
rsync | 增量/全量 | 半实时(手动/定时) | 文件备份、配置同步 | 高效、灵活、支持排除 | 非原生实时,需脚本触发 |
inotify+rsync | 增量/全量 | 实时 | 高并发文件同步(如日志、静态资源) | 低延迟、自动化 | 依赖内核参数,大文件监控压力大 |
unison | 双向 | 实时 | 双向数据同步(如多开发环境) | 自动解决冲突、跨平台 | 性能较低,学习成本略高 |
MySQL主从复制 | 数据库事务 | 实时 | 读写分离、高可用集群 | 数据强一致、自带故障转移 | 配置复杂,依赖binlog |
Ansible | 配置/文件 | 半实时(任务触发) | 集群配置管理 | 批量操作、无需Agent | 非实时同步,依赖SSH连接 |
相关问答FAQs
Q1:rsync同步时如何排除特定文件或目录?
A:rsync通过--exclude
参数排除文件或目录,支持通配符。
- 排除所有
.log
文件:rsync -avz --exclude="*.log" src/ dest/
- 排除
temp
目录及其内容:rsync -avz --exclude="temp/" src/ dest/
- 若需排除多个文件,可使用
--exclude-from
指定文件列表(每行一个规则):rsync -avz --exclude-from=exclude.txt src/ dest/
Q2:如何实现Linux服务器间的实时文件同步,且避免因网络波动导致同步失败?
A:可通过“inotify+rsync+重试机制”实现实时同步并增强容错性,具体步骤:
(1)配置inotify监控文件变化(如前文所述);
(2)在rsync命令中添加--partial
参数(保留部分传输的文件)和--progress
(显示进度);
(3)编写脚本监控rsync进程,若失败则自动重试。
#!/bin/bash src="/data/web" dst="user@192.168.1.20:/backup/web" max_retries=3 retry_interval=5 for ((i=1; i<=max_retries; i++)); do if rsync -avz --delete --partial --progress "$src/" "$dst"; then echo "Sync successful" exit 0 else echo "Sync failed, retry in $retry_interval seconds... (attempt $i/$max_retries)" sleep $retry_interval fi done echo "Max retries reached, sync failed"
可通过keepalived或监控工具(如Zabbix)检测同步状态,确保服务可用性。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/19958.html