ETCD介绍 (一)
什么是ETCD?
etcd是一个Go言编写的分布式、高可用的一致性键值存储系统,用于提供可靠的分布式键值存储、配置共享和服务发现等功能。
特点
-
简单:
易使用:基于HTTP+JSON的API让你用curl就可以轻松使用
易部署:使用Go语言编写,跨平台,部署和维护简单 -
可靠:
强一致:使用Raft算法充分保证了分布式系统数据的强一致性
高可用:具有容错能力,假设集群有n个节点,当有(n-1)/2节点发送故障,依然能提供服务
持久化:数据更新后,会通过WAL格式数据持久化到磁盘,支持Snapshot快照
快速:每个实例每秒支持一千次写操作,极限写性能可达10K QPS
安全:可选SSL客户认证机制
ETCD简单使用
# 安装命令
sudo apt install etcd
# 查看版本
etcd --version
# 测试安装是否成功
curl http://127.0.0.1:2379/version
# 增 / 改
curl http://127.0.0.1:2379/v2/keys/message -XPUT -d value="Hello world"
etcdctl put message "Hello world"
# 删除
curl http://127.0.0.1:2379/v2/keys/message -XDELETE
etcdctl del message
# 查
curl http://127.0.0.1:2379/v2/keys/message
etcdctl get message
# 存储有过期时间的key
curl http://127.0.0.1:2379/v2/keys/foo -XPUT -d value=bar -d ttl=5
# watch
etcdctl watch key
服务架构
基本概念
-
HTTP Server
- 用于处理用户发送的API请求以及其他etcd节点的同步与心跳信息的请求。
-
Store
- 用于处理etcd支持的各类功能的事务,包括数据索引,节点状态的变更,监控与反馈,事件处理与执行等,是etcd对用户提供的大多数API功能的具体实现。
-
Raft
- Raft分布式强一致性算法的具体实现,是etcd的核心。
-
WAL
- Write Ahead Log(预写式日志)是etcd的数据存储方式,WAL中所有数据提交前都会事先记录日志,这种技术在mysql中也有用到(binlog)。除了在内存中存有所有数据的状态及节点的索引以外,etcd就通过WAL进行持久化存储。
-
Snapshot
- 是为了防止数据过多而进行的状态快照
-
Entry
- 表示存储的具体日志内容。
RPC简介
-
ETCD中节点间通信,以及事务处理都是通过RPC机制,RPC(Remote Procedure Call)是远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
-
RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。
核心算法 Raft
通常来说,在分布式环境下,可以通过两种手段达成一致:
- Symmetric, leader-less :所有Server都是对等的,Client可以和任意Server进行交互
- Asymmetric, leader-based:任意时刻,有且仅有1台Server拥有决策权,Client仅和该Leader交互
经典应用场景
1. 服务注册与发现(Service Discovery)
2. 配置中心
3. 负载均衡
4. 分布式锁
5. 分布式队列
6. 分布式通知与协调
7. 消息发布和订阅
发展现状
Raft算法虽然诞生不久,但是在业界已经引起广泛关注,强烈推荐大家浏览其官网http://raftconsensus.github.io,上面有丰富的学习资料,目前Raft算法的开源实现已经涵盖几乎所有主流语言(C/C++/Java/Python/Javascript …),其流行程度可见一斑。由此可见,一项技术能否在工业界大行其道,有时“可理解性”、“可实现性”才是至关重要的。