etcd介绍

GitHub:https://github.com/coreos/etcd

官网:https://coreos.com/etcd/

下载:https://github.com/coreos/etcd/releases/

概念:高可用的分布式key-value存储,可以用于配置共享和服务发现。

具有以下优点:
  • 简单 : 相比于晦涩难懂的paxos算法,etcd基于相对简单且易实现的raft算法实现一致性,并通过gRPC提供接口调用
  • 安全:支持TLS通信,并可以针对不同的用户进行对key的读写控制
  • 高性能:10,000 /秒的写性能

类似项目:zookeeper和consul

开发语言:Go

接口:提供restful的http接口,使用简单

实现算法:基于raft算法的强一致性、高可用的服务存储目录

etcd的应用场景:

  • 服务发现和服务注册
  • 配置中心
  • 分布式锁
  • master选举

etcd单机部署

1、下载安装包etcd-v3.2.7-linux-amd64.tar.gz

tar -zxvf etcd-v3.2.7-linux-amd64.tar.gz
cd etcd-v3.2.7-linux-amd64

2、服务启动

nohup etcd--data-dir /var/lib/data.etcd --listen-client-urls http://10.10.83.162:2379--advertise-client-urls http://10.10.83.162:2379 & > /var/log/etcd.log &

etcd集群部署

集群搭建有三种方式,分布是静态配置,etcd发现,dns发现

三种发现方式:Static,etcd Discovery,DNS Discovery。 
● Static适用于有固定IP的主机节点 
● etcd Discovery适用于DHCP环境 
● DNS Discovery依赖DNS SRV记录

1、部署环境

操作系统:centos6.8

3台服务器:10.10.83.162、10.10.83.163、10.10.83.229

2、配置项说明

  • --name
etcd集群中的节点名,这里可以随意,可区分且不重复就行  
  • --data-dir
指定节点的数据存储目录
  • --wal-dir
指定节点的was文件的存储目录,若指定了该参数,wal文件会和其他数据文件分开存储。
  • --listen-peer-urls
监听的用于节点之间通信的url,可监听多个,集群内部将通过这些url进行数据交互(如选举,数据同步等)
  • --initial-advertise-peer-urls
建议用于节点之间通信的url,节点间将以该值进行通信。
  • --listen-client-urls
监听的用于客户端通信的url,同样可以监听多个。

  • --advertise-client-urls
建议使用的客户端通信url,该值用于etcd代理或etcd成员与etcd节点通信。

  • --initial-cluster-token
节点的token值,设置该值后集群将生成唯一id,并为每个节点也生成唯一id,当使用相同配置文件再启动一个集群时,只要该token值不一样,etcd集群就不会相互影响。

  • --initial-cluster
也就是集群中所有的initial-advertise-peer-urls 的合集

  • --initial-cluster-state
新建集群的标志

静态配置

https://coreos.com/etcd/docs/latest/op-guide/clustering.html

静态配置主要预先将集群的配置信息分配好,然后将集群分布启动,集群将根据配置信息组成集群。这里按如下的配置信息分别启动三个etcd。
  • 10.10.83.162
./etcd --name infra0 --initial-advertise-peer-urls http://10.10.83.162:2380 \
--listen-peer-urls http://10.10.83.162:2380 \
--listen-client-urls http://10.10.83.162:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.10.83.162:2379 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster infra0=http://10.10.83.162:2380,infra1=http://10.10.83.163:2380,infra2=http://10.10.83.229:2380 \
--initial-cluster-state new
  • 10.10.83.163
./etcd --name infra1 --initial-advertise-peer-urls http://10.10.83.163:2380 \
--listen-peer-urls http://10.10.83.163:2380 \
--listen-client-urls http://10.10.83.163:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.10.83.163:2379 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster infra0=http://10.10.83.162:2380,infra1=http://10.10.83.163:2380,infra2=http://10.10.83.229:2380 \
--initial-cluster-state new
  • 10.10.83.229
./etcd --name infra2 --initial-advertise-peer-urls http://10.10.83.229:2380 \
--listen-peer-urls http://10.10.83.229:2380 \
--listen-client-urls http://10.10.83.229:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.10.83.229:2379 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster infra0=http://10.10.83.162:2380,infra1=http://10.10.83.163:2380,infra2=http://10.10.83.229:2380 \
--initial-cluster-state new

按如上配置分别启动集群,启动集群后,将会进入集群选举状态

  • 查看集群成员
./etcdctl  member list

  • 查看集群健康状态
./etcdctl cluster-health

