etcd简介
etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库。etcd内部采用raft协议作为一致性算法,etcd基于Go语言实现。
etcd作为服务发现系统,有以下的特点:
- 简单:安装配置简单,而且提供了HTTP API进行交互,使用也很简单
- 安全:支持SSL证书验证
- 快速:根据官方提供的benchmark数据,单实例支持每秒2k+读操作
- 可靠:采用raft算法,实现分布式系统数据的可用性和一致性
etcd项目地址:https://github.com/etcd-io/etcd
etcd应用场景
etcd比较多的应用场景是用于服务发现,服务发现(Service Discovery)要解决的是分布式系统中最常见的问题之一,即在同一个分布式集群中的进程或服务如何才能找到对方并建立连接。
从本质上说,服务发现就是要了解集群中是否有进程在监听upd或者tcp端口,并且通过名字就可以进行查找和链接。
要解决服务发现的问题,需要下面三大支柱,缺一不可。
- 一个强一致性、高可用的服务存储目录。
基于Ralf算法的etcd天生就是这样一个强一致性、高可用的服务存储目录。
- 一种注册服务和健康服务健康状况的机制。
用户可以在etcd中注册服务,并且对注册的服务配置key TTL,定时保持服务的心跳以达到监控健康状态的效果。
- 一种查找和连接服务的机制。
etcd 安装包的下载地址
etcd地址:https://github.com/etcd-io/etcd/releases
选择对应的版本下载即可,Windows版本解压后文件目录如下:
etcd是服务端,etcdctl 是内置客户端
查看版本号 etcdctl --version
建议API version的版本设为3
windows下设置版本,使用: set ETCDCTL_API=3
etcdctl help查看版本3和2命令和功能方面有不少的差别
etcdctl的V3版本查看所有的keys,指令为:
etcdctl get "" --prefix --keys-only
在同级目录分别创建如下三个启动脚本:
默认使用2379端口提供HTTP API服务,2380端口和peer通信。
start01.bat
.\etcd.exe --name etcd01 ^ --data-dir .\data\etcd01 ^ --advertise-client-urls http://127.0.0.1:2379 ^ --listen-client-urls http://127.0.0.1:2379 ^ --listen-peer-urls http://127.0.0.1:2380 ^ --initial-advertise-peer-urls http://127.0.0.1:2380 ^ --initial-cluster-token etcd-cluster-1 ^ --initial-cluster etcd01=http://127.0.0.1:2380,etcd02=http://127.0.0.1:2381,etcd03=http://127.0.0.1:2382 ^ --initial-cluster-state new pause
start02.bat
.\etcd.exe --name etcd02 ^ --data-dir .\data\etcd02 ^ --advertise-client-urls http://127.0.0.1:3379 ^ --listen-client-urls http://127.0.0.1:3379 ^ --listen-peer-urls http://127.0.0.1:2381 ^ --initial-advertise-peer-urls http://127.0.0.1:2381 ^ --initial-cluster-token etcd-cluster-1 ^ --initial-cluster etcd01=http://127.0.0.1:2380,etcd02=http://127.0.0.1:2381,etcd03=http://127.0.0.1:2382 ^ --initial-cluster-state new pause
start03.bat
.\etcd.exe --name etcd03 ^ --data-dir .\data\etcd03 ^ --advertise-client-urls http://127.0.0.1:4379 ^ --listen-client-urls http://127.0.0.1:4379 ^ --listen-peer-urls http://127.0.0.1:2382 ^ --initial-advertise-peer-urls http://127.0.0.1:2382 ^ --initial-cluster-token etcd-cluster-1 ^ --initial-cluster etcd01=http://127.0.0.1:2380,etcd02=http://127.0.0.1:2381,etcd03=http://127.0.0.1:2382 ^ --initial-cluster-state new pause
然后在同级目录下创建好对应的data-dir,如/data/etcd01、/data/etcd02、/data/etcd03,不创建也行,启动后会自动创建。
依次启动start01.bat、start02.bat、start03.bat三个脚本,然后使用etcdctl.exe member list,当输出如下信息时,代表集群创建成功了。
etcd集群启动参数说明
参数 |
使用说明 |
|
--name etcd0 | 本member的名字 | |
--initial-advertise-peer-urls http://192.168.2.55:2380 |
其他member使用,其他member通过该地址与本member交互信息。一定要保证从其他member能可访问该地址。静态配置方式下,该参数的value一定要同时在--initial-cluster参数中存在。 memberID的生成受--initial-cluster-token和--initial-advertise-peer-urls影响。 |
|
--listen-peer-urls http://0.0.0.0:2380 |
本member侧使用,用于监听其他member发送信息的地址。ip为全0代表监听本member侧所有接口 |
|
--listen-client-urls http://0.0.0.0:2379 |
本member侧使用,用于监听etcd客户发送信息的地址。ip为全0代表监听本member侧所有接口 |
|
--advertise-client-urls http://192.168.2.55:2379 |
etcd客户使用,客户通过该地址与本member交互信息。一定要保证从客户侧能可访问该地址 |
|
--initial-cluster-token etcd-cluster-2 |
用于区分不同集群。本地如有多个集群要设为不同。 |
|
--initial-cluster etcd0=http://192.168.2.55:2380, |
本member侧使用。描述集群中所有节点的信息,本member根据此信息去联系其他member。 memberID的生成受--initial-cluster-token和--initial-advertise-peer-urls影响。 |
|
--initial-cluster-state new |
用于指示本次是否为新建集群。有两个取值new和existing。如果填为existing,则该member启动时会尝试与其他member交互。 集群初次建立时,要填为new,经尝试最后一个节点填existing也正常,其他节点不能填为existing。 集群运行过程中,一个member故障后恢复时填为existing,经尝试填为new也正常。 |
|
-data-dir |
指定节点的数据存储目录,这些数据包括节点ID,集群ID,集群初始化配置,Snapshot文件,若未指定-wal-dir,还会存储WAL文件;如果不指定会用缺省目录。 |
|
-discovery http://192.168.1.163:20003/v2/keys/discovery/78b12ad7-2c1d-40db-9416-3727baf686cb |
用于自发现模式下,指定第三方etcd上key地址,要建立的集群各member都会向其注册自己的地址。 |
- —data-dir 指定节点的数据存储目录,这些数据包括节点ID,集群ID,集群初始化配置,Snapshot文件,若未指定—wal-dir,还会存储WAL文件;
- —wal-dir 指定节点的was文件的存储目录,若指定了该参数,wal文件会和其他数据文件分开存储。
- —name 节点名称
- —initial-advertise-peer-urls 告知集群其他节点url.
- — listen-peer-urls 监听URL,用于与其他节点通讯
- — advertise-client-urls 告知客户端url, 也就是服务的url
- — initial-cluster-token 集群的ID
- — initial-cluster 集群中所有节点