/文章

csync2+lsyncd部署文档

文章目录

一.安装csync2和lsyncd

首先安装csync2和lsyncd,这里我们使用yum安装

yum install csync2 lsyncd

然后打开/etc/xinetd.d/csync2,将里边的desable选项修改为no,修改完后内容如下:

# default: off
# description: csync2
service csync2
{
        flags = REUSE
        socket_type = stream
        wait = no
        user = root
        group = root
        server = /usr/sbin/csync2
        server_args = -i
        port = 30865
        type = UNLISTED
        #log_on_failure += USERID
        disable = no
        # only_from = 192.168.199.3 192.168.199.4
}

 

其实也就是开启这个csync2的服务.
现在我们看一下这个csync2服务是不是能够启动.

chkconfig --list

 

注意下边的csync2选项,变成了on

xinetd based services:
    chargen-dgram: off
    chargen-stream: off
    csync2: on
    daytime-dgram: off
    daytime-stream: off
    discard-dgram: off
    discard-stream: off
    echo-dgram: off
    echo-stream: off
    rsync: off
    tcpmux-server: off
    time-dgram: off
    time-stream: off

我们来启动这个csync2,执行下边命令即可

service xinetd start

然后我们看一下端口是不是被监听了

netstat -nutpl | grep 30865

如果有内容则证明csync2启动成功了.

 二.生成csync2认证key

这一步还是比较简单的一个命令就可以了

csync2 -k /etc/csync2/csync2.key

 

这里就把他放到/etc/csync2目录里,这个是csync2的配置和验证目录.
PS:虚拟机这个过程比较缓慢,耐心等待一会吧~ 服务器的话很快的瞬间完成(已测试)
这个key是进行服务器和服务器之间csync2做认证用的.

 三.配置csync2的同步配置文件

先进入csync2的配置目录

cd /etc/csync2

 

PS:之后的配置文件都是在这个文件下的.

首先创建初始化配置文件
编辑文件csync2.cfg

nossl * *;
group web
{
        host xieshou-Nginx-01;
        host xieshou-Nginx-02;
        key /etc/csync2/csync2.key;
        include /Data/code/topic;
        exclude *~ .*;
        auto none;
}

 

这里的host分别为我的两台机器,这里只能是服务器名,不能使用IP地址

  1. key 使用的key就是刚才生成的csync2.key.
  2. include 是指需要同步的目录
  3. exclude 是指排除的内容,上边的是:排除~结尾的和.开头的文件或目录

 

 

四.配置各节点的csync2配置文件

 

这个配置文件是为了给lsyncd使用的.

创建第一台服务器的配置文件

编辑 csync2_nginx01.cfg

PS:各节点的配置文件格式如csync2_*.cfg,中间的*号为相应节点的名称,这个名字必须是a-z0-9之间的字符,不然会报错

nossl * *;
group web
{
        host xieshou-Nginx-01;
        host (xieshou-Nginx-02);
        key /etc/csync2/csync2.key;
        include /var/Data/code/topic;
        exclude *~ .*;
        auto none;
}

第二个host后的值被加上了(),表示链状结构,即指的是他需要向哪个机器机器推送数据,同时接收哪台机器的数据(没有括号的)

 

第二个节点的配置文件

编辑csync2_nginx02.cfg

nossl * *;
group web
{
        host (xieshou-Nginx-01);
        host xieshou-Nginx-02;
        key /etc/csync2/csync2.key;
        include /var/Data/code/topic;
        exclude *~ .*;
        auto none;
}

 

除了文件名和host中的括号不一样其它的都一样.

然后把这个机器上的/etc/csync2的内容拷贝到另外一台机子上,并替换掉原来的文件夹.完成之后就可以初始化同步了

PS:这里的include必须为绝对路径,如果路径是做的连接的话,使用csync2 -xv初始化的时候会什么都不显示

 

五.初始化同步csync2

 

在执行之前,务必确认host中的名字都是已经写好host的,不然会提示连接不到.

分别在两台机器上执行

csync2 -xv

 

如果你只有一个目录的话,你能看到如下大致内容

xieshou-Nginx-01上执行的命令结果

Marking file as dirty: /var/Data/code/topic
Connecting to host nginx02 (PLAIN) ...
Updating /var/Data/code/topic on nginx02 ...
Finished with 0 errors.

 

xieshou-Nginx-02上执行的 命令结果为空,因为刚才已经在xieshou-Nginx-01上执行过初始化同步,所以xieshou-Nginx-02上也已经通过启动的 csync2执行了这一步操作,要想在xieshou-Nginx-02上看到初始化操作,只需要在他的的那个/var/Data/code/topic 里添加个文件然后再执行就可以了,这里就不演示了.

到这里csync2的配置和同步功能就已经完成了,现在已经能够实现同步了,只是不是实时的需要自己手动去执行而已.

 

