文件同步2
请大家思考如何使用scp命令去解决这个问题。
有两种思路:
第一种:三个文件一个一个去拷贝。缺点是操作麻烦,要逐一操作。
第二种:重新把A上的conf拷贝到B上。缺点是会重复拷贝文件1,2,3,4。
所以问题来了:有没有更好的方式呢? 有,就是我们要学习的rsync!
(四)rsync远程同步
rsync主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
rsync和scp区别是:rsync只对差异文件做更新,而scp是把所有文件都复制过去,所以它的效果更高一些。
rsync -av $pdir/$fname $user@$host:$pdir/$fname
语法说明:
(1)-a:归档拷贝,尽可能让拷贝的文件之间保持一致。
(2)-v:显示拷贝过程。
(3)$pdir/$fname: 要拷贝的文件路径/名称
(4)$user@host:$pdir/$fname: 目的地用户@主机:目的地路径/名称
2. 案例实操
下面我们去操作一下。
第一步:在两台机器上准备文件。
在hadoop100的/opt/conf/ 新建1.txt, 2.txt, 3.txt, 4.txt
做一次同步。
[root@hadoop100 ]$c
它会在hadoop101上创建conf目录。
第二步:在hadoop100中,添加新文件,5.txt, 6.txt, 7.txt
第三步:使用命令把新添加的文件同步到hadoop101中。
命令如下:
[root@hadoop100 ]$ rsync -av /opt/conf/ root@hadoop101:/opt/conf/
(五)xsync脚本集群之间的同步
我们提出一个更加高级的需求: 现在有A,B,C,D,E五台机器,我们在A上新增加了文件,那如何去同步到B,C,D,E上相同的目录下呢?
2.步骤
(1)在/root/bin目录下创建xsync文件。在这个
(2)在该文件中编写如下代码。这个部分的代码不需要会写,能看懂,了解即可。
#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
thenecho Not Enough Arguement!exit;
fi
#2. 遍历集群所有机器
for host in hadoop100 hadoop101 hadoop102
doecho ==================== $host ====================#3. 遍历所有目录,挨个发送for file in $@do#4. 判断文件是否存在if [ -e $file ]then#5. 获取父目录pdir=$(cd -P $(dirname $file); pwd)#6. 获取当前文件的名称fname=$(basename $file)ssh $host "mkdir -p $pdir"rsync -av $pdir/$fname $host:$pdirelseecho $file does not exists!fidone
done
(3)修改执行权限。此时,我们去查看文件,可以看到它的颜色是灰色的,不具备执行权限(如下左图)。
接下来要通过命令: chmod +x xsync(或者是chmod 777 xsync)
重新查看它的颜色,它现在已经变成执行的脚本了(如上右图)。
(4)测试使用。把这个脚本同步到其他的机器中。
[root@hadoop100 ~]$ xsync /root/bin/
(六)集群同步实操
有了上面封装的xsync这个工具之后,我们就可以很方便地把hadoop100上的环境变量配置和安装的两个软件都同步到hadoop101和hadoop102上去。
对应的命令是:
xsync /etc/profile.d/my_env.shxsync /etc/module