目录

  • Nomad集群 自身高可用测试
    • 1.搭建nomad集群
    • 2.测试driver=docker
    • 3.测试driver=raw_exec

Nomad集群 自身高可用测试

1.搭建nomad集群

本测试使用三台ubuntu18.04虚拟机,IP地址分别为:

虚拟机1:192.168.60.10
虚拟机2:192.168.60.11
虚拟机3:192.168.60.12

每个虚拟机上都运行一个Nomad server 和一个Nomad client,每一个server对应一个client,而三个server中会有一个leader。

搭建方法参考Nomad Consul搭建集群,去除consul的部分即可。

三台虚拟机分别创建/etc/nomad.d/nomad.hcl:

datacenter = "dc1"
data_dir = "/home/xxx/nomad/data"  #自己修改路径plugin "raw_exec" {config {enabled = true}
}server {enabled = truebootstrap_expect = 2server_join {retry_join = ["192.168.60.10:4648","192.168.60.11:4648","192.168.60.12:4648"]}
}client {enabled = trueservers = ["192.168.60.10:4647"] #虚拟机1为此值,虚拟机2为192.168.60.11:4647,虚拟机3为192.168.60.12:4647
}

bootstrap_expect = 2是集群允许server的最小数量,实际server数量可以大于等于它。
当有效server数量低于bootstrap_expect,则集群会一直等待恢复,正在运行的任务不变,也不会重调度。
但要注意,bootstrap_expect的数量代表了实际工作的server数量,只有它们对应的client才会被分配任务。
为了测试高可用,需要关掉一个server,所以集群server总数为3的情况下bootstrap_expect要设为2(不能大于2),否则可能无法继续运行。
nomad_test.hcl文件中的注释可能需要去掉。

三个虚拟机都执行sudo nomad agent -config /etc/nomad.d

修改hcl配置文件时,注意先把data文件删掉或者修改data路径

查看集群情况,ubuntu1中的server是leader:

ubuntu1@ubuntu1:~$ nomad server members
Name             Address        Port  Status  Leader  Protocol  Build  Datacenter  Region
ubuntu1.global   192.168.60.10  4648  alive   true    2         1.1.3  dc1         global
ubuntu2.global   192.168.60.11  4648  alive   false   2         1.1.3  dc1         global
ubuntu3.global   192.168.60.12  4648  alive   false   2         1.1.3  dc1         globalubuntu1@ubuntu1:~$ nomad node status
ID        DC    Name     Class   Drain  Eligibility  Status
f340253b  dc1   ubuntu1  <none>  false  eligible     ready
d7dc7cb2  dc1   ubuntu2  <none>  false  eligible     ready
a9470c7f  dc1   ubuntu3  <none>  false  eligible     ready

2.测试driver=docker

以docker的http-echo镜像为例,创建httpecho.nomad:

job "docs" {datacenters = ["dc1"]group "example" {count = 1network {port "http" {static = "5678"}}restart {attempts = 1interval = "30m"delay    = "2s"mode     = "fail"}reschedule {attempts       = 15interval       = "1h"delay          = "5s"delay_function = "constant"unlimited      = false}task "server" {driver = "docker"config {image = "hashicorp/http-echo"ports = ["http"]args = ["-listen",":5678","-text","hello world",]}}}
}

在ubuntu1中执行nomad job run httpecho.nomad,结果如下:

ubuntu1@ubuntu1:~$ nomad job run httpecho.nomad
==> 2021-08-27T13:51:14+08:00: Monitoring evaluation "ac5b793f"2021-08-27T13:51:14+08:00: Evaluation triggered by job "docs"
==> 2021-08-27T13:51:15+08:00: Monitoring evaluation "ac5b793f"2021-08-27T13:51:15+08:00: Evaluation within deployment: "540742e4"2021-08-27T13:51:15+08:00: Allocation "c1c145f8" created: node "a9470c7f", group "example"2021-08-27T13:51:15+08:00: Evaluation status changed: "pending" -> "complete"
==> 2021-08-27T13:51:15+08:00: Evaluation "ac5b793f" finished with status "complete"
==> 2021-08-27T13:51:15+08:00: Monitoring deployment "540742e4"✓ Deployment "540742e4" successful2021-08-27T13:51:42+08:00ID          = 540742e4Job ID      = docsJob Version = 4Status      = successfulDescription = Deployment completed successfullyDeployedTask Group  Desired  Placed  Healthy  Unhealthy  Progress Deadlineexample     1        1       1        02021-08-27T14:01:40+08:00

