lsyncd 多服务器同步

Summary: Author: 张亚飞 | 阅读时间: 4 minute read | Published: 2016-03-08
Filed under Categories: DevOpsTags: Linux, Server, Software, DevOps,

lsyncd 多服务器同步

sudo apt install lsyncd
  • 修改默认 lsyncd.pid 位置
sudo vi /etc/init.d/lsyncd

#PIDFILE=/tmp/$NAME.pid
PIDFILE=/tmp/$NAME.pid

否则使用普通用户身份启用 service lsyncd start 会报如下错误

Tue Aug 02 11:34:25 coam@coam:~$ service lsyncd start
 * Starting synchronization daemon lsyncd                                   11:34:36 Error: Terminating since out of inotify watches.
Consider increasing /proc/sys/fs/inotify/max_user_watches
Cannot open logfile [/var/log/lsyncd/lsyncd.log]!
                                                                      [fail]
  • lsyncd 安装后没有自动生成所需要的配置文件和目录,每台服务器都需要手动创建以下文件:
$ sudo mkdir /etc/lsyncd
$ sudo touch /etc/lsyncd/lsyncd.conf.lua

$ sudo mkdir /var/log/lsyncd
$ sudo touch /var/log/lsyncd/lsyncd.{log,status}

# 更改日志目录及文件写入权限
$ sudo chmod -R 755 /var/log/lsyncd
$ sudo chown coam.coam /var/log/lsyncd
$ sudo chmod -R 755 /var/log/lsyncd/*
$ sudo chown coam.coam /var/log/lsyncd/*
  • 源服务器 47.90.15.40 添加配置文件 – 目标服务器不用添加任何关于此的配置文件,只需要 apt install lsyncd 安装 lsyncd
settings {
    pidfile = "/var/log/lsyncd/lsyncd.pid", -- pid文件路径
    logfile = "/var/log/lsyncd/lsyncd.log", --日志路径
    statusFile = "/var/log/lsyncd/lsyncd.status", -- 状态文件
    statusInterval = 1, --状态文件写入最短时间
    maxDelays = 1, -- 最大延迟
    nodaemon = true, -- 是否开启console调试模式
    insist = true --ssh远程连接失败后是否尝试连接
}

sync {
    default.rsyncssh,
    source = "/data/home/coam/ServerCoam",
    host = "47.90.15.40",
    targetdir = "/data/home/coam/ServerCoam",
    exclude={ "*.log", "*.tmp"},
    rsync = {
        binary = "/usr/bin/rsync", -- rsync 版本需3以上
        archive = true, --归档
        compress = false, --压缩
        verbose = true,
        owner = true, --属主
        perms = true, --权限
        _extra = {"--bwlimit=50000"},
    }
}

sync {
    default.rsyncssh,
    source = "/data/home/coam/ServerCoam",
    host = "45.32.80.56",
    targetdir = "/data/home/coam/ServerCoam",
    exclude={ "*.log", "*.tmp"},
    rsync = {
        binary = "/usr/bin/rsync", -- rsync 版本需3以上
        archive = true, --归档
        compress = false, --压缩
        verbose = true,
        owner = true, --属主
        perms = true, --权限
        _extra = {"--bwlimit=50000"},
    }
}
  • 配置本地机器和远程机器 coam 帐号无密码 ssh 登陆,并在远程机器上(假设 IP 是 43.241.222.110)创建目标同名 ~/ServerCoam 目录

ssh-keygen 产生公钥与私钥对. ssh-copy-id 将本机的公钥复制到远程机器的 authorized_keys 文件中,ssh-copy-id 也能让你有到远程机器的 home, ~./ssh, 和 ~/.ssh/authorized_keys 的权利

//# 47.90.15.40$ sudo su
# ssh-keygen -t rsa
# ssh-copy-id -p 22312 coam@43.241.222.110  ###用 *ssh-copy-id* 将公钥复制到远程机器中

# ssh 43.241.222.110
# mkdir /ServerCoam
  1. 默认使用 root 用户的 ssh 密钥对-需要以 root 身份权限在当前同步源服务器 /home/root/.ssh/id_* 创建 id_rsa 密钥对,否则通过 sudo service lsyncd start 启动或更改源目录文件时会出现很多 需要填写 目标服务器 root@43.241.222.110 的密码,ssh authorized_keys 授权失效
  2. 或者通过普通用户 coam 创建的密钥对,但是通过普通用户权限启动 lsyncd 服务 service lsyncd start -因为目标服务器均关闭root用户登陆,所以采用此方法
  3. 也可以在配置文件特别注明或将 id_rsa 私钥复制到 /home/root/.ssh/ 下 - 未验证
  • 配置好后就可以在本地机器上启动 lsyncd 服务了,启动服务后本地机器 /home/vpsee/local 下的目录会自动同步到远程机器的 /remote 目录下:
$ sudo service lsyncd restart       ======> 使用 root 用户创建的授权ssh无密码授权登陆
$ service lsyncd restart            ======> 使用普通用户 coam 创建的授权ssh无密码授权登陆--注意,要修改相应的 */var/run/lsyncd.pid* 和 */var/log/lsyncd/lsyncd.log* 权限为 coam