etcd发现

静态配置前提是在搭建集群之前已经提前知道各节点的信息,而实际应用中可能存在预先并不知道各节点ip的情况,这时可通过已经搭建的etcd来辅助搭建新的etcd集群,具体过程如下:

分为私有方式和公有方式

1、私有方式

首先需要在已经搭建的etcd集群。这种启动方式,依赖另外一个ETCD集群,在该集群中创建一个目录,并在该目录中创建一个_config的子目录,并且在该子目录中增加一个size节点,指定集群的节点数目。

curl -X PUT http://10.10.83.11:2379/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83/_config/size -d value=3

返回

{"action":"set","node":{"key":"/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83/_config/size","value":"3","modifiedIndex":16,"createdIndex":16}}

如上表示创建一个集群大小为3的etcd发现url,创建成功后按如下配置启动各节点

./etcd --name infra0 --initial-advertise-peer-urls http://10.10.83.162:2380 \
--listen-peer-urls http://10.10.83.162:2380 \
--listen-client-urls http://10.10.83.162:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.10.83.162:2379 \
--discovery http://10.10.83.11:2379/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83
./etcd --name infra1 --initial-advertise-peer-urls http://10.10.83.163:2380 \
--listen-peer-urls http://10.10.83.163:2380 \
--listen-client-urls http://10.10.83.163:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.10.83.163:2379 \
--discovery http://10.10.83.11:2379/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83
./etcd --name infra2 --initial-advertise-peer-urls http://10.10.83.229:2380 \
--listen-peer-urls http://10.10.83.229:2380 \
--listen-client-urls http://10.10.83.229:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.10.83.229:2379 \
--discovery http://10.10.83.11:2379/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83

如上当所有etcd均注册到用于发现的url后,独立的各节点将形成集群。

2、公有方式

如果没有搭建好的etcd集群用于注册和发现,可使用etcd公有服务来进行服务注册发现。

curl https://discovery.etcd.io/new?size=3

返回

https://discovery.etcd.io/580e3f6a132634250f2f790ac159f44e

将返回的url替换上面的 --discovery部分,启动各个节点etcd,建立集群。

dns发现

dns 发现主要通过dns服务来记录集群中各节点的域名信息,各节点到dns服务中获取相互的地址信息,从而建立集群。etcd各节点通过--discovery-serv配置来获取域名信息。

部署方式参考官方介绍

etcd集群运行过程中的改配

主要用于故障节点替换,集群扩容需求。

1、从集群中删除老member

./etcdctl member remove 169547ffdcc5110d

2、向集群中新增新member

./etcdctl member add infra2 http://10.10.83.163:2380

3、删除老节点data目录

4、在新member上启动etcd进程

nohup ./etcd --name infra1 --initial-advertise-peer-urls http://10.10.83.163:2380 --listen-peer-urls http://10.10.83.163:2380 --listen-client-urls http://10.10.83.163:2379,http://127.0.0.1:2379 --advertise-client-urls http://10.10.83.163:2379 --initial-cluster infra0=http://10.10.83.162:2380,infra1=http://10.10.83.163:2380,infra2=http://10.10.83.229:2380 --initial-cluster-state existing &

集群可服务性对故障的容忍度

以3节点集群为例。

结论:

  • 在1个member故障时,即小部分节点故障: 集群处于健康态,读写都正常。
  • 在2个member故障时,即大部分节点故障情况:集群整体状态为”不健康“,剩下的member也为”不健康“。只能read,但不能write,可能是因为剩下的member竞选leader失败,拿不到多数票。
  • 在大部分节点恢复后,集群整体状态为”健康“,每个member也为”健康“

使用示例

package main

import (
"fmt"
etcd_client "github.com/coreos/etcd/clientv3"
"time"
) func main() { cli, err := etcd_client.New(clientv3.Config{
Endpoints: []string{"10.10.83.162:2379", "10.10.83.163:2379", "10.10.83.229:2379"},
DialTimeout: 5 * time.Second,
})
if err != nil {
fmt.Println("connect failed, err:", err)
return
} fmt.Println("connect succ")
defer cli.Close()
}

  

