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

介绍

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包:

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节点:

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]
  • 有效负载是事件名称后面的任何内容。脚本将有效负载解释为stdin。
  • 使用自定义用户事件时,应使用SERF USER EVENT变量而不是SERF_EVENT变量。

结论

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


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

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏安恒网络空间安全讲武堂

溯源小记

看对方的目的是什么,就是最终目标是做什么。然后根据自己经验 看看达到这个目标 需要进行什么操作 逆推回去。看看这些过程都会留下什么日志。

14020
来自专栏乐沙弥的世界

Linux网络检测相关工具用法(ping/netstat/ss/ethtool)

当新的Linux主机完成了网络配置,即可以正常接入网络后,我们可以通过Linux自带的相关工具进行网络相关检测。如最常用的ping,netstat,ss,tra...

34230
来自专栏python全栈布道师

docker安装部署sentry

笔者曾经花了很长时间去一步步安装sentry,成功过也失败过,遇到各种各样的问题,直到后来遇到了sentry,免去我安装部署之苦现在说下步骤

88930
来自专栏小狼的世界

CoreDNS介绍

开始之前先吐槽一下busybox中的nslookup命令。这个命令应该是实现的不是很完全,导致我在测试DNS的成功,得到了错误的信息。先来看一下

2K10
来自专栏晓晨的专栏

ASP.NET Core的身份认证框架IdentityServer4(9)-使用OpenID Connect添加用户认证

61830
来自专栏从流域到海域

Docker 编配 ...它是什么意思,为什么你会需要它

原文作者:Cloudify Community

25980
来自专栏分布式系统和大数据处理

基于Docker的持续集成方案(安装和配置MySql) - Part.3

这篇文章介绍了使用Docker安装MySql数据库的操作步骤,以及安装完成后如何对MySql进行配置。

21030
来自专栏小狼的世界

Kubernetes基础:Pod的详细介绍

Pod是Kubernetes中能够创建和部署的最小单元,是Kubernetes集群中的一个应用实例,总是部署在同一个节点Node上。Pod中包含了一个或多个容器...

17440
来自专栏云原生架构实践

Docker Data Center系列(一)- 快速搭建云原生架构的实践环境

DDC是Docker Data Center的简称,是Docker公司推出的容器化数据中心管理平台。它的编排核心是swarm,包含2个主要组件UCP和DTR。

21760
来自专栏Rovo89

h5ai 目录列表程序完整安装使用教程

48430

扫码关注云+社区

领取腾讯云代金券