java系统找不到指定文件怎么解决
291
2022-09-08
ETCD简介及使用
一、etcd简介
etcd是使用go语言开发的一个开源的、高可用的分布式key-value存储系统,可以用于配置共享和服务的注册和发现。
类似项目有zookeeper和consul
一)etcd 词汇表
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集群提供反向代理服务。Leader:Raft算法中通过竞选而产生的处理所有数据提交的节点。Follower:竞选失败的节点作为Raft中的从属节点,为算法提供强一致性保证。Candidate:当Follower超过一定时间接收不到Leader的心跳时转变为Candidate开始Leader竞选。Term:某个节点成为Leader到下一次竞选开始的时间周期,称为一个Term。Index:数据项编号。Raft中通过Term和Index来定位数据。
二)etcd的特点
安全复制:集群中的每个节点都可以使用完整的存档高可用性:etcd可用于避免硬件的单点故障或网络问题一致性:每次读取都会返回跨多主机的最新写入简单:包括一个定义良好、面向用户的API(gRPC)安全:实现了带有可选的客户端真个证书身份验证的自动化TLS快速:每秒10000次写入的基准速度可靠:使用raft算法实现了强一致性、高可服务用存储目标
三)etcd的应用场景
1、服务发现
服务发现要解决的也是分布式系统中最常见的问题之一,即在同一个分布式集群中的进程或服务,要如何才能找到对方并建立连接。本质上来说,服务发现就是想要了解集群中是否有进程在监听 udp 或 tcp 端口,并且通过名字就可以查找和连接。
要解决服务发现的问题,需要有下面三大支柱,缺一不可。
一个强一致性、高可用的服务存储目录。基于Raft算法的etcd天生就是这样一个强一致性高可用的服务存储目录。一种注册服务和监控服务健康状态的机制。用户可以在etcd中注册服务,并且对注册的服务设置key TTL,定时保持服务的心跳以达到监控健康状态的效果。一种查找和连接服务的机制。通过在etcd指定的主题下注册的服务也能在对应的主题下查找到。为了确保连接,我们可以在每个服务机器上都部署一个proxy模式的etcd,这样就可以确保能访问etcd集群的服务都能互相连接。
2、配置中心(消息发布与订阅)
将一些配置信息放到 etcd 上进行集中管理。
这类场景的使用方式通常是这样:应用在启动的时候主动从 etcd 获取一次配置信息,同时,在 etcd 节点上注册一个 Watcher 并等待,以后每次配置有更新的时候,etcd 都会实时通知订阅者,以此达到获取最新配置信息的目的。
应用中用到的一些配置信息存放在etcd上进行集中管理。这类场景的使用方式通常是这样的:应用在启动的时候主动从etcd获取一次配置信息,同时,在etcd节点上注册一个Watcher并等待,以后每次配置有更新的时候,etcd都会实时通知订阅者,以此达到获取最新配置信息的目的。分布式搜索服务中,索引的元信息和服务器集群机器的节点状态信息存放在etcd中,供各个客户端订阅使用。使用etcd的key TTL功能可以确保机器状态是实时更新的。分布式日志收集系统。这个系统的核心工作是收集分布在不同机器上的日志。收集器通常按照应用(或主题)来分配收集任务单元,因此可以在etcd上创建一个以应用(或主题)命名的目录P,并将这个应用(或主题)相关的所有机器ip,以子目录的形式存储在目录P下,然后设置一个递归的etcd Watcher,递归式地监控应用(或主题)目录下所有信息的变动。这样就实现了在机器IP(消息)发生变动时,能够实时通知收集器调整任务分配。系统中信息需要动态自动获取与人工干预修改信息请求内容的情况。通常的解决方案是对外暴露接口,例如JMX接口,来获取一些运行时的信息或提交修改的请求。而引入etcd之后,只需要将这些信息存放到指定的etcd目录中,即可通过HTTP接口直接被外部访问。
3、负载均衡
这的负载均衡均指软负载均衡。在分布式系统中,为了保证服务的高可用以及数据的一致性,通常都会把数据和服务部署多份,以此达到对等服务,即使其中的某一个服务失效了,也不影响使用。这样的实现虽然会导致一定程度上数据写入性能的下降,但是却能实现数据访问时的负载均衡。因为每个对等服务节点上都存有完整的数据,所以用户的访问流量就可以分流到不同的机器上。
etcd本身分布式架构存储的信息访问支持负载均衡。etcd集群化以后,每个etcd的核心节点都可以处理用户的请求。所以,把数据量小但是访问频繁的消息数据直接存储到etcd中也是个不错的选择,如业务系统中常用的二级代码表。二级代码表的工作过程一般是这样,在表中存储代码,在etcd中存储代码所代表的具体含义,业务系统调用查表的过程,就需要查找表中代码的含义。所以如果把二级代码表中的小量数据存储到etcd中,不仅方便修改,也易于大量访问。利用etcd维护一个负载均衡节点表。etcd可以监控一个集群中多个节点的状态,当有一个请求发过来后,可以轮询式地把请求转发给存活着的多个节点。类似KafkaMQ,通过Zookeeper来维护生产者和消费者的负载均衡。同样也可以用etcd来做Zookeeper的工作。
4、分布式通知与协调
分布式通知与协调,与消息发布和订阅有些相似。两者都使用了etcd中的Watcher机制,通过注册与异步通知机制,实现分布式环境下不同系统之间的通知与协调,从而对数据变更进行实时处理。实现方式通常为:不同系统都在etcd上对同一个目录进行注册,同时设置Watcher监控该目录的变化(如果对子目录的变化也有需要,可以设置成递归模式),当某个系统更新了etcd的目录,那么设置了Watcher的系统就会收到通知,并作出相应处理。
通过etcd进行低耦合的心跳检测。检测系统和被检测系统通过etcd上某个目录关联而非直接关联起来,这样可以大大减少系统的耦合性。通过etcd完成系统调度。某系统有控制台和推送系统两部分组成,控制台的职责是控制推送系统进行相应的推送工作。管理人员在控制台做的一些操作,实际上只需要修改etcd上某些目录节点的状态,而etcd就会自动把这些变化通知给注册了Watcher的推送系统客户端,推送系统再做出相应的推送任务。通过etcd完成工作汇报。大部分类似的任务分发系统,子任务启动后,到etcd来注册一个临时工作目录,并且定时将自己的进度进行汇报(将进度写入到这个临时目录),这样任务管理者就能够实时知道任务进度。
5、分布式锁
因为 etcd 使用 Raft 算法保持了数据的强一致性,某次操作存储到集群中的值必然是全局一致的,所以很容易实现分布式锁。
锁服务有两种使用方式,一是保持独占,二是控制时序。
保持独占即所有获取锁的用户最终只有一个可以得到。etcd 为此提供了一套实现分布式锁原子操作 CAS(CompareAndSwap)的 API。通过设置prevExist值,可以保证在多个节点同时去创建某个目录时,只有一个成功。而创建成功的用户就可以认为是获得了锁。控制时序,即所有想要获得锁的用户都会被安排执行,但是获得锁的顺序也是全局唯一的,同时决定了执行顺序。etcd 为此也提供了一套 API(自动创建有序键),对一个目录建值时指定为POST动作,这样 etcd 会自动在目录下生成一个当前最大的值为键,存储这个新的值(客户端编号)。同时还可以使用 API 按顺序列出所有当前目录下的键值。此时这些键的值就是客户端的时序,而这些键中存储的值可以是代表客户端的编号。
6、分布式队列
分布式队列的常规用法与场景五中所描述的分布式锁的控制时序用法类似,即创建一个先进先出的队列,保证顺序。
另一种比较有意思的实现是在保证队列达到某个条件时再统一按顺序执行。这种方法的实现可以在/queue这个目录中另外建立一个/queue/condition节点。
condition可以表示队列大小。比如一个大的任务需要很多小任务就绪的情况下才能执行,每次有一个小任务就绪,就给这个condition数字加1,直到达到大任务规定的数字,再开始执行队列里的一系列小任务,最终执行大任务。condition可以表示某个任务在不在队列。这个任务可以是所有排序任务的首个执行程序,也可以是拓扑结构中没有依赖的点。通常,必须执行这些任务后才能执行队列中的其他任务。condition还可以表示其它的一类开始执行任务的通知。可以由控制程序指定,当condition出现变化时,开始执行队列任务。
7、集群监控与LEADER竞选
通过etcd来进行监控实现起来非常简单并且实时性强,用到了以下两点特性。
前面几个场景已经提到Watcher机制,当某个节点消失或有变动时,Watcher会第一时间发现并告知用户。节点可以设置TTL key,比如每隔30s向etcd发送一次心跳使代表该节点仍然存活,否则说明节点消失。
这样就可以第一时间检测到各节点的健康状态,以完成集群的监控要求。
另外,使用分布式锁,可以完成Leader竞选。对于一些长时间CPU计算或者使用IO操作,只需要由竞选出的Leader计算或处理一次,再把结果复制给其他Follower即可,从而避免重复劳动,节省计算资源。
Leader应用的经典场景是在搜索系统中建立全量索引。如果每个机器分别进行索引的建立,不但耗时,而且不能保证索引的一致性。通过在etcd的CAS机制竞选Leader,由Leader进行索引计算,再将计算结果分发到其它节点
8、为什么用ETCD而不用ZOOKEEPER?
etcd实现的这些功能,Zookeeper都能实现。那么为什么要用etcd而非直接使用Zookeeper呢?
相较之下,Zookeeper有如下缺点。
复杂。Zookeeper的部署维护复杂,管理员需要掌握一系列的知识和技能;而Paxos强一致性算法也是素来以复杂难懂而闻名于世;另外,Zookeeper的使用也比较复杂,需要安装客户端,官方只提供了java和C两种语言的接口。Java编写。这里不是对Java有偏见,而是Java本身就偏向于重型应用,它会引入大量的依赖。而运维人员则普遍希望机器集群尽可能简单,维护起来也不易出错。发展缓慢。Apache基金会项目特有的“Apache Way”在开源界饱受争议,其中一大原因就是由于基金会庞大的结构以及松散的管理导致项目发展缓慢。
而etcd作为一个后起之秀,其优点也很明显。
简单。使用Go语言编写部署简单;使用HTTP作为接口使用简单;使用Raft算法保证强一致性让用户易于理解。数据持久化。etcd默认数据一更新就进行持久化。安全。etcd支持SSL客户端安全认证。
最后,etcd作为一个年轻的项目,正在高速迭代和开发中,这既是一个优点,也是一个缺点。优点在于它的未来具有无限的可能性,缺点是版本的迭代导致其使用的可靠性无法保证,无法得到大项目长时间使用的检验。然而,目前CoreOS、Kubernetes和Cloudfoundry等知名项目均在生产环境中使用了etcd
四)etcd架构
HTTP Server: 用于处理用户发送的API请求以及其它etcd节点的同步与心跳信息请求。Store:这个模块顾名思义,就像一个商店把etcd已经准备好的各项底层支持加工起来,为用户提供五花八门的API支持,处理用户的各项请求。用于处理etcd支持的各类功能的事务,包括数据索引、节点状态变更、监控与反馈、事件处理与执行等,是etcd对用户提供的大多数API功能的具体实现。Raft: raft 状态机,raft强一致性算法的具体实现,是etcd的核心。WAL:Write Ahead Log(预写式日志),是etcd的数据存储方式。除了在内存中存有所有数据的状态以及节点的索引以外,etcd就通过WAL进行持久化存储。WAL中,所有的数据提交前都会事先记录日志。Entry表示存储的具体日志内容。
二、etcd集群部署、使用
etcd作为一个高可用键值存储系统,天生就是为集群化而设计的。由于Raft算法在做决策时需要多数节点的投票,所以etcd一般部署集群推荐奇数个节点,推荐的数量为3、5或者7个节点构成一个集群。
一)影响性能的因素
时间同步、网络抖动、存储压力、读写压力
时间同步
etcd集群需要各个节点时钟差异不超过1s,否则可能会导致Raft协议的异常
心跳消息时间间隔(-heartbeat-interval)和选举时间间隔(-election-timeout)
选举时间间隔要比心跳消息时间间隔要大:一般建议 选举是心跳时间间隔的5倍以上
snapshot频率(-snapshot-count)
etcd会定期将数据的修改存储为snapshot,默认10000次修改才会存一个snapshot建议将这个值调小一些
修改节点
无论是添加、删除还是迁移节点,都要一个一个的进行,并且确保先修改配置信息(包括节点广播的监听地址、集群中节点列表等),然后再进行操作要迁移或替换节点的时候,先将节点从集群中删除掉,等集群状态重新稳定后,再添加上新的节点。当然,使用旧节点的数据目录文件会加快新节点的同步过程,但是要保证这些数据是完整的,且是比较新的
节点恢复
etcd集群中的节点会通过数据目录来存放修改信息和集群配置一般来说,某个节点出现故障时候,本地数据已经过期甚至格式破坏。若只是简单的重启进程,容易造成数据的不一致。
保险的做法是先通过命令(etcdctl member rm [member])来删除该节点,然后清空数据目录,再重新作为空节点加入
重启集群
极端情况下,集群中大部分节点都出现问题,需要重启整个集群最保险的办法是找到一个数据记录完整且比较新的节点,先以它为唯一节点创建新的集群,然后将其他节点一个个地添加进来,添加过程中注意保证集群的稳定性
二)etcd集群启动
etcd有三种集群化启动的配置方案,分别为静态配置启动、etcd自身服务发现、通过DNS进行服务发现
根据启动环境,你可以选择不同的配置方式。值得一提的是,这也是新版etcd区别于旧版的一大特性,它摒弃了使用配置文件进行参数配置的做法,转而使用命令行参数或者环境变量来配置参数
1、静态配置
这种方式比较适用于离线环境。在启动整个集群之前,你如果已经预先清楚所要配置的集群大小,以及集群上各节点的地址和端口信息,那么启动时,你就可以通过配置initial-cluster参数进行etcd集群的启动。
配置文件:/etc/etcd/etcd.conf
name: 'node1'data-dir: "/opt/etcd_data"wal-dir:snapshot-count: 10000heartbeat-interval: 100election-timeout: 1000quota-backend-bytes: 0listen-peer-urls: 5max-wals: 5cors:initial-advertise-peer-urls: 'proxy'discovery-proxy:discovery-srv:initial-cluster: "node1='etcd-cluster'initial-cluster-state: 'new'strict-reconfig-check: falseenable-v2: trueenable-pprof: trueproxy: 'off'proxy-failure-wait: 5000proxy-refresh-interval: 30000proxy-dial-timeout: 1000proxy-write-timeout: 5000proxy-read-timeout: 0client-transport-security: cert-file: key-file: client-cert-auth: false trusted-ca-file: auto-tls: falsepeer-transport-security: cert-file: key-file: client-cert-auth: false trusted-ca-file: auto-tls: falsedebug: falselogger: zaplog-outputs: [stderr]force-new-cluster: falseauto-compaction-mode: periodicauto-compaction-retention: "1"
etcd.conf
启动:etcd --config-file /etc/etcd/etcd.conf
建议使用: 使用命令行参数或者环境变量来配置参数环境变量:ETCD_INITIAL_CLUSTER = "infra0== new命令行参数--initial-cluster infra0=\--initial-cluster-state new
在初始化完成后,etcd还提供动态增、删、改etcd集群节点的功能,这个需要用到etcdctl命令进行操作
2、etcd自发现模式
通过自发现的方式启动etcd集群需要事先准备一个etcd集群。如果你已经有一个etcd集群,首先你可以执行如下命令设定集群的大小
3、DNS自发现模式
使用discovery的方式来搭建etcd集群方式有两种:etcd discovery和DNS discovery。
etcd在基于DNS做服务发现时,实际上是利用DNS的SRV记录不断轮训查询实现的。DNS SRV是DNS数据库中支持的一种资源记录的类型,它记录了哪台计算机提供了哪个服务这么一个简单信息。
三)etcd的UI
/bin/etcdctl \--endpoints="" \--cacert=/etc/etcd/ca.crt \--cert=/etc/etcd/server.crt \--key=/etc/etcd/server.key \snapshot save /var/lib/etcdbackup/`hostname`-etcd_`date
查看备份信息
#ls
#ETCDCTL_API=3 /bin/etcdctl \--endpoints="" \--cacert=/etc/etcd/ca.crt \--cert=/etc/etcd/server.crt \--key=/etc/etcd/server.key \--write-out=table \snapshot status /var/lib/etcdbackup/szpbs-okd-prd-master1-etcd_202004151411.db+----------+----------+------------+------------+| HASH | REVISION | TOTAL KEYS | TOTAL SIZE |+----------+----------+------------+------------+| ae62eefd | 52199066 | 22295 | 481
2)备份数据目录
备份下旧的etcd数据目录(回滚的时候可以直接回滚)
#cp -r /var/lib/etcd /var/lib/etcd-bak-`date +%Y%m%d%H%M`我们不做直接的删除操作,,直接mv到/tmp目录#mv
3)停止各个节点的服务
systemctl stop kube-apiserversystemctl stop etcd
4)恢复快照
将/var/lib/etcdbackup/快照文件拷贝到其他etcd集群节点同一目录,之后在各个节点分别执行以下命令,--data-dir是新的数据目录,原数据目录/var/lib/etcd,各个参数配置可查看原配置文件/etcd/etc/etcd.conf
etcdctl snapshot restore /var/lib/etcdbackup/szpbs-okd-prd-master1-etcd_202004151411.db --data-dir=/var/lib/etcd
5)启动
systemctl start kube-apiserversystemctl start etcd
2、回滚操作
停止所有etcd服务。还原数据目录。启动旧版本etcd服务。验证状态!
三、etcd 开启auth认证
一)概述
Etcd的v2和v3的认证有些不同,需要分别设置Etcd通过用户(user)-角色(role)-权限的方式来控制访问,用户关联角色,角色拥有权限,从而用户也就拥有了相应的权限Etcd开启Basic Auth之后,默认会启用两个角色root和guest,root角色拥有所有权限,guest拥有只读权限,这两个角色都不要删除
二)授权
1、etcd v2
1、添加root,创建root后,root默认有root最高权限etcdctl --endpoints=user add root2、开启认证etcdctl --endpoints=auth enable3、添加一个读写账号和一个只读账号etcdctl --endpoints=--username root:123456 user add readoetcdctl --endpoints=--username root:123456 user add readw4、添加只读角色和读写角色etcdctl --endpoints=--username root:123456 role add readConfetcdctl --endpoints=--username root:123456 role add rootConf5、为角色授权etcdctl --endpoints=--username root:123456 grant --read --path /* readConfetcdctl --endpoints=--username root:123456 grant --readwrite --path /* rootConf6、为用户分配角色etcdctl --endpoints=--username root:123456 user grant --roles readConf readoetcdctl --endpoints=--username root:123456 user grant --roles rootConf readw7、常用命令1)关闭authetcdctl --endpoints=--username root:123456 auth disable2)删除用户etcdctl --endpoints=--username root:123456 user remove reado3)用户撤销角色etcdctl --endpoints=--username root:123456 user revoke --roles readConf reado4)修改用户密码etcdctl --endpoints=--username root:123456 user passwd reado
2、etcd v3
1、添加root,创建root后,root默认有root最高权限etcdctl --endpoints=user add root2、创建普通用户etcdctl --endpoints=--user=root:123456 user add putong3、添加角色etcdctl --endpoints=--user=root:123456 role add normal4、角色授权etcdctl --endpoints=--user=root:123456 role grant-permission --prefix=true normal readwrite /path_name5、用户绑定角色etcdctl --endpoints=--user=root:123456 user grant-role putong normal
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~