原文地址:the runtime configuration design
运行时重新配置是分布式系统中最难,最容易出错的部分,尤其是在基于共识(像etcd)的系统中。
阅读并学习关于etcd的运行时重新配置命令设计和如何追溯这些错误.

两阶段配置更新保证集群安全


在etcd中,每一次运行时重新配置安全的原因是由于两阶段更新。例如,添加一个成员,首先将新配置通知集群后启动新的成员。

  1. 阶段一 通知集群关于新的配置
    添加一个成员到etcd集群中,通过API调用请求将一个新成员添加到集群中。这是将新的成员添加到集群中唯一的方法。当集群同意配置的更新后将返回API的调用。
  2. 阶段二 启动一个新的成员
    将一个新成员加入到存在的集群中,指定正确的initial-cluster和设置initial-cluster-stateexisting.当成员启动后,它首先联系已存在的集群并验证当前集群配置是否和期望的initial-cluster匹配。当一个新的成员成功启动,集群将获得期望的配置。

用户将过程分为两个阶段需要清楚了解集群成员关系的变化。实际上,这为用户提供了更大的灵活性,并使事情更容易。例如,如果试图添加一个与集群中现有的成员Id相同的新成员到集群中,操作将会立即失败由于阶段一并没有影响到运行中的集群。提供了类似的保护阻止通过错误操作添加新的成员。如果一个新的etcd成员试图在集群接受配置信息更新之前加入集群,操作将不会被集群接受。

如果没有围绕集群成员关系的显式工作流,集群将会容易受到意料之外的集群成员关系变化的影响。例如,如果etcd在一个初始化的系统如systemd中运行,etcd将会通过成员关系API在重新启动之后被移除,并试图在启动后重新加入。这个循环将会在每次通过API成员移除并将系统设置为失败后重新启动etcd时继续,这是预料之外的。

我们希望运行时重新进行配置是不常见的操作。我们决定保持为显式的由用户驱动来确保配置安全,保持集群平稳运行在显式的控制下。

永久性的丢失要求新的集群


如果一个集群永久丢失一些主要的集群成员,需要从原始的数据文件夹启动一个新的集群恢复先前的状态。

完全有可能从已存在的集群中强制删除一个失败的成员并恢复。然而,我们决定不支持此方法因为他绕过了常规的共识提交阶段,这是不安全的。如果成员移除一个没有实际失败的成员或者是同一个集群中的不同成员,etcd将会最终得到具有相同集群Id的分散集群。这是非常危险的而且很难修复。

通过正常的部署,永久性丢失的可能性非常的小。但是这是一个严重的问题值得特别注意。我们强烈建议阅读灾难恢复文档并且在将etcd部署到生产环境之前做充足的准备。

不要在运行时重新配置中使用公共的发现服务


公共发现服务应该只在启动一个集群的时候使用。将一个成员加入已存在的集群,使用运行时配置API.

发现服务被设计用来在云服务环境中启动一个在所有的成员无法提前知道Ip地址时的etcd集群。在成功启动一个集群时,所有的成员将会知道Ip地址。典型的,发现服务奖不再被需要。
看起来使用公共的发现服务进行运行时重新配置是一个便利的方法,毕竟所有的发现服务含有所有的集群配置信息。然而依赖公共发现服务将带来问题:

  1. 将会引进外部独立性到集群的整个生命周期,不只是启动时间。如果集群和公共发现服务之间存在网络问题,则群集将因此受到影响。
  2. 公共发现服务必须在集群的生命周期内反映正确的运行时配置,将需要提供安全机制避免坏的行为,而这是困难的。
  3. 公共发现服务需要保持数万个集群的配置,而我们的公共发现服务很难承受这种负载。

为了使发现服务支持运行时配置,最好的选择是建立一个私有的发现服务。

