etcd是CoreOS团队发起,主要用于管理配置信息和服务发现(Service Discovery)的项目。目标是构建一个高可用的分布式键值(key-value)数据库。
etcd设计时重点考虑如下四点:
1.简单:定义良好、面向用户的API。
2.安全:支持HTTPS方式访问。
3.快速:支持并发10k/s的写操作。
4.可靠:支持分布式结构,基于Raft的一致性算法。
使用etcd可以在多个节点上启动多个实例,并添加它们为一个集群。同一个集群中的etcd实例将会保持彼此信息的一致性。
安装:
etcd是基于Go实现的,可以下载源码编译,也可以直接下载二进制文件,或者直接在Docker里面使用。下面演示下二进制和docker的方式:
二进制文件位置:https://github.com/etcd-io/etcd/releases
所有设备几乎都支持了。很全:
下载:
curl -L https://github.com/etcd-io/etcd/releases/download/v3.4.0/etcd-v3.4.0-linux-amd64.tar.gz -o etcd-v3.4.0-linux-amd64.tar.gz
解压:
tar xzvf etcd-v3.4.0-linux-amd64.tar.gz
cd etcd-v3.4.0-linux-amd64
看到两个重要文件 etcd(服务主文件) 和 etcdctl(命令行客户端),其他的是文档。
拷贝到bin目录下:
sudo cp etcd* /usr/local/bin/
执行etcd
默认2379端口处理客户端请求,2380端口用于集群成员的通信。
接下来可以用etcdctl测试设置 testkey:”helloworld”,检查etcd服务是否启动成功。
看下成员列表
ETCDCTL_API=3 etcdctl member list
设置key-val
ETCDCTL_API=3 etcdctl put testkey "hello world"
获取key-val
ETCDCTL_API=3 etcdctl get testkey
两个地方要说明:
Docker镜像方式运行
docker run \
-p 2379:2379 \
-p 2380:2380 \
--name etcd-gcr-v3.4.0 \
quay.io/coreos/etcd:v3.4.0 \
/usr/local/bin/etcd \
--name s1 \
--listen-client-urls http://0.0.0.0:2379 \
--advertise-client-urls http://0.0.0.0:2379 \
--listen-peer-urls http://0.0.0.0:2380 \
--initial-advertise-peer-urls http://0.0.0.0:2380 \
--initial-cluster s1=http://0.0.0.0:2380 \
--initial-cluster-token tkn \
--initial-cluster-state new \
--log-level info \
--logger zap \
--log-outputs stderr
然后就跑起来了,这个时候可以尝试登陆容器里面或者直接在本地(这块好好理解下(端口已经映射出来了)),直接跟上面那个实验一样测试一次:
但是这里注意一个问题,就是上面创建镜像的时候我没有指定文件挂载和数据库路径。书中的例子跑不起来的,因为新版本的docker在挂载的时候如果没有那个目录,是不会给创建的会报错。真正实际使用的时候,千万千万要记得把库路径挂载出来,数据不要存在容器里。要存在宿主机上。
macOS上就直接这样
brew install etcd
etcd
etcdctl member list
......
下面是一个比较笨的集群部署方式(之后我会整理另一个方便的)
分别用三台docker机器:
分别执行:(对应换成自己的IP)
docker run \
-p 2379:2379 \
-p 2380:2380 \
--name etcd-gcr-v3.4.0 \
quay.io/coreos/etcd:v3.4.0 \
/usr/local/bin/etcd \
--name node1 \
--listen-client-urls http://0.0.0.0:2379 \
--advertise-client-urls http://192.168.0.102:2379 \
--listen-peer-urls http://0.0.0.0:2380 \
--initial-advertise-peer-urls http://192.168.0.102:2380 \
--initial-cluster node1=http://192.168.0.102:2380,node2=http://192.168.0.105:2380,node3=http://192.168.0.106:2380 \
--initial-cluster-token tkn \
--initial-cluster-state new \
--log-level info \
--logger zap \
--log-outputs stderr
docker run \
-p 2379:2379 \
-p 2380:2380 \
--name etcd-gcr-v3.4.0 \
quay.io/coreos/etcd:v3.4.0 \
/usr/local/bin/etcd \
--name node2 \
--listen-client-urls http://0.0.0.0:2379 \
--advertise-client-urls http://192.168.0.105:2379 \
--listen-peer-urls http://0.0.0.0:2380 \
--initial-advertise-peer-urls http://192.168.0.105:2380 \
--initial-cluster node1=http://192.168.0.102:2380,node2=http://192.168.0.105:2380,node3=http://192.168.0.106:2380 \
--initial-cluster-token tkn \
--initial-cluster-state new \
--log-level info \
--logger zap \
--log-outputs stderr
docker run \
-p 2379:2379 \
-p 2380:2380 \
--name etcd-gcr-v3.4.0 \
quay.io/coreos/etcd:v3.4.0 \
/usr/local/bin/etcd \
--name node3 \
--listen-client-urls http://0.0.0.0:2379 \
--advertise-client-urls http://192.168.0.106:2379 \
--listen-peer-urls http://0.0.0.0:2380 \
--initial-advertise-peer-urls http://192.168.0.106:2380 \
--initial-cluster node1=http://192.168.0.102:2380,node2=http://192.168.0.105:2380,node3=http://192.168.0.106:2380 \
--initial-cluster-token tkn \
--initial-cluster-state new \
--log-level info \
--logger zap \
--log-outputs stderr
然后随便找一台机器执行:
ETCDCTL_API=3 etcdctl member list
然后换台机器执行
ETCDCTL_API=3 etcdctl put testkey "hello world"
在继续换一台机器执行
ETCDCTL_API=3 etcdctl get testkey
OK集群相关先到这,明天我继续整理etcd集群相关。上面这些还不够。