`
m635674608
  • 浏览: 4943440 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

etcd 集群的管理

    博客分类:
  • etcd
 
阅读更多

搭建完 etcd 集群后,接下来就是集群的管理了。集群的管理主要包括节点的重启,监控以及集群的运行时更改(Runtime Reconfiguration)。

关于节点的重启、监控相对来说比较简单,这里主要介绍下集群的运行时更改。

1. 在什么情况下需要集群的运行时更改?

让我们来看看需要集群的运行时更改的几个场景。他们中的绝大多数只需要运用到重配置中的 “添加/删除” 节点操作的组合。

1.1. 维护和升级多个机器

  • 如果你因为进行诸如硬件升级或者断网等计划维护,而需要移动多个节点到新机器上,最好是逐个节点移动,一次操作一个。

  • 移动 leader 节点是安全的,只不过 leader 节点下线后,需要耗费更多的时间选举新节点,所以建议最后移动。

  • 如果你的集群有超过 50M 的数据,最好进行节点的迁移(见3.1节 迁移节点),而不要通过删除旧节点,增加新节点来实现节点的移动。

1.2. 更改集群的大小

如上一篇博客所说的,增加集群节点的个数,容错能力越强,读性能也越好。不过相应的,写性能也会下降。减少集群节点的个数,容错能力下降,不过写性能也会提高。

更改集群大小也需要集群运行时更改。

1.3. 替换一个坏掉的节点

如果一个节点的机器因为硬件出错而宕机了,那需要尽快用新机器替换。替换的操作就是简单地分为两步:(通过集群运行时更改)先删除坏掉的节点,再添加新的节点(见2节 集群节点的操作)。不过,如果你的集群有超过 50M 的数据,最好进行节点迁移(见3.1节 迁移节点)

1.4. 集群多数宕机(Majority Failure)后的重启

如果你的集群出现了多数宕机(例如超过(N-1)/2的节点当机),或者所有的节点都更改了 IP,你就需要手动操作,重启(恢复)集群了。基本步骤包括:1.基于原先的数据创建新集群;2.强制让一个节点成为 leader 节点,并最终通过运行时更改添加新节点的方式将其他节点添加到这个新的集群中。

2. 集群运行时更改的操作

知道了什么样的情况下需要运行时更改,下面让我们来了解下具体的运行时更改的操作。

一般来说,这些操作需要确保集群的多数节点是正常服务的,并且一次只操作一个节点。

  • 升级单个节点的 peerURLs,需要执行一个更新节点操作

  • 替换一个节点,需要先执行一个添加节点操作,再执行一个删除节点操作

  • 将集群大小从 3 更改到 5,需要执行两个添加节点操作

  • 将集群大小从 5 降低到 3,需要执行两个删除节点操作

下面的所有例子都是利用 etcdctl 命令实现操作,其本质是调用 etcd 的 REST API。你也可以使用其他你习惯的客户端。

2.1 更新一个节点

如果你想更新一个节点的 IP(peerURLS),首先你需要知道那个节点的 ID。你可以列出所有节点,找出对应节点的 ID。

$ etcdctl member list
6e3bd23ae5f1eae0: name=node2 peerURLs=http://localhost:23802 clientURLs=http://127.0.0.1:23792
924e2e83e93f2560: name=node3 peerURLs=http://localhost:23803 clientURLs=http://127.0.0.1:23793
a8266ecf031671f3: name=node1 peerURLs=http://localhost:23801 clientURLs=http://127.0.0.1:23791

在本例中,我们假设要更新 ID 为 a8266ecf031671f3 的节点的 peerURLs 为:http://10.0.1.10:2380

$ etcdctl member update a8266ecf031671f3 http://10.0.1.10:2380
Updated member with ID a8266ecf031671f3 in cluster

2.2 删除一个节点

假设我们要删除 ID 为 a8266ecf031671f3 的节点

$ etcdctl member remove a8266ecf031671f3
Removed member a8266ecf031671f3 from cluster

执行完后,目标节点会自动停止服务,并且打印一行日志:

etcdthis member has been permanently removed from the cluster. Exiting.

如果删除的是 leader 节点,则需要耗费额外的时间重新选举 leader

2.3 增加一个新的节点

增加一个新的节点分为两步:

  • 通过 etcdctl 或对应的 API 注册新节点

  • 使用恰当的参数启动新节点

先看第一步,假设我们要新加的节点取名为 infra3, peerURLs 是 http://10.0.1.13:2380

$ etcdctl member add infra3 http://10.0.1.13:2380
added member 9bf1b35fc7761a23 to cluster

ETCD_NAME="infra3"
ETCD_INITIAL_CLUSTER="infra0=http://10.0.1.10:2380,infra1=http://10.0.1.11:2380,infra2=http://10.0.1.12:2380,infra3=http://10.0.1.13:2380"
ETCD_INITIAL_CLUSTER_STATE=existing

etcdctl 在注册完新节点后,会返回一段提示,包含3个环境变量。然后在第二部启动新节点的时候,带上这3个环境变量即可。

$ export ETCD_NAME="infra3"
$ export ETCD_INITIAL_CLUSTER="infra0=http://10.0.1.10:2380,infra1=http://10.0.1.11:2380,infra2=http://10.0.1.12:2380,infra3=http://10.0.1.13:2380"
$ export ETCD_INITIAL_CLUSTER_STATE=existing
$ etcd -listen-client-urls http://10.0.1.13:2379 -advertise-client-urls http://10.0.1.13:2379  -listen-peer-urls http://10.0.1.13:2380 -initial-advertise-peer-urls http://10.0.1.13:2380 -data-dir %data_dir%

这样,新节点就会运行起来并且加入到已有的集群中了。

值得注意的是,如果原先的集群只有1个节点,在新节点成功启动之前,新集群并不能正确的形成。因为原先的单节点集群无法完成leader的选举。
直到新节点启动完,和原先的节点建立连接以后,新集群才能正确形成。

3. 迁移节点和灾难恢复

3.1 迁移节点

移动节点有两种方式:1. 删除旧的节点,增加新的节点; 2. 迁移节点。当集群的数据超过 50M 的时候,建议通过迁移节点的方式来移动节点。

迁移节点的核心就是数据目录的迁移。因为 etcd 的各个节点会将自己的 ID 存放在自己的数据目录下面,所以迁移节点不会改变节点的 ID。

迁移节点的步骤简单来说,包括以下几步:

  • 停止需要迁移的节点的服务

  • 从老机器上拷贝数据目录到新机器上

  • 通过集群运行时更改的更新操作,改变节点的 peerURLs 值为新机器的 IP:port

  • 在新机器上指定拷贝过来的数据目录,启动 etcd 的节点服务

下面通过一个例子具体说明。

假设我们已有的集群是这样的:

name peerURLs
infra0 10.0.1.10:2380
infra1 10.0.1.11:2380
infra2 10.0.1.12:2380
$ etcdctl member list
84194f7c5edd8b37: name=infra0 peerURLs=http://10.0.1.10:2380 clientURLs=http://127.0.0.1:2379,http://10.0.1.10:2379
b4db3bf5e495e255: name=infra1 peerURLs=http://10.0.1.11:2380 clientURLs=http://127.0.0.1:2379,http://10.0.1.11:2379
bc1083c870280d44: name=infra2 peerURLs=http://10.0.1.12:2380 clientURLs=http://127.0.0.1:2379,http://10.0.1.12:2379

我们要移动 infra1 从 10.0.1.11 到 10.0.1.13

1. 停止 infra1 的 etcd 进程
$ssh 10.0.1.11
kill `pgrep etcd`
2. 从 10.0.1.11 拷贝etcd的数据目录到 10.0.1.13 的机器上
$ tar -cvzf infra1.etcd.tar.gz %data_dir%
$ scp infra1.etcd.tar.gz 10.0.1.13:~/
3. 变更 infra1 的 peerURLs
$ curl http://10.0.1.10:2379/v2/members/b4db3bf5e495e255 -XPUT \
-H "Content-Type: application/json" -d '{"peerURLs":["http://10.0.1.13:2380"]}'

或者利用 etcdctl

etcdctl member update b4db3bf5e495e255 http://10.0.1.13:2380
4. 在新机器上使用 infra1 的数据和配置启动 etcd
$ ssh 10.0.1.13
$ tar -xzvf infra1.etcd.tar.gz -C %data_dir%
$ etcd -name infra1 \
> -listen-peer-urls http://10.0.1.13:2380 \
> -listen-client-urls http://10.0.1.13:2379,http://127.0.0.1:2379 \
> -advertise-client-urls http://10.0.1.13:2379,http://127.0.0.1:2379

3.2 灾难恢复

总的来说,etcd 的集群还是相当可靠的,但是也不能排除极端情况的出现。当出现灾难性的多数节点宕机,就不得不进行灾难恢复了。

灾难恢复需要以下几个步骤:

1 备份数据

备份操作需要在一台还'活着'的节点上进行

$ etcdctl backup \
      --data-dir %data_dir% \
      --backup-dir %backup_data_dir%

这个命令会备份原数据到 %backup_data_dir% 目录下,并重新相关的元数据(例如 节点的 id 和 集群的 id)。这意味着在 %backup_data_dir% 中只包含原先的数据,而不包含原先的身份信息。

接下来我们就可以基于备份的数据创建一个单节点的集群。

2 从备份数据中重建单节点集群
$ etcd \
      -data-dir=%backup_data_dir% \
      -force-new-cluster \
      ...

...部分省略了其他相关的参数,例如-peer-urls -client-urls 等等

这时候,应该就成功创建了一个新的只包含一个节点的集群,并包含之前的所有数据。当你确认新集群正常后,就可以删除原来集群的数据,暂停新集群,将新集群的数据目录拷贝回原先数据的位置,并重新启动。

$ pkill etcd
$ rm -rf %data_dir%
$ mv %backup_data_dir% %data_dir%
$ etcd \
    -data-dir=%data_dir% \
    ...
3 恢复集群

现在已经有了一个拥有之前数据的单节点的集群了。接下来,你可以通过添加节点的操作,重建出一个同样大小的集群。值得注意的是,如果你还是使用之前的其他机器来重建这个新的集群,一定杀掉之前的etcd 进程,并且清除掉之前的数据。

 

https://segmentfault.com/a/1190000003976539

分享到:
评论

相关推荐

    etcd-statefulset:在调控器中创建statefulset etcd集群

    因此对于快速部署一套高可用的Etcd集群的需求也越来越强烈,本次就带领大家一起使用Kubernetes的Statefulset特性快速部署一套Etcd集群。什么是Kubernetes?Kubernetes 是一个用于容器集群的自动化部署、扩容以及运维...

    etcd-operator:etcd操作员在Kubernetes上创建配置管理etcd集群

    etcd操作员管理部署到etcd集群,并自动执行与操作etcd集群相关的任务。 有关使用不同配置设置集群的 阅读,以获取有关如何更好地使用etcd运算符的更多信息。 阅读以了解如何在存在RBAC的情况下为etcd运算符设置RBAC...

    etcd-bootstrap:AWS自动扩展组中的Bootstraps ETCD集群

    维护和管理ETCD集群具有巨大的运营成本。 我们希望使其尽可能简单。 因此,我们决定编写此应用程序,以使其更容易在AWS Autoscaling组内引导ETCD集群。 我们还希望能够将我们的etcd客户端指向一个端点。 这是不...

    etcd-cloud-operator:在云提供商上部署和管理生产级的etcd集群:故障恢复,灾难恢复,备份和调整大小

    由一名前CoreOS工程师维护,并从为设计的的启发下,etcd-cloud-operator在云提供商上自动引导,监视,快照和恢复etcd集群。 用于代替etcd二进制文件并以最少的配置使用,操作员根据从云提供程序收集的数据和etcd...

    Etcd3静态集群部署

    etcd比较多的应用场景是用于服务发现与配置共享,值得注意的是,分布式系统中的数据分为控制数据和...与其他数据库和缓存服务不同的是,用于配置管理的etcd服务会运行在集群每一个节点上(有些可能处于“代理模式”)。

    etcd故障处理文档.docx

    etcd集群是为高可用,持久性数据存储和检索而准备。 "etcd"这个名字源于两个想法,即 unix “/etc” 文件夹和分布式系统"d"istibuted。 “/etc” 文件夹为单个系统存储配置数据的地方,而 etcd 存储大规模分布式...

    基于Docker的开源云主机集群管理平台本科毕业论文

    解除了集群管理程序和 Docker 程序的耦合。同时,通过 ETCD 集群做全局索引系统,利用其实现的 Raft 算法带来的集群写一致性,进而保证 了整个系统的一致性。同时,为互联网与 Pod 之间增加了一层访问中间控制层, ...

    etcd-v3.3.10-linux-amd64.tar.zip

    Google的容器集群管理系统Kubernetes、开源PaaS平台Cloud Foundry和CoreOS的Fleet都广泛使用了etcd。在分布式系统中,如何管理节点间的状态一直是一个难题,etcd像是专门为集群环境的服务发现和注册而设计,它提供了...

    CoreGI, 用于监视包括舰队和etcd的CoreOS 集群的WebUI.zip

    CoreGI, 用于监视包括舰队和etcd的CoreOS 集群的WebUI CoreGI 用于监视包括舰队和etcd的CoreOS 集群的WebUI 由 Yodlr 团队建立的爱什么是 CoreGI在我们的CoreOS 集群中查看运行的应用程序状态。监视etcd密钥和管理...

    谷歌开源的容器集群管理系统Kubernetes.zip

    2. 什么是Kubernetes Kubernetes是Google开源的容器集群管理系统,其提供应用部署、维护、 扩展机制等功能,利用Kubernetes能方便地管理跨机器运行容器化的应用,其主要功能如下:1) 使用Docker对应用程序包装...

    etcd-manager

    etcd-manager在云或裸机上管理etcd集群。 它借鉴了etcd-operator的思想,但避免了依赖kubernetes(本身依赖etcd)的循环依赖。 etcd-manager为初始集群成员资格执行最少数量的类似八卦的对等点发现,然后尽快“转...

    coreos-vulcand-shipyard:运行 Vulcand、Docker Registry 和 Shipyard 的 CoreOS 集群

    etcd集群 etcd 集群相当简单。 这是三台 etcd 机器。 没有第二步。 根据 CoreOS 团队对生产使用的建议,没有其他东西在它们上面运行。 只需根据您的喜好编辑cloudformation/devops-etcd.json (特别是指定您的 VPC ...

    Conf_Web:django + etcd + confd 配置管理平台

    etcd集群:使用Raft协议保证每个节点数据一致,由多个节点对外提供服务。这里只用单台。confd:管理本地应用配置文件,使用etcd或consul存储的数据渲染模板,还支持redis、zookeeper等。confd有一个watch功能,通过...

    etcdmanager:跨平台的GUI和ETCD客户端

    ETCD经理 这是一个免费的跨平台ETCD v3客户端和GUI。 该项目的目标是双重的: 为台式机(Windows,Linux,Mac),... 设置和配置: 能够使用多个配置配置文件,使您可以通过专用设置管理任意数量的ETCD集群。 导入/导出

    CynosDB技术详解——存储集群管理

    CynosDB是架构在CynosFS之上的分布式关系数据库系统,为最大化利用存储资源,平衡资源之间的竞争,检查资源使用情况,需要一套高效稳定的分布式集群管理系统(SCM:StorageClusterManager),SCM使用Etcd作为存储,...

    ansible-kubeadm:Ansible剧本可在任何具有SSH访问权限的Debian机器上启动HA Kubernetes集群

    能够扩展Kubernetes和etcd集群 能够从部分集群故障中恢复而不会出现重大问题 本手册的某些部分基于和 要求 该剧本被认为是在Debian机器上运行的,并且假定用户具有SSH访问权限和root / sudoer帐户,因为执行的许多...

    chef-etcd:安装和配置etcd

    它提供了用于从二进制文件和源文件进行安装以及管理一个或多个etcd服务实例的资源。 这什至是为了什么? 本菜谱旨在提供功能完善的实用程序,以安装和配置etcd的一个或多个实例,以用于生产和开发/测试提议。 etcd...

    dister是一款轻量级高性能的分布式集群管理软件,实现了分布式软件架构中的常用核心组件

    dister(Distribution Cluster)是一款轻量级高性能的分布式集群管理软件,实现了分布式软件架构中的常用核心组件,包括:服务配置管理中心、服务注册与发现、服务健康检查、服务负载均衡。dister的灵感来源于...

    nginx-confd-etcd:基于etcd和registrator为confd配置nginx的Docker容器

    nginx-confd-etcd 集装箱配置基于由生成的值 。 主要用于集群。 我从开始,但我不喜欢 sidekick 实例的想法。 我将 sidekick 更改为 Registrator 并在 Confd 配置中进行了一些更改。 集群配置的先决条件 这个 ...

Global site tag (gtag.js) - Google Analytics