ETCD深入解析

一、一致性协议

1.Raft协议:分布式算法

  • 领导人选举:当领导人出现故障的时候,选举新的领导人
  • 日志复制:领导人接受日志并发送到其他服务器上,强制其他服务器和自己一样
  • 安全性:保持数据的强一致性
  • 成员关系变化:配置发生变化时,集群可以继续工作

2、Raft算法的基本概念

  • 对称:所有节点都是平等的,客户端可以与其他所有节点交互
  • 非对称:只有主节点有决策权

二、etcd优点

1、优点

  1. 稳定可靠。主要作kv存储
  2. 服务发现使用节点租约来实现,并且支持多key
  3. 支持稳定的watch
  4. 支持MVCC(多版本并发控制)
  5. 高性能

2、简介

go语言编程、分布式、高可用的一致性键值存储系统,主要用于配置共享和服务发现

3、etcd架构

网络层:监听端口、完成节点间通信收发数据

Raft模块:实现数据强一致性

存储模块:KV存储、WAL文件、Snapshot管理、处理事务

复制状态机:将多台机器看成一台机器

4、典型应用场景举例

一般存储一些非常重要的元数据,多个客户端会watch这些原数据,适用于读多写少的场景

1、服务注册与发现:在同一分布式集群中的进程或者服务如何才能找到对方并且建立连接

2、配置中心:在服务启动的时候主动从etcd获取服务器信息

二、etcd初体验

1、端口

2379:监听外在客户端的请求

2380:监听集群中的其他server的请求

2、基础命令

#指定环境变量
export ETCDCTL_API=3
增删改查
#写入一个key
etcdctl put hgq 123
#读取一个key
etcdctl get hgq
#读取以hgq为前缀的所有key
etcdctl get --prefix hgq
#读取老版本的key,读取版本号为2的key
etcdctl get --rev=2 hgq
#删除一个key
etcdctl del hgq

#####删除一个范围内的key#########危险#####
etcdctl del hgq hgq9

#watch某一个key,显示对这个key都进行了哪些操作
etcdctl watch hgq
#压缩所有key版本号5之前的所有数据,压缩后,版本之前的key和value都不可用,谨慎操作
etcdctl compact 5
#查看当前key的版本号
etcdctl get hgq -w=json
#查看集群的member信息
etcdctl --endpoint=localhost:2379 member list
#查看etcd集群的健康状态
etcdctl health
#查看集群的状态,并显示leader的状态,显示db的大小
etcdctl --endpoints=http://XXXX:2380,(所有节点) endpoint status -w table 
#查看集群的健康情况
etcdctl --endpoints=http://XXXX:2380,(所有节点) endpoint health -w table 

3、多节点集群化部署

(1) 静态配置

前提:

集群节点个数已知

集群各节点的地址已知

–initial-cluster 来传递各个节点的地址信息

--initial-cluster hgq1=http://10.0.1.10:2380,hgq2=http://10.0.1.11:2380,hgq3=http://10.0.1.12:2380

–initial-cluster-token 为集群赋予一个第一无二的tiken,防止信息紊乱,从而生成第一无二的cluster ID和member ID

–listen-client-urls 指定ip和端口监听客户端的请求

–advertise-client-urls 指定的该成员的客户端URL会向其他成员发布

配置示例

--name hgq1 --initial0advertise-peer-urls http://10.0.1.10:2380 
--listen--peer-urls http://10.0.1.10:2380 
--listen--client-urls http://10.0.1.10:2379,http://127.0.0.1:2379 
--advertise-client-urls http://10.0.1.10:2379 
--initial-cluster-token hgq-test 
--initial-cluster hgq1=http://10.0.1.10:2380,hgq2=http://10.0.1.11:2380,hgq3=http://10.0.1.12:2380

(2) etcd常用配置参数

member相关参数

参数 含义 默认值 备注
–data-dir 数据目录

–wal-dir wal文件专用目录
不设置将会把wal存入数据目录
–snapshot-count 触发磁盘快照的数量 100000
–heartbeat-interval leader的心跳时间间隔 100ms 节点间的延迟较高时,可以适当调高,避免频繁发生leader切换
–election-timeout 一次等待选举的时间 1000ms
–listen-peer-urls 集群之间通讯监听的URL http://localhots:2380 如果为0.0.0.0,将监听所有网卡的指定端口,一般配置为内网IP
–max-snapshots 保留最大快照数量 5 0代表无上限
–max-wals 保存的最大wal文件数 5 0代表无上限
–listen-client-urls 监听客户端的请求的URL http://localhots:2379 如果为0.0.0.0,将监听所有网卡的指定端口,一般配置为内网IP

