集群分发脚本xsync

admin2024-05-15  1

1.环境准备
1.准备三台服务器(我这里使用虚拟机,操作系统 CentOS7 )它们的IP分别为 192.168.188.135、192.168.188.136、192.168.188.137

2.先将三台机器的主机名修改,为每台主机设置hostname(具体名称由自己定义),分别在不同的机器下执行:

# 修改192.168.188.135 node1-zookeeper
[root@node1-zookeep etc]# vi hostname 
[root@node1-zookeep etc]# cat hostname
node1-zookeeper
 
# 修改 192.168.188.136 node2-zookeeper
[root@node2-zookeep etc]# vi hostname 
# 查看
[root@node2-zookeep etc]# cat hostname
node2-zookeeper
 
# 修改 192.168.188.137 node3-zookeeper
[root@node3-zookeep etc]# vi hostname 
# 查看
[root@node3-zookeep etc]# cat hostname
node3-zookeeper
3.改完之后将每台服务器的对应信息添加到hosts文件中

vim /etc/hosts
# 添加以下内容到文件中
192.168.188.135 node1-zookeeper
192.168.188.136 node2-zookeeper
192.168.188.137 node3-zookeeper

4.添加hosts文件后,使用ping命令测试能否接通:

相互测试每台机器是否互通,比如节点1 ping 节点2,节点1ping节点3,节点2ping节点3,这里就以节点1ping节点2为示例:

# 使用node1-zookeeper节点 ping node2-zookeeper节点
[root@node1-zookeep ~]# ping  node2-zookeeper
PING node2-zookeeper (192.168.188.136) 56(84) bytes of data.
64 bytes from node2-zookeeper (192.168.188.136): icmp_seq=1 ttl=64 time=0.497 ms
64 bytes from node2-zookeeper (192.168.188.136): icmp_seq=2 ttl=64 time=1.61 ms
64 bytes from node2-zookeeper (192.168.188.136): icmp_seq=3 ttl=64 time=1.7
...
注意,以上操作三台服务器节点都要操作。

3.安装Rsync
1.由于xsync是对rsync的再次封装所以需要先安装rsync,根据使用的操作系统不同,使用对应命令即可,我使用的是CentOS7,所以直接使用yum命令安装即可:

# 下载rsync脚本
[root@node1-zookeep /]# yum install -y rsync
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
 ...
4.脚本的编写及使用:
1.在 /usr/local/bin 下创建xsync文件。

# 创建xsync文件
[root@node1-zookeep usr]# vim /usr/local/bin/xsync 
2.在创建好的xsync文件中编写脚本,这里只是做简单示例,可根据自己实际情况进行调整:

#!/bin/bash
# 判断参数个数
if [ $# -lt 1 ]
then
    echo Not Enough Arguement!
    exit;
fi
# 2.遍历集群所有节点
for host in node1-zookeeper node2-zookeeper node3-zookeeper
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
完成之后,保存并退出。

3.修改xsync脚本具有执行权限:

# 原文件
-rw-r--r--. 1 root root 732 9月  20 15:10 xsync
 
 
# 修改执行权限(两种方式都可以)
[root@node1-zookeep bin]# chmod +x xsync 
# 或
[root@node1-zookeep bin]# chmod 777 xsync 
 
 
# 查看被修改后的文件
[root@node1-zookeep bin]# ll
总用量 4
-rwxr-xr-x. 1 root root 732 9月  20 15:10 xsync
4.使用命令:xsync 要同步的文件

[root@node1-zookeep /]$ xsync /Test01
至此,配置结束,就可以正常使用了,但是每次同步都需要输入密码,所以还需要使用ssh配置集群间免密登录。

5.免密登陆
1.免密登录的基本原理:

集群分发脚本xsync,第1张

2.生成RSA秘钥对

使用 ssh-keygen -t rsa 命令,在生成命令时,会要求你输入密码短语、确认密码短语等信息,可根据自己需要的情况来填写,不填写也可以(但是建议通过ssh-keygen建立SSH keys,不要指定密码),如果不填写直接按回车键即可,然后就会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)

# 生成秘钥对
[root@node1-zookeep .ssh]# ssh-keygen -t rsa
集群分发脚本xsync,第2张
3.由上能看到,生成的秘钥被保存在/root/.ssh目录下,

集群分发脚本xsync,第3张

查看生成的文件:

[root@node1-zookeep .ssh]# ll
总用量 12
-rw-------. 1 root root 1679 9月  20 15:49 id_rsa
-rw-r--r--. 1 root root  400 9月  20 15:49 id_rsa.pub
4.使用ssh-copy-id命令,将公钥拷贝到要免密登录的目标机器上:

# 将公钥拷贝到node2-zookeeper
[root@node1-zookeep .ssh]# ssh-copy-id -i ~/.ssh/id_rsa.pub node2-zookeeper
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@node2-zookeeper's password: 
# 如果有提示就输入自己的密码
Number of key(s) added: 1
Now try logging into the machine, with:   "ssh 'node2-zookeeper'"
and check to make sure that only the key(s) you wanted were added.
# 将公钥拷贝到node3-zookeeper
[root@node1-zookeep .ssh]# ssh-copy-id -i ~/.ssh/id_rsa.pub node3-zookeeper
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@node3-zookeeper's password: 
# 如果有提示就输入自己的密码
Number of key(s) added: 1
Now try logging into the machine, with:   "ssh 'node3-zookeeper'"
and check to make sure that only the key(s) you wanted were added.
或者使用下面这种方式也可以,ssh-copy-id会将本机的公钥发送到要访问计算机——存储在hadoop102的 ~/.ssh/authorized_keys中:

# 或者使用下面这种方式拷贝公钥也可以
[root@node1-zookeep .ssh]# ssh-copy-id node1-zookeeper
[root@node1-zookeep .ssh]# ssh-copy-id node2-zookeeper
[root@node1-zookeep .ssh]# ssh-copy-id node3-zookeeper
上述步骤只是将节点一的文件能够同步到节点2 和节点3 ,如果需要他们之间相互能够同步,需要在 192.168.188.136(节点二) 与 192.168.188.137(节点三) 的服务器上重复上述步骤。

6.ssh文件夹详解集群分发脚本xsync,第4张

功能

known_hosts

记录ssh访问过计算机的公钥(public key)

id_rsa

生成的私钥

id_rsa.pub

生成的公钥

authorized_keys

存放授权过得无密登录服务器公钥

ssh会把每个访问过计算机的公钥(public key)都记录在~/.ssh/known_hosts

脚本

在/usr/local/bin 目录下创建 xsync 文件 

#!/bin/sh
# 获取输入参数个数,如果没有参数,直接退出
pcount=$#
if((pcount==0)); then
        echo no args...;
        exit;
fi
# 获取文件名称
p1=$1
fname=`basename $p1`
echo fname=$fname
# 获取上级目录到绝对路径
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir
# 获取当前用户名称
user=`whoami`
# 循环
for((host=2; host<=10; host++)); do
        echo $pdir/$fname $user@slave$host:$pdir
        echo ==================slave$host==================
        rsync -rvl $pdir/$fname $user@slave$host:$pdir
done
#Note:这里的slave对应自己主机名,需要做相应修改。另外,for循环中的host的边界值

参考文章: xsync同步脚本的创建及使用(以Debian10集群为例)-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明原文出处。如若内容造成侵权/违法违规/事实不符,请联系SD编程学习网:675289112@qq.com进行投诉反馈,一经查实,立即删除!