基于rsync写脚本实现多节点多服务器文件一键同步的方法

目录
  • 集群脚本分发
  • scp
    • 基本语法
    • 简单操作
  • rsync
    • 基本语法
    • 简单操作
  • xsync
    • 需求
    • 实现
  • SSH 无密码登录
    • 免登陆原理
    • 操作步骤

集群脚本分发

在处理 Linux 集群的时候,常常会涉及到集群内文件的同步。文件数量多,且需要频繁同步的情况下,运用 一些 Linux 命令能很大程度上的帮助我们节省时间和精力。

本文将介绍 scp 和 rsync 两个命令

  1. scp(secure copy) 安全拷贝:可以实现服务器与服务器之间的数据拷贝。rsync 远程同步工具:主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
  2. 区别:用 rsync 做文件的复制要比 scp 的速度快,rsync 只对差异文件做更新。scp 是把所有文件都复制过去。

scp

基本语法

scp -r $pdir/$fname $user@$host:$pdir/$fname

scp:命令

-r:递归

p d i r / pdir/ pdir/fname:要拷贝的文件路径/名称

u s e r @ user@ user@host: p d i r / pdir/ pdir/fname:目的地用户@主机:目的地路径/名称

简单操作

在 ndmiao 用户目录下,创建一个 test 文件夹, 并创建一些文件。修改 test 文件目录权限归属为 ndmiao:ndmiao

[ndmiao@centos01 ~]$ sudo chown ndmiao:ndmiao -R test

在 centos01 上将 test 文件目录拷贝到 centos02 上,回车后会提示是否确认连接,确认连接后输入 centos02 的密码即可

[ndmiao@centos01 ~]$ scp -r test ndmiao@centos02:/home/ndmiao/

在 centos02 上将 centos01 中的目录拷贝到 centos02

[ndmiao@centos01 ~]$ scp -r test ndmiao@centos02:/home/ndmiao/

在 centos02 上将 centos01 上的目录拷贝到 centos03

[ndmiao@centos02 ~]$ scp -r ndmiao@centos01:/home/ndmiao/test ndmiao@centos03:/home/ndmiao/

rsync

基本语法

rsync -av $pdir/$fname $user@$host:$pdir/$fname

rsync:命令

-a:归档拷贝

-v:显示复制过程

p d i r / pdir/ pdir/fname:要拷贝的文件路径/名称

u s e r @ user@ user@host: p d i r / pdir/ pdir/fname:目的地用户@主机:目的地路径/名称

简单操作

同步 centos01 目录到 centos02

[ndmiao@centos01 ~]$ rsync -av test ndmiao@centos02:/home/ndmiao/

xsync

虽然上面两个命令已经极大的方便了文件的同步,但是当集群中存在着几十几百甚至上千服务器的时候,就又显的麻烦了,这时候就可以编写一个shell脚本来实现集群文件的同步。

需求

能够一条命令同步目录至集群所有的节点

实现

配置 /etc/hosts ,因为脚本需要通过主机名来获取节点的地址, 文件中追加节点地址以及对应的主机名。配置好之后,需要重启。

192.168.10.101 centos01
192.168.10.102 centos02
192.168.10.102 centos03

因为需要脚本在任何路径下都能够使用,所以需要将脚本放置在声明了全局环境变量的路径下面。

[ndmiao@centos01 ~]$ /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/ndmiao/.local/bin:/home/ndmiao/bin

于是选择将 xsync 文件放置在 /home/ndmiao/bin 目录下

#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
    echo Not Enough Arguement!
    exit;
fi
#2. 遍历集群所有机器
for host in centos01 centos02 centos03
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

修改脚本 xsync 的权限

[ndmiao@centos01 bin]$ chmod 777 xsync

测试脚本

[ndmiao@centos01 ~]$ xsync /home/ndmiao/bin

运行后会发现所有节点的 /home/ndmiao/bin 下都会出现 xsync 脚本

如果想要以 root 的身份来运行

[ndmiao@centos01 ~]$ sudo /home/ndmiao/bin/xsync /home/ndmiao/test

SSH 无密码登录

虽然已经配置好了xsync,但是每同步一个节点就要输入一次节点的密码,SSH 无密码登录就可以去除这种重复的操作

免登陆原理

假设有两台服务器,一台为 centos01,一台为 centos02,使用 ssh-key-gen 在 centos01 的 /home/ndmiao/.ssh 会生成私钥 id_rsa 和 公钥 id_rsa.pub。将 centos01 的公钥拷贝到 centos02 的 authorized_keys 后,当 centos01 通过 ssh 访问 centos02(数据用私钥加密),centos02 会授权 authorized_keys 中的 centos01 公钥来解密私钥,然后用 centos01 公钥加密数据返还给 centos01,centos01 接受到数据后用私钥来解密数据。

操作步骤

生成公钥和私钥

[ndmiao@centos01 ~]$ cd .ssh
[ndmiao@centos01 .ssh]$ ssh-keygen -t rsa

将公钥拷贝到需要免密登录的目标节点,因为 ssh 访问自身节点也需要密码,所以自身也需要拷贝

[ndmiao@centos01 .ssh]$ ssh-copy-id centos01
[ndmiao@centos01 .ssh]$ ssh-copy-id centos02
[ndmiao@centos01 .ssh]$ ssh-copy-id centos03

这时候就可以通过 centos01 来 ssh 免密访问三台节点了,运行 xsync 也不再需要输入密码。如果想要其它节点也能无密码访问其它的节点,也需要同样的配置过程。因为 Linux 不同用户是隔离的,所以其它用户想要无密码访问其它节点,也需要同样操作配置,包括 root 用户。

