一、一致性协议
1.Raft协议:分布式算法
2、Raft算法的基本概念
-
对称:所有节点都是平等的,客户端可以与其他所有节点交互 -
非对称:只有主节点有决策权
二、etcd优点
1、优点
-
稳定可靠。主要作kv存储 -
服务发现使用节点租约来实现,并且支持多key -
支持稳定的watch -
支持MVCC(多版本并发控制) -
高性能
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