2015-07-24

在本地搭建一个 etcd 集群

目录

  • 基本概念 CoreOS/etcd/
  • 在本地构建一个 CoreOS 集群
  • 初始化 etcd
  • 参考文献

基本概念 CoreOS/etcd/

CoreOS 是一个基于 Docker 的轻量级容器化 Linux 发行版,专为大型数据中心而设计,旨在通过轻量的系统架构和灵活的应用程序部署能力简化数据中心的维护成本和复杂度。大多数 Linux 发行版自带很多软件包,有些包在服务部署时并不需要。 CoreOS 将不需要的统统裁掉,只保留系统核心,同时支持通过 Docker 按需创建应用容器。

CoreOS 提供 etcd (用于服务发现和配置管理的高可用、分布式键值存储服务)和 fleet (基于 etcd 和 fleet. etcd 提供分布式初始化服务,systemd 提供服务的管理功能)两个工具。有了 CoreOS 和这些工具,就可以对集群系统而非单个主机执行所希望的操作。 本文主要介绍 如何搭建一个 etcd 集群

etcd 是一个高可用的键值存储系统,主要用于共享配置和服务发现。etcd 是由 CoreOS 开发并维护的,灵感来自于 ZooKeeper 和 Doozer,它使用 Go 语言编写,并通过 Raft 一致性算法处理日志复制以保证强一致性。

在分布式系统中,如何管理节点间的状态一直是一个难题,etcd 像是专门为集群环境的服务发现和注册而设计,它提供了数据 TTL 失效、数据改变监视、多值、目录监听、分布式锁原子操作等功能,可以方便的跟踪并管理集群节点的状态。

更多关于 etcd 的介绍参见 这里

构建一个本地集群

本文通过CoreOS 官方在 github 上面有一个项目, 见这里. 这是一个 Vagrant 项目, 根据 github 上面说明文档的步骤操作可以在本地安装部署并启动 3 个 CoreOS 虚拟机. 这三台虚拟机机器名分别是 * core-o1 * core-02 * core-03 可以通过如下命令登录到虚拟机中

vagrant ssh core-03 -- -A

初始化 etcd

CoreOS 系统默认就会启动 etcd 服务, 但是默认的 etcd 服务并没有集群信息, 无法构成集群. 通过 etcd 的集群指南 可知, 可以通过静态方式创建一个 etcd 集群.

启动集群

按如下步骤操作 * 通过 vagrant ssh core-0x -- -A 命令分别登录到三台虚拟机中 * 分别在三台虚拟机中执行 systemctl stop etc * 分别在 core-01 core-02 core-03 中执行如下命令

etcd2 -name infra0 -initial-advertise-peer-urls http://172.17.8.101:2380 \
  -listen-peer-urls http://172.17.8.101:2380 \
  -initial-cluster-token etcd-cluster-1 \
  -initial-cluster infra0=http://172.17.8.101:2380,infra1=http://172.17.8.102:2380,infra2=http://172.17.8.103:2380 \
  -initial-cluster-state new

etcd2 -name infra1 -initial-advertise-peer-urls http://172.17.8.102:2380 \
  -listen-peer-urls http://172.17.8.102:2380 \
  -initial-cluster-token etcd-cluster-1 \
  -initial-cluster infra0=http://172.17.8.101:2380,infra1=http://172.17.8.102:2380,infra2=http://172.17.8.103:2380 \
  -initial-cluster-state new

etcd2 -name infra2 -initial-advertise-peer-urls http://172.17.8.103:2380 \
  -listen-peer-urls http://172.17.8.103:2380 \
  -initial-cluster-token etcd-cluster-1 \
  -initial-cluster infra0=http://172.17.8.101:2380,infra1=http://172.17.8.102:2380,infra2=http://172.17.8.103:2380 \
  -initial-cluster-state new

命令解释: * etcd 有 v1 和 v2 本文的命令明确使用 etcd2 * 其他配置项说明参见官方文档

验证集群

  • 在 core-01 上面设置一个 key-value
core@core-01 ~ $ curl http://127.0.0.1:2379/v2/keys/message -XPUT -d value="Hello world"
{"action":"get","node":{"key":"/message","value":"Hello world","modifiedIndex":831,"createdIndex":831}}
  • 在 core-02 上面获取这个 key-value
core@core-02 ~ $ curl http://127.0.0.1:2379/v2/keys/message
{"action":"get","node":{"key":"/message","value":"Hello world","modifiedIndex":831,"createdIndex":831}}

由此可见集群配置已经生效

参考文献