在搭建Linux集群服务的时候,主服务器需要启动从服务器的服务,如果通过手动启动,集群内服务器几台还好,要是像阿里1000台的云梯hadoop集群的话,轨迹启动一次集群就得几个工程师一两天时间,是不是很恐怖。如果使用免密登录,主服务器就能通过程序执行启动脚步,自动帮我们将从服务器的应用启动。而这一切就是建立在ssh服务的免密码登录之上的。所以要学习集群部署,就必须了解linux的免密码登录。
原理 使用一种被称为"公私钥"认证的方式来进行ssh登录. "公私钥"认证方式简单的解释是 首先在客户端上创建一对公私钥 (公钥文件:~/.ssh/id_rsa.pub; 私钥文件:~/.ssh/id_rsa) 然后把公钥放到服务器上(~/.ssh/authorized_keys), 自己保留好私钥 当ssh登录时,ssh程序会发送私钥去和服务器上的公钥做匹配.如果匹配成功就可以登录了
提示
配置环境:
(1)服务器IP、名称、网卡信息
3台 centos7.3 64位系统内容如下:
IP地址: 服务器名称 网卡名称 用户名 主目录
192.168.0.210 hadoop1 eth0 hadoop /home/hadoop
192.168.0.211 hadoop2 eth0 hadoop /home/hadoop
192.168.0.212 hadoop3 eth0 hadoop /home/hadoop
配置准备:
(1)添加用户
(2)配置网络
(一)修改服务器主机名称 hostname,
以root用户登录,需要修改3个地方,hostname 指令,如果只修改这一处,重启电脑后还是会变回来。/etc/hosts主机文件, 这个地方修改是给 DNS解析用的。单独修改也不行。只有三个地方同时修改才能算修改完成。修改完成后重启服务器。
【1】 hostname 指令中修改。
直接输入hostname查看主机名是不是hadoop,如果不是,输入“hostname hadoop” 再输入 “hostname” 进行验证
【2】使用 vim /etc/sysconfig/network 修改网络配置中主机名,将修改 HOSTNAME=hadoop
(二)配置IP映射
以root用户登录,依次修改每台服务器的主机信息,通过 vim /etc/hosts修改主机信息,加入主机别名
如果主机IP是192.168.0.210,本机主机名是hadoop1,那么 /etc/hosts 文件的内容应该包含一下内容:
如果主机IP是192.168.0.211,本机主机名是hadoop2,那么 /etc/hosts 文件的内容应该包含一下内容:
如果主机IP是192.168.0.212,本机主机名是hadoop3,那么 /etc/hosts 文件的内容应该包含一下内容:
这里是一个小坑特别说明一下
之前看到网上如下的配置(拿hadoop1举例)
127.0.0.1 hadoop1 localhost 192.168.0.210 hadoop1 192.168.0.211 hadoop2 192.168.0.212 hadoop3
这样会找出造成hadoop集群启动后,集群中只有一个活动的节点,网上查说是
:一个ip对应两个名字,Linux系统应该只采纳排序靠头的记录,当之后有同ip的记录时,估计会抛弃。最后造成一个回环,每 个节点获得namenode的信息都是localhost名字,而具体到各个机器,localhost 反向映射到自己,最后造成集群中一个死路回环。
(三)修改网卡名称 --(可选)
1. 以root用户登录各服务器。 2. 使用vi编辑器,修改“/etc/udev/rules.d/70-persistent-net.rules”文件 --- (如果服务器没有此文件就跳过)。如果是虚拟机,没有此文件,就不用修改 ,主要是修改NAME="eth0"
3. 使用vi编辑器,修改“/etc/sysconfig/network-scripts/ifcfg-eth0”文件。 主要是DEVICE=“eth0"
4. 执行reboot命令,重新启动服务器。 5. 执行ifconfig命令,查看网卡名称。
6. 参考“步骤1”至“步骤5”,将所有服务器的网卡名称设置为“eth0”。
配置免登录
(1)创建或者修改密钥目录权限 (此操作在所有服务器完成后再进入下一步)
(2)创建公钥和私钥(此操作在所有服务器完成后再进入下一步)
如果创建公钥和私钥后(黄色部分),提示的用户名hadoop@后面不是本机别名(上图红色部分),说明主机名称需要重新配置一次,然后记得重启,然后删除/.ssh目录下的公钥和私钥,重新生成,直到生成的密钥后缀是本机别名.
(3)拷贝公钥到服务器(要登录上去的那台服务器)
安装scp工具yum install -y openssh-clients
1. 执行以下命令(假设本机是192.168.0.210),并根据提示输入登录密码,配置免登录。
scp id_rsa.pub hadoop@hadoop2:/home/hadoop/.ssh/authorized_keys_from_hadoop1
scp id_rsa.pub hadoop@hadoop2:/home/hadoop/.ssh/authorized_keys_from_hadoop1
执行完成后,目标服务器的/home/hadoop/.ssh/目录下就应该有一个authorized_keys_from_hadoop1文件
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@hadoop2
(4)在被登录的服务器上生成公钥, 公钥合并
(5)验证
以下是正常情况:
(6) 目录文件权限修改方法
以root用户登录,依次进入服务器、客户端,执行以下权限修改命令。如果还是不行,请重复 配置免登录操作(需要删除公钥和私钥再做一次)。
修改权限后在登录,就应该能正常了。
常见错误 1、在使用 ssh-copy-id 错误提示 错误提示: ssh-copy-id:/usr/bin/ssh-copy-id: ERROR: No identities found 解决方法: 缺少公钥路径,加上IP即可 ssh-copy-id -i ~/.ssh/id_dsa.pub user@remote_ip 2、ssh ip 可以成功登录,ssh hostname 却失败 错误提示: ssh: connect to host localhost port 22: Connection refused 解决方法: 看下对方的主机名是不是在 /etc/hosts 文件中和 ip 做了映射,没有就加上即可。 3、ssh 的配置目录权限问题 错误提示: 登录的时候依旧让输入密码 由于 ssh 的权限直接关系到服务器的安全问题,因此 ssh 每次读取配置都会校验相关文件夹和文件的权限,以防止权限过大对外暴露。 解决方法: 服务端的.ssh目录权限要是700 authorized_keys权限600 4、ssh localhost:publickey 授权失败 解决办法: #vim /etc/ssh/sshd_config 开启这3行,重启服务即可 RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys 5、ssh localhost:需要密码 解决方法: cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys 6、Selinux与Iptables阻拦 解决方法: 关闭Selinux: #sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config (重启生效) #setenforce 0 (警告模式,相当于临时关闭) 设置Iptables: #iptables -A INPUT -p tcp --dport 22 -j ACCEPT #iptables -A INPUT -p tcp --dport 1234 -j ACCEPT #/etc/rc.d/init.d/iptables save #/etc/rc.d/init.d/iptables restart