如果有多个主机,只需要将生成的 authorized_keys 拷贝到相应的服务器root/.ssh/下,authorized_keys不要使用复制粘贴,使用cat方式

参考列表


lsyncd.conf 配置选项说明

  • settings

里面是全局设置,–开头表示注释,下面是几个常用选项说明:

logfile 定义日志文件
sta.usFile 定义状态文件
nodaemon=true 表示不启用守护模式,默认
statusInterval 将lsyncd的状态写入上面的statusFile的间隔,默认10秒
inotifyMode 指定inotify监控的事件,默认是CloseWrite,还可以是Modify或CloseWrite or Modify
maxProcesses 同步进程的最大个数.假如同时有20个文件需要同步,而maxProcesses = 8,则最大能看到有8个rysnc进程
maxDelays 累计到多少所监控的事件激活一次同步,即使后面的delay延迟时间还未到
  • sync

里面是定义同步参数,可以继续使用maxDelays来重写settings的全局变量.一般第一个参数指定lsyncd以什么模式运行:rsync. rsyncssh. direct三种模式:

  1. default.rsync :本地目录间同步,使用rsync,也可以达到使用ssh形式的远程rsync效果,或daemon方式连接远程rsyncd进程; default.direct :本地目录间同步,使用cp. rm等命令完成差异文件备份; default.rsyncssh :同步到远程主机目录,rsync的ssh模式,需要使用key来认证

    source 同步的源目录,使用绝对路径. target 定义目的地址.对应不同的模式有几种写法: /tmp/dest :本地目录同步,可用于direct和rsync模式 172.29.88.223:/tmp/dest :同步到远程服务器目录,可用于rsync和rsyncssh模式,拼接的命令类似于/usr/bin/rsync -ltsd –delete –include-from=- –exclude=* SOURCE TARGET,剩下的就是rsync的内容了,比如指定username,免密码同步 172.29.88.223::module :同步到远程服务器目录,用于rsync模式

  2. init 这是一个优化选项,当init = false,只同步进程启动以后发生改动事件的文件,原有的目录即使有差异也不会同步.默认是true

  3. delay 累计事件,等待rsync同步延时时间,默认15秒(最大累计到1000个不可合并的事件).也就是15s内监控目录下发生的改动,会累积到一次rsync同步,避免过于频繁的同步.(可合并的意思是,15s内两次修改了同一文件,最后只同步最新的文件) 监控路径里的任何部分匹配到一个文本,都会被排除,例如/bin/foo/bar可以匹配规则foo 如果规则以斜线/开头,则从头开始要匹配全部 如果规则以/结尾,则要匹配监控路径的末尾 ?匹配任何字符,但不包括/ *匹配0或多个字符,但不包括/ **匹配0或多个字符,可以是/excludeFrom 排除选项,后面指定排除的列表文件,如excludeFrom = “/etc/lsyncd.exclude”,如果是简单的排除,可以使用exclude = LIST.这里的排除规则写法与原生rsync有点不同,更为简单:

  4. delete 为了保持target与souce完全同步,Lsyncd默认会delete = true来允许同步删除.它除了false,还有startup. running值,请参考 Lsyncd 2.1.x ‖ Layer 4 Config ‖ Default Behavior.

  • rsync

(提示一下,delete和exclude本来都是rsync的选项,上面是配置在sync中的,我想这样做的原因是为了减少rsync的开销)

  1. bwlimit 限速,单位kb/s,与rsync相同(这么重要的选项在文档里竟然没有标出)
  2. compress 压缩传输默认为true.在带宽与cpu负载之间权衡,本地目录同步可以考虑把它设为false
  3. perms 默认保留文件权限.
  4. 其它rsync的选项 其它还有rsyncssh模式独有的配置项,如host. targetdir. rsync_path. password_file,见后文示例.rsyncOps={“-avz”,“–delete”}这样的写法在2.1.*版本已经不支持.

lsyncd.conf 可以有多个sync,各自的source,各自的target,各自的模式,互不影响. settings 中的 insist,这个选项默认为 false,当启动 lsyncd 服务时,若目标主机无法访问,如 ssh 登录失败等,lsyncd 服务会退出,若设置 insist 为 true,仍会启动 lsyncd 并继续尝试连接


错误分析

  • /var/log/lsyncd/lsyncd.log 不停地出现如下错误
