共计 4169 个字符,预计需要花费 11 分钟才能阅读完成。
简介
Etcd 是一个高可用的 Key/Value 存储系统,主要用于分享配置和服务发现。
● 简单:支持 curl 方式的用户 API (HTTP+JSON)
● 安全:可选 SSL 客户端证书认证
● 快速:单实例可达每秒 1000 次写操作
● 可靠:使用 Raft 实现分布式
环境:
node | IP | OS | etcd_version |
---|---|---|---|
etcd0 | 10.1.2.61 | CentOS7.0 | etcd3.0.14 |
etcd1 | 10.1.2.172 | centos7.0 | etcd3.0.14 |
etcd2 | 10.1.2.173 | centos7.0 | etcd3.0.14 |
一、在各节点(etcd0、etcd1、etcd2)上安装 etcd
下载 etcd 源码包:https://github.com/coreos/etcd/releases,这里用的是 etcd-v3.0.14-Linux-amd64.tar.gz,解压并添加 etcd 命令至环境变量。
# cd /path/to/etcd-v3.0.14-linux-amd64.tar.gz
# tar xf etcd-v3.0.14-linux-amd64.tar.gz
# mv etcd-v3.0.14-linux-amd64 etcd
# vim /etc/profile
export PATH=/path/to/etcd
# source /etc/profile
二、配置 etcd 集群
目前支持三种发现方式:Static,etcd Discovery,DNS Discovery。
● Static 适用于有固定 IP 的主机节点
● etcd Discovery 适用于 DHCP 环境
● DNS Discovery 依赖 DNS SRV 记录
这里我们采用 Static 方式,创建 etcd0 脚本,方便配置 etcd 启动参数。
# cd /path/to/etcd
# mkdir log data //data 为节点数据存储文件夹,log 为日志文件夹
# vim etcd0.sh // 写入以下脚本内容
#!/bin/bash
etcd --name etcd0 --data-dir /data/etcd/data --advertise-client-urls http://10.1.2.61:2379,http://10.1.2.61:4001 --listen-client-urls http://0.0.0.0:2379,http://0.0.0.0:4001 --initial-advertise-peer-urls http://10.1.2.61:2380 --listen-peer-urls http://0.0.0.0:2380 --initial-cluster-token etcd-cluster-1 --initial-cluster etcd0=http://10.1.2.61:2380,etcd1=http://10.1.2.172:2380,etcd2=http://10.1.2.173:2380 --initial-cluster-state new > ./log/etcd.log 2>&1
# nohup ./etcd0.sh &
# ps -ef|grep etcd
# netstat -lnpt|grep etcd
参数说明:
● –data-dir 指定节点的数据存储目录,若不指定,则默认是当前目录。这些数据包括节点 ID,集群 ID,集群初始化配置,Snapshot 文件,若未指 定–wal-dir,还会存储 WAL 文件
● –wal-dir 指定节点的 was 文件存储目录,若指定了该参数,wal 文件会和其他数据文件分开存储
● –name 节点名称
● –initial-advertise-peer-urls 告知集群其他节点的 URL,tcp2380 端口用于集群通信
● –listen-peer-urls 监听 URL,用于与其他节点通讯
● –advertise-client-urls 告知客户端的 URL, 也就是服务的 URL,tcp2379 端口用于监听客户端请求
● –initial-cluster-token 集群的 ID
● –initial-cluster 集群中所有节点
● –initial-cluster-state 集群状态,new 为新创建集群,existing 为已存在的集群
在 etcd1、etcd2 上分别做相似操作,只需将脚本中–advertise-client-urls 和 –initial-advertis-peer-urls 参数修改一下即可。
注意: 上面的初始化只是在集群初始化时运行一次,之后节点的服务有重启,必须要去掉 initial 参数,否则报错。
# etcd --name etcd0 --data-dir /data/etcd/data --listen-peer-urls http://10.1.2.61:2380 --listen-client-urls http://10.1.2.61:2379,http://127.0.0.1:2379 --advertise-client-urls http://10.1.2.61:2379
三、管理 etcd 集群
1. 查看集群版本
# etcdctl --version
# etcdctl --help
2. 查看集群健康状态
# etcdctl cluster-health
3. 查看集群成员
# etcdctl member list
在任一节点上执行,可以看到集群的节点情况,并能看出哪个是 leader 节点
4. 更新一个节点
如果你想更新一个节点的 IP(peerURLS),首先你需要知道那个节点的 ID
# etcdctl member list
# etcdctl member update memberID http://ip:2380
5. 删除一个节点(Etcd 集群成员的缩)
# etcdctl member list
# etcdctl member remove memberID
# etcdctl member list
# ps -ef|grep etcd // 在相关节点上 kill 掉 etcd 进程
6. 增加一个新节点(Etcd 集群成员的伸)
注意: 步骤很重要,不然会报集群 ID 不匹配
# etcdctl member add --help
a. 将目标节点添加到集群
# etcdctl member add etcd3 http://10.1.2.174:2380
Addedmember named etcd3 with ID 28e0d98e7ec15cd4 to cluster
ETCD_NAME="etcd3"
ETCD_INITIAL_CLUSTER="etcd0=http://10.1.2.61:2380,etcd1=http://10.1.2.172:2380,etcd2=http://10.1.2.173:2380,etcd3=http://10.1.2.174:2380"
ETCD_INITIAL_CLUSTER_STATE="existing"
b. 查看新增成员列表,etcd3 状态为 unstarted
# etcdctl member list
d4f257d2b5f99b64[unstarted]:peerURLs=http://10.1.2.174:2380
c. 清空目标节点 etcd3 的 data-dir
节点删除后,集群中的成员信息会更新,新节点是作为一个全新的节点加入集群,如果 data-dir 有数据,etcd 启动时会读取己经存在的数据,仍然用老的 memberID 会造成无法加入集群,所以一定要清空新节点的 data-dir。
# rm -rf /path/to/etcd/data
d. 在目标节点上启动新增加的成员
这里的 initial 标记一定要指定为 existing,如果为 new,则会自动生成一个新的 memberID,这和前面添加节点时生成的 ID 不一致,故日志中会报节点 ID 不匹配的错。
# vim etcd3.sh
修改 etcd3.sh,脚本中–advertise-client-urls 和 –initial-advertis-peer-urls 参数修改为 etcd3 的,–initial-cluster-state 改为 existing
# nohup ./etcd3.sh &
# etcdctl member list
五、增删改查
1. 在 etcd1 上设置一个 key/value 对,这时就可以在集群任意节点上获取 key/value
etcd1# etcdctl set api_server http://192.168.5.44:8080
http://192.168.5.44:8080
etcd0# etcdctl get api_server
http://192.168.5.44:8080
2.
# etcdctl set foo "bar"
# etcdctl get foo
# etcdctl mkdir hello
# etcdctl ls
# etcdctl --output extended get foo
# etcdctl --output json get foo
# etcdctl update foo "etcd cluster is ok"
# etcdctl get foo
# etcdctl import --snap /data/etcd/member/snap/db
3.REST API
# curl http://10.1.2.61:2379/v2/members
查看集群成员,其中,id 是集群成员的全局唯一的身份标识,name 是成员的名字,peerURLs 是成员之间通信的入口,clientURLs 是成员跟用户通信的访问入口
# curl http://10.1.2.61:2379/v2/keys
# curl -fs -X PUT http://10.1.2.61:2379/v2/keys/_test
# curl -X GET http://10.1.2.61:2379/v2/keys/_test
六、常见问题
1.dial tcp 10.1.2.172:2380: getsockopt: no route to host
此为防火墙没有关闭,要关闭防火墙
# service iptables stop
# service firewalld stop
# systemctl disable firewalld
2.nohup——真正的 Shell 后台运行
# nohup /path/to/start_etcd.sh &
本文永久更新链接地址 :http://www.linuxidc.com/Linux/2017-01/139665.htm