前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在一些Ubuntu服务器上设置Serf集群

如何在一些Ubuntu服务器上设置Serf集群

原创
作者头像
温浪
发布2018-08-03 18:02:51
1K0
发布2018-08-03 18:02:51
举报

介绍

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

使用多个服务器

Serf旨在运行多个服务器,并与Nix,Windows和Mac OS系统兼容。本教程将向您展示如何在两个不同的Ubuntu服务器上设置Serf。没有服务器的用户可以购买和使用腾讯云服务器或者直接在腾讯云实验室Ubuntu服务器实验。

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

SerfNode1 | 1.1.1.1

SerfNode2 | 2.2.2.2

安装Serf

这需要在SerfNode1SerfNode2上完成

下载最新的Serf包:

代码语言:txt
复制
wget https://dl.bintray.com/mitchellh/serf/0.3.0_linux_amd64.zip

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

代码语言:txt
复制
apt-get install unzip

解压缩Serf包:

代码语言:txt
复制
unzip 0.3.0_linux_amd64.zip

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

代码语言:txt
复制
mv serf /usr/local/bin

创建一个Serf集群

SerfNode1上启动第一个Serf节点:

代码语言:txt
复制
serf agent -node=**SerfNode1** -bind=1.1.1.1:7496 

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

代码语言:txt
复制
==> 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代理:

代码语言:txt
复制
serf agent -node=**SerfNode2** -bind=2.2.2.2:7497 -rpc-addr=127.0.0.1:7373 &

注意:'&'指明了命令在后台执行

告诉SerfNode2加入到SerfNode1中

代码语言:txt
复制
serf join 1.1.1.1:7496

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

代码语言:txt
复制
...
    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上,执行以下命令:

代码语言:txt
复制
serf event hello

SerfNode1上,您应该看到与此类似的内容:

代码语言:txt
复制
2014/01/16 15:48:05 [INFO] agent: Received event: user-event: hello

我们刚刚将第一个事件发送到集群。但是这个事件并没有真正执行很多。

创建自定义事件处理程序

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

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

SerfNode1上,按Ctrl + C停止Serf代理。它的输出结果如下:

代码语言:txt
复制
    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目录:

代码语言:txt
复制
cd /usr/src

打开nano:

代码语言:txt
复制
nano handler.sh

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

代码语言:txt
复制
 #!/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

输入以下命令执行脚本:

代码语言:txt
复制
chmod +x handler.sh

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

代码语言:txt
复制
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集群:

代码语言:txt
复制
serf leave

导航到/ usr / src目录:

代码语言:txt
复制
cd /usr/src

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

代码语言:txt
复制
serf agent -log-level=debug -event-handler=./handler.sh -node=**SerfNode2** -bind=2.2.2.2:7496 &

测试事件处理程序

SerfNode2上,重新加入SerfNode1

代码语言:txt
复制
serf join 1.1.1.1:7496

执行以下命令:

代码语言:txt
复制
serf event write

SerfNode1上切换到/ usr / src directoy

代码语言:txt
复制
cd /usr/src

现在你应该在directoy中看到test.txt文件。当我们从SerfNode2触发Serf事件时创建了该文件。

设置可用内存监控

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

SerfNode1上,按Ctrl + C退出Serf群集。

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

代码语言:txt
复制
cd /usr/src

打开handler.sh脚本:

代码语言:txt
复制
nano handler.sh

将脚本更改为以下内容:

代码语言:txt
复制
 #!/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事件,该事件将使用以下格式返回虚拟服务器上的可用内存:

代码语言:txt
复制
490 MB from 1.1.1.1 at Sun Jan 19 00:37:22 EST 2014

现在我们需要一种在服务器上记录这个的方法

SerfNode2上,离开Serf集群:

代码语言:txt
复制
serf leave

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

代码语言:txt
复制
cd /usr/src

创建处理程序脚本:

代码语言:txt
复制
nano handler.sh

对脚本建立以下内容:

代码语言:txt
复制
 #!/bin/bash
if [ "${SERF_USER_EVENT}" = "memresponse" ]; then
    cat >> mem.txt
    echo "\n" >> mem.txt
fi

按Ctrl + X退出nano,按Y保存,点击Enter

使脚本可执行:

代码语言:txt
复制
chmod +x handler.sh

SerfNode1上启动代理:

代码语言:txt
复制
serf agent -log-level=debug -event-handler=./handler.sh -node=**SerfNode1** -bind=1.1.1.1:7496

SerfNode2上启动代理:

代码语言:txt
复制
serf agent -log-level=debug -event-handler=./handler.sh -node=**SerfNode2** -bind=2.2.2.2:7496 &

SerfNode2上,重新加入SerfNode1

代码语言:txt
复制
serf join 1.1.1.1:7496

触发'mem'事件:

代码语言:txt
复制
serf event mem

检查mem.txt文件:

代码语言: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”。

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

代码语言:txt
复制
serf event [SERF_EVENT_NAME] [PAYLOAD]
  • 有效负载是事件名称后面的任何内容。脚本将有效负载解释为stdin。
  • 使用自定义用户事件时,应使用SERF USER EVENT变量而不是SERF_EVENT变量。

结论

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


参考文献:《How To Set Up a Serf Cluster on Several Ubuntu VPS》

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • 使用多个服务器
  • 安装Serf
  • 创建一个Serf集群
  • 事件和事件处理
  • 结论
相关产品与服务
云服务器
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档