etcd快速入门

1,239 阅读5分钟

这是我参与8月更文挑战的第26天,活动详情查看:8月更文挑战

1. 简介

etcd是一种高度一致的分布式k/v存储,它提供了一种可靠的方式来存储需要由分布系统或机器集群访问的数据。

2. 特点

  • k/v存储 将数据存储在分层组织的目录中,目录数结构
  • 安全性 可选的ssl客户端证书认证,密钥过期的可选 TTL
  • 易用性 支持curl等http工具访问
  • 高性能 每个实例每秒1000次基准写入
  • 可靠性 采用raft算法实现分布式系统数据的可用性和一致性

3. 应用场景

  • 服务注册与发现
  • 消息发布和订阅
  • 负载均衡
  • 分布式锁
  • 分布式队列

4. 概念词汇

Raft:etcd 所采用的保证分布式系统强一致性的算法。
Node:一个 Raft 状态机实例。
Member: 一个 etcd 实例。它管理着一个 Node,并且可以为客户端请求提供服务。
Cluster:由多个 Member 构成可以协同工作的 etcd 集群。
Peer:对同一个 etcd 集群中另外一个 Member 的称呼。
Client: 向 etcd 集群发送 HTTP 请求的客户端。
WAL:预写式日志,etcd 用于持久化存储的日志格式。
snapshot:etcd 防止 WAL 文件过多而设置的快照,存储 etcd 数据状态。
proxy:etcd 的一种模式,为 etcd 集群提供反向代理服务。
LeaderRaft 算法中通过竞选而产生的处理所有数据提交的节点。
Follower:竞选失败的节点作为 Raft 中的从属节点,为算法提供强一致性保证。
Candidate:当 Follower 超过一定时间接收不到 Leader 的心跳时转变为 Candidate 开始竞选。
Term:某个节点成为 Leader 到下一次竞选时间,称为一个 TermIndex:数据项编号。Raft 中通过 TermIndex 来定位数据

5. 架构简介

image.png 该架构主要为4个部分:

  • HTTP Server: 用于处理用户发送的API请求以及其它etcd节点的同步与心跳信息请求。
  • Store:用于处理etcd支持的各类功能的事务,包括数据索引、节点状态变更、监控与反馈、事件处理与执行等等,是etcd对用户提供的大多数 API 功能的具体实现。
  • Raft:Raft 强一致性算法的具体实现,是 etcd 的核心。
  • WAL:Write Ahead Lo(预写式日志),是etcd 的数据存储方式。除了在内存中存有所有数据的状态以及节点的索引以外,etcd就通过WAL进行持久化存储。WAL 中,所有的数据提交前都会事先记录日志。Snapshot 是为了防止数据过多而进行的状态快照;Entry表示存储的具体日志内容。

流程:

一个用户的请求发送过来,会经由HTTP Server转发给Store进行具体的事务处理,如果涉及到节点的修改,则交给Raft模块进行状态的变更、日志的记录,然后再同步给别的etcd节点以确认数据提交,最后进行数据的提交,再次同步

6. 安装部署

6.1 单机安装

因为centos7已经有了etcd的rpm包,这里直接使用yum安装既可,方便快捷

yum install etcd -y

查看一下配置,单机环境不需要修改,egrep -v "^#|^$" /etc/etcd/etcd.conf

image.png

#启动etcd 
systemctl start etcd
#查看状态
etcdctl cluster-health
etcdctl member list

6.2 集群安装

三台机器集群,安装和单机一样,在每台机器执行安装命令,配置不一样,需要根据情况而定

机器
D1
D2
D3

分布在三台机器执行安装命令

yum install etcd -y

配置集群 为了简化配置文件,这里使用几个变量替代一下机器的etcd端点地址

#设置几个变量
D1=http://192.168.1.101
D2=http://192.168.1.102
D3=http://192.168.1.103
#配置文件,按照D1,D2,D3机器,替换一下
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="${D1}:2380"
ETCD_LISTEN_CLIENT_URLS="http://127.0.0.1:2379,${D1}:2379"
ETCD_NAME="number1"
ETCD_INITIAL_ADVERTISE_PEER_URLS="${D1}:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://127.0.0.1:2379,${D1}:2379"
ETCD_INITIAL_CLUSTER="number1=${D1}:2380,number2=${D2}:2380,number3=${D3}:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-token"
ETCD_INITIAL_CLUSTER_STATE="new"

在三台机器分别执行启动命令 systemctl start etcd #查看状态

etcdctl cluster-health
etcdctl member list

集群的搭建主要在配置文件上,如果出现报错,先查看报错日志,根据日志信息排错

7. 管理工具