到此这篇关于利用rsync写脚本实现多节点多服务器文件一键同步的文章就介绍到这了,更多相关rsync多服务器文件同步内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • rsync指定ssh端口进行文件同步的方法

    有台服务器因为安全性需要,修改了默认的ssh端口为34778端口. 因此rsync使用ssh同步的时候需要指定ssh的端口 rsync提供了一个-e参数 -e参数的作用是可以使用户自由选择想使用的shell程序来连接远端服务器,因此也可以设置成使用默认的ssh来连接,这样我们就可以加入ssh的参数了 具体语句写法如下: rsync -e 'ssh -p 34778' username@hostname:SourceFile DestFile 单引号,目的是为了使引号内的参数为引号内的命令所用 实

  • Rsync 服务器文件同步的搭建以及使用

    rsync 是类unix系统下的数据镜像备份工具, 它可以镜像保存整个目录树和文件系统.并且很容易做到保持原文件的权限,时间,软硬链接等等. 无须特殊权限即可安装. 特点: 快速.  第一次同步时会复制全部内容,但在下一次他只传修改过的文件,并且在传输过程中可以实行压缩及解压缩操作,因此可以使用更少带宽.安全. 可以使用scp.ssh等方式来传输文件,当然也可以通过直接的socket链接支持匿名传输,以方便进行网站镜像. 首先 下载安装包 复制代码 代码如下: wget http://rsync

  • 基于rsync写脚本实现多节点多服务器文件一键同步的方法

    目录 集群脚本分发 scp 基本语法 简单操作 rsync 基本语法 简单操作 xsync 需求 实现 SSH 无密码登录 免登陆原理 操作步骤 集群脚本分发 在处理 Linux 集群的时候,常常会涉及到集群内文件的同步.文件数量多,且需要频繁同步的情况下,运用 一些 Linux 命令能很大程度上的帮助我们节省时间和精力. 本文将介绍 scp 和 rsync 两个命令 scp(secure copy) 安全拷贝:可以实现服务器与服务器之间的数据拷贝.rsync 远程同步工具:主要用于备份和镜像.

  • 基于Java写minio客户端实现上传下载文件

    前言: 确保已经安装了minio的服务端 代码: pom.xml <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>7.0.2</version> </dependency> application.yml server: port:90 minio: url: http://10.69.94.140

  • Python写脚本常用模块OS基础用法详解

    收集了一些关于OS库的用法,整理归纳一下,方便使用 import os # 系统操作 print(os.sep) # 获取当前系统的路径分隔符 print(os.name) # 获取当前使用的工作平台 print(os.getenv('PATH')) # 获取名为 PATH 的环境变量 print(os.getcwd()) # 获取当前的路径 print(os.environ['PATH']) # 可以返回环境相关的信息 不传参时,以字典的方式返回所有环境变量 # 调用系统命令 os.syste

  • 基于bootstrap写的一点localStorage本地储存

    先给大家说下什么是localstorage 前几天在老项目中发现有对cookie的操作觉得很奇怪,咨询下来是要缓存一些信息,以避免在URL上面传递参数,但没有考虑过cookie会带来什么问题: ① cookie大小限制在4k左右,不适合存业务数据 ② cookie每次随HTTP事务一起发送,浪费带宽 我们是做移动项目的,所以这里真实适合使用的技术是localstorage,localstorage可以说是对cookie的优化,使用它可以方便在客户端存储数据,并且不会随着HTTP传输,但也不是没有

  • 用Python写脚本,实现完全备份和增量备份的示例

    需求: 在/root/backup下面有两个文件夹dst和src.要求在周一的时候进行完全备份,其余日子进行增量备份.从src备份到dst. 思路及关键点: 建立一个文件,以字典方式记录src的文件名以及文件对应的md5的值 完全备份的时候将文件名和md5值写在一个文件里面.cPickle的知识点. 增量备份的时候比较文件名是否在key里面,没有就要备份:有的话,这个文件的md5值是否改变,改变了就要备份 os.path.join()拼接路径,os.listdir(),os.chdir() ti

  • python rsync服务器之间文件夹同步脚本

    本文实例为大家分享了python rsync服务器之间文件夹同步的具体代码,供大家参考,具体内容如下 About  rsync 配置两台服务器之间3ssh-key后,可以实现自动化无需手动输入密码,脚本如下: import argparse import datetime from functools import partial import multiprocessing as mp import os import paramiko as pmk import time def check

  • 如何基于python实现脚本加密

    这篇文章主要介绍了如何基于python实现脚本加密,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 from pathlib import Path import python_minifier import compileall import sys def get_save_path(from_dir, to_dir, p): ori_dir = str(from_dir.resolve()) _p = str(p.resolve()) re

  • 基于C# 写一个 Redis 数据同步小工具

    概念 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hash(哈希类型).在此基础上,redis支持各种不同方式的排序.与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文

  • 基于Redis+Lua脚本实现分布式限流组件封装的方法

    创建限流组件项目 pom.xml文件中引入相关依赖 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springf

  • python基于Kivy写一个图形桌面时钟程序

    Kivy 是一个开源的 Python 第三方库,可以用来快速开发应用程序. 它有如下三个特点: 跨平台 Kivy 编写的程序可在 Linux,Windows,OS X,Android,iOS 和 Raspberry Pi 上运行. 商业友好 Kivy 基于 MIT 许可证进行开源,可以进行免费的商业使用. GPU 加速 Kivy 的图像引擎基于 Open ES 2 构建,性能出众. 除此之外 Kivy 也存在一些缺点,比如: 非原生的图形界面: 打包后的体积很大: 缺乏社区支持: 缺乏足够的示例

随机推荐