etcd使用
Posted 闫世成
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了etcd使用相关的知识,希望对你有一定的参考价值。
etcd简介
etcd 是 coreOs 团队于 2013 年 6 发起的开源项目, 他的目标是构建一个高可用的分布式键值(key-value)数据库. etcd 内部采用 raft 协议作为一致性算法, etcd基于 go 语言实现.
项目地址: https://github.com/coreos/etcd/
推荐文章: https://blog.csdn.net/bbwangj/article/details/82584988
特性
- 简单: 安装配置简单, 而且提供了 HTTP API 进行交互, 使用也很简单.
- 安全: 支持 SSL 证书验证.
- 快速: 根据官方提供的 benchmark 数据, 单实例支持每秒 2k+ 读操作.
- 可靠: 采用 raft 算法, 实现分布式数据库的可用性和一致性.
etcd 集群介绍
etcd 集群 是一个分布式系统. 使用 Raft 协议来维护集群内各个节点状态的一致性.
主机状态分为: Leader, Follower, Candidate
当集群初始化的时候,每个节点都是 Follower 角色.
通过心跳与其他节点同步数据.当 Follower 在一定时间内没有收到来自主节点的心跳,会将自己角色变为 Candidate ,并发起一次选主投票.
配置 etcd 集群,建议尽可能是奇数个节点,而不要是偶数节点.
单节点etcd配置
1. 安装 etcd [root@test1 ~]# yum install etcd -y # 2. 修改配置文件 [root@test1 ~]# cat /etc/etcd/etcd.conf #[Member] # 数据目录 ETCD_DATA_DIR="/var/lib/etcd/cluster.etcd" # 集群通信的监听地址 ETCD_LISTEN_PEER_URLS="http://172.16.0.111:2380,http://localhost:2380" # 客户端的连接地址 ETCD_LISTEN_CLIENT_URLS="http://172.16.0.111:2379,http://localhost:2379" # 名字标识符 ETCD_NAME="test1" # 启动 etcd [root@test1 ~]# systemctl start etcd [root@test1 ~]# systemctl enable etcd # 3. 查看节点 [root@test1 ~]# etcdctl member list 8e9e05c52164694d: name=test1 peerURLs=http://localhost:2380 clientURLs=http://localhost:2379 isLeader=true # 4. 查看健康状态 [root@test1 ~]# etcdctl cluster-health member 8e9e05c52164694d is healthy: got healthy result from http://localhost:2379 cluster is healthy # 5. 操作 etcd [root@test1 ~]# etcdctl mkdir /test [root@test1 ~]# etcdctl ls / /test [root@test1 ~]# etcdctl rmdir /test
etcd集群配置
集群的安装方法都一样,配置文件也类似,除了IP地址和唯一标识之外没有区别,提前配置好 hosts 文件.
etcd集群配置文件
[root@test1 ~]# cat /etc/etcd/etcd.conf #[Member] #ETCD_CORS="" # 数据目录 ETCD_DATA_DIR="/var/lib/etcd/cluster.etcd" #ETCD_WAL_DIR="" # 集群通信的监听地址 ETCD_LISTEN_PEER_URLS="http://172.16.0.111:2380" # 客户端的连接地址 提供 Http API服务 ETCD_LISTEN_CLIENT_URLS="http://172.16.0.111:2379,http://localhost:2379" # 保存最大的快照文件数 0表示不受限制 ETCD_MAX_SNAPSHOTS="10" # 要保留的最大wal文件数(0表示不受限制) ETCD_MAX_WALS="5" # 名字标识符 ETCD_NAME="test1" # 该参数作用指定有多少个事务被提交时,触发快照功能保存到磁盘. ETCD_SNAPSHOT_COUNT="100000" # leader 多久发送一次心跳 默认 100ms ETCD_HEARTBEAT_INTERVAL="100" # 该参数的作用是重新投票的超时时间,如果follow在该+ 时间间隔没有收到心跳包,会触发重新投票,默认为1000ms。 ETCD_ELECTION_TIMEOUT="1000" # 事务中允许的最大操作数。 ETCD_QUOTA_BACKEND_BYTES="0" # 服务器将接受的最大客户端请求大小(字节)。 ETCD_MAX_REQUEST_BYTES="1572864" # 客户端在ping服务器之前应等待的最短持续时间间隔。 ETCD_GRPC_KEEPALIVE_MIN_TIME="5s" # 服务器到客户端ping的频率持续时间,以检查连接是否处于活动状态(0表示禁用)。 #ETCD_GRPC_KEEPALIVE_INTERVAL="2h0m0s" # 关闭非响应连接之前的额外持续等待时间(0表示禁用)。 #ETCD_GRPC_KEEPALIVE_TIMEOUT="20s" # # [Clustering] # ETCD_ADVERTISE_CLIENT_URLS # 对外公告该节点同伴监听地址,这个值会告诉集群中的其他节点 ETCD_INITIAL_ADVERTISE_PEER_URLS="http://172.16.0.111:2380" # 对外公告的该节点客户端监听地址,这个值会告诉集群中的其他节点. ETCD_ADVERTISE_CLIENT_URLS="http://172.16.0.111:2379,http://localhost:2379" # 集群中所有节点的信息 ETCD_INITIAL_CLUSTER="test1=http://172.16.0.111:2380,test2=http://172.16.0.112:2380,test3=http://172.16.0.113:2380" # 创建集群的 token,这个值每个集群保持唯一。 ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" # 设置new为初始静态或DNS引导期间出现的所有成员。如果将此选项设置为existing,则etcd将尝试加入现有群集。 ETCD_INITIAL_CLUSTER_STATE="new"
etcd配置文件详解
--name 含义:此成员的名称。 默认值:default 环境变量:ETCD_NAME 作用:此配置值作为此节点在--initial-cluster标志中列出的条目(例如,default=http://localhost:2380)引用。若使用静态引导,则需要匹配标志中使用的密钥。使用发现时,每个成员必须具有唯一的名称。建议使用Hostname或者machine-id。 注意:使用发现时,每个成员必须具有唯一的名称。 --data-dir 含义:服务运行数据保存的路径。 默认值:${name}.etcd 环境变量:ETCD_DATA_DIR 作用:设置数据保存的目录。 --wal-dir 含义:专用wal目录的路径。 默认值:--data-dir的路径下 环境变量:ETCD_WAL_DIR 作用:独立设置wal目录,etcd会将WAL文件写入--wal-dir而不是--data-dir。独立的wal路径,有助于避免日志记录和其他IO操作之间的竞争。 --snapshot-count 含义:触发快照到磁盘的已提交事务数。 默认值:100000 环境变量:ETCD_SNAPSHOT_COUNT 作用:指定有多少事务(transaction)被提交时,触发截取快照保存到磁盘。 --heartbeat-interval 含义:心跳间隔的时间(以毫秒为单位) 默认值:100 环境变量:ETCD_HEARTBEAT_INTERVAL 作用:leader 多久发送一次心跳到 followers。 --election-timeout 含义:选举超时的时间(以毫秒为单位) 默认值:1000 环境变量:ETCD_ELECTION_TIMEOUT 作用:重新投票的超时时间,如果 follow 在该时间间隔没有收到心跳包,会触发重新投票,默认为 1000 ms。 --listen-peer-urls 含义:和成员之间通信的地址。 默认值:http://localhost:2380 环境变量:ETCD_LISTEN_PEER_URLS 作用:用于监听其他etcd member的url 提示:域名为无效值,如http://example.com:2380为错误配置。 --listen-client-urls 含义:对外提供服务的地址 默认值:http://localhost:2379 环境变量:ETCD_LISTEN_CLIENT_URLS 作用:对外提供服务的地址。 提示:域名为无效值,如http://example.com:2379为错误配置。 --max-snapshots 含义:要保留的最大快照文件数(0表示不受限制)。 默认值:5 环境变量:ETCD_MAX_SNAPSHOTS 作用: 提示:Windows上的用户默认值不受限制,建议手动清除至5。 --max-wals 含义:要保留的最大wal文件数(0表示不受限制)。 默认值:5 环境变量:ETCD_MAX_WALS 作用: 提示:Windows上的用户默认值不受限制,建议手动清除至5。 --cors 含义:逗号分隔的CORS原始白名单(跨源资源共享) 默认值: 环境变量:ETCD_CORS --quota-backend-bytes 含义:当后端大小超过给定配额时(0默认为低空间配额),引发警报。 默认值:0 环境变量:ETCD_QUOTA_BACKEND_BYTES --max-txn-ops 含义:事务中允许的最大操作数。 默认值:128 环境变量:ETCD_MAX_TXN_OPS --max-request-bytes 含义:服务器将接受的最大客户端请求大小(字节)。 默认值:1572864 环境变量:ETCD_MAX_REQUEST_BYTES --grpc-keepalive-min-time 含义:客户端在ping服务器之前应等待的最短持续时间间隔。 默认值:5s 环境变量:ETCD_GRPC_KEEPALIVE_MIN_TIME --grpc-keepalive-interval 含义:服务器到客户端ping的频率持续时间,以检查连接是否处于活动状态(0表示禁用)。 默认值:2h 环境变量:ETCD_GRPC_KEEPALIVE_INTERVAL --grpc-keepalive-timeout 含义:关闭非响应连接之前的额外持续等待时间(0表示禁用)。 默认值:20s 环境变量:ETCD_GRPC_KEEPALIVE_TIMEOUT 2.2 集群相关标识 提示:--initial-advertise-peer-urls, --initial-cluster, --initial-cluster-state, and --initial-cluster-token标识用于引导一个新成员,当重启一个已经存在的成员时将忽略。 --initial-advertise-peer-urls 含义:该节点成员对等URL地址,且会通告群集的其余成员节点。 默认值:http://localhost:2380 环境变量:ETCD_INITIAL_ADVERTISE_PEER_URLS 作用: --initial-cluster 含义:集群中所有节点的信息。 默认值:default=http://localhost:2380 环境变量:ETCD_INITIAL_CLUSTER 作用: 注意:此处default为节点的--name指定的名字;localhost:2380为--initial-advertise-peer-urls指定的值。 --initial-cluster-state 含义:初始集群状态 默认值:new 环境变量:ETCD_INITIAL_CLUSTER_STATE 作用:设置new为初始静态或DNS引导期间出现的所有成员。如果将此选项设置为existing,则etcd将尝试加入现有群集。 --initial-cluster-token 含义:创建集群的 token,这个值每个集群保持唯一。 默认值:etcd-cluster 环境变量:ETCD_INITIAL_CLUSTER_TOKEN 作用:此配置可使重新创建集群,即使配置和之前一样,也会再次生成新的集群和节点 uuid;否则会导致多个集群之间的冲突,造成未知的错误。 --advertise-client-urls 含义:此成员的客户端URL列表,用于通告群集的其余部分。这些URL可以包含域名。 默认值:http://localhost:2379 环境变量:ETCD_ADVERTISE_CLIENT_URLS 作用:对外公告的该节点客户端监听地址。 --discovery 含义:用于引导群集的发现URL。 默认值: 环境变量:ETCD_DISCOVERY 作用: --discovery-srv 含义:DNS srv域用于引导群集。 默认值: 环境变量:ETCD_DISCOVERY_SRV 作用: --discovery-srv-name 含义:使用DNS引导时查询的DNS srv名称的后缀。 默认值: 环境变量:ETCD_DISCOVERY_SRV_NAME 作用: --discovery-fallback 含义:发现服务失败时的预期行为(“退出”或“代理”)。“proxy”仅支持v2 API。 默认值:proxy 环境变量:ETCD_DISCOVERY_FALLBACK 作用: --discovery-proxy 含义:用于流量到发现服务的HTTP代理。 默认值: 环境变量:ETCD_DISCOVERY_PROXY 作用: --strict-reconfig-check 含义:拒绝可能导致仲裁丢失的重新配置请求。 默认值:false 环境变量:ETCD_STRICT_RECONFIG_CHECK 作用: --auto-compaction-retention 含义:在一个小时内为mvcc键值存储的自动压实保留。0表示禁用自动压缩。 默认值:0 环境变量:ETCD_AUTO_COMPACTION_RETENTION 作用: --auto-compaction-mode 含义:说明--auto-compaction-retention配置的基于时间保留的三种模式:periodic, revision. periodic 默认值:periodic 环境变量:ETCD_AUTO_COMPACTION_MODE 作用: --enable-v2 含义:接受etcd V2客户端请求 默认值:true 环境变量:ETCD_ENABLE_V2 作用: 2.3 代理相关标识 提示:--proxy配置etcd以在代理模式下运行,“proxy”仅支持v2 API。 --proxy 含义:代理模式设置,("off", "readonly" or "on") 默认值:off 环境变量:ETCD_PROXY 作用: --proxy-failure-wait 含义:在重新考虑代理请求之前,endpoints 将处于失败状态的时间(以毫秒为单位)。 默认值:5000 环境变量:ETCD_PROXY_FAILURE_WAIT 作用: --proxy-refresh-interval 含义:endpoints 刷新间隔的时间(以毫秒为单位)。 默认值:30000 环境变量:ETCD_PROXY_REFRESH_INTERVAL 作用: --proxy-dial-timeout 含义:拨号超时的时间(以毫秒为单位)或0表示禁用超时 默认值:1000 环境变量:ETCD_PROXY_DIAL_TIMEOUT 作用: --proxy-write-timeout 含义:写入超时的时间(以毫秒为单位)或0以禁用超时。 默认值:5000 环境变量:ETCD_PROXY_WRITE_TIMEOUT 作用: --proxy-read-timeout 含义:读取超时的时间(以毫秒为单位)或0以禁用超时。 默认值:0 环境变量:ETCD_PROXY_READ_TIMEOUT 作用: 2.4 安全相关标识 --ca-file 提示:已弃用,可以替换为--trusted-ca-file ca.crt、--client-cert-auth,etcd将执行相同的操作。 --cert-file 含义:客户端服务器TLS证书文件的路径。 默认值: 环境变量:ETCD_CERT_FILE 作用: --key-file 含义:客户端服务器TLS密钥文件的路径。 默认值: 环境变量:ETCD_KEY_FILE 作用: --client-cert-auth 含义:启用客户端证书验证。 默认值:false 环境变量:ETCD_CLIENT_CERT_AUTH 作用: --client-crl-file 含义:客户端证书吊销列表文件的路径。 默认值: 环境变量:ETCD_CLIENT_CRL_FILE 作用: --trusted-ca-file 含义:客户端服务器的路径TLS可信CA证书文件。 默认值: 环境变量:ETCD_TRUSTED_CA_FILE 作用: --auto-tls 含义:客户端TLS使用生成的证书 默认值:false 环境变量:ETCD_AUTO_TLS 作用: --peer-ca-file 提示:已弃用,可以替换为--peer-trusted-ca-file ca.crt --peer-client-cert-auth,etcd将执行相同的操作。 --peer-cert-file 含义:对等服务器TLS证书文件的路径。这是对等流量的证书,用于服务器和客户端。 默认值: 环境变量:ETCD_PEER_CERT_FILE 作用: --peer-key-file 含义:对等服务器TLS密钥文件的路径。这是对等流量的关键,用于服务器和客户端。 默认值: 环境变量:ETCD_PEER_KEY_FILE 作用: --peer-client-cert-auth 含义:启用对等客户端证书验证。 默认值:false 环境变量:ETCD_PEER_CLIENT_CERT_AUTH 作用: --peer-crl-file 含义:对等证书吊销列表文件的路径。 默认值: 环境变量:ETCD_PEER_CRL_FILE 作用: --peer-trusted-ca-file 含义:对等服务器TLS可信CA文件的路径。 默认值: 环境变量:ETCD_PEER_TRUSTED_CA_FILE 作用: --peer-auto-tls 含义:Peer TLS使用自动生成的证书 默认值:false 环境变量:ETCD_PEER_AUTO_TLS 作用: --peer-cert-allowed-cn 含义:允许CommonName进行对等体认证。 默认值:none 环境变量:ETCD_PEER_CERT_ALLOWED_CN 作用: 2.5 日志相关标识 --logger 含义:为结构化日志记录指定\'zap\'或\'capnslog\'。 默认值:capnslog 环境变量:ETCD_LOGGER 作用: --log-outputs 含义:指定\'stdout\'或\'stderr\'以跳过日志记录,即使在systemd或逗号分隔的输出目标列表下运行也是如此。 默认值:default 环境变量:ETCD_LOG_OUTPUT 作用: --debug 含义:将所有子包的默认日志级别设置为DEBUG。 默认值:false(所有包的INFO) 环境变量:ETCD_DEBUG 作用: --log-package-levels 含义:将单个etcd子包设置为特定的日志级别。一个例子是etcdserver=WARNING,security=DEBUG 默认值:(所有包的INFO) 环境变量:ETCD_LOG_PACKAGE_LEVELS 作用: 2.6 非安全相关标识 --force-new-cluster 含义:强制创建新的单成员群集。它提交配置更改,强制删除集群中的所有现有成员并添加自身。需要将其设置为还原备份。 默认值:false 环境变量:ETCD_FORCE_NEW_CLUSTER 作用: 2.7 配置文件相关标识 --enable-pprof 含义:通过HTTP服务器启用运行时分析数据。地址位于客户端URL +“/ debug / pprof /” 默认值:false 环境变量: 作用: --metrics 含义:设置导出的指标的详细程度,指定“扩展”以包括直方图指标。 默认值:basic 环境变量: 作用: --listen-metrics-urls 含义:要监听的其他URL列表将响应端点/metrics和/health端点 默认值: 环境变量: 作用: 2.8 其他相关标识 --version 含义:打印版本并退出。 默认值:false 环境变量: 作用: --config-file 含义:从文件加载服务器配置。 默认值: 环境变量: 作用:从配置文件加载相关配置。 2.9 认证相关标识 --auth-token 略 --bcrypt-cost 含义:为散列身份验证密码指定bcrypt算法的成本/强度。有效值介于4和31之间。 默认值:10 环境变量: 作用:
etcd集群增加节点
1. 现在集群的节点信息 [root@test1 ~]# etcdctl member list 3098763f11736063: name=test3 peerURLs=http://172.16.0.113:2380 clientURLs=http://172.16.0.113:2379,http://localhost:2379 isLeader=false a4c992617e0f82a1: name=test1 peerURLs=http://172.16.0.111:2380 clientURLs=http://172.16.0.111:2379,http://localhost:2379 isLeader=true e198241381008009: name=test2 peerURLs=http://172.16.0.112:2380 clientURLs=http://172.16.0.112:2380 isLeader=false 2. 增加节点 指定 name 及 URL [root@test1 ~]# etcdctl member add test4 http://172.16.0.114:2380 Added member named test4 with ID 9e3ee0c2cc5c6dd8 to cluster ETCD_NAME="test4" ETCD_INITIAL_CLUSTER="test3=http://172.16.0.113:2380,test4=http://172.16.0.114:2380,test1=http://172.16.0.111:2380,test2=http://172.16.0.112:2380" ETCD_INITIAL_CLUSTER_STATE="existing" 3. 检查 3098763f11736063: name=test3 peerURLs=http://172.16.0.113:2380 clientURLs=http://172.16.0.113:2379,http://localhost:2379 isLeader=false 9e3ee0c2cc5c6dd8: name=test4 peerURLs=http://172.16.0.114:2380 clientURLs=http://172.16.0.114:2379,http://localhost:2379 isLeader=false a4c992617e0f82a1: name=test1 peerURLs=http://172.16.0.111:2380 clientURLs=http://172.16.0.111:2379,http://localhost:2379 isLeader=true e198241381008009: name=test2 peerURLs=http://172.16.0.112:2380 clientURLs=http://172.16.0.112:2380 isLeader=false
etcd集群删除节点
1. 查看所有节点 [root@test1 ~]# etcdctl member list 3098763f11736063: name=test3 peerURLs=http://172.16.0.113:2380 clientURLs=http://172.16.0.113:2379,http://localhost:2379 isLeader=false 9e3ee0c2cc5c6dd8: name=test4 peerURLs=http://172.16.0.114:2380 clientURLs=http://172.16.0.114:2379,http://localhost:2379 isLeader=false a4c992617e0f82a1: name=test1 peerURLs=http://172.16.0.111:2380 clientURLs=http://172.16.0.111:2379,http://localhost:2379 isLeader=true e198241381008009: name=test2 peerURLs=http://172.16.0.112:2380 clientURLs=http://172.16.0.112:2380 isLeader=false 2. 删除选中节点id 进行删除 [root@test1 ~]# etcdctl member remove 3098763f11736063 Removed member 3098763f11736063 from cluster 3. 检查 [root@test1 ~]# etcdctl member list 9e3ee0c2cc5c6dd8: name=test4 peerURLs=http://172.16.0.114:2380 clientURLs=http://172.16.0.114:2379,http://localhost:2379 isLeader=false a4c992617e0f82a1: name=test1 peerURLs=http://172.16.0.111:2380 clientURLs=http://172.16.0.111:2379,http://localhost:2379 isLeader=true e198241381008009: name=test2 peerURLs=http://172.16.0.112:2380 clientURLs=http://172.16.0.112:2380 isLeader=false
以上是关于etcd使用的主要内容,如果未能解决你的问题,请参考以下文章