sudo docker ps发现job运行在ubuntu1的client上:

ubuntu1@ubuntu1:~$ sudo docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS          PORTS                                                      NAMES
0ea066a3b0bc   hashicorp/http-echo   "/http-echo -listen …"   53 seconds ago   Up 52 seconds   192.168.60.10:5678->5678/tcp, 192.168.60.10:5678->5678/udp   server-c1c145f8-f3f9-efcf-14b2-13651aa2c6e2

可以在ubuntu2/3执行http 192.168.60.10:5678(没有http可以sudo apt-get install httpie):

ubuntu2@ubuntu2:~$ http 192.168.60.10:5678
HTTP/1.1 200 OK
Content-Length: 12
Content-Type: text/plain; charset=utf-8
Date: Fri, 27 Aug 2021 05:54:36 GMT
X-App-Name: http-echo
X-App-Version: 0.2.3hello world

现在我们将ubuntu1中运行着sudo nomad agent -config /etc/nomad.d的终端结束掉,发现ubuntu1的状态变成了left,ubuntu3变成了leader。

ubuntu2@ubuntu2:~$ nomad server members
Name             Address        Port  Status  Leader  Protocol  Build  Datacenter  Region
ubuntu1.global   192.168.60.10  4648  left    false   2         1.1.3  dc1         global
ubuntu2.global   192.168.60.11  4648  alive   false   2         1.1.3  dc1         global
ubuntu3.global   192.168.60.12  4648  alive   true    2         1.1.3  dc1         global

查看ubuntu1的docker执行状态,发现httpecho还存在,功能也可用,说明关闭server不会对client执行的docker造成影响。

ubuntu1@ubuntu1:~$ sudo docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS          PORTS                                                      NAMES
0ea066a3b0bc   hashicorp/http-echo   "/http-echo -listen …"   13 minutes ago   Up 13 minutes   192.168.60.10:5678->5678/tcp, 192.168.60.10:5678->5678/udp   server-c1c145f8-f3f9-efcf-14b2-13651aa2c6e2

但是我们看其他两个虚拟机的docker 执行情况,发现ubuntu2中也起了一个httpecho,ubuntu3没有变化:

ubuntu2@ubuntu2:~$ sudo docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED         STATUS         PORTS                                                      NAMES
e7c228d09421   hashicorp/http-echo   "/http-echo -listen …"   2 minutes ago   Up 2 minutes   192.168.60.11:5678->5678/tcp, 192.168.60.11:5678->5678/udp   server-f87ef72a-3ee0-b5c8-6f1e-0469e66d77b1

说明当运行着job的client所对应的server被关闭时,其上的job会在其他的clinet上启动。并且是否为leader和是否被选择执行job没有必然联系。

这时,我们再次在ubuntu1上开启server,sudo nomad agent -config /etc/nomad.d

发现原本仍然运行的ubuntu1中的httpecho被终止,而ubuntu2、3中的不变。

ubuntu1@ubuntu1:~$ sudo docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED         STATUS         PORTS                                                      NAMES
ubuntu2@ubuntu2:~$ sudo docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED         STATUS         PORTS                                                      NAMES
e7c228d09421   hashicorp/http-echo   "/http-echo -listen …"   13 minutes ago   Up 13 minutes   192.168.60.11:5678->5678/tcp, 192.168.60.11:5678->5678/udp   server-f87ef72a-3ee0-b5c8-6f1e-0469e66d77b1
ubuntu3@ubuntu3:~$ sudo docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED         STATUS         PORTS                                                      NAMES

说明被关闭的server被恢复之后,job的执行会保持现状,并不会恢复到关闭之前的状态,多余的job会被关闭。

3.测试driver=raw_exec

编写简单程序main.c

#include <stdio.h>
int main()
{while(1){sleep(10);}return 0;
}

