虚拟机之间的通信
- ssh认证
- 免密登录
- 通过主机名实现ssh连接
- 更加简单的同步 rsync 与其二次封装的 xsync
学习大数据,配置集群时,需要先让虚拟机之间能够自由通信。
看这篇文章前,必须确保各虚拟机的IP在同一网段。参考 Linux虚拟机安装及静态IP配置
下图是我自己安装了4台 centos8 虚拟机,并配置了静态IP:192,168.1.31
、192,168.1.32
、192,168.1.33
、192,168.1.34
。它们对应的主机名分别是flink01、flink02、flink03、flink04.
后边讲解下我是如何让这4台虚拟机免密连接的。不过文章截图都是我配置好后的截图,与配置过程可能有差异。
ssh认证
SSH 是较可靠,专为 远程登录 会话和其他网络服务提供安全性的协议。
1、修改配置文件 /etc/ssh/sshd_config
RSAAuthentication yes # 启用 RSA 认证
PubkeyAuthentication yes # 启用公钥私钥配对认证方式
AuthorizedKeysFile .ssh/authorized_keys # 公钥文件路径
2、测试 192,168.1.31
、192,168.1.32
是否能够通信:[root@flink01 ~]# ssh 192,168.1.32
。没配置免密登录前,是需要输入密码。
3、分别在各台虚拟机上生成密钥对:例如 flink01虚拟机,[root@flink01 ~]# ssh-keygen -t rsa
。此时 ~/
下会生成一个 .ssh
文件夹(开始时没有,如果有可能是其他ssh自动生成的),该文件夹内有2个文件id_rsa
、id_rsa.pub
,其中 id_rsa.pub
里边放着本机的公钥。
4、从上图中可以看到还有两个文件,其中 authorized_keys
是我自己创建的,写入所有虚拟机的公钥。则该电脑则可以免密登录所有虚拟机了。现在可以再次试一下[root@flink01 ~]# ssh 192,168.1.32
。
第一次应该不能识别
192,168.1.32
,让输入密码。输入密码成功后系统背后会自动生成~/.ssh/known_hosts
(有则不生成) ,并将192,168.1.32
的认证数据写入到该文件。然后下次[root@flink01 ~]# ssh 192,168.1.32
就不会能识别不用输入密码了。
我感觉将内容全部复制,粘贴到一个文件就挺方便的。不过这里还是介绍下
scp
、cat
两个命令,可以更优雅的实现上边的配置。
scp 可传输文件或整个文件夹到另一台设备上。这里是传输的是一个文件,如果另一台设备上有该文件则被替换
[root@flink01 ~]# scp ~/.ssh/authorized_keys [email protected]:~/
cat 一般用于读取某个文件的内容。这里是将第一个文件内容追加到第二个文件内,如果第二个文件没有,则会创建然后追加(相当于复制)
[root@flink02 ~]# cat ~/authorized_keys >> ~/.ssh/authorized_keys
[root@flink02 ~]# cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
[root@flink02 ~]# cat ~/.ssh/authorized_keys
删除 192.168.1.32:~/authorized_keys
[root@flink02 ~]# rm -rf ~/authorized_keys
5、上边提到 ~/.ssh/known_hosts
是在 ssh 访问其他虚拟机时,免密认证前的识别,通过密码登录另一台电脑时,将会自动写入另一台电脑的相关信息。
[root@flink01 ~]# ssh 192,168.1.31
// 自己
[root@flink01 ~]# ssh 192,168.1.32
// 输入密码
[root@flink01 ~]# ssh 192,168.1.33
// 输入密码
[root@flink01 ~]# ssh 192,168.1.34
当然也可以手动更改配置的,我的如下:
各虚拟机的
~/.ssh/known_hosts
也保持一致。可以粗暴的复制粘贴,也可以使用scp
、cat
命令
6、上图中我还将各虚拟机的主机名追加在了对应位置:flink01,192.168.1.31 ecaddsa-sha2...
是希望虚拟机之间可以通过虚拟机的主机名就能访问。
7、配置 [root@flink01 ~]# vim /etc/hosts
8、可以试下:[root@flink01 ~]# ssh flink02
。可以发现现在不需要记住各虚拟机的IP,就能通信了。后边配置集群,设置host时,也可以直接使用主机名了。
9、如果是普通用户,步骤同上,不过要设置文件读取权限。
chmod 600 ~/.ssh/authorized_keys
是不是很开心的解决了 CentOS8虚拟机之间的通信 呢?欢迎大家评论。如果觉得好,就来个赞吧。
更加简单的同步 rsync 与其二次封装的 xsync
相对spc,用rsync做文件的复制的速度更快。rsync只对有差异文件做更新,而scp是把所有文件都复制过去。
安装:
[root@flink01 ~]# yum install -y rsync
二次封装rsync的 xsync
- 查看全局环境变量的所有路径,在其中一个路径下创建脚本文件
[root@flink01 ~]# echo $PATH
/opt/jdk1.8.0_291/bin:/opt/hadoop-3.3.1/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@flink01 ~]# vim /root/bin/xsync
- 编辑
/root/bin/xsync
,输入如下内容
#1. 判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 遍历集群所有机器
for host in flink01 flink02 flink03
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
- 放开
/root/bin/xsync
权限:
[root@flink01 bin]# chmod +x xsync
- 在任意路径下使用 xsync,看是否能将文件同步到其他主机。例如同步
/root/bin/xsync
,让其他主机也有同步功能:
[root@flink01 bin]# xsync ~/bin/xsync
==================== flink01 ====================
sending incremental file list
sent 44 bytes received 12 bytes 112.00 bytes/sec
total size is 733 speedup is 13.09
==================== flink02 ====================
sending incremental file list
xsync
sent 824 bytes received 35 bytes 572.67 bytes/sec
total size is 733 speedup is 0.85
==================== flink03 ====================
sending incremental file list
xsync
sent 824 bytes received 35 bytes 1,718.00 bytes/sec
total size is 733 speedup is 0.85
- 连接
flink02
,发现flink02
中已经有该文件了。同样放开该文件权限即可使用了 _。
[root@flink02 bin]# chmod +x xsync