运行一个高可用的服务

使用CoreOS最大的好处就是你可以以高可用的方式来运行你的服务。接下来我们将部署两个一样的Apache web server容器。然后,我们将通过让一台机器出现故障,fleet将在其它机器上重新启动我们的任务。

首先,让我们写一个将会运行两个副本的unit文件。为了实现这个目标,我们用一个unit模板,名字是apache@.service。它将会是apache@1.service 和 apache@2.service的基础配置。

[Unit]
Description=My Apache Frontend
After=docker.service
Requires=docker.service [Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill apache1
ExecStartPre=-/usr/bin/docker rm apache1
ExecStartPre=/usr/bin/docker pull coreos/apache
ExecStart=/usr/bin/docker run --rm --name apache1 -p 80:80 coreos/apache /usr/sbin/apache2ctl -D FOREGROUND
ExecStop=/usr/bin/docker stop apache1 [X-Fleet]
Conflicts=apache@*.service

fleet通过Conflicts属性来知道这两个服务将不会运行在同一个机器上,提供了高可用。更详细的配置配置节点将会在fleet units guide找到。

让我们在启动两个unit在不同的机器吧。

$ fleetctl start apache@1
$ fleetctl start apache@2
$ fleetctl list-units
UNIT MACHINE ACTIVE SUB
myapp.service c9de9451.../10.10.1.3 active running
apache@1.service 491586a6.../10.10.1.2 active running
apache@2.service 148a18ff.../10.10.1.1 active running

就像你看到的一样,Apache单元现在已经运行在我们集群中的两个不同的机器中了。

那我们怎么样给这些容器分发请求呢?最好的策略就是运行一个搭档容器来履行相关的职责,而不是直接内置到应用里面。例如搭档容器就是用来服务发现和控制外部负载均衡或DNS

故障恢复

fleet集群中的机器不断地与集群中的其他人进行通信,并选出一个领导者做出决策。领导负责解析新提交units,并找到一个合格的机器运行(通过x-fleet参数),然后通知机器启动unit。

当一个机器没能给fleet leader发回心跳包,所有运行在这台机器上的units会被重新调度。通过这个流程,每个unit都能找到合适的机器来运行,他们将运行在新的机器上。在这个合适的机器没有找到之前,units不会重新运行。如果失败的机器恢复了,fleet leader 会告诉他停掉已经重新调度的units,并且这台机器将被用来新的工作。

你可以通过停掉一台机器上的fleet进程(sudo systemctl stop fleet)来测试Apache unit。fleet的日志(sudo journalctl -u fleet)将会体统更清晰的过程。

运行一个简单的搭档

这个简单的搭档的例子就是服务发现,这个unit连续的宣布我们的容器已经在运行了。我们可以为每一个已经运行了的Apache unit运行一个搭档,我们将要用一个unit的模板来启动两个实例。做一个模板叫做apache-discovery@.service。

[Unit]
Description=Announce Apache1
BindsTo=apache@%i.service
After=apache@%i.service [Service]
ExecStart=/bin/sh -c "while true; do etcdctl set /services/website/apache@%i '{ \"host\": \"%H\", \"port\": 80, \"version\": \"52c7248a14\" }' --ttl 60;sleep 45;done"
ExecStop=/usr/bin/etcdctl rm /services/website/apache@%i [X-Fleet]
MachineOf=apache@%i.service

这个unit有几个简单的特性。首先,它使用BindsTo来连接我们的apache@%i.service unit。当Apache unit 停止运行的时候,他也会从我们的etcd中的/services/website目录中移除。当我们的机器因某种原因突然停止的时候,60秒后将会把unit从我们的目录中移除。

第二就是%i,一个内置的系统变量,代表一个实例化单元实例名称(一个单元推出一个模板)。这个变量在单元名称中的任何值之后扩展到任何值。在我们的例子中,它将扩大到1(Apache-discovery@1)和2(apache-discovery@2)。

Third is %H, a variable built into systemd, that represents the hostname of the machine running this unit. Variable usage is covered in our Getting Started with systemd guide as well as in systemd documentation.

第三为%H,一个内置的系统变量,表示运行机器的主机名。变量使用说明详见Getting Started with systemd或是systemd documentation

第四是一个fleet特有的属性,叫做MachineOf。这个属性的作用是让单元被放置在运行Apache服务的同一机器上(例如,apache-discovery@1.service将被安排在同一台机器上的Apache@1.service)。

让我们来验证每个单元被放置在Apache服务的同一台机器上:

$ fleetctl start apache-discovery@1
$ fleetctl start apache-discovery@2
$ fleetctl list-units
UNIT MACHINE ACTIVE SUB
myapp.service c9de9451.../10.10.1.3 active running
apache@1.service 491586a6.../10.10.1.2 active running
apache@2.service 148a18ff.../10.10.1.1 active running
apache-discovery@1.service 491586a6.../10.10.1.2 active running
apache-discovery@2.service 148a18ff.../10.10.1.1 active running

现在,我们来验证一下服务发现是否能正常工作

$ etcdctl ls /services/ --recursive
/services/website
/services/website/apache@1
/services/website/apache@2
$ etcdctl get /services/website/apache@1
{ "host": "ip-10-182-139-116", "port": 80, "version": "52c7248a14" }

运行一个外部的伙伴服务

如果你在云中运行,许多服务都可以在集群中的行为的基础上实现自动化。例如,您可以更新DNS记录或添加新的容器来负载均衡。我们的fleet的例子部署包含预存在容器更新亚马逊的弹性负载平衡器与新的后台。 视频地址

Fleet-运行一个高可用的服务的更多相关文章

  1. 微服务配置内容《网上copy》=========》如何创建一个高可用的服务注册中心

    前言:首先要知道什么是一个高可用的服务注册中心,基于spring boot建成的服务注册中心是一个单节点的服务注册中心,这样一旦发生了故障,那么整个服务就会瘫痪,所以我们需要一个高可用的服务注册中心, ...

  2. SpringCloud学习系列之一 ----- 搭建一个高可用的注册中心(Eureka)

    前言 本篇主要介绍的是SpringCloud相关知识.微服务架构以及搭建一个高可用的服务注册与发现的服务模块(Eureka). SpringCloud介绍 Spring Cloud是在Spring B ...

  3. 高可用Redis服务架构分析与搭建

    基于内存的Redis应该是目前各种web开发业务中最为常用的key-value数据库了,我们经常在业务中用其存储用户登陆态(Session存储),加速一些热数据的查询(相比较mysql而言,速度有数量 ...

  4. 高可用Redis服务架构分析与搭建(单redis实例)

    原文地址:https://www.cnblogs.com/xuning/p/8464625.html 基于内存的Redis应该是目前各种web开发业务中最为常用的key-value数据库了,我们经常在 ...

  5. Java生鲜电商平台-高可用微服务系统如何设计?

    Java生鲜电商平台-高可用微服务系统如何设计? 说明:Java生鲜电商平台高可用架构往往有以下的要求: 高可用.这类的系统往往需要保持一定的 SLA,7*24 时不间断运行不代表完全不挂,而是有一定 ...

  6. Cluster基础(四):创建RHCS集群环境、创建高可用Apache服务

    一.创建RHCS集群环境 目标: 准备四台KVM虚拟机,其三台作为集群节点,一台安装luci并配置iSCSI存储服务,实现如下功能: 使用RHCS创建一个名为tarena的集群 集群中所有节点均需要挂 ...

  7. 如何安装一个高可用K3s集群?

    作者介绍 Janakiram MSV是Janakiram & Associates的首席分析师,也是国际信息技术学院的兼职教师.他也是Google Qualified Developer.亚马 ...

  8. 每天响应数亿次请求,腾讯云如何提供高可用API服务?

    每天响应数亿次请求,腾讯云如何提供高可用API服务? https://mp.weixin.qq.com/s/OPwlHcqkaTT_gcwHfr5Shw 李阳 云加社区 2020-09-16 导语 | ...

  9. lvs+keep搭建高可用web服务

    title: lvs+keep搭建高可用web服务 date: 2015-11-26 22:11:55 tags: --- 第一部分 概念 负载均衡 生产环境下必不可少的基础手段当前大部分互联网都使用 ...

随机推荐

  1. 「LuoguP1429」 平面最近点对(加强版)

    题目描述 给定平面上n个点,找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的 输入输出格式 输入格式: 第一行:n:2≤n≤200000 接下来n行:每行两个实数:x y, ...

  2. 浅析C语言中strtol()函数与strtoul()函数的用法

    转自:http://www.jb51.net/article/71463.htm C语言strtol()函数:将字符串转换成long(长整型数) 头文件: ? 1 #include <stdli ...

  3. wpf RenderTargetBitmap保存控件为图片时图片尺寸不对的问题

    使用RenderTargetBitmap渲染图片时,必须在需要渲染的控件外层包含一个border控件,不然渲染的图片返回就会出现问题. 如下: <Grid> <Grid.RowDef ...

  4. eclipse必备快捷键

    1.[ Ctrl + Shift+ P  ],查找括号的开始和闭合 2.[ALT+/],这个快捷键应该没有人不知道 3.[Ctrl+O],显示类中方法和属性的大纲,能快速定位类的方法和属性,在查找Bu ...

  5. CABasicAnimation动画及其keypath值和作用

    //tarnsform放大缩小动画 CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transf ...

  6. JavaScript 检验变量

    创建: 2019/02/20 迁入: 删除[WIP]标签(因为随时更新, 不存在完成不完成)   从[JavaScript 式与运算符]迁入typeof 更新: 2019/03/25 补充静态变量与参 ...

  7. Intellij IDEA生成JavaDoc(转)

    Intellij IDEA生成JavaDoc(转)

  8. 洛谷U3348 A2-回文数

    U3348 A2-回文数 题目背景 方方方很喜欢回文数,于是就有了一道关于回文数的题目. 题目描述 求从小到大第n(1<=n<=10^18)个回文数. 注释:出题人认为回文数不包括0. 输 ...

  9. git 基本操作——上传文件与项目分支管理

    创建并转入新分支:git checkout –b XX(其中XX代表分支名称) 将新分支发布在github上: git push origin Branch1 往分支中添加文件:git add mas ...

  10. for循环,递归,函数封装作业

    /******求100以内,所有的奇数和,求100以内,所有的偶数积*******/ // for循环方法   var sum=0; var sum1=1; for(var i=1;i<=100 ...