介绍
Serf是一个分散的服务编排和服务发现工具。 它是非常容错和分散的,没有像其他类似工具的单点故障。 Serf可用于触发系统集群中的任何事件以及执行监视任务。 它建立在Gossip协议之上,专为分散式通信而设计。 为了节点加入Serf集群,节点仅需要最初知道集群中另一个节点的地址。 一旦节点加入,所有成员资格信息将在整个集群中传播。 Gossip协议使Serf极易设置和配置。
使用多个VPS
Serf设计为跨多个VPS和机器运行,并与nix,windows和Mac OS系统兼容。 本教程将向您展示如何在两个不同的Ubuntu服务器上设置Serf。
在本教程中,服务器将被命名为SerfNode1和SerfNode2。 您需要知道每个服务器的IP地址; 以下IP地址用于表示本教程中的每个VPS。 [无论您在教程中看到这些IP地址,您都将替换为您自己的IP地址]。
SerfNode1 | 1.1.1.1
SerfNode2 | 2.2.2.2
安装Serf
这将需要在两个SerfNode1和SerfNode2完成
下载最新的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
是如果用户事件的LamportTimeSERF_EVENT
为“用户”。
当触发事件时,以下是事件命令的布局:
serf event [SERF_EVENT_NAME] [PAYLOAD]
有效内容是事件名称后面的任何内容。 有效负载被脚本解释为stdin。
当使用自定义用户事件,则SERF 用户事件变量应该被用来代替SERF_EVENT变量。
结论
Serf是在一组机器上触发事件的好方法。 它简单,轻便,容错。 除了这些伟大的功能,它是非常分散的,没有单点故障。 一些示例用例是:系统配置,部署,安全更新,消息广播和服务器监视。 Serf也是非常可定制的,并且可以适应于解决各种各样的问题。
对农奴的更多信息和文件,可以发现在这里 。