六.配置lsyncd服务

 

刚才第一步就已经将lsyncd服务安装上了,下面先看一下他的版本

lsyncd -version

 

如果你的版本是Version: 2.1.4或者更高,那你配置这个lsyncd将是一个很轻松的过程

如果你执行一下命令发现和我的结果不一样,而且是少了/etc/lsyncd.conf文件,那你就得多走点路了

whereis lsyncd

结果

lsyncd: /usr/bin/lsyncd /etc/lsyncd.conf /usr/share/man/man1/lsyncd.1.gz

 

下面先讲一下高版本的配置吧,这个比较简单

 

编辑lsyncd配置文件 /etc/lsyncd.conf

----
-- User configuration file for lsyncd.
--
-- Simple example for default rsync, but executing moves through on the target.
--
-- For more examples, see /usr/share/doc/lsyncd*/examples/
-- 
-- sync{default.rsyncssh, source="/var/www/html", host="localhost", targetdir="/tmp/htmlcopy/"}

settings {
        logident        = "lsyncd",
        logfacility     = "user",
        logfile         = "/var/log/lsyncd/lsyncd.log",
        statusFile      = "/var/log/lsyncd/status.log",
        statusInterval  = 1
}
initSync = {
        delay = 1,
        maxProcesses = 1,
        action = function(inlet)
                local config = inlet.getConfig()
                local elist = inlet.getEvents(function(event)
                        return event.etype ~= "Init"
                end)
                local directory = string.sub(config.source, 1, -2)
                local paths = elist.getPaths(function(etype, path)
                        return "\t" .. config.syncid .. ":" .. directory .. path
                end)
                log("Normal", "Processing syncing list:\n", table.concat(paths, "\n"))
                spawn(elist, "/usr/sbin/csync2", "-C", config.syncid, "-x")
        end,
        collect = function(agent, exitcode)
                local config = agent.config
                if not agent.isList and agent.etype == "Init" then
                        if exitcode == 0 then
                                log("Normal", "Startup of '", config.syncid, "' instance finished.")
                        elseif config.exitcodes and config.exitcodes[exitcode] == "again" then
                                log("Normal", "Retrying startup of '", config.syncid, "' instance.")
                                return "again"
                        else
                                log("Error", "Failure on startup of '", config.syncid, "' instance.")
                                terminate(-1)
                        end
                        return
                end
                local rc = config.exitcodes and config.exitcodes[exitcode]
                if rc == "die" then
                        return rc
                end
                if agent.isList then
                        if rc == "again" then
                                log("Normal", "Retrying events list on exitcode = ", exitcode)
                        else
                                log("Normal", "Finished events list = ", exitcode)
                        end
                else
                        if rc == "again" then
                                log("Normal", "Retrying ", agent.etype, " on ", agent.sourcePath, " = ", exitcode)
                        else
                                log("Normal", "Finished ", agent.etype, " on ", agent.sourcePath, " = ", exitcode)
                        end
                end
                return rc
        end,
        init = function(event)
                local inlet = event.inlet;
                local config = inlet.getConfig();
                log("Normal", "Recursive startup sync: ", config.syncid, ":", config.source)
                spawn(event, "/usr/sbin/csync2", "-C", config.syncid, "-x")
        end,
        prepare = function(config)
                if not config.syncid then
                        error("Missing 'syncid' parameter.", 4)
                end
                local c = "csync2_" .. config.syncid .. ".cfg"
                local f, err = io.open("/etc/csync2/" .. c, "r")
                if not f then
                        error("Invalid 'syncid' parameter: " .. err, 4)
                end
                f:close()
        end
}
local sources = {
        -- change the node1 value with respective host
        ["/Data"] = "nginx02"
}
for key, value in pairs(sources) do
        sync {initSync, source=key, syncid=value}
end

 

local sources配置项是需要监听哪个目录就写哪个,后边的是指的csync的id,需要和csync2_nginx01.cfg中的nginx01对应

这样就能通过lsyncd监听/Data/code/topic目录,然后按照csync2_nginx01.cfg的配置进行过滤同步了,多个监听目录的话设置多个参数即可如:

["/Data/code/topic"] = "nginx01"
["/usr/local/nginx/config"] = "nginx01"

 

保存之后现在就可以启动了

PS:这里的路径貌似不用是绝对路径也可以,因为我将/var/Data 链接到了 /Data上,所以在配置csync2的时候必须使用/var/Data 而这里就可以不使用了,不过为了统一还是建议都是用绝对路径,这里我就不修改了

现在可以通过

service lsyncd start

 

启动lsyncd服务

 

执行完成之后你能够通过以下命令看到服务的状态

tail -f /var/log/lsyncd/lsyncd.log

 

 

本文固定链接:http://www.bbtang.info/linux/fuwu/951.html 原文链接:csync2+lsyncd部署文档,转发请注明来源!
2 0

发表评论