1、目的
多个环境具有相同配置(例如分布式环境搭建zookeeper集群、kafka集群、Hadoop集群等)
多个环境都需要相同版本的jdk或者其他服务,这里以jdk为例;其他服务类似!
1. 环境准备
- 创建普通用户
geray
,并配置具有root权限,方便后期执行sudo命令
# 添加geray用户
useradd geray
# 配置密码
passwd geray
# 配置root权限
# 修改/etc/sudoers 文件,在%wheel 这行下面添加一行,如下所示:
vim /etc/sudoers
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
## Allows members of the 'sys' group to run networking, software,
## service management apps and more.
# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
geray ALL=(ALL) NOPASSWD:ALL
注意:geray这一行不要直接放到 root 行下面,因为所有用户都属于 wheel 组,你先 配置了 geray具有免密功能,但是程序执行到%wheel 行时,该功能又被覆盖回需要 密码。所以 geray要放到%wheel 这行下面。
2、环境架构
IP | 主机名 | 测试软件 |
---|---|---|
192.168.6.61 | node1 | JDK |
192.168.6.62 | node2 | JDK |
192.168.6.63 | node3 | JDK |
3、集群分发脚本xsync
1. scp(secure copy)安全拷贝
scp
命令可以实现服务器与服务器之间的数据拷贝(from server1 to server2)
# 基本语法
# 1. 拷贝文件到远程服务
scp -r $pdir/$fname $user@$host:$pdir/$fname
#命令 递归 要拷贝文件的路径/文件民 目标服务器用户@主机:目的地路径/文件名
# 2. 拷贝远程服务文件到本地
scp -r $user@$host:$pdir/$fname $pdir/$fname
#命令 递归 目标服务器用户@主机:目的地路径/文件名 要拷贝文件的路径/文件民
# 3. 拷贝远程服务文件到远程服务
scp -r $user@$host:$pdir/$fname $user@$host:$pdir/$fname
#命令 递归 要拷贝文件的路径/文件民 目标服务器用户@主机:目的地路径/文件名
2. scp命令案例
拷贝node1主机的/opt/module/jdk1.8.0_291/
解压文件和/opt/software/jdk-8u291-linux-x64.tar.gz
到node2和node3
前提条件:
-
添加域名解析
- 非root用户:geray
- 在node2和node3服务器上创建目录
/opt/module
,并设置所属用户和所属组为geray
# 在node2和node3节点创建目录并分配用户和用户组
sudo mkdir /opt/{module,software}
sudo chown -R geray:geray /opt/{module,software}
# 添加域名解析
sudo vim /etc/hosts
# 追加以下内容
192.168.6.61 node1
192.168.6.62 node2
192.168.6.63 node3
1)拷贝文件到远程服务
在node1节点上,拷贝node1节点上的/opt/module/jdk1.8.0_291/
到node2节点
scp -r /opt/module/jdk1.8.0_291/ geray@node2:/opt/module/
2)拷贝远程服务文件到本地
在node3节点上,拷贝node2节点上的/opt/module/jdk1.8.0_291/
到node3节点
scp -r geray@node2:/opt/module/jdk1.8.0_291/ /opt/module/
3)拷贝远程服务文件到远程服务
在node2节点上,拷贝node1节点上的/opt/software/
下的所有文件到node3节点
scp -r geray@node1:/opt/software/* geray@node3:/opt/software/
3. rsync远程同步工具
安装该命令:sudo yum -y install rsync
(每个节点都需要安装)
rsync主要用于备份和镜像
- 速度快
- 避免复制相同内容
- 支持符号链接
rsync和scp区别:
-
rsync用于复制文件的速度比scp命令快
- rsync只对差异文件做更新
- scp是把所有文件都复制过去
# 基本语法
rsync -av $pdir/$fname $user@$host:$pdir/$fname
#命令 参数 要拷贝文件的路径/文件民 目标服务器用户@主机:目的地路径/文件名
参数选项:
选项 | 功能 |
---|---|
-a | 归档拷贝 |
-v | 显示复制过程 |
4. rsync命令案例
1)删除node3中的/opt/software
中的jdk文件
rm -rf /opt/software/jdk-8u291-linux-x64.tar.gz
2)同步node1中的/opt/software
下的所有文件到node3
rsync -av /opt/software/* geray@node3:/opt/software/
5. xsync集群分发脚本
1)脚本实现
-
需求:循环复制文件到所有节点的相同目录下
-
需求分析:
- 原始拷贝命令:
rsync -av $pdir/$fname $user@$host:$pdir/$fname #命令 参数 要拷贝文件的路径/文件民 目标服务器用户@主机:目的地路径/文件名
- 期望脚本:
xsync 要同步的文件名称
- 期望脚本可以在任何路径下都可以使用(脚本放在全局变量PATH路径中)
-
脚本实现
- 在当前用户下创建
bin
目录,并创建xsync
文件
mkdir ~/bin touch ~/bin/xsync chmod +x xsync # 设置环境变量 sudo vim /etc/profile.d/my_env.sh
- 文件内容如下:
#!/bin/bash # 1. 判断参数个数 if [ $# -lt 1 ] then echo "没有指定参数!" exit fi # 2. 遍历集群所有机器 for host in node2 node3 do echo "======== $host ========$" # 3. 遍历所有目录,挨个发送 for file in $@ do # 4. 判断文件是否存在 if [ -e $file ] then # 5. 如果文件存在(-P 进入实际目录,例如软链接) pdir=$(cd -P $(dirname $file); pwd) # 6. 获取当前文件名称(即便给定的是路径,也只需要文件名称) fname=$(basename $file) # 这里的-p表示即便目标路径存在,不做任何操作和提示 ssh $host "mkdir -p $pdir" rsync -av $pdir/$fname $host:$pdir else echo "$file 你传递的文件名不存在!" fi done done
- 在当前用户下创建
2)分发xsync脚本文件和my_env.sh环境变量文件
xsync ./bin/xsync /etc/profile.d/my_env.sh
权限不足:/etc
目录下的文件都是root用户的
rsync: mkstemp "/etc/profile.d/.my_env.sh.51wxGR" failed: Permission denied (13)
解决办法:
sudo ./bin/xsync ./bin/xsync /etc/profile.d/my_env.sh
3)分发jdk安装包
xsync /opt/software/*
4、SSH免密登录
1. 免密登录的原理
私钥和公钥文件名称(id_rsa、id_rsa.pub)
- A服务器生成密钥对(公钥A、私钥A)
- 拷贝A服务器的公钥A到B服务器的授权文件(autoorized_keys)中
- A服务器访问B服务器(数据使用私钥A加密)
- B服务器接收到数据后,去授权key中查找A的公钥,并解密数据
- 采用A公钥加密的数据返回给A
- A服务器接收到数据后,用私钥A解密数据
2. 生成公钥和私钥
ssh-keygen -t rsa
然后敲(三个回车),就会生成两个文件 id_rsa(私钥)、id_rsa.pub(公钥)
3. 将公钥拷贝到要免密登录的目标机器上
ssh-copy-id node1
ssh-copy-id node2
ssh-copy-id node3
注意: 还需要在其他两个节点node2、node3上使用geray用户,同样的方式进行配置免密登录
4. .ssh 文件夹下(~/.ssh)的文件功能解释
文件名 | 说明 |
---|---|
known_hosts | 记录 ssh 访问过计算机的公钥(public key) |
id_rsa | 生成的当前用户私钥 |
id_rsa.pub | 生成的当前用户公钥 |
authorized_keys | 存放授权过的无密登录服务器公钥 |