Etcd集群是什么意思
这篇文章主要介绍了Etcd集群是什么意思,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
Etcd简介
Etcd是一个开源的、高度一致的分布式key-value存储系统。由Go语言实现,具有很好的跨平台性。主要用于配置共享和服务发现。通过raft算法维护集群中各个节点的通信和数据一致性,节点之间是对等的关系,即使leader节点故障,会很快选举出新的leader,保证系统的正常运行。目前已广泛应用在kubernetes、ROOK、CoreDNS、M3、openstack等领域。
接口操作简单,提供了http+json和grpc接口。 可选的ssl客户端认证,支持https访问。 每个实例支持1000的QPS,适用于存储数据量小但更新和访问频繁的数据。 数据按照文件系统的方式,分层存储,数据持久化。 监视特定的键或目录的变化,并对值的更改做出响应,适用于消息的发布和订阅。
Etcd架构及工作原理
架构
Etcd的架构如下图所示,主要分为四部分。HTTP server、Store、Raft和WAL。
HTTP server:为用户提供的Api请求。 Store:用于处理 etcd 支持的各类功能的事务,包括数据索引、节点状态变更、监控与反馈、事件处理与执行等等。 Raft:利用raft算法,保证节点之间数据的强一致性。 WAL:数据存储方式。通过 WAL 进行数据持久化存储。Snapshot 存储数据的状态快照;Entry 表示存储的具体日志内容。
工作原理
ETCD集群是一个分布式系统,每个ETCD节点都维护了一个状态机,并且存储了完整的数据,任意时刻至多存在一个有效的主节点。主节点处理所有来自客户端的读写操作。其中状态机的状态转换规则如下:
ETCD中每个节点的状态集合为(Follower、Candidate、Leader),集群初始化时候,每个节点都是Follower角色,当Follower在一定时间内没有收到来自主节点的心跳,会将自己角色改变为Candidate,并发起一次选主投票;当收到包括自己在内超过半数节点赞成后,选举成功;当收到票数不足半数选举失败,或者选举超时。若本轮未选出主节点,将进行下一轮选举。当某个Candidate节点成为Leader后,Leader节点会通过心跳与其他节点同步数据,同时参与竞选的Candidate节点进入Follower角色。
Etcd集群搭建及基本应用
部署环境
一键安装etcd
创建安装脚本build.sh。
ETCD_VER=v3.4.7# choose either URLGOOGLE_URL=https://storage.googleapis.com/etcdGITHUB_URL=https://github.com/etcd-io/etcd/releases/downloadDOWNLOAD_URL=${GITHUB_URL}rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gzrm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-testcurl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz -o /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gztar xzvf /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz -C /tmp/etcd-download-test --strip-components=1rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gzcp /tmp/etcd-download-test/etcd /usr/binetcd --versioncp /tmp/etcd-download-test/etcdctl /usr/binetcdctl version
或者执行以下命令,脚本已上传到公网S3存储。
wget -qO- http://pub-shbt.s3.360.cn/v2s3/build-20200419214912.sh | bash
etcd配置和systemd保活
创建etcd配置文件/etc/etcd/etcd.conf。
ETCD_NAME=instance01ETCD_DATA_DIR="/usr/local/etcd/data"ETCD_LISTEN_CLIENT_URLS="http://10.143.74.108:2379,http://127.0.0.1:2379"ETCD_ADVERTISE_CLIENT_URLS="http://10.143.74.108:2379"ETCD_INITIAL_ADVERTISE_PEER_URLS="http://10.143.74.108:2380"ETCD_LISTEN_PEER_URLS="http://10.143.74.108:2380"ETCD_INITIAL_CLUSTER="instance01=http://10.143.74.108:2380,instance02=http://10.202.253.147:2380,instance03=http://10.202.254.213:2380"ETCD_INITIAL_CLUSTER_STATE=new
ETCD_NAME:本member的名称; ETCD_DATA_DIR:存储数据的目录; ETCD_LISTEN_CLIENT_URLS:用于监听客户端etcdctl或者curl连接; ETCD_ADVERTISE_CLIENT_URLS: 本机地址, 用于通知客户端,客户端通过此IPs与集群通信; ETCD_INITIAL_ADVERTISE_PEER_URLS:本机地址,用于通知集群member,与member通信; ETCD_LISTEN_PEER_URLS:用于监听集群中其它member的连接; ETCD_INITIAL_CLUSTER:描述集群中所有节点的信息,本member根据此信息去联系其他member; ETCD_INITIAL_CLUSTER_STATE:集群状态,新建集群时候设置为new,若是想加入某个已经存在的集群设置为existing。
[Unit]Description=Etcd ServerAfter=network.target[Service]Type=simpleWorkingDirectory=/var/lib/etcd/EnvironmentFile=-/etc/etcd/etcd.confExecStart=/usr/bin/etcdKillMode=processRestart=alwaysRestartSec=3LimitNOFILE=655350LimitNPROC=655350PrivateTmp=falseSuccessExitStatus=143[Install]WantedBy=multi-user.target
启动etcd。
systemctl daemon-reload
systemctl enable etcd.service
systemctl start etcd.service
查看etcd集群状态。
HOST_1=10.143.74.108
HOST_2=10.202.253.147
HOST_3=10.202.254.213
ENDPOINTS=$HOST_1:2379,$HOST_2:2379,$HOST_3:2379
etcdctl -w table --endpoints=$ENDPOINTS endpoint status
读写以及删除操作。
watch监听操作。
至此,在10.143.74.108主机上,我们已经成功安装、启动etcd服务,并测试了基本的功能。其他两台机器的配置类似,在此不再做介绍。
Etcd选主在Go中的实践
下来我们一起看下项目中如何利用etcd的选主机制来实现应用的高可用吧。
go get "github.com/coreos/etcd/clientv3"
添加常量。
const prefix = "/nanoPing"const prop = "local"var leaderFlag bool
编写client节点竞选函数campaign。
func campaign(c *clientv3.Client, election string, prop string) {
for {
//gets the leased session for a client
s, err := concurrency.NewSession(c, concurrency.WithTTL(15))
if err != nil {
log.Println(err)
continue
}
//returns a new election on a given key prefix
e := concurrency.NewElection(s, election)
ctx := context.TODO()
//Campaign puts a value as eligible for the election on the prefix key.
//Multiple sessions can participate in the election for the same prefix,
//but only one can be the leader at a time
if err = e.Campaign(ctx, prop); err != nil {
log.Println(err)
continue
}
log.Println("elect: success")
leaderFlag = true
select {
case <-s.Done():
leaderFlag = false
log.Println("elect: expired")
}
}
}
添加竞选成功后执行的动作run。
func run() { log.Println("[info] Service master") log.Println("[info] Task start.")}
编写入口函数,创建client节点,参与竞选master,竞选成功,执行任务。
func Start() {
donec := make(chan struct{})
//create a client
cli, err := clientv3.New(clientv3.Config{Endpoints: g.Config().Etcd.Addr,Username:g.Config().Etcd.User,Password:g.Config().Etcd.Password})
if err != nil {
log.Fatal(err)
}
defer cli.Close()
go campaign(cli, prefix, prop)
go func() {
ticker := time.NewTicker(time.Duration(10) * time.Second)
for {
select {
case <-ticker.C:
{
if leaderFlag == true{
run()
return
}else{
log.Println("[info] Service is not master")
}
}
}
}
}()
<-donec
}
选主失败的节点输出:
Master节点进程退出后,之前的非master节点,自动竞选为master节点。
感谢你能够认真阅读完这篇文章,希望小编分享的“Etcd集群是什么意思”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网行业资讯频道,更多相关知识等着你来学习!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341