一: 简介
1) 近年来随着 docker+kubenetes 流行与火热,它们都默认用了 etcd 组件作为一个高可用的跨节点的数据存储仓库,etcd 是什么?很多人第一反应是键值存储仓库。首先先看官方的定义。
etcd 是一个分布式的键值存储仓库,它提供了一种跨集群的的数据存储的可靠方法。
etcd is a distributed key value store that provides a reliable way to store data across a cluster of machines.
看了以上定义,可能又有人会问,这种分布式的跨集群的数据存储有许多,为什么会是它,请看另一段定义。
etcd 是一个开源的分布式键值存储仓库,它为容器提供了配置共享和服务发现。
etcd is an open-source distributed key value store that provides shared configuration and service discovery for Container Linux clusters.
2) etcd 和 ZooKeeper/Consul/doozer 等非常相似,都提供了类似的功能,以及 REST API 的访问操作,具有以下特点:
* 简单:安装和使用简单,提供了 REST API 进行操作交互
* 安全:支持 HTTPS SSL 证书
* 快速:支持并发千次的读写操作
* 可靠:采用 raft 算法,实现分布式系统数据的可用性和一致性
3) etcd 用有限的资源,就可以提供高可用跟高并发服务。具体的参数请参考官方网站:
https://coreos.com/etcd/docs/latest/op-guide/hardware.html
4) etcd 构建自身高可用集群主要有三种形式:
① 静态发现: 预先已知 etcd 集群中有哪些节点,在启动时直接指定好 Etcd 的各个 node 节点地址
② etcd 动态发现: 通过已有的 etcd 集群作为数据交互点,然后在扩展新的集群时实现通过已有集群进行服务发现的机制
③ dns 动态发现: 通过 DNS 查询方式获取其他节点地址信息
本文主要介绍第一种方式。
二:环境介绍:
三台虚拟机,系统环境均为 Centos7,对应节点名称及 IP 地址如下:
app1:192.168.16.5
app2:192.168.16.6
app3:192.168.16.102
三:安装&配置
三台机器分别执行 sudo yum install etcd -y,yum 安装的 etcd 默认配置文件在/etc/etcd/etcd.conf,以下将三个节点上的配置贴出来,未贴出部分不影响集群的搭建就表明暂时不用改
app1:
#[Member]
#数据存放路径
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
#监听其他 etcd node 的 url
ETCD_LISTEN_PEER_URLS="http://192.168.16.5:2380,http://127.0.0.1:2380"
#监听客户端的 url,etcdctl 默认 ip 为 127.0.0.1,不追加 127.0.0.1 可能会报端口拒绝的错误
ETCD_LISTEN_CLIENT_URLS="http://192.168.16.5:2379,http://127.0.0.1:2379"
ETCD_NAME="app1"
#[Clustering]
#集群内通信用 url
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.16.5:2380"
#集群内广播给其他节点用 url
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.16.5:2379"
#初始化集群列表
ETCD_INITIAL_CLUSTER="app1=http://192.168.16.5:2380,app2=http://192.168.16.6:2380,app3=http://192.168.16.102:2380"
#集群名称
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
#初期化集群状态,new 为新建集群
ETCD_INITIAL_CLUSTER_STATE="new"
app2:
#[Member]
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://192.168.16.6:2380,http://127.0.0.1:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.16.6:2379,http://127.0.0.1:2379"
ETCD_NAME="app2"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.16.6:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.16.6:2379"
ETCD_INITIAL_CLUSTER="app1=http://192.168.16.5:2380,app2=http://192.168.16.6:2380,app3=http://192.168.16.102:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
app3:
#[Member]
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://192.168.16.102:2380,http://127.0.0.1:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.16.102:2379,http://127.0.0.1:2379"
ETCD_NAME="app3"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.16.102:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.16.102:2379"
ETCD_INITIAL_CLUSTER="app1=http://192.168.16.5:2380,app2=http://192.168.16.6:2380,app3=http://192.168.16.102:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
改好配置之后,在各个节点上开启 etcd 服务:sudo systemctl restart etcd,集群就此搭建完毕
四:测试验证:
1. etcdctl member list
4ed30152ffb4e90b: name=app2 peerURLs=http://192.168.16.6:2380 clientURLs=http://192.168.16.6:2379 isLeader=false
8db7b2edc9e1381e: name=app3 peerURLs=http://192.168.16.102:2380 clientURLs=http://192.168.16.102:2379 isLeader=false
973ffc1324497d5b: name=app1 peerURLs=http://192.168.16.5:2380 clientURLs=http://192.168.16.5:2379 isLeader=true
2. etcdctl cluster-health
member 4ed30152ffb4e90b is healthy: got healthy result from http://192.168.16.6:2379
member 8db7b2edc9e1381e is healthy: got healthy result from http://192.168.16.102:2379
member 973ffc1324497d5b is healthy: got healthy result from http://192.168.16.5:2379
cluster is healthy
五:参考资料
https://coreos.com/etcd/
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于