设为首页 收藏本站
查看: 1829|回复: 0

[经验分享] etcd基础第一篇

[复制链接]

尚未签到

发表于 2019-1-31 11:49:02 | 显示全部楼层 |阅读模式
  1.1 简介
摘自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




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-670013-1-1.html 上篇帖子: etcd第三篇恢复数据 下篇帖子: etcd + TLS 集群部署
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表