摘自coreos官网(etcd v3.2.17)
https://coreos.com/etcd/docs/latest/
https://coreos.com/etcd/docs/latest/getting-started-with-etcd.html
1.1.1 概念
注意v2的版本对于linux系统默认仓库不再封装。对于最新的去github上下载。
官网中首先介绍什么是etcd
A distributed, reliable key-value store for the most critical data of a distributed system
它是一套开源的可靠的分布式存储(即需要做cluster),用于存储key-value 键值对
同时它不仅仅是存储,它还提供共享配置及服务发现(后面这两个特征非常有特点,主要用于container中),对于leader的选举非常优秀,它的leader选举更换对于前端是无感知的。
应用容器读写数据在etcd上,除此还有支持快照及查看历史事件的功能。
下图是官网给出的etcd的功能及特点
etcd is the backend for service discovery and stores cluster state and configuration
1.1.2 数据模型
etcd的数据模型是非常有特点的。
一个持久的、多版本的并发控制数据模型(这有点类似于svn),也就是说All past versions of keys are still accessible and watchable after modification. 同时对于旧数据,它会进行压缩存储区,丢弃最旧的版本,防止数据库数据暴涨(只要有数据的压缩,就会覆盖最旧版本的数据)。
Note:etcd适用于较小的元数据键值对的处理,对于大的键值对数据的处理会导致其他请求时间的增加。数据目前最大支持1M数据的RPC(远程过程调用)请求,目前来说没有办法实现更大的数据的配置。
1.1.3 安装
1、 系统要求
目前支持linux操作系统,请不要使用其他操作系统,下图是官方给出的
Architecture | Operating System | Status | Maintainers |
---|---|---|---|
amd64 | Linux | Stable | etcd maintainers |
2、 硬件要求
生产环境中标准配置为:x86-64位架构的CPU、8CPU、16G RAM 、50G SSD硬盘
1) CPU
官方给的建议如下:Heavily loaded etcd deployments, serving thousands of clients or tens of thousands of requests per second, tend to be CPU bound since etcd can serve requests from memory. Such heavy deployments usually need eight to sixteen dedicated cores
翻译如下:上千的客户端或者每秒成千上万的的并发请求,需要绑定CPU,因为大部分的请求可以从内存中获取,这种情况需要8-16核CPU.
测试环境可以降低:2-4 核CPU
2) 内存
etcd的元数据需要很少的内存,数据的存储需要内存,也就是说根据数据量来分配需要多少内存,因为etcd会在内存中cache key-value数据,对于数据它会消耗大量的剩余内存用于追踪watcher。一般8G够用了,对于高并发的场景(上千的watcher)或者上百万的key,则需要16G或者更高。
测试环境可以使用4G
3) 硬盘
硬盘的转速直接影响etcd的稳定性和性能。因为etcd的协议raft依赖于持续的存储元数据到日志文件中,如果磁盘转速太慢或者磁盘I/O不好,直接影响cluster etcd,很有可能导致leader经常性的选举(因为集群是通过log日志的状态来判断是否存活,磁盘转速慢直接导致心跳检测超时)。
最低要求:7200 n/s
机械硬盘:(这里的IOPS是指其中的顺序读写的次数,不含随机读写次数)
75-100 iops 对应7200 n/s,125-150 iops 对应 1000 n/s,175-210 iops 对应 15000 n/s
固态硬盘:
ssd完全满足需求,因为它的IOPS可达数万甚至数十万
注意:对于etcd的备份,建议使用SSD硬盘,一般情况下不需要再备份,因为使用了集群,它的数据的一致性很可靠,对于硬盘做raid,建议做成raid0,还是因为集群的原因。
测试环境可以使用raid0,7200 n/s
对于磁盘的优化,可以调整etcd的进程的磁盘的优先级(如果有其他进程,可能会导致fsync函数延迟,即调整etcd进程的磁盘优先级),命令如下:
sudo ionice -c2 -n0 -p pgrep etcd
4) 网卡
网络低延迟是保证etcd稳定性的重要指标,宽带传输速度越快越好,1G就可以满足大部分需求,如果etcd是个大的集群,需要10G以上的宽带,请使用光纤。
对于小的集群来说,可以使用一个data center,这样避免了延迟开销同时减少了划分事件的开销,如果是多个数据中心,最好选择比较近的数据中心
注意:对于延迟高的数据中心或者网络,需要额外设置heartbeat interval and election timeout
延迟时间=磁盘+网络
增加心跳检测时间及选举超时时间,命令如下:
etcd --heartbeat-interval=100 --election-timeout=500
如果对于大量的客户端的请求造成延迟,会报如下错误
dropped MsgProp to 247ae21ff9436b2d since streamMsg‘s sending buffer is full
dropped MsgAppResp to 247ae21ff9436b2d since streamMsg‘s sending buffer is full
可以通过如下命令调整网络的优先级:
tc qdisc add dev eth0 root handle 1: prio bands 3
tc filter add dev eth0 parent 1: protocol ip prio 1 u32 match ip sport 2380 0xffff flowid 1:1
tc filter add dev eth0 parent 1: protocol ip prio 1 u32 match ip dport 2380 0xffff flowid 1:1
tc filter add dev eth0 parent 1: protocol ip prio 2 u32 match ip sport 2739 0xffff flowid 1:1
tc filter add dev eth0 parent 1: protocol ip prio 2 u32 match ip dport 2739 0xffff flowid 1:1
其他:
快照优化:命令:etcd --snapshot-count=5000 ,默认是10000个改变后会快照,如果内存使用量高及磁盘负载高可以降低该值,同时来保证etcd集群的稳定性。
3、 系统限制
默认的存储设置的是2G,需要修改增加(这个是根据物理内存设置),通过--quota-backend-bytes设置
对于其他的比如云计算上的虚拟机(AWS/GCE)参考文章
https://coreos.com/etcd/docs/latest/op-guide/hardware.html
关于压力测试(主要是测试QPS/请求的平均延迟),参考如下文章
https://coreos.com/etcd/docs/latest/op-guide/performance.html
4、 安装包
官方提供了源码包和二进制包
https://github.com/coreos/etcd/releases
最好选择release版本,不要使用stable,官方说的Note: The master branch may be in an unstable or even broken state during development. Please use releases instead of the master branch in order to get stable binaries.
1) 二进制安装wget https://github.com/coreos/etcd/releases/download/v3.2.23/etcd-v3.2.23-linux-amd64.tar.gz
直接解压即可
[root@localhost etcd-v3.2.23-linux-amd64]# ./etcd --version etcd Version: 3.2.23 Git SHA: c9504f61f Go Version: go1.8.7 Go OS/Arch: linux/amd64
由于etcdctl是客户端工具,用于和etcd服务端进行通信或直接操作etcd数据库,但是默认etcdctl命令是使用的是API VERSION:2,需要更改,因为这里使用的是3的版本
[root@localhost etcd-v3.2.23-linux-amd64]# tail -1 /etc/profile export ETCDCTL_API=3 [root@localhost etcd-v3.2.23-linux-amd64]# source /etc/profile
检查
[root@localhost etcd-v3.2.23-linux-amd64]# ./etcdctl --version Error: unknown flag: --version NAME: etcdctl - A simple command line client for etcd3. USAGE: etcdctl VERSION: 3.2.23 API VERSION: 3.2
#检查是否按装成功
#启动etcd
[root@localhost etcd-v3.2.23-linux-amd64]# ./etcd 2018-07-18 14:23:42.781257 I | etcdmain: etcd Version: 3.2.23 2018-07-18 14:23:42.781362 I | etcdmain: Git SHA: c9504f61f 2018-07-18 14:23:42.781386 I | etcdmain: Go Version: go1.8.7 2018-07-18 14:23:42.781406 I | etcdmain: Go OS/Arch: linux/amd64 2018-07-18 14:23:42.781423 I | etcdmain: setting maximum number of CPUs to 2, total number of available CPUs is 2 2018-07-18 14:23:42.781460 W | etcdmain: no data-dir provided, using default data-dir ./default.etcd 2018-07-18 14:23:42.782487 I | embed: listening for peers on http://localhost:2380 2018-07-18 14:23:42.782875 I | embed: listening for client requests on localhost:2379 2018-07-18 14:23:42.826434 I | etcdserver: name = default 2018-07-18 14:23:42.826472 I | etcdserver: data dir = default.etcd 2018-07-18 14:23:42.826491 I | etcdserver: member dir = default.etcd/member 2018-07-18 14:23:42.826511 I | etcdserver: heartbeat = 100ms 2018-07-18 14:23:42.826527 I | etcdserver: election = 1000ms 2018-07-18 14:23:42.826542 I | etcdserver: snapshot count = 100000 2018-07-18 14:23:42.826571 I | etcdserver: advertise client URLs = http://localhost:2379 2018-07-18 14:23:42.826594 I | etcdserver: initial advertise peer URLs = http://localhost:2380 2018-07-18 14:23:42.826621 I | etcdserver: initial cluster = default=http://localhost:2380 2018-07-18 14:23:42.904133 I | etcdserver: starting member 8e9e05c52164694d in cluster cdf818194e3a8c32 2018-07-18 14:23:42.904208 I | raft: 8e9e05c52164694d became follower at term 0 2018-07-18 14:23:42.904242 I | raft: newRaft 8e9e05c52164694d [peers: [], term: 0, commit: 0, applied: 0, lastindex: 0, lastterm: 0] 2018-07-18 14:23:42.904272 I | raft: 8e9e05c52164694d became follower at term 1 2018-07-18 14:23:42.999118 W | auth: simple token is not cryptographically signed 2018-07-18 14:23:43.025464 I | etcdserver: starting server... [version: 3.2.23, cluster version: to_be_decided] 2018-07-18 14:23:43.026680 I | etcdserver: 8e9e05c52164694d as single-node; fast-forwarding 9 ticks (election ticks 10) 2018-07-18 14:23:43.026759 W | raft: 8e9e05c52164694d cannot campaign at term 1 since there are still 1 pending configuration changes to apply 2018-07-18 14:23:43.027628 I | etcdserver/membership: added member 8e9e05c52164694d [http://localhost:2380] to cluster cdf818194e3a8c32 2018-07-18 14:23:44.004745 I | raft: 8e9e05c52164694d is starting a new election at term 1 2018-07-18 14:23:44.004850 I | raft: 8e9e05c52164694d became candidate at term 2 2018-07-18 14:23:44.004916 I | raft: 8e9e05c52164694d received MsgVoteResp from 8e9e05c52164694d at term 2 2018-07-18 14:23:44.004953 I | raft: 8e9e05c52164694d became leader at term 2 2018-07-18 14:23:44.004980 I | raft: raft.node: 8e9e05c52164694d elected leader 8e9e05c52164694d at term 2 2018-07-18 14:23:44.005452 I | etcdserver: setting up the initial cluster version to 3.2 2018-07-18 14:23:44.019731 N | etcdserver/membership: set the initial cluster version to 3.2 2018-07-18 14:23:44.019890 I | etcdserver/api: enabled capabilities for version 3.2 2018-07-18 14:23:44.019955 I | etcdserver: published {Name:default ClientURLs:[http://localhost:2379]} to cluster cdf818194e3a8c32 2018-07-18 14:23:44.020082 E | etcdmain: forgot to set Type=notify in systemd service file? 2018-07-18 14:23:44.020111 I | embed: ready to serve client requests 2018-07-18 14:23:44.020477 N | embed: serving insecure client requests on 127.0.0.1:2379, this is strongly discouraged!
使用etcdctl客户端命令写和读
[root@localhost etcd-v3.2.23-linux-amd64]# ./etcdctl --endpoints=localhost:2379 put foo bar OK [root@localhost etcd-v3.2.23-linux-amd64]# ./etcdctl --endpoints=localhost:2379 get foo foo bar
2) 源码包安装
参考https://coreos.com/etcd/docs/3.2.17/dl_build.html
下载:wget https://github.com/coreos/etcd/releases/download/v3.2.23/v3.2.23.tar.gz
解压后,直接build即可./build
1.1.4 使用
启动后,会有两个端口2379 和2380
2379 for client communication
2380 for server-to-server communication
其中我们看到前面的启动不是后台的,同时监听的ip也不可以,需要更改
这里我们必须使用配置文件启动etcd,配置如下
[root@localhost etcd]# cat /etc/etcd/etcd.conf ETCD_NAME=etcd-node1 #定义节点名称 ETCD_DATA_DIR="/var/lib/etcd/default.etcd" #定义数据存放位置 #[cluster] ETCD_INITIAL_ADVERTISE_PEER_URLS=http://172.16.80.201:2380 #通知其他etcd实例地址 ETCD_INITIAL_CLUSTER="etcd-node1=http://172.16.80.201:2380,etcd-node2=http://172.16.80.202:2380,etcd-node3=http://172.16.80.203:2380" #定义etcd集群节点 ETCD_INITIAL_CLUSTER_STATE=new #初始化集群状态,new表示新建 ETCD_INITIAL_CLUSTER_TOKEN=etcd-k8s-cluster #初始化集群token,token一致则可以进入同一集群 ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380 #监听etcd实例的地址 ETCD_ADVERTISE_CLIENT_URLS=http://172.16.80.201:2379 #通知客户端地址 ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379" #监听客户端地址 #[proxy] ETCD_PROXY="off" #[security]
1.1.4.1 grpc-gateway
etcd v3的版本使用的是grpc的协议来进行内部的通信的,(速度快,它传的是二进制的数据,同时是基于http2的多路复用),但是有一个问题,它只能用于内部服务调用,无法对外服务,grpc-gateway就是为了解决这个问题诞生的,它就是网关服务器负责信息的转换。
官网解释:
etcd v3 uses gRPC for its messaging protocol. The etcd project includes a gRPC-based Go client and a command line utility, etcdctl, for communicating with an etcd cluster through gRPC. For languages with no gRPC support, etcd provides a JSON grpc-gateway. This gateway serves a RESTful proxy that translates HTTP/JSON requests into gRPC messages.
翻译:etcd v3的版本使用的是grpc的协议来进行通信。etcd项目包括一个基于go客户端的gRPC和一个命令行etcdctl,这个客户端用于通过gRPC协议在etcd集群中通信。对于无法支持gRPC的计算机语言,etcd提供了一个grpc-gateway的JSON。这个网关作为一个restful 代理(这个代理用于将HTTP或者JSON转换为gRPC信息)
关于如何使用grpc-agteway参考如下两篇文章:
http://dockone.io/article/2836
https://coreos.com/etcd/docs/3.2.17/dev-guide/api_grpc_gateway.html
原文:http://blog.51cto.com/laodou/2146819