lsyncd 多服务器同步
Summary: Author: 张亚飞 | Read Time: 4 minute read | Published: 2016-03-08
Filed under
—
Categories:
DevOps
—
Tags:
Linux,
Server,
Software,
DevOps,
lsyncd 多服务器同步
首先各服务器先安装 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
- 默认使用 root 用户的 ssh 密钥对-需要以 root 身份权限在当前同步源服务器 /home/root/.ssh/id_* 创建 id_rsa 密钥对,否则通过 sudo service lsyncd start 启动或更改源目录文件时会出现很多 需要填写 目标服务器 root@43.241.222.110 的密码,ssh authorized_keys 授权失效
- 或者通过普通用户 coam 创建的密钥对,但是通过普通用户权限启动 lsyncd 服务 service lsyncd start -因为目标服务器均关闭root用户登陆,所以采用此方法
- 也可以在配置文件特别注明或将 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三种模式:
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模式
init 这是一个优化选项,当init = false,只同步进程启动以后发生改动事件的文件,原有的目录即使有差异也不会同步.默认是true
delay 累计事件,等待rsync同步延时时间,默认15秒(最大累计到1000个不可合并的事件).也就是15s内监控目录下发生的改动,会累积到一次rsync同步,避免过于频繁的同步.(可合并的意思是,15s内两次修改了同一文件,最后只同步最新的文件) 监控路径里的任何部分匹配到一个文本,都会被排除,例如/bin/foo/bar可以匹配规则foo 如果规则以斜线/开头,则从头开始要匹配全部 如果规则以/结尾,则要匹配监控路径的末尾 ?匹配任何字符,但不包括/ *匹配0或多个字符,但不包括/ **匹配0或多个字符,可以是/excludeFrom 排除选项,后面指定排除的列表文件,如excludeFrom = “/etc/lsyncd.exclude”,如果是简单的排除,可以使用exclude = LIST.这里的排除规则写法与原生rsync有点不同,更为简单:
delete 为了保持target与souce完全同步,Lsyncd默认会delete = true来允许同步删除.它除了false,还有startup. running值,请参考 Lsyncd 2.1.x ‖ Layer 4 Config ‖ Default Behavior.
- rsync
(提示一下,delete和exclude本来都是rsync的选项,上面是配置在sync中的,我想这样做的原因是为了减少rsync的开销)
- bwlimit 限速,单位kb/s,与rsync相同(这么重要的选项在文档里竟然没有标出)
- compress 压缩传输默认为true.在带宽与cpu负载之间权衡,本地目录同步可以考虑把它设为false
- perms 默认保留文件权限.
- 其它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