Host key verification failed.^M
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(226) [sender=3.1.0]
Tue May 10 10:15:17 2016 Normal: Retrying startup of "/data/home/coam/Server/Run/": 255
Tue May 10 10:15:17 2016 Normal: recursive startup rsync: /data/home/coam/Server/Run/ -> 43.241.222.110:/data/home/coam/Server/Run/ excluding
*.volt.php
*.xhprof
*.tmp
*.log

而在本地服务器 47.90.15.40 可以直接通过 ssh 无密码登陆 远程服务器 43.241.222.110

于是检查以下几项

每台服务器 /etc/ssh/sshd_config 按如下段修改

StrictModes no

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile  %h/.ssh/authorized_keys

[.ssh|coam|coam/..] 三个文件夹权限都为 700,.ssh/authorized_kesy 文件权限设为 600

重启 ssh 服务

sudo service ssh restart

修改 /etc/lsyncd/lsyncd.conf.lua 开启 lsyncd 调试模式:

nodaemon = true, -- 是否开启console调试模式

重启 lsyncd,根据命令行交互模式,输入 远程 root@43.241.222.110 密码,方可解决此问题

sudo service lsyncd restart

  • 尝试启动 lsyncd 后提示 lsyncd Consider increasing /proc/sys/fs/inotify/max_user_watches 错误,默认系统配置8092,应为需要同步的目录下子文件较多,我们将其改大一些
su
echo 100000 > /proc/sys/fs/inotify/max_user_watches

但是按照上述设置,重启系统后 max_user_watches 会重新恢复到 8192,正确修改方法为:

vim /etc/sysctl.conf

在最后新添加的内容:

# Fixed /proc/sys/fs/inotify/max_user_watches 8192 Error.
fs.inotify.max_user_watches=99999999            ======>(你想设置的值)

  • 修改默认 ssh 端口为 222312 后启动 lsyncd 服务出现如下错误
ssh: connect to host 43.241.222.110 port 22: Connection refused
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(226) [sender=3.1.0]
20:56:27 Normal: Retrying startup of "/data/home/coam/ServerCoam/": 255
20:56:27 Normal: recursive startup rsync: /data/home/coam/ServerCoam/ -> 43.241.222.110:/data/home/coam/ServerCoam/ excluding
*.volt.php
*.xhprof
*.tmp
*.log

  • lsyncd 使用普通用户权限启动出现权限不够的错误

由于ssh权限的问题,导致启动 lsyncd 使用普通用户的权限启动,但是普通用户运行 lsyncd 会导致权限不够,首先 sudo vi /etc/lsyncd/lsyncd.conf.lua 开启 nodaemon = true 调试模式查看运行日志:

Sun Jun 19 15:29:54 coam@coam:~$ service lsyncd start
 * Starting synchronization daemon lsyncd
 15:30:00 Error: Cannot write pidfile; '/var/run/lsyncd.pid'
     [fail]
  • 提示权限不够
Sun Jun 19 15:31:44 coam@coam:~$ ls -al /var/run/lsyncd.pid
-rwxr-xr-x 1 root root 2540 Jun 23  2013 /var/run/lsyncd.pid
Sun Jun 19 15:32:31 coam@coam:~$ sudo chown coam.coam /var/run/lsyncd.pid
Sun Jun 19 15:32:39 coam@coam:~$ ls -al /var/run/lsyncd.pid
-rwxr-xr-x 1 coam coam 2540 Jun 23  2013 /var/run/lsyncd.pid
Sun Jun 19 15:29:54 coam@coam:~$ service lsyncd start
...

如果提示没有 /var/run/lsyncd.pid 文件,可以先执行 sudo service lsyncd start 自动生成此文件

修改 /var/run/lsyncd.pid 属主为 当前登陆普通用户 coam 重启顺利解决问题

也可以直接修改 /etc/init.d/lsyncd 中de /var/run/lsyncd.pid/tmp/lsyncd.pid


  • 源码编译安装 lsyncd

先要先安装 lua 运行环境

sudo apt install asciidoc
cd /opt/data
#git clone https://github.com/axkibe/lsyncd.git
#wget https://github.com/axkibe/lsyncd/archive/release-2.1.6.tar.gz
cd lsyncd
cmake .
make
sudo make install

sudo apt install liblua5.3-dev

我这个版本编译时有个小bug,如果按照INSTALL在build目录中make,会提示:

* [100%] Generating doc/lsyncd.1
Updating the manpage
a2x: failed: source file not found: doc/lsyncd.1.txt
make[2]: *** [doc/lsyncd.1] Error 1
make[1]: *** [CMakeFiles/manpage.dir/all] Error 2
make: *** [all] Error 2

解决办法是要么直接在解压目录下cmake,不要mkdir build,要么在CMakeList.txt中搜索doc字符串,在前面加上${PROJECT_SOURCE_DIR}.

  • 启动
/usr/local/bin/lsyncd /etc/lsyncd/lsyncd.conf.lua

其它同上…

Comments

Cor-Ethan, the beverage → www.iirii.com