go etcd
etcd介绍
GitHub:https://github.com/coreos/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
- --data-dir
- --wal-dir
- --listen-peer-urls
- --initial-advertise-peer-urls
- --listen-client-urls
- --advertise-client-urls
- --initial-cluster-token
- --initial-cluster
- --initial-cluster-state
静态配置
https://coreos.com/etcd/docs/latest/op-guide/clustering.html
- 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的更多相关文章
- 一次基于etcd的分布式锁自动延时失败问题的排查
今天在测试基于etcd的分布式锁过程中,在测试获取锁后,释放之前超出TTL时长的情况下自动延长TTL这部分功能,在延长指定key的TTL时总是返回404错误信息,在对目标KEY更新TTL时目标KEY已 ...
- etcd:用于服务发现的键值存储系统
etcd是一个高可用的键值存储系统,主要用于共享配置和服务发现.etcd是由CoreOS开发并维护的,灵感来自于 ZooKeeper 和 Doozer,它使用Go语言编写,并通过Raft一致性算法处理 ...
- Centos7下Etcd集群搭建
一.简介 "A highly-available key value store for shared configuration and service discovery." ...
- 通过docker-machine和etcd部署docker swarm集群
本片文章介绍一下 使用docker-machine 搭建docker swarm 集群:docker swarm是docker 官方搭建的容器集群编排工具:容器编排,就是可以使你像使用一太机器一样来使 ...
- etcd第三集
简单说下golang的etcd接口例子.etcd api有v2(http+json)和v3(grpc)两个版本,目前大家都用v2,所以... v2: https://github.com/coreos ...
- etcd第二集
参考文章:https://github.com/coreos/etcd/blob/master/Documentation/v2/api.mdhttp://www.cnblogs.com/zhengr ...
- etcd第一集
网站:https://github.com/coreos/etcd 一些观点:https://yq.aliyun.com/articles/11035 1.etcd是键值存储仓库,配置共享和服务发现2 ...
- 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 ...
- etcd api 接口
etcd api接口 基本操作api: https://github.com/coreos/etcd/blob/6acb3d67fbe131b3b2d5d010e00ec80182be4628/Doc ...
- Key/Value存储系统etcd的特性
etcd 是一个高可用的Key/Value存储系统,和其他KV存储系统不同的是,它的灵感来自于 ZooKeeper 和 Doozer,主要用于分享配置和服务发现.利用 etcd 的特性,应用程序可以在 ...
随机推荐
- GLSL 变量属性
1. attribute变量为这个attribute变量指定一个位置(用无符号值表示):glBindAttribLocation利用这个“位置”来指定需要传给shader里的attribue变量的数据 ...
- kubernetes增加污点,达到pod是否能在做节点运行
master node参与工作负载 (只在主节点执行)使用kubeadm初始化的集群,出于安全考虑Pod不会被调度到Master Node上,也就是说Master Node不参与工作负载. 这里搭建的 ...
- 51Nod1778 小Q的集合 【组合数】【Lucas定理】
题目分析: 题解好高深...... 我给一个辣鸡做法算了,题解真的看不懂. 注意到方差恒为$0$,那么其实就是要我们求$\sum_{i=0}^{n}\binom{n}{i}(i^k-(n-i)^k)^ ...
- Django+Xadmin打造在线教育系统(七)
全局导航&个人中心&全局搜索 配置全局导航 让index页面也继承base页面,注意首页有个单独的__index.js__ base页面的导航栏也进行配置 <nav> &l ...
- HDU4864 Task(算竞进阶习题)
贪心 比较巧妙的贪心..先把所有机器和任务按时间是第一关键字,等级为第二关键字排序. 然后用机器去匹配每一个任务. 排序之后,在时间上满足当前任务的机器,必定也在时间上满足后面的机器,所以我们每次把时 ...
- 【GZOI2015】石子游戏 博弈论 SG函数
题目大意 有\(n\)堆石子,两个人可以轮流取石子.每次可以选择一堆石子,做出下列的其中一点操作: 1.移去整堆石子 2.设石子堆中有\(x\)个石子,取出\(y\)堆石子,其中\(1\leq y&l ...
- JumpServer 跳板机系统
Jumpserver项目为开源项目,截至到目前最新版本为4.0,4.0功能并不完整,无上传.下载功能,配置复杂.启动服务也较繁琐,推荐使用0.3.2版本,文档较全,安装简单文档链接https://gi ...
- 汽车控制器LIMPHOME电路设计
摘要:本文介绍汽车控制器上常用的3种LIMPHOME电路设计方法,用于在单片机复位重启期间仍能保证外部输出正确性,确保行车安全. 在电子电气领域,单片机使用非常广泛,单片机的复位重启是设计时必须 ...
- servlet 上下文
一.应用需求: 如何统计网站在线人数? 使用ServletContext. 二.ServletContext详解: 1.是不同于session和cookie,是可以让所有客户端共同访问的内容,是在服务 ...
- Zabbix历史数据清理
特别提醒: a.文中测试的Zabbix版本为 3.0.3 . b.清理数据属于高危操作,请在测试环境中验证后再执行线上操作!!! 1.统计数据库中每个表所占的空间: mysql> SELECT ...