### 概述 etcd 是一个分布式一致性k-v存储系统,可用于服务注册发现与共享配置,具有以下优点。 - 简单 : 相比于晦涩难懂的paxos算法,etcd基于相对简单且易实现的raft算法实现一致性,并通过gRPC提供接口调用 - 安全:支持TLS通信,并可以针对不同的用户进行对key的读写控制 - 高性能:10,000 /秒的写性能 > etcd release [下载地址](https://github.com/coreos/etcd/releases/) 页面下载最新版本的二进制文件 ### etcd 依赖go,需要先到官方站点下载最新go tar -xf go1.8.3.linux-amd64.tar.gz -C /usr/local/ cat > /etc/profile.d/go.sh <<EOF export PATH=/usr/local/go/bin/:$PATH EOF ### 安装 etcd tar xf etcd-v3.2.7-linux-amd64.tar.gz -C /usr/local/ ln -sv /usr/local/etcd-v3.2.7-linux-amd64/ /usr/local/etcd cat > /etc/profile.d/etcd.sh <<EOF export PATH=/usr/local/etcd/:$PATH EOF useradd -r -s /sbin/nologin etcd mkdir /data/lib/etcd/ -p chown -R etcd:etcd /data/lib/etcd > etcd-v3.2.1 有bug 解决方法参考链接 [link](http://dockone.io/question/1408) ### 修改/etc/etcd/etcd.conf 注意修改每个node ip [member] ETCD_NAME=cd-test-001.drcloud.com ETCD_DATA_DIR="/data/lib/etcd/" ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379" ETCD_ADVERTISE_CLIENT_URLS="http://0.0.0.0:2379" ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380" ETCD_INITIAL_ADVERTISE_PEER_URLS="http://172.16.200.100:2380" [cluster] ETCD_INITIAL_CLUSTER="cd-test-001.drcloud.com=http://172.16.200.100:2380,cd-test-002.drcloud.com=http://172.16.200.101:2380,cd-test-003.drcloud.com=http://172.16.200.102:2380" ETCD_INITIAL_CLUSTER_STATE="new" ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" ### 参数说明 name 节点名称 data-dir 指定节点的数据存储目录 listen-peer-urls 监听URL,用于与其他节点通讯 listen-client-urls 对外提供服务的地址:比如 http://ip:2379,http://127.0.0.1:2379 ,客户端会连接到这里和 etcd 交互 initial-advertise-peer-urls 该节点member(同伴)监听地址,这个值会告诉集群中其他节点 initial-cluster 集群中所有节点的信息,格式为 node1=http://ip1:2380,node2=http://ip2:2380,… 。注意:这里的 node1 是节点的 --name 指定的名字;后面的 ip1:2380 是 --initial-advertise-peer-urls 指定的值 initial-cluster-state 新建集群的时候,这个值为 new ;假如已经存在的集群,这个值为 existing initial-cluster-token 创建集群的 token,这个值每个集群保持唯一。这样的话,如果你要重新创建集群,即使配置和之前一样,也会再次生成新的集群和节点 uuid;否则会导致多个集群之间的冲突,造成未知的错误 advertise-client-urls 对外公告的该节点客户端监听地址,这个值会告诉集群中其他节点 ### systemd 启动配置文件, 默认rpm 安装的 cat > /usr/lib/systemd/system/etcd.service << EOF [Unit] Description=Etcd Server After=network.target After=network-online.target Wants=network-online.target [Service] Type=notify WorkingDirectory=/data/lib/etcd/ EnvironmentFile=-/etc/etcd/etcd.conf User=etcd # set GOMAXPROCS to number of processors ExecStart=/bin/bash -c "GOMAXPROCS=$(nproc) /usr/local/etcd/etcd --name=\"${ETCD_NAME}\" --data-dir=\"${ETCD_DATA_DIR}\" --listen-client-urls=\"${ETCD_LISTEN_CLIENT_URLS}\" --initial-advertise-peer-urls=\"${ETCD_INITIAL_ADVERTISE_PEER_URLS}\" --listen-peer-urls=\"${ETCD_LISTEN_PEER_URLS}\" --initial-cluster=\"${ETCD_INITIAL_CLUSTER}\" --advertise-client-urls=\"${ETCD_ADVERTISE_CLIENT_URLS}\" --initial-cluster-token=\"${ETCD_INITIAL_CLUSTER_TOKEN}\" --initial-cluster-state=\"${ETCD_INITIAL_CLUSTER_STATE}\"" Restart=on-failure LimitNOFILE=65536 [Install] WantedBy=multi-user.target EOF ### 配置防火墙规则 firewall-cmd --zone=public --add-port=2379/tcp --permanent firewall-cmd --zone=public --add-port=2380/tcp --permanent ### etcd集群运行过程中的改配 主要用于故障节点替换,集群扩容需求。 集群运行过程中的改配不区分static和discovery方式。 1、替换的步骤: 比如集群中某一member重启后仍不能恢复时,就需要替换一个新member进来。 a、从集群中删除老member etcdctl member remove 1609b5a3a078c227 b、向集群中新增新member etcdctl member add <name> <peerURL> 例子:敲命令 etcdctl member add etcd2 http://192.168.2.56:2380 后返回如下信息 Added member named etcd2 with ID b7d510356ee2e68b to cluster ETCD_NAME="etcd2" ETCD_INITIAL_CLUSTER="etcd0=http://192.168.2.55:2380,etcd2=http://192.168.2.56:2380,etcd1=http://192.168.2.54:2380" ETCD_INITIAL_CLUSTER_STATE="existing" c、删除老节点data目录 如果不删除,启动后节点仍旧沿用之前的老id, 其他正常节点不认,不能建立联系 d、在新member上启动etcd进程 2、扩容的步骤: 执行上面第b,d两步即可。 ### etcd 集群健康检查 curl http://172.16.200.206:2379/health etcdctl cluster-health member 37460b828c8625a0 is healthy: got healthy result from http://0.0.0.0:2379 member 52b98a730bb6d77c is healthy: got healthy result from http://172.16.200.208:2379 member 7f453c22b9758161 is healthy: got healthy result from http://172.16.200.206:2379