4. 实现
4.1. etcd 结构
一个 etcd 节点的核心由三部分组成:
- Raft:raft 状态机是对 raft 共识算法的实现
- WAL:raft 日志存储
- Storage:数据的存储与索引
WAL (Write-ahead logging),是用于向系统提供原子性和持久性的一系列技术。在使用 WAL 的系提供中,所有的修改在提交之前都要先写入 log 文件中。etcd 的 WAL 由日志存储与快照存储两部分组成,其中 Entry 负责存储具体日志的内容,而 Snapshot 负责在日志内容发生变化的时候保存 raft 的状态。WAL 会在本地磁盘的一个指定目录下分别日志条目与快照内容。
4.2. 服务
4.2.1. Clients
在默认设定下,etcd 通过主机的 2379 端口向 Client 提供服务。如下图:
每个主机上的应用程序都可以通过主机的 2379 以 HTTP + JSON 的方式向 etcd 读写数据。写入的数据会由 etcd 同步到集群的其它节点中。
4.2.2. Peers
在默认设定下,etcd 通过主机的 2380 端口在各个节点中同步 raft 状态及数据。
5. 创建
从方法上来划分,创建 etcd 集群的方式分为两种:Static (通过制定 peers 的 IP 和端口创建)与 Discovery (通过一个发现服务创建)。
Static 方式需要预先知道集群所有节点的 IP,所以适合小规模的集群或者搭建一个临时的开发与测试环境。
Discovery 方式不需要预先了解其他节点的 IP。启动时 etcd 通过访问一个 Discovery URL 来注册自己并获取其他节点的信息。这种方式通常适合将 etcd 部署在某个云服务平台或是一个 DHCP 环境中。其中 Discovery 服务可以使用 CoreOS 提供的一个公共地址 来申请一个 token,或者自己搭建一个这样的服务并设定一个 token。出于安全的考虑,这个 token 应该只在集群初始引导时短暂存在,因为集群建立之后将不再需要这一地址,而集群中节点的变更可以通过 etcd 运行时重构的能力来进行配置。
6. 运行
下面我们尝试使用 etcd 0.5.0 以 discovery 方式创建一个 CoreOS 集群。当然由于 etcd 0.5.0 尚未正式发布,所以我们目前还无法从官方渠道获得打包 etcd 0.5.0 的 CoreOS 镜像,但是我们可以修改引导文件,在 CoreOS 启动时将 etcd 0.5.0 下载至系统里进行配置并启动。
CoreOS 官方提供了一个使用 vagrant + virtualbox 项目,供用户在本地电脑中创建一个微型 CoreOS 集群。我们可以在这个项目的基础上进行修改来实现我们的需求。
6.1. Clone 项目到本地
- git clone
- https://github.com/coreos/coreos-vagrant.git
- cd coreos-vagrant
- cp config.rb.sample config.rb
- cp user-data.sample user-data.sample
6.2. 通过 CoreOS 提供的公共 discovery 服务申请 token
curl ?size=3
size = 3 表示这个集群节点总数为 3 个。
6.3. 修改 config.rb 文件
- # Size of the CoreOS cluster created by Vagrant
- $num_instances=3
将启动的 CoreOS 实例数量定为 3 个
6.4. 修改 user-data 文件
6.4.1. 修改 etcd 参数:
- etcd:
- discovery: https://discovery.etcd.io/780456e1317eb2db312b62ba1cb9a4f7
- advertise-client-urls: http://$public_ipv4:2379
- initial-advertise-peer-urls: http://$public_ipv4:2380
- listen-client-urls: http://$public_ipv4:2379
- listen-peer-urls: http://$public_ipv4:2380
6.4.2. 修改 etcd 服务内容
- - name: etcd.service
- command: start
- content:|
- [Unit]
- After=network-online.target
- Requires=network-online.target
- [Service]
- ExecStartPre=/usr/bin/wget -N -P /opt/bin https://github.com/coreos/etcd/releases/
- download/v0.5.0-alpha.3/etcd-v0.5.0-alpha.3-linux-amd64.tar.gz
- ExecStartPre=/usr/bin/tar -C /opt/bin -xvf /opt/bin/etcd-v0.5.0-alpha.3-linux-amd64.tar.gz
- ExecStartPre=/usr/bin/chmod +x /opt/bin/etcd-v0.5.0-alpha.3-linux-amd64/etcd
- ExecStart=/opt/bin/etcd-v0.5.0-alpha.3-linux-amd64/etcd
- [Install]
- WantedBy=multi-user.target
修改的部分让我们重新定制了 etcd 服务的??容。在系统启动时,先将 etcd 0.5.0 的打包文件下载至指定目录并在稍后将其启动。
6.4.3. 使用 vagrant 启动集群
- vagrant up
稍后 vagrant 将帮助我们在 VirtualBox 中创建三个 CoreOS 实例。
6.4.4. 登录到 CoreOS
登录到其中的一个节点
- vagrant ssh core-01
查看一下 etcd.service 的状态,输入:
- systemctl status etcd.service
不出意外的话,可以看到其状态为 active (running)
- etcd.service
- Loaded: loaded (/etc/systemd/system/etcd.service; disabled)
- Drop-In:/run/systemd/system/etcd.service.d
- └─20-cloudinit.conf
- Active: active (running) since Sun2014-11-1613:10:59 UTC;12min ago
- Process:894ExecStartPre=/usr/bin/chmod +x /opt/bin/etcd-v0.5.0-alpha.3-
- linux-amd64/etcd (code=exited, status=0/SUCCESS)
- Process:890ExecStartPre=/usr/bin/tar -C /opt/bin -xvf /opt/bin/etcd-
- v0.5.0-alpha.3-linux-amd64.tar.gz (code=exited, status=0/SUCCESS)
- Process:857ExecStartPre=/usr/bin/wget -N -P /opt/bin
- https://github.com/coreos/etcd/releases/download/v0.5.0-alpha.3/etcd-v0.5.0
- -alpha.3-linux-amd64.tar.gz (code=exited, status=0/SUCCESS)
- Main PID:896(etcd)
- CGroup:/system.slice/etcd.service
- └─896/opt/bin/etcd-v0.5.0-alpha.3-linux-amd64/etcd
6.4.5. 通过 etcdctl 查询集群状态
etcdctl 可以帮助我们查询一下集群中节点信息,输入:
- /opt/bin/etcd-v0.5.0-alpha.3-linux-amd64/etcdctl --peers 172.17.8.101:2379 member list
启动参数 --peers 172.17.8.101:2379 表示通过本节点的 2379 端口访问 etcd 接口,用户可以根据自己的实际情况对 IP 地址进行修正。
正常情况下可看到如下输出:
- b4f4d25ed56d7a44: name=b74c24773df147e1be8e1e35defaad38 peerURLs=
- http://172.17.8.101:2380 clientURLs=
- b7404cc414e7affa: name=001db0fc02184af5b293e2cb21c86a11 peerURLs=
- http://172.17.8.102:2380 clientURLs=
- f609956c55a6809e: name=2840dc331d224360a097b781c876c9e5 peerURLs=
- http://172.17.8.103:2380 clientURLs=
这样,我们就在本地创建了一个基于 etcd 0.5.0 的 CoreOS 集群。
7. 预告
作为 CoreOS 及管理工具介绍的第三部分,笔者将向大家介绍 CoreOS 集群的重要管理工具 fleet ,通过 fleet 用户可以在 CoreOS 实现简单的 Orchestration 功能,敬请期待。
CoreOS 的详细介绍:
CoreOS 的下载地址:
本文永久更新链接地址: