• Linux 下配置多机实时同步


    没钱的时候,用此方案做网站内容的负载均衡、异地备份,经济实惠又方便(仅针对网站文件做实时同步,如果数据库,则考虑mysql的多主架构)

    一、机器配置及机房IP

    A机,位于杭州,IP: 115.33.25.25 CentOS 6.4_x64

    B机, 位于米为,IP: 192.8.172.133 CentOS 6.4 _x64

    二、基础软件

    因为要实现数据文件的实时同步,需要借助如下两个软件:

    1. rsync  可以实现将本机的文件夹mirror到另外一台机器,支持多种模式,详细请man rsync

    2. inotify-tool 可以实现监听Linux某个文件夹下的所有变动,包括添加、删除、访问、修改权限等等。

    三、实现思路

    利用inotify-tool,监听指定文件夹下的文件变化,获取变化的文件列表,利用rsync,将变动的文件实时推送到指定目标机器。

    四、实际操作

    了解了以上原理后,我们按照如下步骤来操作。

    step1.在两台机器上分别安装rsync

    yum install rsync -y #安装rsync

     step2. 配置杭州节点服务器IP115.33.25.25上的:rsyncd.conf

    mkdir /etc/rsyncd  #创建rsync的配置文件夹
    touch /etc/rsyncd/rsyncd.conf  #创建rsync.conf文件
    ln -s /etc/rsyncd/rsync.conf /etc/rsyncd.conf #软链接rsyncd.conf到etc目录
    
    vim /etc/rsyncd/rsyncd.conf #修改rsyncd.conf内容如下:
    
    uid = apache #使用apache用户对数据进行更新
    gid = apache #使用apache用户组对数据进行更新
    read only = false
    transfer logging = true
    max connections = 10
    slp refresh = 300
    hosts allow = 192.8.172.133 #杭州的机器配置:允许米国的机器IP访问本机,对于米国的配置,其IP要写成杭州的IP
    pid file = /var/run/rsyncd.pid
    lock file = /var/run/rsyncd.lock
    log file = /var/log/rsyncd.log
    log format = %h %o %f %l %b
    
    [web]  #其他机器与本机通讯时,将使用web作为module名称
    path = /var/www/html  #要同步的文件夹名
    comment = rsynctest
    read only = false            #这里要设置为false,如果为true,则其他机器无法向本机推送变更
    list = false
    auth users = hanxianlong #使用daemon启动rsync时,对方机器可以使用该用户名与本机通讯
    secrets file = /etc/rsyncd/pass_server.conf #其他机器与本机通讯时, 需要用到的用户名和密码信息,以如下格式保存:username:password
    exclude from = /etc/rsyncd/exclude.txt #同步文件时,将会被忽略的文件或文件夹列表,每个一行

    step 3. 杭州节点服务器建立rsync以daemon形式启动时需要的密码文件

    创建pass_server.conf,内容如下:

    vim /etc/rsyncd/pass_server.conf #编辑服务端的用户名和密码如下:
    hanxianlong:abc123

    chmod 600 /etc/rsyncd/pass_server.conf #修改文件权限为600,否则启动失败

    step4. 杭州节点启动rsync服务

    启动服务:

    rsync --daemon --config=/etc/rsyncd/rsyncd.conf

    Step 4.1 米国的服务器实现数据到杭州的手工推送

    rsync -avzP /var/www/ hanxianlong@115.33.25.25::web

    但此时,需要你手工输入在pass_server.conf中配置的密码abc23 为了解决这个问题,我们在米国的机器上,建立一个pass.conf文件,在执行rsync命令时,使密码从该文件中读取:

    vim /etc/rsyncd/pass.conf #编辑密码文件,内容为abc123
    abc123

    执行如下命令,不需要再输入密码:

    rsync -avzP --password-file=/etc/rsyncd/pass.conf /var/www/ hanxianlong@115.33.25.25::web

    准备工作已经完成了大半,在米国的机器上,对/var/www/目录下添加一个文件之后,执行上面的命令,到杭州的服务器上的/var/www文件夹下看看,是否已经被同步过来了?

    step5 在米国节点安装inotify-tool,实现有文件变化时主动推送

    wget http://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
    cp
    inotify-tools-3.14.tar.gz /usr/local/src/
    cd /usr/local/src
    tar -xzvf inotify-tools-3.14.tar.gz
    cd inotify-tools-3.14
    ./configure --prefix=/usr/local/inotify/ --libdir=/usr/lib64
    make && make install
    
    

     以上安装inotify-tool完成,接下来要做的是实现inotity对指定文件夹的监听:

    step 5.1 实现inotify对指定文件夹的监听,使得在有数据发生变化时同步到杭州节点

    在任意目录下,创建inotify.sh文件,并修改其权限为a+x( chmod a+x inotify.sh)

    #!/bin/sh
    src=/var/www/
    des=web
    ip=115.33.25.25 #杭州节点IP
    
    /usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format  '%T %w%f' -e modify,delete,create,attrib ${src} | while read  file
            do
                    rsync -avz --delete --progress --password-file=/etc/rsyncd/pass.conf ${src} hanxianlong@${ip}::${des} &&
                    echo "${src} was rsynced"
    #                echo "---------------------------------------------------------------------------"
            done
    ~

    step 5.2 启动监听

    nohup inotify.sh &

    Step 6. 测试是否实时将改动同步到杭州节点

    cd /var/www

    touch a.txt

    到杭州节点IP,查看/var/www下,确认文件已经同步过去,如果出现问题,可以查看 nohup.log, 根据错误信息,对数据进行排查。

     

    Step 7. Step1-4 在米国的机器上同样做一遍,注意将其中的IP修改为杭州的IP

    Step 8. Step 5-6 在杭州的机器上同样做一遍,注意将其中的IP修改为米国的IP

    Step9. 大功告成,两个机器可以实现对于文件的修改、删除的实时同步

    可能遇到的问题:

     rsync: failed to connect to X.X.X.X: No route to host (113)
      rsync error: error in socket IO (code 10) at clientserver.c(107) [sender=2.6.8]
     
      两台主机能相互ping通,报错信息 却说 没有路由到主机!
      网上搜了搜,找到了问题的答案,如下:
     
      故障原因:对方没开机、防火墙阻挡、通过的网络上有防火墙阻挡,都有可能。

      解决方法:关闭防火墙,或者把防火墙的tcp udp 的873端口打开,允许rsync通过。

      实施方案:

      1、防火墙的启动与停止

      # service iptables start / stop

      2、允许rsync通过防火墙

      为防重启将规则清除,我将规则直接加到规则配置文件里边了(/etc/sysconfig/iptables),如下:

      -A INPUT -p tcp -s X.X.X.X --dport 873 -j ACCEPT 

      注意,这条规则要加在REJECT规则前。

      加好后,重启下 iptables(# service iptables restart)。

     参考资料:

    http://250688049.blog.51cto.com/643101/1019663

    http://blog.csdn.net/songxixi/article/details/8787923

  • 相关阅读:
    图数据库的选择与对比(Neo4j)
    pip install ahocorasick报错以及Requirement already satisfied问题
    从知识图谱到认知图谱: 历史、发展与展望
    kafka(一)—— kafka安装简单使用
    python管理docker
    Javaweb前后端分离项目docker部署
    django + uwsgi + nginx部署(前后端不分离)
    坑(八)—— LayUI框架中append新的元素的问题
    docker(三)—— 避免一直输入sudo
    坑(七)—— 表单提交方式
  • 原文地址:https://www.cnblogs.com/hanxianlong/p/4583818.html
Copyright © 2020-2023  润新知