ETCD:运行时重新配置设计

原文地址: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. 公共发现服务需要保持数万个集群的配置,而我们的公共发现服务很难承受这种负载。

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

原文地址:https://www.cnblogs.com/cbkj-xd/p/11934588.html

时间: 2024-11-19 21:18:58

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

处理Android程序运行时的配置变化

本篇文章翻译自Android官方文档Handling Runtime Changes,有翻译错误请留言告知,多谢. Android程序在运行期间设备的配置是可能发生改变的(例如屏幕的方向,键盘可用性,和语言等).当这些配置发生变化时,Android会重启正在运行的Activity(先调用onDestory(),紧接着调用onCreate()).这个设计是为了让你的程序在配置发生变化时,使用不同的资源自动去适配新的配置机器. 正确的处理重启,一件很重要的事就是通过Activity正常的生命周期去恢

实现一个支持运行时并发修改配置生效的Configuration类

可配置性是一个好的应用程序的重要指标.我们常常需要实现类似能够运行时修改配置的功能.最近在开发一个中间层的服务程序,最终发布的方式是把代码打成jar包交给调用方使用.这个中间层服务需要一些配置信息,考虑了一下有几个基本的需求: 1. 在ja包中提供一个service-defalut.properties配置文件来提供全部的默认配置.这样的好处是尽量减少对调用方的侵入.调用方可以不提供额外的配置. 2. 调用方也可以提供一个service-site.properties配置文件来提供自定义的配置信

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

窗体设置的尺寸为1946*850,而电脑分辨率是1920*1280 按说宽度已经超过屏幕大小很多了,应该显示占满屏幕宽度才对,但是运行时宽度只有设计时的一半 高度最多只能是1946像素,再拉大也不管用,而高度可以设置 解决办法,把窗体的AutoScaleMode改为None 这个属性的意思是:确定当屏幕分辨率或字体更改时窗体或控件如何缩放 而我不小心设置成了Font,就显示不对了 原文地址:https://www.cnblogs.com/yaotome/p/10026320.html

Silverlight 在运行时更改 ControlTemplate

You cannot create a ControlTemplate in Silverlight in C# alone. Unlike WPF (where you can set the VisualTree property), there is no property you can set that specifies the "content" of the ControlTemplate. You can define your XAML as a string, a

混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集

其调用的方法是从sqlite数据库中获取原来已经使用过的数据库连接,当时也没注意,就是准备设断点然后单步调试,结果竟然是断点无法进入方法体内,后来仔细看了一下方法体的时候发现了一个问题,就是现有的System.Data.Sqlite这个数据访问provider是针对.NET2.0环境开发(最新的版本是1.0.66.0,2010年4月18日发布的),而目前官方也没有给出最新的.NET4的数据访问支持. 既然出现这个问题,那肯定是上GOOGLE搜索解决方案,毕竟微软不可能因为升级到了.NET4.0的

SQLite.dll混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。

其他信息: V5.7.4.4 Can't find the System.Data.SQLite.dll more info : 混合模式程序集是针对"v2.0.50727"版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集. 解决办法,web.config 添加

C#连接Sqlite 出现:混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。的解决方案

C#连接Sqlite 出现: 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集.的解决方案 C#连接sqlite数据库代码: 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Data.SQLite; 6 using System.D

opcache运行时配置参数详解

测试帖: http://www.aikaiyuan.com/6430.html 配置如下: opcache.memory_consumption=128 opcache.interned_strings_buffer=8 opcache.max_accelerated_files=4000 opcache.revalidate_freq=60 opcache.fast_shutdown=1 opcache.enable_cli=1 配置说明: PHP的opcode缓存又出了新成员(说新不新,也有

混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况

在app.config中的configuration节内添加子节Startup,详细如下: <?xml version="1.0"?><configuration><startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0&