海量文件同步方案: rsync的多进程实现

目录

  • 安装服务端rsync模块
    • 执行一键命令
    • 模块配置文件
    • 授权用户配置文件
  • 客户端
    • 配置密码文件
    • 排除文件
    • 新建一个sh文件

主要是通过rsync配置好服务端的模式来实现
ssh实现参考https://blog.csdn.net/longxuu/article/details/106309580

安装服务端rsync模块

执行一键命令

yum install -y rsync #centos,其余自行搜索资料

模块配置文件

vim /etc/rsyncd.conf
# Minimal configuration file for rsync daemon
; ; ; ; ; ; ; ; ; ; ; ; ; ; # See rsync(1) and rsyncd.conf(5) man pages for help
; ; ; ; ; ; ; ; ; ; ; ; ; ; # This line is required by the /etc/init.d/rsyncd script
; ; ; ; ; ; ; ; ; ; ; ; ; ; # GLOBAL OPTIONS
uid              = root
gid              = root
use chroot       = no
read only        = no
write only       = no
max connections  = 5
pid file         = /var/run/rsyncd.pid
secrets file     = /etc/rsyncd/rsyncd.secrets
motd file        = /etc/rsyncd/rsyncd.motd
# This will give you a separate log file
log file         = /var/log/rsyncd.log
# This will log every file transferred - up to 85,000+ per user, per sync
transfer logging = yes
log format       = %t %a %m %f %b
syslog facility  = local3
timeout          = 300

[sync] #模块名称
uid             = nginx #用户组
gid             = nginx #用户
port            = 873 #端口
motd file       = /etc/rsyncd/rsyncd.motd
syslog facility = local3
log file        = /var/log/rsyncd.log
path            = /path/ #路径
read only       = false #是否只读
write only      = false #是否只写
use chroot      = false #是否启用 chroot
auth users      = username #授权用户,注意修改
secrets file    = /etc/rsyncd/rsyncd.secrets
hosts allow     = xxx.xxx.xxx.xxx #允许连接该模块的客户端,不需要可以删除这行
list            = true #是否在模块列表中显示模块
max connections = 0 #最大并发连接数 0没有限制
:wq

授权用户配置文件

vi /etc/rsyncd/rsyncd.secrets

添加一行

用户名:密码
:wq

重启服务

service rsync restart

开机自动启动服务

chkconfig rsync on

客户端

客户端安装和服务端一样的

配置密码文件

vi /etc/rsyncd.secrets

把在服务端设置的授权用户的密码输入保存

排除文件

如果需要排除目录或文件,需要执行这一步,最好设置一个,防止隐藏文件传输过去

vi /etc/lsyncd.exclude

一行一条

aaaa
bbb/
aaa.jpg
bbbb/aaaa.jpg

新建一个sh文件

vi /root/rsync.sh
#!/bin/sh
PATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/root/bin"

dir='/local/path/' #需同步的路径
ip='xxx.xxx.xxx.xxx' #远程服务器IP
port='873' 			#远程服务器rsync端口
user='username'		#远程服务器rsync用户名
des='sync'			#远程服务器rsync模块名
opt='-rq -p -t -L --password-file=/etc/rsyncd.secrets'	#rsync 选项
exclude='--exclude-from=/etc/lsyncd.exclude' #如果上一步没有建立, 将单引号里面的删除

num=20
depth='4 3 2 1' #归递目录深度

# 从深到浅同步目录
for l in $depth ;do
	todo=`find -L $dir -maxdepth $l -mindepth $l -type d` # -L 读取软链接
 	# 启动rsync进程
 	for i in $todo; do
  		now_num=`ps axw | grep rsync | grep $ip | grep -v '\-\-server' | wc -l`
 		echo "${i/$dir/}::$now_num"
        while [ $now_num -ge $num ];do
        	echo 'wait 1s'
        	sleep 1
            now_num=`ps axw | grep rsync | grep $ip | grep -v '\-\-server' | wc -l`
        done
		/usr/bin/rsync $opt $exclude $i/ rsync://$user@$ip:$port/$des/${i/$dir/}/ &
	done
done

# 最后再校验一遍
while true; do
	sleep 5
	now_num=`ps axw | grep rsync | grep $ip | grep -v '\-\-server' | wc -l`
	if [ $now_num -lt 1 ]; then
		/usr/bin/rsync $opt $exclude $dir rsync://$user@$ip:$port/$des
		break
 	fi
done
#保存
:wq
#执行权限
chmod +x /root/rsync.sh
#后台运行
nohup /root/rsync.sh & 

你可能感兴趣的:(运维,运维,rsync,多进程,文件同步)