首先说明,我模拟hadoop集群,创建了三个节点,分别为master,slave1,slave2,他们在本文配置基本一样,请各位举一反三。
还有,在做这步之前请在各节点中都安装好jdk(版本越高越好,当然,与你的hadoop版本协调)与openssh:
Linux CentOS 6.5 下载 oracle jdk修改环境变量
接下来我们依然做点准备工作(所有准备工作在root用户下完成)
1.创建新用户名及密码,但先不登录(为了节点安全考虑)
指令:
useradd xqz --(xqz是我的用户名) passwd xqz --(更改xqz用户的密码,输入两次即可)
创建完成后先不急着登录,这里还有一点,每个节点用户名必须一致!
1.给本机起名,便于访问,就是不要使用我们的ip了
指令:
vim /etc/hostname
以slave2节点举例,在编辑时先按i进入inster模式,编辑完成后按esc,输入:wq保存退出
2.查看本机ip
指令:
ifconfig -a --信息过多的话shift+[PgUp/PgDown]进行翻页
记录一下ip
3.配置hosts文件,也就是主机名与ip的映射
以我为例,三个节点都要配置,因为可能使用ssh访问自身节点(这个截图是master节点,slave1,slave2都一样)
到这里为止,准备工作结束
现在开始生成ssh,每个虚拟机登陆下刚才创建的用户(以下虽然我以master节点在截图,当请各位举一反三)
指令:
ssh-keygen -t rsa
其中-t配置秘钥类型,我们用rsa
中间会询问你一些文件位置,描述等,我们都回车跳过,这样ssh秘钥生成完毕,他放在.ssh隐藏文件夹下,我们去看看
指令:
cd .ssh ls
我们看到.ssh文件夹下有两个文件,id_rsa与id_rsa.pub,分别是私有与公有秘钥
我们要把公有秘钥复制到一个authorized_keys文件内,这个文件的作用就是完成无密码访问,具体原因我们稍后再讲
指令:
cp id_rsa.pub authorized_keys cat authorized_keys
(注意!这里的一步,只需要创建master的authorized_keys文件即可,其余节点我们从master发送过即可)
将master的authorized_keys文件传送给slave1和slave2
指令:
scp authorized_keys xqz@slave1:~/.ssh/
用户名@主机名:文件位置
这里需要输入slave1节点xqz用户的密码,并且,我第一遍失败是因为没有现在slave1的xqz用户中生成rsa,即没有.ssh文件夹
我们在slave1中查看一下发送过来的authorized_keys文件,发现文件末尾写着master,成功了(其实这一步就是为了让每个节点都拥有其余节点的id_rsa.pub,即公钥,你也可以用复制粘贴做)
指令:
cat id_rsa.pub >> authorized_keys
这里有个小知识cat指令中 >>代表追加,>代表覆盖,那么这里就是把slave1的id_rsa.pub追加到我们刚才发送过来的文件末尾
...(此处为省略号)
继续发送与追加,我们的最终目的就是让每个节点都拥有所有的公钥,这里我就不赘述了
测试免密码链接
指令:
ssh xqz@slave1
用户名@主机名
我们在master中链接slave1,注意看指令域已经变成了slave1,说明我们连接成功了,而且没有输入过密码
至此,我们大功告成!下面讲解下ssh免密码登录的具体机制
首先我们要清楚一件事,就是rsa密码,这是一种非对称密码,也就是说,它分为公钥与私钥,公钥面向全世界,私钥只能自己拥有(别人知道了就不安全了)。至于其具体的密码学或者说数学知识,最传统的密码学教科书都会有。公钥与私钥有一个特性,那就是公钥加密的文件只能私钥解密,基于这个特性,我们来建立一些安全措施,就是我们之前使用的ssh。
回想下我们刚才的配置工作,最重要的就是把所有的公钥卸载authorized_keys文件中,那么,当我们的节点访问其余节点时,他会遍历authorized_keys文件,使用其中的公钥加密一个即将约定的密码,这个加密后的密码只能由私钥进行解密,如果被访问节点允许访问,就会保留这个密码,并返回响应,接下来,两节点使用密码访问即可,不需要我们手动输入。
当然了,为了安全,手段不止这一种。我这里也是简略介绍,有兴趣请查阅文献资料深入学习。