go etcd的更多相关文章

  1. 一次基于etcd的分布式锁自动延时失败问题的排查

    今天在测试基于etcd的分布式锁过程中,在测试获取锁后,释放之前超出TTL时长的情况下自动延长TTL这部分功能,在延长指定key的TTL时总是返回404错误信息,在对目标KEY更新TTL时目标KEY已 ...

  2. etcd:用于服务发现的键值存储系统

    etcd是一个高可用的键值存储系统,主要用于共享配置和服务发现.etcd是由CoreOS开发并维护的,灵感来自于 ZooKeeper 和 Doozer,它使用Go语言编写,并通过Raft一致性算法处理 ...

  3. Centos7下Etcd集群搭建

    一.简介 "A highly-available key value store for shared configuration and service discovery." ...

  4. 通过docker-machine和etcd部署docker swarm集群

    本片文章介绍一下 使用docker-machine 搭建docker swarm 集群:docker swarm是docker 官方搭建的容器集群编排工具:容器编排,就是可以使你像使用一太机器一样来使 ...

  5. etcd第三集

    简单说下golang的etcd接口例子.etcd api有v2(http+json)和v3(grpc)两个版本,目前大家都用v2,所以... v2: https://github.com/coreos ...

  6. etcd第二集

    参考文章:https://github.com/coreos/etcd/blob/master/Documentation/v2/api.mdhttp://www.cnblogs.com/zhengr ...

  7. etcd第一集

    网站:https://github.com/coreos/etcd 一些观点:https://yq.aliyun.com/articles/11035 1.etcd是键值存储仓库,配置共享和服务发现2 ...

  8. etcd命令说明 etcd Version: 3.0.15

    etcd Version: 3.0.15Git SHA: fc00305Go Version: go1.6.3Go OS/Arch: linux/amd64 https://github.com/co ...

  9. etcd api 接口

    etcd api接口 基本操作api: https://github.com/coreos/etcd/blob/6acb3d67fbe131b3b2d5d010e00ec80182be4628/Doc ...

  10. Key/Value存储系统etcd的特性

    etcd 是一个高可用的Key/Value存储系统,和其他KV存储系统不同的是,它的灵感来自于 ZooKeeper 和 Doozer,主要用于分享配置和服务发现.利用 etcd 的特性,应用程序可以在 ...

随机推荐

  1. JarvisOJ Basic Base64?

    GUYDIMZVGQ2DMN3CGRQTONJXGM3TINLGG42DGMZXGM3TINLGGY4DGNBXGYZTGNLGGY3DGNBWMU3WI=== 题目非常具有迷惑性,我一开始以为就是一 ...

  2. WMS工作原理

    图1:创建窗口 图2:通信过程 我们知道其实任何一个窗口的创建,最终都是会创建一个 ViewRootImpl对象.ViewRootImpl 是一很重要的类,类似 ActivityThread 负责跟A ...

  3. Codeforces340 E. Iahub and Permutations

    Codeforces题号:#340E 出处: Codeforces 主要算法:思维+DP 难度:4.8 题意: 有一个长度为$n$的排列(即各元素互不相同),其中有一些为-1.现要求将数填到这些-1上 ...

  4. Codeforces Round #545 (Div. 2) D

    链接:http://codeforces.com/contest/1138/problem/D 啊啊啊啊啊啊,自闭啊,比赛的时候判断条件 if(s1[i-1]=='0') aa++;写成了 if(s1 ...

  5. Ionic3在ts中获取html中值的方法

    我觉得有两种方法,都是Angular中的语法,一种是把值当做参数传递,另一种是使用ngModel实现双向绑定 还有一种很少用到的,Js的原生方法:document.getElementById('ch ...

  6. PHP错误代号列表

    代号 代号 语法 参考 T_ABSTRACT abstract 抽象类(自 PHP 5.0.0 起可用) T_AND_EQUAL &= 赋值运算符 T_ARRAY array() array( ...

  7. hiho1257 Snake Carpet

    题目链接:http://hihocoder.com/problemset/problem/1257 题目大意:有n条蛇 编号为1-n 每条蛇的长度跟编号相等 奇数编号的蛇必须拐奇数次(除了第一条)偶数 ...

  8. Android stadio 生成项目 Plugin with id 'com.android.application' not found

    buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2. ...

  9. 【cf789B】Masha and geometric depression(分类讨论/暴力)

    B. Masha and geometric depression 题意 在黑板上写数列,首项是b,公比是q,超过l时就停止不写.给定m个数,遇到后跳过不写.问一共写多少个数,如果无穷个输出inf. ...

  10. HNOI2019 退役记

    窗外风雨大作. 凌晨两点又被噩梦惊醒,朦胧中看见书桌的灯还亮着. 走近书桌,有一个人正在敲打着键盘,屏幕上是一些似曾相识的东西. 被水浸湿的头发随意地搭在额头上,鼻梁上架着一副眼镜,镜片上全是小水珠, ...