zoukankan      html  css  js  c++  java
  • 服务管理之rsync

    rsync

    1. rsync简介

    rsync是linux系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH、rsync主机同步。

    2. rsync特性

    rsync支持很多特性:

    • 可以镜像保存整个目录树和文件系统
    • 可以很容易做到保持原来文件的权限、时间、软硬链接等等
    • 无须特殊权限即可安装
    • 快速:第一次同步时rsync会复制全部内容,但在下一次只传输修改过的文件。rsync在传输数据的过程中可以实行压缩及解压缩操作,因此可以使用更少的带宽
    • 安全:可以使用scp、ssh等方式来传输文件,当然也可以通过直接的socket连接
    • 支持匿名传输,以方便进行网站镜象

    3.rsync的ssh认证协议

    rsync命令来同步系统文件之前要先登录remote主机认证,认证过程中用到的协议有2种:

    • ssh协议
    • rsync协议

    rsync server端不用启动rsync的daemon进程,只要获取remote host的用户名和密码就可以直接rsync同步文件

    rsync server端因为不用启动daemon进程,所以也不用配置文件/etc/rsyncd.conf

    ssh认证协议跟scp的原理是一样的,如果在同步过程中不想输入密码就用ssh-keygen -t rsa打通通道

    //这种方式默认是省略了 -e ssh 的,与下面等价:
    rsync -avz /SRC -e ssh root@172.16.12.129:/DEST 
        -a  //文件宿主变化,时间戳不变
        -z  //压缩数据传输
     
    //当遇到要修改端口的时候,我们可以:
    rsync -avz /SRC -e "ssh -p2222" root@192.168.153.153:/DEST  
    //修改了ssh 协议的端口,默认是22
    

    4. rsync命令

    //Rsync的命令格式常用的有以下三种:
        rsync [OPTION]... SRC DEST
        rsync [OPTION]... SRC [USER@]HOST:DEST
        rsync [OPTION]... [USER@]HOST:SRC DEST
      
    //对应于以上三种命令格式,rsync有三种不同的工作模式:
    1)拷贝本地文件。当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。如:
    [root@localhost ~]# ls
    anaconda-ks.cfg  azhttpd.sh  test  tphttpd.sh
    [root@localhost ~]# rsync -a anaconda-ks.cfg ba
    [root@localhost ~]# ls
    anaconda-ks.cfg  azhttpd.sh  ba  test  tphttpd.sh
    [root@localhost ~]# ll
    总用量 16
    -rw-------. 1 root root 1585 3月  20 03:06 anaconda-ks.cfg
    -rw-r--r--. 1 root root 1773 4月  25 04:10 azhttpd.sh
    -rw-------. 1 root root 1585 3月  20 03:06 ba
    drwxr-xr-x. 2 root root   29 4月  25 21:35 test
    -rw-r--r--. 1 root root 1248 4月  25 16:39 tphttpd.sh
    2)使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包 
    含单个冒号":"分隔符时启动该模式。如:
    [root@localhost ~]# rsync -avz ba root@192.168.153.152:/root/aa
    root@192.168.153.152's password: 
    sending incremental file list
    ba
    
    sent 867 bytes  received 35 bytes  200.44 bytes/sec
    total size is 1,585  speedup is 1.76
    客户端验证:
    [root@liuyi ~]# ls
    aa                      CentOS7-Base-163.repo
    anaconda-ks.cfg         httpd-2.4.39.tar.bz2
    apr-1.6.5.tar.bz2       mysql57-community-release-el7-10.noarch.rpm
    apr-util-1.6.1.tar.bz2  test
    [root@liuyi ~]# 
    3)使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径 
    包含单个冒号":"分隔符时启动该模式。如:
    [root@localhost ~]# rsync -aqz ba 'ssh' root@192.168.153.152:/root
    root@192.168.153.152's password: 
    rsync: link_stat "/root/ssh" failed: No such file or directory (2)
    rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1178) [sender=3.1.2]
    客户端验证:
    [root@liuyi ~]# ls
    aa  anaconda-ks.cfg  ba  test
    //rsync常用选项:
        -a, --archive       //归档
        -v, --verbose       //啰嗦模式
        -q, --quiet         //静默模式
        -r, --recursive     //递归
        -p, --perms         //保持原有的权限属性
        -z, --compress      //在传输时压缩,节省带宽,加快传输速度
        --delete            //在源服务器上做的删除操作也会在目标服务器上同步
    delete的用法
    [root@localhost ~]# rsync -aqz --delete test 'ssh' root@192.168.153.152:/root
    root@192.168.153.152's password: 
    rsync: link_stat "/root/ssh" failed: No such file or directory (2)
    rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1178) [sender=3.1.2]
    客户端验证:
    [root@liuyi ~]# ls test/
    aa  anaconda-ks.cfg
    

    5. rsync+inotify

    rsync与传统的cp、tar备份方式相比,rsync具有安全性高、备份迅速、支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,例如定期的备份文件服务器数据到远端服务器,对本地磁盘定期做数据镜像等。

    随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足,首先,rsync同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的。而且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。其次,rsync不能实时的去监测、同步数据,虽然它可以通过linux守护进程的方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。基于以上原因,rsync+inotify组合出现了!

    Inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这样的一个第三方软件。
    在前面有讲到,rsync可以实现触发式的文件同步,但是通过crontab守护进程方式进行触发,同步的数据和实际数据会有差异,而inotify可以监控文件系统的各种变化,当文件有任何变动时,就触发rsync同步,这样刚好解决了同步数据的实时性问题。

    环境说明:

    服务器类型 IP地址 应用 操作系统
    源服务器 192.168.153.153 rsync
    inotify-tools
    脚本
    centos7/redhat7
    目标服务器 192.168.153.152 rsync centos7/redhat7
    需求:
    • 把源服务器上/etc目录实时同步到目标服务器的/lcr/下

    在目标服务器上做以下操作:

    //关闭防火墙与SELINUX
    [root@liuyi ~]# systemctl stop firewalld.service 
    [root@liuyi ~]# systemctl disable firewalld.service 
    Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
    Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
    [root@liuyi ~]# getenforce 
    Enforcing
    [root@liuyi ~]# setenforce 0
    [root@liuyi ~]# getenforce 
    Permissive
    //安装rsync服务端软件
    [root@liuyi ~]# yum -y install rsync
    Loaded plugins: product-id, search-disabled-repos, subscription-manager
    This system is not registered with an entitlement server. You can use subscription-manager to register.
    myrepo                                          | 4.1 kB     00:00
    (1/2): myrepo/group_gz                            | 137 kB   00:00
    (2/2): myrepo/primary_db                          | 4.0 MB   00:00
    Resolving Dependencies
    --> Running transaction check
    ---> Package rsync.x86_64 0:3.0.9-18.el7 will be installed
    ......
    myrepo/productid                                | 1.6 kB     00:00
      Verifying  : rsync-3.0.9-18.el7.x86_64                           1/1
    
    Installed:
      rsync.x86_64 0:3.0.9-18.el7
    
    Complete!
    //设置rsyncd.conf配置文件
    [root@localhost ~]# cat >> /etc/rsyncd.conf <<EOF
    log file = /var/log/rsyncd.log    //日志文件位置,启动rsync后自动产生这个文件,无需提前创建
    pidfile = /var/run/rsyncd.pid     //pid文件的存放位置
    lock file = /var/run/rsync.lock   //支持max connections参数的锁文件
    secrets file = /etc/rsync.pass    //用户认证配置文件,里面保存用户名称和密码,必须手动创建这个文件
    
    [etc_from_client]     //自定义同步名称
    path = /lcr/          //rsync服务端数据存放路径,客户端的数据将同步至此目录
    comment = sync test from client
    uid = root        //设置rsync运行权限为root
    gid = root        //设置rsync运行权限为root
    port = 873        //默认端口
    ignore errors     //表示出现错误忽略错误
    use chroot = no       //默认为true,修改为no,增加对目录文件软连接的备份
    read only = no    //设置rsync服务端为读写权限
    list = no     //不显示rsync服务端资源列表
    max connections = 200     //最大连接数
    timeout = 600     //设置超时时间
    auth users = admin        //执行数据同步的用户名,可以设置多个,用英文状态下逗号隔开
    hosts allow = 172.16.12.128   //允许进行数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开
    hosts deny = 192.168.1.1      //禁止数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开
    > EOF
    [root@liuyi ~]# echo 'admin:123456' > /etc/rsync.pass
    [root@liuyi ~]# cat /etc/rsync.pass
    admin:123456
    [root@liuyi ~]# chmod 600 /etc/rsync.pass
    [root@liuyi ~]# systemctl restart rsyncd
    [root@liuyi ~]# systemctl enable rsyncd
    Created symlink from /etc/systemd/system/multi-user.target.wants/rsyncd.service to /usr/lib/systemd/system/rsyncd.service.
    [root@liuyi ~]# ss -antl
    State      Recv-Q Send-Q Local Address:Port               Peer Address:Port              
    LISTEN     0      128        *:22                     *:*                  
    LISTEN     0      100    127.0.0.1:25                     *:*                  
    LISTEN     0      5          *:873                    *:*                  
    LISTEN     0      128       :::22                    :::*                  
    LISTEN     0      100      ::1:25                    :::*                  
    LISTEN     0      5         :::873                   :::*                  
    [root@liuyi ~]# 
    

    在源服务器上做以下操作:

    /关闭防火墙与SELINUX
    [root@localhost ~]# systemctl stop firewalld
    [root@localhost ~]# systemctl disable firewalld
    [root@localhost ~]# getenforce
    Enforcing
    [root@localhost ~]# setenforce 0
    //配置yum源
    [root@localhost ~]# cd /etc/yum.repos.d/
    [root@localhost yum.repos.d]# wget http://mirrors.163.com/.help/CentOS7-Base-163.repo
    --2018-08-10 12:07:17--  http://mirrors.163.com/.help/CentOS7-Base-163.repo
    Resolving mirrors.163.com (mirrors.163.com)... 59.111.0.251
    Connecting to mirrors.163.com (mirrors.163.com)|59.111.0.251|:80... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 1572 (1.5K) [application/octet-stream]
    Saving to: ‘CentOS7-Base-163.repo’
    
    100%[=================================>] 1,572       --.-K/s   in 0s
    
    2018-08-10 12:07:17 (191 MB/s) - ‘CentOS7-Base-163.repo’ saved [1572/1572]
    [root@localhost ~]# sed -i 's/$releasever/7/g' /etc/yum.repos.d/CentOS7-Base-163.repo
    [root@localhost ~]# sed -i 's/^enabled=.*/enabled=1/g' /etc/yum.repos.d/CentOS7-Base-163.repo
    [root@localhost ~]# yum -y install epel-release
    安装过程略。。。。
    //安装rsync服务端软件,只需要安装,不要启动,不需要配置
    [root@localhost ~]# yum -y install rsync
    Loaded plugins: product-id, search-disabled-repos, subscription-manager
    This system is not registered with an entitlement server. You can use subscription-manager to register.
    myrepo                                          | 4.1 kB     00:00
    (1/2): myrepo/group_gz                            | 137 kB   00:00
    (2/2): myrepo/primary_db                          | 4.0 MB   00:00
    Resolving Dependencies
    --> Running transaction check
    ---> Package rsync.x86_64 0:3.0.9-18.el7 will be installed
    ......
    myrepo/productid                                | 1.6 kB     00:00
      Verifying  : rsync-3.0.9-18.el7.x86_64                           1/1
    
    Installed:
      rsync.x86_64 0:3.0.9-18.el7
    
    Complete!
    //创建认证密码文件
    [root@localhost ~]#  echo '123456' > /etc/rsync.pass
    //设置文件权限,只设置文件所有者具有读取、写入权限即可
    [root@localhost ~]# chmod 600 /etc/rsync.pass
    [root@localhost ~]# ll /etc/rsync.pass
    -rw-------. 1 root root 7 4月  26 03:33 /etc/rsync.pass
    //在源服务器上创建测试目录,然后在源服务器运行以下命令
    [root@localhost ~]#  mkdir -pv /root/etc/test
    mkdir: 已创建目录 "/root/etc"
    mkdir: 已创建目录 "/root/etc/test"
    [root@localhost ~]# rsync -avH --port 873 --progress --delete /root/etc/ admin@192.168.153.152::test_from_153 --password-file=/etc/rsync.pass
    sending incremental file list
    ./
    test/
    
    sent 81 bytes  received 23 bytes  208.00 bytes/sec
    total size is 0  speedup is 0.00
    [root@localhost ~]# 
    //运行完成后,在目标服务器上查看,在/lcr目录下有test目录,说明数据同步成功
    验证:
    [root@liuyi ~]# cd /lcr/
    [root@liuyi lcr]# ls
    test
    [root@liuyi lcr]# 
    //安装inotify-tools工具,实时触发rsync进行同步
    //查看服务器内核是否支持inotify
    [root@localhost ~]# ll /proc/sys/fs/inotify/
    总用量 0
    -rw-r--r--. 1 root root 0 4月  26 03:49 max_queued_events
    -rw-r--r--. 1 root root 0 4月  26 03:49 max_user_instances
    -rw-r--r--. 1 root root 0 4月  26 03:49 max_user_watches
    //如果有这三个max开头的文件则表示服务器内核支持inotify
    
    //安装inotify-tools
    [root@localhost ~]# yum -y install make gcc gcc-c++
    安装过程略....
    [root@localhost ~]# yum -y install inotify-tools
    安装过程略....
    //写同步脚本,此步乃最最重要的一步,请慎之又慎。让脚本自动去检测我们制定的目录下 
    //文件发生的变化,然后再执行rsync的命令把它同步到我们的服务器端去
    [root@localhost ~]# mkdir /scripts
    [root@localhost ~]# touch /scripts/inotify.sh
    [root@localhost ~]# chmod 755 /scripts/inotify.sh
    [root@localhost ~]# ll /scripts/inotify.sh
    -rwxr-xr-x. 1 root root 0 4月  26 03:52 /scripts/inotify.sh
    root@localhost ~]# vim /scripts/inotify.sh
    host=192.168.153.152      //目标服务器的ip(备份服务器)
    src=/etc        //在源服务器上所要监控的备份目录(此处可以自定义,但是要保证存在)
    des=test_from_153     //自定义的模块名,需要与目标服务器上定义的同步名称一致
    password=/etc/rsync.pass        //执行数据同步的密码文件
    user=admin          //执行数据同步的用户名
    inotifywait=/usr/bin/inotifywait
    
    $inotifywait -mrq --timefmt '%Y%m%d %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src 
    | while read files;do
        rsync -avzP --delete  --timeout=100 --password-file=${password} $src $user@$host::$des
        echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
    done
    //启动脚本
    [root@localhost ~]# nohup bash /scripts/inotify.sh &
    [1] 12221
    [root@localhost ~]# nohup: 忽略输入并把输出追加到"nohup.out"
    
    [root@localhost ~]# ps -ef|grep inotify
    root      12221   1380  0 04:01 pts/0    00:00:00 bash /scripts/inotify.sh
    root      12222  12221  0 04:01 pts/0    00:00:00 /usr/bin/inotifywait -mrq --timefmt %Y%m%d %H:%M --format %T %w%f%e -e modify,delete,create,attrib /etc
    root      12223  12221  0 04:01 pts/0    00:00:00 bash /scripts/inotify.sh
    root      12225   1380  0 04:01 pts/0    00:00:00 grep --color=auto inotify
    //在源服务器上生成一个新文件
    [root@localhost ~]# touch /etc/abc
    验证:
    [root@liuyi ~]# ls /lcr
    test
    [root@liuyi ~]# ls /lcr
    etc  test
    //查看inotify生成的日志
    [root@localhost ~]# tail /tmp/rsync.log
    20190426 04:02 /etc/abcCREATE was rsynced
    20190426 04:02 /etc/abcATTRIB was rsynced
    
    

    设置脚本开机自动启动:

    [root@localhost ~]# chmod +x /etc/rc.d/rc.local
    [root@localhost ~]# ll /etc/rc.d/rc.local
    -rwxr-xr-x 1 root root 473 Aug 10 23:23 /etc/rc.d/rc.local
    [root@localhost ~]# echo 'nohup /bin/bash /scripts/inotify.sh' >> /etc/rc.d/rc.local
    [root@localhost ~]# tail /etc/rc.d/rc.local
    # to run scripts during boot instead of using this file.
    #
    # In contrast to previous versions due to parallel execution during boot
    # this script will NOT be run after all other services.
    #
    # Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
    # that this script will be executed during boot.
    
    touch /var/lock/subsys/local
    nohup /bin/bash /scripts/inotify.sh
    
    

    到目标服务器上去查看是否把新生成的文件自动传上去了:

    etc  test
    [root@liuyi ~]# ls /lcr/etc/
    abc                      httpd                     rc2.d
    adjtime                  init.d                    rc3.d
    aliases                  inittab                   rc4.d
    aliases.db               inputrc                   rc5.d
    alternatives             iproute2                  rc6.d
    anacrontab               issue                     rc.d
    asound.conf              issue.net                 rc.local
    audisp                   kdump.conf                redhat-release
    audit                    kernel                    resolv.conf
    bash_completion.d        krb5.conf                 rhsm
    bashrc                   krb5.conf.d               rpc
    bbb                      ld.so.cache               rpm
    binfmt.d                 ld.so.conf                rsyncd.conf
    chkconfig.d              ld.so.conf.d              rsync.pass
    cron.d                   libaudit.conf             rsyslog.conf
    cron.daily               libnl                     rsyslog.d
    cron.deny                libuser.conf              rwtab
    cron.hourly              locale.conf               rwtab.d
    cron.monthly             localtime                 sasl2
    crontab                  login.defs                securetty
    cron.weekly              logrotate.conf            security
    crypttab                 logrotate.d               selinux
    csh.cshrc                lvm                       services
    csh.login                machine-id                sestatus.conf
    dbus-1                   magic                     shadow
    default                  mailcap                   shadow-
    depmod.d                 makedumpfile.conf.sample  shells
    dhcp                     man_db.conf               skel
    DIR_COLORS               mime.types                ssh
    DIR_COLORS.256color      mke2fs.conf               ssl
    DIR_COLORS.lightbgcolor  modprobe.d                statetab
    dracut.conf              modules-load.d            statetab.d
    dracut.conf.d            motd                      subgid
    e2fsck.conf              mtab                      subuid
    environment              my.cnf                    subversion
    ethertypes               my.cnf.d                  sudo.conf
    exports                  NetworkManager            sudoers
    favicon.png              networks                  sudoers.d
    filesystems              nsswitch.conf             sudo-ldap.conf
    firewalld                nsswitch.conf.bak         sysconfig
    fstab                    openldap                  sysctl.conf
    fuse.conf                opt                       sysctl.d
    gcrypt                   os-release                systemd
    gdbinit                  pam.d                     system-release
    gdbinit.d                passwd                    system-release-cpe
    GeoIP.conf               passwd-                   tcsd.conf
    GeoIP.conf.default       pkcs11                    terminfo
    gnupg                    pki                       tmpfiles.d
    GREP_COLORS              plymouth                  tuned
    groff                    pm                        udev
    group                    polkit-1                  vconsole.conf
    group-                   popt.d                    vimrc
    grub2.cfg                postfix                   virc
    grub.d                   ppp                       vmware-tools
    gshadow                  prelink.conf.d            wgetrc
    gshadow-                 printcap                  wpa_supplicant
    gss                      profile                   X11
    host.conf                profile.d                 xdg
    hostname                 protocols                 xinetd.d
    hosts                    python                    yum
    hosts.allow              rc0.d                     yum.conf
    hosts.deny               rc1.d                     yum.rep
    
  • 相关阅读:
    inner join 与 left join 之间的区别
    pdo Call to a member function setFetchMode() on boolean in
    PHP用星号隐藏用户名中间部分
    phpstorm里面无法配置deployment问题
    替换字符串中间部分为*
    tp3.2中between的用法
    PHP中的$this用法
    PhpStorm中实现代码自动换行
    ORM常用操作介绍
    django的admin的基础配置和使用
  • 原文地址:https://www.cnblogs.com/ly0629/p/10782446.html
Copyright © 2011-2022 走看看