gcc main.c -o main.out编译。

sudo cp main.out /usr/拷贝到/usr下面,三个虚拟机都要完成以上操作。

创建exec.nomad:

job "exec" {datacenters = ["dc1"]type = "batch"group "execg" {count = 1restart {attempts = 1interval = "30m"delay    = "0s"mode     = "fail"}reschedule {attempts       = 15interval       = "1h"delay          = "5s"delay_function = "constant"unlimited      = false}task "exect" {driver = "raw_exec"config {command = "/usr/main.out"}}}
}

在ubuntu1中执行nomad job run exec.nomad,结果如下:

ubuntu1@ubuntu1:~$ nomad job run exec.nomad
==> 2021-08-30T16:08:45+08:00: Monitoring evaluation "562ed36f"2021-08-30T16:08:45+08:00: Evaluation triggered by job "exec"
==> 2021-08-30T16:08:46+08:00: Monitoring evaluation "562ed36f"2021-08-30T16:08:46+08:00: Allocation "b798e296" created: node "d7dc7cb2", group "execg"2021-08-30T16:08:46+08:00: Evaluation status changed: "pending" -> "complete"
==> 2021-08-30T16:08:46+08:00: Evaluation "562ed36f" finished with status "complete"

ps -ef发现job运行在ubuntu2的client上:

