ETCD:运行时重新配置设计
原文地址:the runtime configuration design
运行时重新配置是分布式系统中最难,最容易出错的部分,尤其是在基于共识(像etcd)的系统中。
阅读并学习关于etcd的运行时重新配置命令设计和如何追溯这些错误.
两阶段配置更新保证集群安全
在etcd中,每一次运行时重新配置安全的原因是由于两阶段更新。例如,添加一个成员,首先将新配置通知集群后启动新的成员。
- 阶段一 通知集群关于新的配置
添加一个成员到etcd集群中,通过API调用请求将一个新成员添加到集群中。这是将新的成员添加到集群中唯一的方法。当集群同意配置的更新后将返回API的调用。 - 阶段二 启动一个新的成员
将一个新成员加入到存在的集群中,指定正确的initial-cluster和设置initial-cluster-state为existing.当成员启动后,它首先联系已存在的集群并验证当前集群配置是否和期望的initial-cluster匹配。当一个新的成员成功启动,集群将获得期望的配置。
用户将过程分为两个阶段需要清楚了解集群成员关系的变化。实际上,这为用户提供了更大的灵活性,并使事情更容易。例如,如果试图添加一个与集群中现有的成员Id相同的新成员到集群中,操作将会立即失败由于阶段一并没有影响到运行中的集群。提供了类似的保护阻止通过错误操作添加新的成员。如果一个新的etcd成员试图在集群接受配置信息更新之前加入集群,操作将不会被集群接受。
如果没有围绕集群成员关系的显式工作流,集群将会容易受到意料之外的集群成员关系变化的影响。例如,如果etcd在一个初始化的系统如systemd中运行,etcd将会通过成员关系API在重新启动之后被移除,并试图在启动后重新加入。这个循环将会在每次通过API成员移除并将系统设置为失败后重新启动etcd时继续,这是预料之外的。
我们希望运行时重新进行配置是不常见的操作。我们决定保持为显式的由用户驱动来确保配置安全,保持集群平稳运行在显式的控制下。
永久性的丢失要求新的集群
如果一个集群永久丢失一些主要的集群成员,需要从原始的数据文件夹启动一个新的集群恢复先前的状态。
完全有可能从已存在的集群中强制删除一个失败的成员并恢复。然而,我们决定不支持此方法因为他绕过了常规的共识提交阶段,这是不安全的。如果成员移除一个没有实际失败的成员或者是同一个集群中的不同成员,etcd将会最终得到具有相同集群Id的分散集群。这是非常危险的而且很难修复。
通过正常的部署,永久性丢失的可能性非常的小。但是这是一个严重的问题值得特别注意。我们强烈建议阅读灾难恢复文档并且在将etcd部署到生产环境之前做充足的准备。
不要在运行时重新配置中使用公共的发现服务
公共发现服务应该只在启动一个集群的时候使用。将一个成员加入已存在的集群,使用运行时配置API.
发现服务被设计用来在云服务环境中启动一个在所有的成员无法提前知道Ip地址时的etcd集群。在成功启动一个集群时,所有的成员将会知道Ip地址。典型的,发现服务奖不再被需要。
看起来使用公共的发现服务进行运行时重新配置是一个便利的方法,毕竟所有的发现服务含有所有的集群配置信息。然而依赖公共发现服务将带来问题:
- 将会引进外部独立性到集群的整个生命周期,不只是启动时间。如果集群和公共发现服务之间存在网络问题,则群集将因此受到影响。
- 公共发现服务必须在集群的生命周期内反映正确的运行时配置,将需要提供安全机制避免坏的行为,而这是困难的。
- 公共发现服务需要保持数万个集群的配置,而我们的公共发现服务很难承受这种负载。
为了使发现服务支持运行时配置,最好的选择是建立一个私有的发现服务。
ETCD:运行时重新配置设计的更多相关文章
- ETCD:运行时重新配置
原文地址:runtime reconfiguration etcd带有增量运行时重新配置的支持.允许我们在集群运行的时候更新集群成员关系. 仅当大多数集群成员都在运行时,才能处理重新配置请求,强烈建议 ...
- set_include_path — 设置 include_path 配置选项为当前脚本设置 include_path 运行时的配置选项。
说明 string set_include_path ( string $new_include_path ) 为当前脚本设置 include_path 运行时的配置选项. 参数 new_includ ...
- linux(centos8):firewalld的运行时日志配置
一,firewalld配置日志的用途: 在生产环境中,firewalld的默认配置是不记录日志 我们通过日志记录下防火墙过滤时拒绝的非法ip, 可以主动把这些有攻击性的ip加入到黑名单, 防患于未然 ...
- maven运行时的配置及命令详解
上面是指定端口运行程序的,也可以先指定好,直接在上面的地方写jettty:run 当然,如果你是在控制台运行且安装了maven,直接可以进入项目的文件中:mvn jetty:r ...
- pycharm中运行时添加配置 及pytest模式怎么修改为run模式
会发现不是控制台输出,而是pytest模式. 修改: 当运行时,发现无法运行: 然后点击Add Configuration, 点击加号,点击Python: 选择脚本路径和解释器.点击OK即可.
- winform窗体运行时的大小和设计时不一致
窗体设置的尺寸为1946*850,而电脑分辨率是1920*1280 按说宽度已经超过屏幕大小很多了,应该显示占满屏幕宽度才对,但是运行时宽度只有设计时的一半 高度最多只能是1946像素,再拉大也不管用 ...
- 利用etcd及confd实现配置自动管理
ETCD etcd 架设etcd集群 静态启动etcd集群需要每个成员在集群中知道另一个成员.在许多情况下,集群成员的IP可能提前未知.在这种情况下,可以使用etcd集群的自动发现服务.一旦etcd集 ...
- [C#] 将NLog输出到RichTextBox,并在运行时动态修改日志级别过滤
作者: zyl910 一.缘由 NLog是一个很好用的日志类库.利用它,可以很方便的将日志输出到 调试器.文件 等目标,还支持输出到窗体界面中的RichTextBox等目标. 而且它还支持在运行时修改 ...
- Android Studio的安装及第一次启动时的配置
Android Studio的安装及第一次启动时的配置 一.下载Android Studio 百度搜索“Android Studio" 点击中文社区进入,选择最新版本下载. 下载后双击安装包 ...
随机推荐
- 一 UI基本的用法
1. UIView的基本用法 //打印屏幕的宽和高 CGRect screenBounds = [[UIScreen mainScreen] bounds]; NSLog(@"%f, %f& ...
- 如何下载Vimeo视频
MediaHuman YouTube Downloader是应用在Mac上的一款非常优秀的YouTube视频下载工具,YouTube Downloader破解版将帮助你快速完成视频下载,而不会挂断.您 ...
- ELK查询命令详解
目录 ELK查询命令详解 倒排索引 使用ElasticSearch API 实现CRUD 批量获取文档 使用Bulk API 实现批量操作 版本控制 什么是Mapping? 基本查询(Query查询) ...
- SpringCloud-创建服务消费者-Feign方式(附代码下载)
场景 SpringCloud-服务注册与实现-Eureka创建服务注册中心(附源码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...
- mysql-magic 从dump中获取MySQL的明文密码
项目地址: https://github.com/hc0d3r/mysql-magic 安装: git clone --recurse-submodules https://github.com/hc ...
- oracle中add_months()函数总结
今天对add_months函数进行简单总结一下: add_months 函数主要是对日期函数进行操作,在数据查询的过程中进行日期的按月增加,其形式为: add_months(date,int);其中第 ...
- CSDN屏蔽广告
CSDN俨然是一家广告网站了,各种广告层出不穷,且毫无底线.经常性的展示一些植发.防脱的广告,实在影响心情.另外,在复制内容的时候,会通过js给你带上一段来源,对于版权保护这是好事儿,但是对于直接复制 ...
- .NET Core 发布(dotnet publish)
目录 一.需求 二.方法 三.参考 一.需求 使用.net core 3.0建的项目,一般情况下,每次想发布都要打开vs,然后点击发布,选择配置: 如果想用cmd命令行发布,应该怎么写呢? 二.方法 ...
- spring security 原理+实战
疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 架构师成长+面试必备之 高并发基础书籍 [Netty Zookeeper Redis 高并发实战 ] 前言 Crazy ...
- 持续集成(CI):Jmeter+Ant+Jenkins定时构建
这里Jenkins的安装部署以及工程项目的整体配置不做赘述,其它博文已经说明,这里主要是赘述Ant的相关配置,build.xml文件配置以及项目中的部分配置 一.build.xml 在Ant的安装目录 ...