etcd的ui工具并不多,且大多不再维护,目前用的这个工具支持跨平台(Windows、Linux、Mac), 涵盖所有ETCD功能(etcdctl可以做的该工具可以都可以操作),满足所有用户的需求。但是不支持etcd v2的api,只支持v3

工具地址: github.com/gtamas/etcd…

界面实图:

image.png

8. 常用操作

使用etcdctl进行常用的操作例子

var
ENDPOINTS=http://127.0.0.1:2379
put/get
etcdctl --endpoints=$ENDPOINTS put foo "Hello World!"
etcdctl --endpoints=$ENDPOINTS get foo
etcdctl --endpoints=$ENDPOINTS --write-out="json" get foo
prefix
etcdctl --endpoints=$ENDPOINTS put web2 value2
etcdctl --endpoints=$ENDPOINTS put web3 value3
etcdctl --endpoints=$ENDPOINTS get web --prefix
delete
etcdctl --endpoints=$ENDPOINTS del foo
etcdctl --endpoints=$ENDPOINTS del web --prefix
Watch
etcdctl --endpoints=$ENDPOINTS watch stock1
etcdctl --endpoints=$ENDPOINTS put stock1 1000
etcdctl --endpoints=$ENDPOINTS watch stock --prefix
etcdctl --endpoints=$ENDPOINTS put stock1 10
etcdctl --endpoints=$ENDPOINTS put stock2 20
Lease
etcdctl --endpoints=$ENDPOINTS lease grant 300
#lease 2be7547fbc6a5afa granted with TTL(300s)

etcdctl --endpoints=$ENDPOINTS put sample value --lease=2be7547fbc6a5afa
etcdctl --endpoints=$ENDPOINTS get sample

etcdctl --endpoints=$ENDPOINTS lease keep-alive 2be7547fbc6a5afa
etcdctl --endpoints=$ENDPOINTS lease revoke 2be7547fbc6a5afa
### or after 300 seconds
etcdctl --endpoints=$ENDPOINTS get sample
Distributed locks
etcdctl --endpoints=$ENDPOINTS lock mutex1
###another client with the same name blocks
etcdctl --endpoints=$ENDPOINTS lock mutex1
Elections
etcdctl --endpoints=$ENDPOINTS elect one p1
###another client with the same name blocks
etcdctl --endpoints=$ENDPOINTS elect one p2
Cluster status
etcdctl --write-out=table --endpoints=$ENDPOINTS endpoint status
etcdctl --endpoints=$ENDPOINTS endpoint health
Snapshot
etcdctl --endpoints=$ENDPOINTS snapshot save my.db
Migrate
# write key in etcd version 2 store
export ETCDCTL_API=2
etcdctl --endpoints=http://$ENDPOINT set foo bar

# read key in etcd v2
etcdctl --endpoints=$ENDPOINTS --output="json" get foo

# stop etcd node to migrate, one by one

# migrate v2 data
export ETCDCTL_API=3
etcdctl --endpoints=$ENDPOINT migrate --data-dir="default.etcd" --wal-dir="default.etcd/member/wal"

# restart etcd node after migrate, one by one

# confirm that the key got migrated
etcdctl --endpoints=$ENDPOINTS get /foo
Member

由于操作步骤较多,建议到官网查询,该操作一般在集群扩容或缩容时进行,平时运行正常的集群不要测试,地址: etcd.io/docs/v3.3/d…

Auth
export ETCDCTL_API=3
ENDPOINTS=localhost:2379

etcdctl --endpoints=${ENDPOINTS} role add root
etcdctl --endpoints=${ENDPOINTS} role grant-permission root readwrite foo
etcdctl --endpoints=${ENDPOINTS} role get root

etcdctl --endpoints=${ENDPOINTS} user add root
etcdctl --endpoints=${ENDPOINTS} user grant-role root root
etcdctl --endpoints=${ENDPOINTS} user get root

etcdctl --endpoints=${ENDPOINTS} auth enable
###now all client requests go through auth

etcdctl --endpoints=${ENDPOINTS} --user=root:123 put foo bar
etcdctl --endpoints=${ENDPOINTS} get foo
etcdctl --endpoints=${ENDPOINTS} --user=root:123 get foo
etcdctl --endpoints=${ENDPOINTS} --user=root:123 get foo1

9. 监控集成

etcd默认带有metrics接口,提供给prometheus采集数据,然后使用grafana展示

命令查看接口数据: curl -v http://localhost:2379/metrics

prometheus配置

- job_name: 'etcd'
    static_configs:
      - targets: ['ip:2379']

目前在granfa有几个常用的模版,ID为: 12362、9618和3070,直接在grafana导入既可

image.png

参考

etcd.io/docs/v3.3/d…