运行一个高可用的服务

使用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. javacv实现实时视频截图和录像服务easyCV

    本项目维护于github:https://github.com/eguid/easyCV 1.介绍 本项目基于javaCV1.4.x. 其中实现了 (1)实时视频截图服务(支持rtsp/rtmp/ht ...

  2. vmware ubuntu14.04 忘记密码

    重置root密码 启动系统,一直点击esc键盘,出现如下界面,选择Advanced options for Ubuntu 按回车键确认: 选择recovery mode,按 e : 到 linux / ...

  3. Oracle查询24小时制的时间格式

    select to_date('2016-11-11 13:42:27', 'yyyy/mm/dd hh24:mi:ss') from dual.

  4. ie下使用文本编辑器导致input文本框无法聚焦的问题原因

    最近公司的一个项目遇到一个如下问题: 描述:测试发现,每当我们在发布活动的页面发布完活动后,页面跳转到我的活动,然后再次回到发布活动页面,发现所有的input文本框都不能聚焦.然后再去看看其他页面(我 ...

  5. python中re.sub的使用 --解读一段代码

    json='{ title: "条纹针织衫+蓬蓬裙套装", picSrc: "http://d05.res.meilishuo.net/pic/_o/15/f5/f2e2 ...

  6. webSocket 简单介绍

    WebSocket :WebSocket协议支持(在受控环境中运行不受信任的代码的)客户端与(选择加入该代码的通信的)远程主机之间进行全双工通信.                       简单的说 ...

  7. grep的用法(CentOS7)及有关正则表达式的使用

    环境准备:alias grep="grep --color" 1.grep以整行为单位进行处理,行中有的匹配显示出来 Last中取出符合root的行:grep  '查找字符串' l ...

  8. java面试题汇总(1)

    1)Java 中能创建 volatile 数组吗? 能,Java 中可以创建 volatile 类型数组,不过只是一个指向数组的引用,而不是整个数组.我的意思是,如果改变引用指向的数组, 将会受到 v ...

  9. 最小化安装linux CentOS-6.6后 部署fastdfs +下载地址 很干很干的干货

    参考:http://blog.itpub.net/7734666/viewspace-1292485/ 安装一些必要软件 yum -y install wget gcc perl mkdir ~/zy ...

  10. 玩转 React 服务器端渲染

    React 提供了两个方法 renderToString 和 renderToStaticMarkup 用来将组件(Virtual DOM)输出成 HTML 字符串,这是 React 服务器端渲染的基 ...