ETCD:运行时重新配置设计的更多相关文章

  1. ETCD:运行时重新配置

    原文地址:runtime reconfiguration etcd带有增量运行时重新配置的支持.允许我们在集群运行的时候更新集群成员关系. 仅当大多数集群成员都在运行时,才能处理重新配置请求,强烈建议 ...

  2. set_include_path — 设置 include_path 配置选项为当前脚本设置 include_path 运行时的配置选项。

    说明 string set_include_path ( string $new_include_path ) 为当前脚本设置 include_path 运行时的配置选项. 参数 new_includ ...

  3. linux(centos8):firewalld的运行时日志配置

    一,firewalld配置日志的用途: 在生产环境中,firewalld的默认配置是不记录日志 我们通过日志记录下防火墙过滤时拒绝的非法ip, 可以主动把这些有攻击性的ip加入到黑名单, 防患于未然 ...

  4. maven运行时的配置及命令详解

      上面是指定端口运行程序的,也可以先指定好,直接在上面的地方写jettty:run           当然,如果你是在控制台运行且安装了maven,直接可以进入项目的文件中:mvn jetty:r ...

  5. pycharm中运行时添加配置 及pytest模式怎么修改为run模式

    会发现不是控制台输出,而是pytest模式. 修改: 当运行时,发现无法运行: 然后点击Add Configuration, 点击加号,点击Python: 选择脚本路径和解释器.点击OK即可.

  6. winform窗体运行时的大小和设计时不一致

    窗体设置的尺寸为1946*850,而电脑分辨率是1920*1280 按说宽度已经超过屏幕大小很多了,应该显示占满屏幕宽度才对,但是运行时宽度只有设计时的一半 高度最多只能是1946像素,再拉大也不管用 ...

  7. 利用etcd及confd实现配置自动管理

    ETCD etcd 架设etcd集群 静态启动etcd集群需要每个成员在集群中知道另一个成员.在许多情况下,集群成员的IP可能提前未知.在这种情况下,可以使用etcd集群的自动发现服务.一旦etcd集 ...

  8. [C#] 将NLog输出到RichTextBox,并在运行时动态修改日志级别过滤

    作者: zyl910 一.缘由 NLog是一个很好用的日志类库.利用它,可以很方便的将日志输出到 调试器.文件 等目标,还支持输出到窗体界面中的RichTextBox等目标. 而且它还支持在运行时修改 ...

  9. Android Studio的安装及第一次启动时的配置

    Android Studio的安装及第一次启动时的配置 一.下载Android Studio 百度搜索“Android Studio" 点击中文社区进入,选择最新版本下载. 下载后双击安装包 ...

随机推荐

  1. CentOS搭建yum源及EPEL仓库

    一.CentOS搭建yum源 1.备份配置文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backu ...

  2. 什么是cookie?什么是session?session和cookie有什么区别?

    在技术面试中,经常被问到“说说Cookie和Session的区别”,大家都知道,Session是存储在服务器端的,Cookie是存储在客户端的,然而如果让你更详细地说明,你能说出几点?今天个推君就和大 ...

  3. 算法题-Z 字形变换

    描述 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L C I R ...

  4. 使用 Vue + axios 时,返回状态200,返回值被浏览器拦截

    目录 一.前言 二.解决方案 1. 在全局定义 2. 单独定义 一.前言 在使用 Vue + TypeScript + axios 时,后端已经配置了Cors的前提下,但是在请求接口的时候,返回状态为 ...

  5. poj 3241 Object Clustering (曼哈顿最小生成树)

    Object Clustering Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 2640   Accepted: 806 ...

  6. ClassNotFoundException------IDEA下的一种原因

    由于直接复制文件而未经过IDE造成次异常,需要修改程序入口:

  7. 数据库day01

    作业: 1. 查看岗位是teacher的员工姓名.年龄 select name,age from staff_info where jobs = 'teacher'; 查看岗位是teacher且年龄大 ...

  8. AQS系列(五)- CountDownLatch的使用及原理

    前言 前面四节学完了AQS最难的两种重入锁应用,下面两节进入实战学习,看看JUC包中其他的工具类是如何运用AQS实现特定功能的.今天一起看一下CountDownLatch. CountDownLatc ...

  9. vue组件初始化过程

    之前文章有写到vue构造函数的实例化过程,只是对vue实例做了个粗略的描述,并没有说明vue组件实例化的过程.本文主要对vue组件的实例化过程做一些简要的描述. 组件的实例化与vue构造函数的实例化, ...

  10. 剑指offer-47:不用加减乘除做加法

    参考:https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html <原码,反码,补码 详解> 题目描述 ...