如何建立一个农奴集群上一些Ubuntu VPS

农奴是一个分散的服务编排和服务发现工具。这是非常容错和分散,失败像其他类似的工具没有单点。农奴可以用来触发跨越系统集群任何事件以及执行监视任务。它是建立在它是专为分散式通信Gossip协议之上。

介绍


Serf是一个分散的服务编排和服务发现工具。 它是非常容错和分散的,没有像其他类似工具的单点故障。 Serf可用于触发系统集群中的任何事件以及执行监视任务。 它建立在Gossip协议之上,专为分散式通信而设计。 为了节点加入Serf集群,节点仅需要最初知道集群中另一个节点的地址。 一旦节点加入,所有成员资格信息将在整个集群中传播。 Gossip协议使Serf极易设置和配置。

使用多个VPS


Serf设计为跨多个VPS和机器运行,并与nix,windows和Mac OS系统兼容。 本教程将向您展示如何在两个不同的Ubuntu服务器上设置Serf。

在本教程中,服务器将被命名为SerfNode1SerfNode2。 您需要知道每个服务器的IP地址; 以下IP地址用于表示本教程中的每个VPS。 [无论您在教程中看到这些IP地址,您都将替换为您自己的IP地址]。

SerfNode1 | 1.1.1.1

SerfNode2 | 2.2.2.2


安装Serf


这将需要在两个SerfNode1SerfNode2完成

下载最新的Serf包:

wget https://dl.bintray.com/mitchellh/serf/0.3.0_linux_amd64.zip

安装解压缩工具以解压缩软件包:

apt-get install unzip

解压缩Serf包:

unzip 0.3.0_linux_amd64.zip

将Serf添加到二进制文件目录,以便可以从任何地方执行:

mv serf /usr/local/bin

创建Serf集群


开始在SerfNode1第一农奴节点:

serf agent -node=**SerfNode1** -bind=1.1.1.1:7496 

您应该看到类似于以下输出的内容:

==> Starting Serf agent...
==> Starting Serf agent RPC...
==> Serf agent running!
    Node name: '**SerfNode1**'
    Bind addr: '1.1.1.1:7496'
     RPC addr: '127.0.0.1:7373'
    Encrypted: false
     Snapshot: false
      Profile: lan

==> Log data will now stream in as it occurs:

    2014/01/18 21:57:57 [INFO] Serf agent starting
    2014/01/18 21:57:57 [WARN] Binding to public address without encryption!
    2014/01/18 21:57:57 [INFO] serf: EventMemberJoin: **SerfNode1** 1.1.1.1
    2014/01/18 21:57:58 [INFO] agent: Received event: member-join

注意:node参数指定节点的名称,bind表示要绑定的IP地址和端口。

SerfNode2我们会在后台启动农奴代理:

serf agent -node=**SerfNode2** -bind=2.2.2.2:7497 -rpc-addr=127.0.0.1:7373 &

注意:'&'告诉命令在后台执行

告诉SerfNode2加盟SerfNode1:

serf join 1.1.1.1:7496

您应该看到类似以下的输出:

...
    2014/01/18 22:03:04 [INFO] serf: EventMemberJoin: **SerfNode2** 2.2.2.2
    2014/01/18 22:03:05 [INFO] agent: Received event: member-join1922
...

真棒! 你现在有一个小工作Serf集群。 为了设置额外的服务器,你只是重复我们做了SerfNode2的过程。 为了加入Serf集群,您只需要指示VPS加入集群中已有的其他Serf代理。 Gossip协议自动通知群集中的所有其他Serf代理新的VPS。

事件和事件处理


Serf是如此真棒的另一个原因是事件处理是多么容易。 让我们先向集群发送一个事件。

发送简单的用户事件


SerfNode2,执行以下命令:

serf event hello

SerfNode1,你应该会看到类似这样的:

2014/01/16 15:48:05 [INFO] agent: Received event: user-event: hello

Woot! 我们刚刚发送了我们的第一个事件到集群。 好吧,这是很酷,所有,但这个事件没有真正做很多。

创建自定义事件处理程序


现在我们将配置一些自定义事件处理。 Serf可以在集群中触发自定义事件,以启动部署,安全更新,系统配置等事情。在Linux机器上可以编写脚本的任何事件,Serf都可以触发它。

让我们从一个简单的例子开始。

SerfNode1,按Ctrl + C.它应该给你下面的输出停止农奴代理:

    2014/01/16 15:58:54 [INFO] agent: requesting serf shutdown
    2014/01/16 15:58:54 [WARN] Shutdown without a Leave
    2014/01/16 15:58:54 [INFO] agent: shutdown complete

现在我们将创建一个自定义事件脚本,将“写入文件”写入/ usr / src目录中的文本文件。 当用户发送“write”事件时,它将执行此脚本。

首先让我们创建我们的事件处理程序。 事件处理程序可以是任何可执行文件 - 在我们的例子中,我们将使用一个bash文件。

切换到/ usr / src目录:

cd /usr/src

打开nano:

nano handler.sh

对事件处理程序使用以下脚本:

 #!/bin/bash
if [ "${SERF_USER_EVENT}" = "write" ]; then
        echo "written to file" >> test.txt
fi

echo "${SERF_USER_EVENT}"

注:$ {农奴用户事件}是我们发送的EVNT的名称。 注意如何使用if语句来设置不同的事件。

按Ctrl + X退出nano

按Y保存

按Enter键

使脚本可执行:

chmod +x handler.sh

现在我们将重新启动Serf代理,但这次我们将使用我们刚刚创建的事件处理程序:

serf agent -log-level=debug -event-handler=./handler.sh -node=**SerfNode1** -bind=1.1.1.1:7496

(可选步骤)

每个Serf代理可以有自己的事件处理程序。 如果你想有SerfNode2自定义事件处理程序,你只需做你为SerfNode1相同的事件处理程序的创建过程,或者你可能只是在复制事件处理程序脚本到SerfNode2服务器的/ usr / src目录下,然后执行以下命令:

SerfNode2,离开农奴集群:

serf leave

导航到/ usr / src目录:

cd /usr/src

使用自定义事件处理程序在后台启动Serf代理程序:

serf agent -log-level=debug -event-handler=./handler.sh -node=**SerfNode2** -bind=2.2.2.2:7496 &

测试事件处理程序


SerfNode2,归队SerfNode1:

serf join 1.1.1.1:7496

执行以下命令:

serf event write 

SerfNode1切换到/ usr / src目录directoy:

cd /usr/src

现在你应该在directoy中看到test.txt文件。 当我们引发了SerfNode2农奴事件时,此文件被创建。 漂亮nfty eh? 现在让我们做一些更高级的东西。

设置空闲内存监视


我们将设置一个自定义事件处理程序,它将服务器集群上的可用内存记录到中央服务器。

SerfNode1,按Ctrl + C离开农奴集群。

确保您位于/ usr / src目录中:

cd /usr/src

打开handler.sh脚本:

nano handler.sh

将脚本更改为以下内容:

 #!/bin/bash
if [ "${SERF_USER_EVENT}" = "mem" ]; then
   serf event memresponse "$(awk '/MemTotal/ {printf( "%.2f\n", $2 / 1024 ) }'              /proc/meminfo) MB from $(wget -qO- http://ipecho.net/plain ; echo) at $(date)"
fi

按Ctrl + X退出nano

按Y保存

按Enter键

此脚本将触发Serf事件,该事件将以下列格式返回虚拟服务器上的可用内存:

490 MB from 1.1.1.1 at Sun Jan 19 00:37:22 EST 2014

现在我们需要一种方法在VPS上进行日志记录

SerfNode2,离开农奴集群:

serf leave

确保您位于/ usr / src目录中:

cd /usr/src

创建处理程序脚本:

nano handler.sh

对脚本使用以下命令:

 #!/bin/bash
if [ "${SERF_USER_EVENT}" = "memresponse" ]; then
    cat >> mem.txt
    echo "\n" >> mem.txt
fi

按Ctrl + X退出nano

按Y保存

按Enter键

使脚本可执行:

chmod +x handler.sh

开始在SerfNode1代理:

serf agent -log-level=debug -event-handler=./handler.sh -node=**SerfNode1** -bind=1.1.1.1:7496

开始在SerfNode2代理:

serf agent -log-level=debug -event-handler=./handler.sh -node=**SerfNode2** -bind=2.2.2.2:7496 &

SerfNode2,归队SerfNode1 2:

serf join 1.1.1.1:7496

触发“mem”事件:

serf event mem

检查mem.txt文件:

nano mem.txt

现在您有一个可以分布在多个虚拟服务器上的正常内存监视工具。

Serf事件详细


下面是一些在创建自定义事件处理脚本时派上用场的变量。 这些都直接取自农奴网站。

  • SERF_EVENT是正在发生的事件的类型。 这将是成员加入,成员离开,成员失败或用户之一。

  • SERF_SELF_NAME是执行事件处理的节点的名称。

  • SERF_SELF_ROLE是执行事件处理的节点的作用。

  • SERF_USER_EVENT是如果用户事件类型的名称SERF_EVENT为“用户”。

  • SERF_USER_LTIME是如果用户事件的LamportTime SERF_EVENT为“用户”。

当触发事件时,以下是事件命令的布局:

serf event [SERF_EVENT_NAME] [PAYLOAD]
  • 有效内容是事件名称后面的任何内容。 有效负载被脚本解释为stdin。

  • 当使用自定义用户事件,则SERF 用户事件变量应该被用来代替SERF_EVENT变量。

结论


Serf是在一组机器上触发事件的好方法。 它简单,轻便,容错。 除了这些伟大的功能,它是非常分散的,没有单点故障。 一些示例用例是:系统配置,部署,安全更新,消息广播和服务器监视。 Serf也是非常可定制的,并且可以适应于解决各种各样的问题。

对农奴的更多信息和文件,可以发现在这里