我们通常在服务器与服务器之间,拷贝数据都是使用scp:
scp -r $pdir/$fname $user@hadoop$host:$pdir/$fname
命令 递归 要拷贝的文件路径/文件名称 目的用户@主机:目的路径/名称
在拷贝完成之后还需要修改文件对应的所有者和所有者组
sudo chown xxx:xxx -R /opt/module
那如果我们要拷贝的目标服务器很多的话,类似上面的操作就会显得非常繁琐,而且每次拷贝都是全量的文件更新,如果我们只需要对不同的地方做更新呢?所以,由此我们可以使用一个工具Rsync。
1.了解
1.什么是Rsync?
全称叫做remote sync(远程同步),rsync是一款开源、快速、多功能的可实现增量的本地或远程的数据镜像同步备份工具。适用于多个平台。 可使本地主机不同分区或目录之间及本地和远程两台主机之间的数据快速同步镜像,远程备份等功能。默认情况下,rsync通过独特的“quick check”算法,仅同步大小或者最后修改时间发生变化的文件或目录(也可根据权限,属主等变化同步,需要制定参数)。甚至是只同步一个文件里变化的内容部分,所以可以实现快速的同步数据的功能。
2.对此scp等拷贝方式的主要区别?
传统的cp,scp工具拷贝每次均为完整拷贝,就是把完整的文件都复制过去。而rsync除了完整拷贝,还具备增量拷贝的功能,因此从此性能和效率上更胜一筹。
3.xsync
xsync是一个同步脚本,它是对rsync脚本的二次封装。通过执行命令,可以实现将文件或目录从一个机器复制到多台集群上,避免了逐台机器复制的麻烦。
2.环境准备
1.准备三台服务器(我这里使用虚拟机,操作系统 CentOS7 )它们的IP分别为 192.168.188.135、192.168.188.136、192.168.188.137
2.先将三台机器的主机名修改,为每台主机设置hostname(具体名称由自己定义),分别在不同的机器下执行:
# 修改192.168.188.135 node1-zookeeper
[root@node1-zookeep etc]# vi hostname
# 查看
[root@node1-zookeep etc]# cat hostname
node1-zookeeper
# 修改 192.168.188.136 node2-zookeeper
[root@node2-zookeep etc]# vi hostname
# 查看
[root@node2-zookeep etc]# cat hostname
node2-zookeeper
# 修改 192.168.188.137 node3-zookeeper
[root@node3-zookeep etc]# vi hostname
# 查看
[root@node3-zookeep etc]# cat hostname
node3-zookeeper
3.改完之后将每台服务器的对应信息添加到hosts文件中
vim /etc/hosts
# 添加以下内容到文件中
192.168.188.135 node1-zookeeper
192.168.188.136 node2-zookeeper
192.168.188.137 node3-zookeeper
4.添加hosts文件后,使用ping命令测试能否接通:
相互测试每台机器是否互通,比如节点1 ping 节点2,节点1ping节点3,节点2ping节点3,这里就以节点1ping节点2为示例:
# 使用node1-zookeeper节点 ping node2-zookeeper节点
[root@node1-zookeep ~]# ping node2-zookeeper
PING node2-zookeeper (192.168.188.136) 56(84) bytes of data.
64 bytes from node2-zookeeper (192.168.188.136): icmp_seq=1 ttl=64 time=0.497 ms
64 bytes from node2-zookeeper (192.168.188.136): icmp_seq=2 ttl=64 time=1.61 ms
64 bytes from node2-zookeeper (192.168.188.136): icmp_seq=3 ttl=64 time=1.7
...
注意,以上操作三台服务器节点都要操作。
3.安装Rsync
1.由于xsync是对rsync的再次封装所以需要先安装rsync,根据使用的操作系统不同,使用对应命令即可,我使用的是CentOS7,所以直接使用yum命令安装即可:
# 下载rsync脚本
[root@node1-zookeep /]# yum install -y rsync
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
...
4.脚本的编写及使用:
1.在 /usr/local/bin 下创建xsync文件。
# 创建xsync文件
[root@node1-zookeep usr]# vim /usr/local/bin/xsync
2.在创建好的xsync文件中编写脚本,这里只是做简单示例,可根据自己实际情况进行调整:
#!/bin/bash
# 判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
# 2.遍历集群所有节点
for host in node1-zookeeper node2-zookeeper node3-zookeeper
do
echo ==================== $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:$pdir
else
echo $file does not exists!
fi
done
done
完成之后,保存并退出。
3.修改xsync脚本具有执行权限:
# 原文件
-rw-r--r--. 1 root root 732 9月 20 15:10 xsync
# 修改执行权限(两种方式都可以)
[root@node1-zookeep bin]# chmod +x xsync
# 或
[root@node1-zookeep bin]# chmod 777 xsync
# 查看被修改后的文件
[root@node1-zookeep bin]# ll
总用量 4
-rwxr-xr-x. 1 root root 732 9月 20 15:10 xsync
4.使用命令:xsync 要同步的文件
[root@node1-zookeep /]$ xsync /Test01
至此,配置结束,就可以正常使用了,但是每次同步都需要输入密码,所以还需要使用ssh配置集群间免密登录。
5.免密登陆
1.免密登录的基本原理:
2.生成RSA秘钥对
使用 ssh-keygen -t rsa 命令,在生成命令时,会要求你输入密码短语、确认密码短语等信息,可根据自己需要的情况来填写,不填写也可以(但是建议通过ssh-keygen建立SSH keys,不要指定密码),如果不填写直接按回车键即可,然后就会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)
# 生成秘钥对
[root@node1-zookeep .ssh]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:dVT9smAppX...此处省略...WjYf/VHY root@node1-zookeep
The key's randomart image is:
+---[RSA 2048]----+
| . . o .... |
| . o . o ... .|
| . o .o .=.. .|
| . . o+.= . .|
| . . +S .+o.Eo |
| . =.. o .. |
| o o+o . |
| .oX=o+.. |
| .=O. .. |
+----[SHA256]-----+
3.由上能看到,生成的秘钥被保存在/root/.ssh目录下,
查看生成的文件:
[root@node1-zookeep .ssh]# ll
总用量 12
-rw-------. 1 root root 1679 9月 20 15:49 id_rsa
-rw-r--r--. 1 root root 400 9月 20 15:49 id_rsa.pub
4.使用ssh-copy-id命令,将公钥拷贝到要免密登录的目标机器上:
# 将公钥拷贝到node2-zookeeper
[root@node1-zookeep .ssh]# ssh-copy-id -i ~/.ssh/id_rsa.pub node2-zookeeper
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@node2-zookeeper's password:
# 如果有提示就输入自己的密码
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'node2-zookeeper'"
and check to make sure that only the key(s) you wanted were added.
# 将公钥拷贝到node3-zookeeper
[root@node1-zookeep .ssh]# ssh-copy-id -i ~/.ssh/id_rsa.pub node3-zookeeper
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@node3-zookeeper's password:
# 如果有提示就输入自己的密码
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'node3-zookeeper'"
and check to make sure that only the key(s) you wanted were added.
或者使用下面这种方式也可以,ssh-copy-id会将本机的公钥发送到要访问计算机——存储在hadoop102的 ~/.ssh/authorized_keys中:
# 或者使用下面这种方式拷贝公钥也可以
[root@node1-zookeep .ssh]# ssh-copy-id node1-zookeeper
[root@node1-zookeep .ssh]# ssh-copy-id node2-zookeeper
[root@node1-zookeep .ssh]# ssh-copy-id node3-zookeeper
上述步骤只是将节点一的文件能够同步到节点2 和节点3 ,如果需要他们之间相互能够同步,需要在 192.168.188.136(节点二) 与 192.168.188.137(节点三) 的服务器上重复上述步骤。
6.ssh文件夹详解
文件名 | 功能 |
known_hosts | 记录ssh访问过计算机的公钥(public key) |
id_rsa | 生成的私钥 |
id_rsa.pub | 生成的公钥 |
authorized_keys | 存放授权过得无密登录服务器公钥 |
ssh会把每个访问过计算机的公钥(public key)都记录在~/.ssh/known_hosts。
- 作用:当下次访问相同计算机时,OpenSSH会核对公钥;
- 如果公钥不同,OpenSSH会发出警告,避免你受到DNS Hijack之类的攻击。
如何通过在不危害安全的情况下通过防火墙使用rsync?
这通常有两种情况,一种是服务器在防火墙内,一种是服务器在防火墙外。无论哪种情况,通常还是使用ssh,这时最好新建一个备份用户,并且配置 sshd仅允许这个用户通过RSA认证方式进入。如果服务器在防火墙内,则最好限定客户端的IP地址,拒绝其它所有连接。如果客户机在防火墙内,则可以简单允许防火墙打开TCP端口22的ssh外发连接就ok了