Serf是一种分散的服务编排和服务发现工具。它具有极高的容错能力和分散性,与其他类似工具一样没有单点故障。Serf可用于触发系统集群中的任何事件以及执行监视任务。它建立在Gossip协议的基础之上,该协议专为分散式通信而设计。为了使节点加入Serf集群,该节点只需要最初知道集群中另一个节点的地址。节点加入后,所有成员资格信息都将在整个群集中传播。Gossip协议使Serf非常容易设置和配置。
Serf旨在运行多个服务器,并与Nix,Windows和Mac OS系统兼容。本教程将向您展示如何在两个不同的Ubuntu服务器上设置Serf。没有服务器的用户可以购买和使用腾讯云服务器或者直接在腾讯云实验室Ubuntu服务器实验。
在本教程中,服务器将命名为SerfNode1和SerfNode2。您需要知道每台服务器的IP地址; 在本教程中,以下IP地址用于表示每个服务器。[无论您在教程中何处看到这些IP地址,都将使用您自己的IP地址替换它们。
SerfNode1 | 1.1.1.1
SerfNode2 | 2.2.2.2
这需要在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
在SerfNode1上启动第一个Serf节点:
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代理:
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群集,您只需要指示服务器加入群集中已有的另一个Serf代理。Gossip协议自动通知新服务器集群中的所有其他Serf代理。
Serf非常棒的另一个原因是事件处理是多么容易。我们首先向集群发送一个事件。
发送简单的用户事件
在SerfNode2上,执行以下命令:
serf event hello
在SerfNode1上,您应该看到与此类似的内容:
2014/01/16 15:48:05 [INFO] agent: Received event: user-event: hello
我们刚刚将第一个事件发送到集群。但是这个事件并没有真正执行很多。
创建自定义事件处理程序
现在我们将配置一些自定义事件处理。Serf可以在集群中触发自定义事件,以启动诸如部署,安全更新,系统配置等事情,以及Linux计算机上任何可以编写脚本的事件。
让我们从一个简单的例子开始吧。
在SerfNode1上,按Ctrl + C
停止Serf代理。它的输出结果如下:
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
现在我们将创建一个自定义事件脚本,将“written to file”写入/ 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}"
注意:\$ {SERF USEREVENT}是我们发送的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集群:
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触发Serf事件时创建了该文件。
设置可用内存监控
我们将设置一个自定义事件处理程序,它将服务器集群上的可用内存记录到中央服务器。
在SerfNode1上,按Ctrl + C
退出Serf群集。
确保您位于/ 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
现在我们需要一种在服务器上记录这个的方法
在SerfNode2上,离开Serf集群:
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:
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
是“user”。SERF_USER_LTIME
是用户事件的LamportTime,前提是如果SERF_EVENT
是“user”。触发事件时,以下是事件命令的布局:
serf event [SERF_EVENT_NAME] [PAYLOAD]
Serf是在一组机器上触发事件的好方法。它简单,轻便,容错。除了这些强大的功能外,它还非常分散,并且没有单点故障。一些示例用例包括:系统配置,部署,安全更新,消息广播和服务器监视。Serf也是可定制的,可以适应各种问题的解决方案。
参考文献:《How To Set Up a Serf Cluster on Several Ubuntu VPS》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有