集群分发

  • 当我们为了实现某些集群功能时,会自己搭建一个小型集群做测试使用,经常会在某台机器上配置好,然后依次分发到其他机器上。

  • 通常使用的是 scp 命令,格式如:

    scp -r /jdk8 root@hadoop002:/usr/local/
    
    scp -r /jdk8 root@hadoop003:/usr/local/
    
  • 观察一下这个命令,就会发现这里面很多不足

    1. 很多重复的部分

    2. 通常集群之间的文件位置都是相同的,所以可以不指定具体位置

    3. 指令太长,希望的是 xsync jdk8,即可自动分发到其他机器上

  • 有了基本想法,下面我们做一个 shell 脚本来实现

  • scp 与 rsync 的区别

  • scp (secure copy)安全拷贝,可以实现服务器与服务器之间的数据拷贝,基本语法是

    scp -r $pdir/$fname $user@hadoop$host:$pdir/$fname
    scp -r 文件 用户@host:位置
    
  • rsync 速度快,可以增量拷贝,避免复制相同的内容和支持符号链接的优点。

    • 基本语法是:

      rsync -rvl $pdir/$fname $user@hadoop$host:$pdir/$fname
      
    • 其中三个参数的含义是

-r递归
-v显示复制过程
-l拷贝符号连接

ssh 免密登录

  • 通常我们使用 ssh 来远程登录到 linux 机器上,那我们的文件分发也是需要登录到对方服务器上的,不可能每次分发文件都要输入密码,所以需要预先配置好 ssh 免密登录。

    1. 首先需要依次更改主机名字
    Vim   /etc/sysconfig/network
    
    1. 修改 /etc/hosts 文件,可以通过访问机器名来访问 ip

    2. 在一台机器上生成公钥和私钥

    ssh-keygen -t rsa
    
    1. 一路回车,会在 ~/.ssh 下产生公钥和私钥文件

    2. 在每台机器上执行 ssh-copy-id 机器名,把公钥发送到其他主机

关于ssh免密登录

  • 通常集群分发文件并不会多次操作,建议安全起见不要设置免密,在执行脚本时,只需要根据提示输入密码即可

    • shell 脚本 for 循环语法

      #!/bin/bash
      
      for((i=1;i<=10;i++));  
      do   
      echo $(expr $i \* 3 + 1);  
      done
      
  • 脚本实现

  • 在 /usr/local/bin 下

    touch xsync & vim xsync
    
    #!/bin/bash
    #1 获取输入参数个数,如果没有参数,直接退出
    pcount=$#
    if((pcount==0)); then
    echo no args;
    exit;
    fi
    
    #2 获取文件名称
    p1=$1
    fname=`basename $p1`
    echo fname=$fname
    
    #3 获取上级目录到绝对路径
    pdir=`cd -P $(dirname $p1); pwd`
    echo pdir=$pdir
    
    #4 获取当前用户名称
    user=`whoami`
    
    #5 循环
    for((host=103; host<105; host++)); do
    echo ------------------- hadoop$host --------------
            rsync -rvl $pdir/$fname $user@hadoop$host:$pdir
    done
    #note:hadoop 修改为自己hosts文件指定的域名
    
    • 给脚本赋予可执行权限,chmod 777 xsync

    • 脚本编辑完成后,配置hosts 文件

      vim /etc/hosts
      

  • host 指向的ip 就是分发文件的地址

     cd /usr/local/bin
    
  • 执行脚本-将指定目录的文件分发到各个hosts文件指定的服务器上

     ./xsync /home/softwore/kafka
    

  • 如果你没有配置ssh免密登录,将会提示输入指定服务器的密码

  • 如何获取到待发送文件的文件名和绝对路径?

    • basename jdk8,即可获得当前文件的文件名
  • pdir=cd -P $(dirname $p1); pwd

  • 这条命令是什么意思

  • dirname /opt/module/jdk/,可以获得 jdk8 的绝对路径 /opt/module

  • 为何要加一个 cd -P 命令呢?

  • 如果我们发送的文件是一个软连接,那么 cd -P 会 cd 到软链接的真实目录下,而不是软链接本身所在的目录,可以考虑到发送的文件是一个软链接的情况

上一篇 下一篇