集群分发脚本
概述
当前集群环境用到的越来越多了,集群各服务器之间很多数据配置大体一致,导致一个文件可能需要同时上传到多个服务器,工作量很大而且容易失误
在网上参考了一些集群文件分发脚本,在此记录一下
scp拷贝
全程secure copy,即安全拷贝,这是一种最基础的服务器之前传递文件的方法
语法
scp -r $pdir/$fname $user@$host:$pdir/[$fname]
比如需要把服上/home/test.txt传递到B服务器,写法如下
文件复制到文件夹
scp /home/test.txt root@192.168.10.101:/home
文件复制并重命名
scp /home/test.txt root@192.168.10.101:/home/test.txt
批量复制
scp /home/* root@192.168.10.101:/home
复制文件夹
scp -r /home root@192.168.10.101:/
这是一个最基本的全量拷贝方法
rsync
相比如scp的全量拷贝,这是一个种增量更新复制方式,速度更快,适合做备份使用
安装
没有的话需要安装
yum install rsync
注意,同步数据的目标服务器也要安装
语法
rsync -av $pdir/$fname $user@$host:$pdir/$fname
参数说明
- -a 归档拷贝
- -v 显示拷贝过程
使用
比如把/home/test文件夹同步到B服务器
rsync -av /home/test root@192.168.10.101:/home
分发脚本
上面的两种方式,无论使用哪个,都比较麻烦,需要指定源路径、目标路径
而在集群环境中一般路径都是一致的,我们希望只写一个路径,就自动同步路径下的文件到其它节点的相同路径下
这就需要自己写脚本,脚本名称取为xsync
,内容如下
#!/bin/bash
#1. 判断参数大于1
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 遍历集群所有节点,这里假如有三个集群节点
for host in 192.168.10.100 192.168.10.101 192.168.10.102
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"
#7.使用rsync增量复制
rsync -av $pdir/$fname $host:$pdir
else
echo $file does not exists!
fi
done
done
注意,脚本尽量在linux环境编写
把脚本存入一个文件夹下,为全局使用,可以配置环境变量(跟配jdk的bin目录差不多)
此时执行
xsync /home/test
就会把/home/test文件夹即里面的文件同步到集群所有节点,非常方便
但是有一点,需要不断的去输入密码,每个节点输入两遍(ssh和rsync命令各一遍),所以还要做到免密登录
免密登录
免密登录的原理就不说了,执行起来挺简单
找到用户文件夹下的.ssh文件夹,如果是root用户就是/root/.ssh文件夹,如果没有执行一次ssh命令就有了
进入.ssh文件夹,执行命令
ssh-keygen -t rsa
此时会生成两个文件id_rsa
(私钥)、id_rsa.pub
(公钥)
此时执行
ssh-copy-id 192.168.10.101
192.168.10.101服务器上/root/.ssh就会出现authorized_keys
文件,此时就可以不登录访问192.168.10.101服务器了,ssh/scp/rsync都不需要输入密码了
这时再执行自定义xsync脚本,就非常简单的可以实习集群数据同步了~