1.环境准备
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
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
脚本
在/usr/local/bin 目录下创建 xsync 文件
#!/bin/sh
# 获取输入参数个数,如果没有参数,直接退出
pcount=$#
if((pcount==0)); then
echo no args...;
exit;
fi
# 获取文件名称
p1=$1
fname=`basename $p1`
echo fname=$fname
# 获取上级目录到绝对路径
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir
# 获取当前用户名称
user=`whoami`
# 循环
for((host=2; host<=10; host++)); do
echo $pdir/$fname $user@slave$host:$pdir
echo ==================slave$host==================
rsync -rvl $pdir/$fname $user@slave$host:$pdir
done
#Note:这里的slave对应自己主机名,需要做相应修改。另外,for循环中的host的边界值
参考文章: xsync同步脚本的创建及使用(以Debian10集群为例)-CSDN博客