Fleet-运行一个高可用的服务
运行一个高可用的服务
使用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-运行一个高可用的服务的更多相关文章
- 微服务配置内容《网上copy》=========》如何创建一个高可用的服务注册中心
前言:首先要知道什么是一个高可用的服务注册中心,基于spring boot建成的服务注册中心是一个单节点的服务注册中心,这样一旦发生了故障,那么整个服务就会瘫痪,所以我们需要一个高可用的服务注册中心, ...
- SpringCloud学习系列之一 ----- 搭建一个高可用的注册中心(Eureka)
前言 本篇主要介绍的是SpringCloud相关知识.微服务架构以及搭建一个高可用的服务注册与发现的服务模块(Eureka). SpringCloud介绍 Spring Cloud是在Spring B ...
- 高可用Redis服务架构分析与搭建
基于内存的Redis应该是目前各种web开发业务中最为常用的key-value数据库了,我们经常在业务中用其存储用户登陆态(Session存储),加速一些热数据的查询(相比较mysql而言,速度有数量 ...
- 高可用Redis服务架构分析与搭建(单redis实例)
原文地址:https://www.cnblogs.com/xuning/p/8464625.html 基于内存的Redis应该是目前各种web开发业务中最为常用的key-value数据库了,我们经常在 ...
- Java生鲜电商平台-高可用微服务系统如何设计?
Java生鲜电商平台-高可用微服务系统如何设计? 说明:Java生鲜电商平台高可用架构往往有以下的要求: 高可用.这类的系统往往需要保持一定的 SLA,7*24 时不间断运行不代表完全不挂,而是有一定 ...
- Cluster基础(四):创建RHCS集群环境、创建高可用Apache服务
一.创建RHCS集群环境 目标: 准备四台KVM虚拟机,其三台作为集群节点,一台安装luci并配置iSCSI存储服务,实现如下功能: 使用RHCS创建一个名为tarena的集群 集群中所有节点均需要挂 ...
- 如何安装一个高可用K3s集群?
作者介绍 Janakiram MSV是Janakiram & Associates的首席分析师,也是国际信息技术学院的兼职教师.他也是Google Qualified Developer.亚马 ...
- 每天响应数亿次请求,腾讯云如何提供高可用API服务?
每天响应数亿次请求,腾讯云如何提供高可用API服务? https://mp.weixin.qq.com/s/OPwlHcqkaTT_gcwHfr5Shw 李阳 云加社区 2020-09-16 导语 | ...
- lvs+keep搭建高可用web服务
title: lvs+keep搭建高可用web服务 date: 2015-11-26 22:11:55 tags: --- 第一部分 概念 负载均衡 生产环境下必不可少的基础手段当前大部分互联网都使用 ...
随机推荐
- Swift协议
「协议」(protocol)声明一系列方法.属性.下标等用来约束其「遵循者」,进而保证「遵循者」能够完成限定的工作.「协议」本身不实现任何功能,它仅仅描述了「遵循者」的实现.「协议」能被类.结构体.枚 ...
- Java命名规范(简略)
1.包 全部小写,由域名定义前缀. 例如:teach.golddrem.javagroup 2.类 开头字母大写,后边每个单词的首字母都大写.如果有缩写,缩写部分全部大写. 例如:Informatio ...
- Python3解leetcode Single Number
问题描述: Given a non-empty array of integers, every element appears twice except for one. Find that sin ...
- [Forward]Improving Web App Performance With the Chrome DevTools Timeline and Profiles
Improving Web App Performance With the Chrome DevTools Timeline and Profiles We all want to create h ...
- algo: 冒泡排序(Java实现)
package com.liuxian.algo; public class MySortClass implements Comparable<MySortClass> { public ...
- YOLO3训练widerface数据集
因为YOLO3速度精度都很棒,所以想训练一下人脸模型,废话不多,进入正题 1写所有的配置文件 1.1 YOLO3-face.cfg 个人感觉YOLO的配置文件骑士和caffe差不多 在cfg/YOLO ...
- openstack介绍(二)
OpenStack services 本节将详细描述OpenStack服务. Compute service overview(计算服务概述) 使用OpenStack云计算计算主机和管理系统.Open ...
- ant错误 reference classes not found
使用ant提示reference classes not found错误 原因是 里面的一些属性的值要用on或者yes或者off或者no..用成其他,例如true,false的话就会有这个提示..
- UVa 11100 The Trip, 2007 (题意+贪心)
题意:有n个包,其中小包可以装到大的包里,包的大小用数字进行表示,求最小的装包数量. 析:这个题的题意不太好理解,主要是有一句话难懂,意思是让每个最大包里的小包数量的最大值尽量小,所以我们就不能随便输 ...
- 用MATLAB进行数据分析