ubuntu2@ubuntu2:~$ ps -ef
...
root      41559      2  0 16:07 ?        00:00:00 [kworker/u256:1-]
root      41599  40421  0 16:08 pts/0    00:00:00 /usr/bin/nomad logmon
root      41608  40421  0 16:08 ?        00:00:00 /usr/bin/nomad executor {"LogF
root      41616  41608  0 16:08 ?        00:00:00 /usr/main.out
ubuntu2   41633  40566  0 16:09 pts/3    00:00:00 ps -ef

现在我们将ubuntu2中运行着sudo nomad agent -config /etc/nomad.d的终端结束掉,发现ubuntu2的状态变成了left。

ubuntu1@ubuntu1:~$ nomad server members
Name             Address        Port  Status  Leader  Protocol  Build  Datacenter  Region
ubuntu1.global   192.168.60.10  4648  alive   false   2         1.1.3  dc1         global
ubuntu2.global   192.168.60.11  4648  left    false   2         1.1.3  dc1         global
ubuntu3.global   192.168.60.12  4648  alive   true    2         1.1.3  dc1         global

查看ubuntu2的进程执行状态,发现main.out进程还存在,说明关闭server不会对client执行的exec造成影响。

但是我们看其他两个虚拟机的进程执行情况,发现ubuntu1中也起了一个main.out进程,ubuntu3没有变化:

ubuntu1@ubuntu1:~$ ps -ef
root      85269  75952  0 16:12 pts/1    00:00:00 /usr/bin/nomad logmon
root      85278  75952  0 16:12 ?        00:00:00 /usr/bin/nomad executor {"LogF
root      85286  85278  0 16:12 ?        00:00:00 /usr/main.out
root      85460      2  0 16:12 ?        00:00:00 [kworker/u256:1-]
ubuntu1   85576  76826  0 16:13 pts/3    00:00:00 ps -ef

说明当运行着任务的client所对应的server被关闭时,其上的任务会在其他的clinet上启动。

这时,我们再次在ubuntu2上开启server,sudo nomad agent -config /etc/nomad.d

发现原本仍然运行的ubuntu2中的main.out进程被终止,而ubuntu1、3中的不变。

说明被关闭的server被恢复之后,任务的执行会保持现状,并不会恢复到关闭之前的状态,多余的任务会被关闭。

Nomad集群 自身高可用测试相关推荐

  1. 【带你重拾Redis】Redis 哨兵集群实现高可用

    Redis 哨兵集群实现高可用 哨兵的介绍 sentinel,中文名是哨兵.哨兵是 Redis 集群架构中非常重要的一个组件,主要有以下功能: 集群监控:负责监控 Redis master 和 sla ...

  2. 蚂蚁集团万级规模 k8s 集群 etcd 高可用建设之路

    蚂蚁集团运维着可能是全球最大的 k8s 集群:k8s 官方以 5k node 作为 k8s 规模化的顶峰,而蚂蚁集团事实上运维着规模达到 10k node 规模的 k8s 集群.一个形象的比喻就是,如 ...

  3. K8S集群Master高可用实践

    本文将在前文基础上介绍k8s集群的高可用实践,一般来讲,k8s集群高可用主要包含以下几个内容: 1.etcd集群高可用 2.集群dns服务高可用 3.kube-apiserver.kube-contr ...

  4. Redis面试 - 哨兵集群实现高可用

    Redis 哨兵集群实现高可用 哨兵的介绍 sentinel,中文名是哨兵.哨兵是 redis 集群机构中非常重要的一个组件,主要有以下功能: 集群监控:负责监控 redis master 和 sla ...

  5. nginx两台文件服务器集群,keepalived结合nginx状态检测脚本实现对web服务器集群的高可用...

    实验环境 两台CentOS-7.5虚拟机 web1:10.0.11.203 web2:10.0.11.204 VIP :10.0.11.210 web类型:nginx 客户端:自用笔记本(win10) ...

  6. Redis 哨兵集群实现高可用

    哨兵的介绍 sentinel,中文名是哨兵.哨兵是 redis 集群机构中非常重要的一个组件,主要有以下功能: 1,集群监控:负责监控 redis master 和 slave 进程是否正常工作. 2 ...

  7. 蚂蚁集团于雨:万级规模 K8S 集群 Etcd 高可用建设之路

    -     前言    - 蚂蚁集团运维着可能是全球最大的 k8s 集群:k8s 官方以 5k node 作为 k8s 规模化的顶峰,而蚂蚁集团事实上运维着规模达到 10k node 规模的 k8s ...

  8. 数据库集群和高可用解决方案

    数据库集群和高可用解决方案 参考文章: (1)数据库集群和高可用解决方案 (2)https://www.cnblogs.com/Newd/p/9049873.html 备忘一下.

  9. web应用的负载均衡、集群、高可用(HA)解决方案

    web应用的负载均衡.集群.高可用(HA)解决方案 参考文章: (1)web应用的负载均衡.集群.高可用(HA)解决方案 (2)https://www.cnblogs.com/huojg-21442/ ...

最新文章

  1. Redis中的过期策略
  2. linux var目录满了,Linux入门教程:/var/spool/clientmqueue 占满根目录
  3. 使用Testcontainers和PostgreSQL,MySQL或MariaDB的Spring Boot测试
  4. 半年辞退30多个程序员,大厂“开猿节流”太狠了!
  5. 微信支付,银联支付,支付宝支付——三大支付总结
  6. anaconda如何做python笔记_python笔记
  7. 为资产分类定义折旧范围_SAP折旧范围概念
  8. java 万年历_java万年历代码仅供参考
  9. pipreqs 命令 ConnectionResetError(10054, ‘An existing connection was forcibly closed by the remote hos
  10. python判断excel某单元格是否为空
  11. android 热点 连接电脑上网,安卓手机做wifi热点让笔记本上网的方法
  12. MapReduce作业提交流程
  13. 2018-03-05 百度AI API说明
  14. 保龄球记分程序c语言,保龄球的计分规则和比赛规则
  15. JS实现方块颜色的渐变
  16. 14.0高等数学五- 函数的幂级数展开(泰勒级数或者麦克劳林级数)
  17. Google Adsense优化SEO选词技巧
  18. 自我和对自我与他人关系的思考
  19. 一文看懂四大汽车总线:LIN、CAN、FlexRay、MOST
  20. linux免费私人云盘软件,私人云盘搭建教程 如何自己搭建云盘

热门文章

  1. 对接银行的方法与流程
  2. 一篇文章理解Promise原理
  3. Mysql Oracle Sql server 三种数据库默认端口
  4. 微信小程序计算时间差
  5. 研华PCI板卡驱动装不了问题解决
  6. subtract用法c语言,操作 subtract() - 闪电教程JSRUN
  7. 这个在线文本编辑器的源代码
  8. 如何将网站发布上线,配合宝塔Linux面板,小白级教程
  9. node 项目打包工具ncc
  10. Latex 常用(插入图片、参考文献等)