cluster相关参数

以–initial为前缀的选项用于一个集群最初的启动过程,重启时会被忽略。

参数 含义 默认值 备注
–initial-adver-tise-peer-urls 用于etcd集群内数据交互 http://localhots:2380 其他member可以访问到,可以为域名
–initial-cluster 初始集群的配置 default=http://localhots:2380 default应替换为每个节点的name选项
–initial-cluster-state 初始集群的状态 new 静态启动时为new,配置为existing将尝试加入一个已经存在的集群(用于扩容)
–initial-cluster-token 集群初始化的token

–strict-reconfig-check 拒绝所有会引起quorum丢失的重配置 false
–auto-compac-tion-retention MVCC键值不被自动压缩的时间 0h 0为屏蔽自动压缩

日志相关参数

参数 含义 默认值 备注
–debug 将所有项目的日志级别调到DEBUG false 默认日志级别为info

不安全参数

参数 含义 默认值 备注
–force-new-cluster 强制创建只有一个节点的集群 false 该选项会移除所有现存的节点,一般用于备份恢复

(3) 服务发现

1⃣️通过现有集群

2⃣️通过DNS

三、etcd开放API之v3

1、v3的重要特性

  • gRPC

  • 减少TCP链接,v3客户端共享同一个tcp链接,进行了多路复用

  • 租约机制:v2自动过期机制基于TTL,租约可以共享

  • 观察者模式:v2是每个key都是一个长链接,v3是多个key使用一个长链接

  • 数据存储模型:v2默认只保存整个数据的1000个value的历史变更记录,v3引进了MVCC(多版本并发控制),保存了所有历史变更记录,v2将数据放在内存,v3将数据放在磁盘

  • 支持事务

  • 快照:一致性系统基于log的复制,v3对增量快照和快照传输做了优化,可以存贮百万级别的key

  • etcd v3 API不支持RESTful API

四、etcd集群

etcd集群里的数据更新操作都是先写到binlog日志里(wal日志),master节点通过Raft协议向slave复制binlog,slave根据binlog日志进行更新键值

1、升级到v3流程(滚动升级)

检查集群是否健康

etcdctl cluster-health

停止当前etcd进程,并备份

etcdctl backup --data-dir /var/lib/etcd --backup-dir /tmp/etcd_backup

启动新的版本,并依次处理其他节点,并查看健康状态etcdctl health

2、参数调优

(1) 时间参数

心跳间隔:主节点通知从节点的频率,应该设置成主机间1.5倍的最大RTT的时间,默认为100毫秒

选举超时时间:从节点多久没有接收到主节点的心跳,就尝试竞争领导者,应设置为10倍的最大RTT时间,默认为1000毫秒,最大为50000毫秒

#启动参数
etcd --heartbeat-interval=100 --election-timeout=500
#环境变量
ETCD_HEARTBEAT_INTERVAL=100 ETCD_ELECTION_TIEOUT=500 etcd

(2) 快照

当修改积累到一定数量的时候才会创建快照,默认为10000

#启动参数
etcd --snapshot-count=5000
#环境变量
ETCD_SNAPSHOT_COUNT=5000 etcd

(3) 磁盘

为etcd赋予磁盘IO更高的优先值

best effort, highest priority
sudo ionice -c2 -n0 -p 'pgrep etcd'

(4) 网络

通过tc来调整etcd的优先级

3、维护

(1) 压缩历史版本

启动参数:–auto-compaction-retention=5,保留5个小时的历史版本

(2) 消除碎片化

etcdctl defrag 清理etcd节点的存储碎片

(3) 快照备份

#快照备份
etcdctl  snapshot save backup.db
#查询快照信息
etcdctl --write-out=table snapshot status backup.db

4、灾难恢复

(1) 快照

#先做快照 T指向的etcd数据保存到快照文件snapshot.db
ETCDCTL_APi=3 etcdctl --endpoints $ENDPOINT snapshot save snapshot.db

(2) 恢复集群

etcdctl snapshot  restore snapshot.db 
--name hgq1 --initial0advertise-peer-urls http://10.0.1.10:2380 
--listen--peer-urls http://10.0.1.10:2380 
--listen--client-urls http://10.0.1.10:2379,http://127.0.0.1:2379 
--advertise-client-urls http://10.0.1.10:2379 
--initial-cluster-token hgq-test 
--initial-cluster hgq1=http://10.0.1.10:2380,hgq2=http://10.0.1.11:2380,hgq3=http://10.0.1.12:2380

原文始发于微信公众号(TechOps之窗):ETCD深入解析

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/278269.html

(0)
李, 若俞的头像李, 若俞

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!