Docker微服务的ETCD集群搭建教程详解
etcd是一个高可用的键值存储系统,主要用于共享配置和服务发现。etcd是由coreos开发并维护的,灵感来自于 zookeeper 和 doozer,它使用go语言编写,并通过raft一致性算法处理日志复制以保证强一致性。raft是一个来自stanford的新的一致性算法,适用于分布式系统的日志复制,raft通过选举的方式来实现一致性,在raft中,任何一个节点都可能成为leader。google的容器集群管理系统kubernetes、开源paas平台cloud foundry和coreos的fleet都广泛使用了etcd。
etcd的特性
简单: curl可访问的用户的api(http+json)定义明确,面向用户的api(grpc)
安全: 可选的ssl客户端证书认证
快速: 单实例每秒 1000 次写操作
可靠: 使用raft保证一致性
etcd构建自身高可用集群主要有三种形式
1)静态发现: 预先已知 etcd 集群中有哪些节点,在启动时直接指定好etcd的各个node节点地址
2)etcd动态发现: 通过已有的etcd集群作为数据交互点,然后在扩展新的集群时实现通过已有集群进行服务发现的机制
3)dns动态发现: 通过dns查询方式获取其他节点地址信息
本次搭建的基础环境
底层os:centos7
docker版本:docker version 18.06.1-ce
ip:
服务器a:192.167.0.168
服务器b:192.167.0.170
服务器c:192.167.0.172
首先在各个服务器上下载最新的etcd镜像
# docker pull quay.io/coreos/etcd
本人因机器有限,在一台机器配置了3个容器,在机器上创建了子网络,三台容器在一个网络里
# docker network create --subnet=192.167.0.0/16 etcdnet
接下来我采用了两种方式来创建集群:1、将三个服务器挨个添加进集群;2、将三个服务器统一添加进集群。以下命令标注a的代表在a机器上执行,同理b、c。
1、将服务器挨个添加进集群
a 在 容器/服务器 a上运行一个etcd实例,取名为autumn-client0,注意其状态为new,“-initial-cluster”中只有自己的ip
# docker run -d -p 2379:2379 -p 2380:2380 --net etcdnet --ip 192.167.0.168 --name etcd0 quay.io/coreos/etcd /usr/local/bin/etcd --name autumn-client0 -advertise-client-urls http://192.167.0.168:2379 -listen-client-urls http://0.0.0.0:2379 -initial-advertise-peer-urls http://192.167.0.168:2380 -listen-peer-urls http://0.0.0.0:2380 -initial-cluster-token etcd-cluster -initial-cluster "autumn-client0=http://192.167.0.168:2380" -initial-cluster-state new
参数说明
—data-dir 指定节点的数据存储目录,这些数据包括节点id,集群id,集群初始化配置,snapshot文件,若未指定—wal-dir,还会存储wal文件; —wal-dir 指定节点的was文件的存储目录,若指定了该参数,wal文件会和其他数据文件分开存储。 —name 节点名称 —initial-advertise-peer-urls 告知集群其他节点url. — listen-peer-urls 监听url,用于与其他节点通讯 — advertise-client-urls 告知客户端url, 也就是服务的url — initial-cluster-token 集群的id — initial-cluster 集群中所有节点
配置文件说明,例如
# [member] # 节点名称 etcd_name=node1 # 数据存放位置 etcd_data_dir="/var/lib/etcd/default.etcd" #etcd_wal_dir="" #etcd_snapshot_count="10000" #etcd_heartbeat_interval="100" #etcd_election_timeout="1000" # 监听其他 etcd 实例的地址 etcd_listen_peer_urls="http://0.0.0.0:2380" # 监听客户端地址 etcd_listen_client_urls="http://0.0.0.0:2379,http://0.0.0.0:4001" #etcd_max_snapshots="5" #etcd_max_wals="5" #etcd_cors="" # #[cluster] # 通知其他 etcd 实例地址 etcd_initial_advertise_peer_urls="http://node1:2380" # if you use different etcd_name (e.g. test), set etcd_initial_cluster value for this name, i.e. "test=http://..." # 初始化集群内节点地址 etcd_initial_cluster="node1=http://node1:2380,node2=http://node2:2380,etcd2=http://etcd2:2380" # 初始化集群状态,new 表示新建 etcd_initial_cluster_state="new" # 初始化集群 token etcd_initial_cluster_token="mritd-etcd-cluster" # 通知 客户端地址 etcd_advertise_client_urls=http://node1:2379,http://node1:4001
a 在服务器a的etcd服务上,通过调用api添加一个新的节点:192.167.0.170
# curl http://127.0.0.1:2379/v2/members -xpost -h "content-type: application/json" -d '{"peerurls": ["http://192.167.0.170:2480"]}'
b 在容器/服务器b上运行一个etcd实例,取名为autumn-client1,注意其状态为existing,“-initial-cluster”中有前一个ip及自己的ip
# docker run -d -p 2479:2479 -p 2480:2480 --name etcd1 quay.io/coreos/etcd /usr/local/bin/etcd --name autumen-client1 -advertise-client-urls http://192.167.0.170:2379 -listen-client-urls http://0.0.0.0:2379 -initial-advertise-peer-urls http://192.167.0.170:2380 -listen-peer-urls http://0.0.0.0:2480 -initial-cluster-token etcd-cluster -initial-cluster "autumn-client0=http://192.167.0.168:2380,autumn-client1=http://192.167.0.170:2480" -initial-cluster-state existing
a 在服务器a的etcd服务上,通过调用api添加一个新的节点:192.168.7.172
# curl http://127.0.0.1:2379/v2/members -xpost -h "content-type: application/json" -d '{"peerurls": ["http://192.167.0.172:2580"]}'
c 在服务器c上运行一个etcd实例,取名为autumn-client2,注意其状态为existing,“-initial-cluster”中有之前所有节点的ip及自己的ip
# docker run -d -p 2579:2579 -p 2580:2580 --name etcd quay.io/coreos/etcd -name autumn-client2 -advertise-client-urls http://192.167.0.172:2579 -listen-client-urls http://0.0.0.0:2379 -initial-advertise-peer-urls http://192.167.0.172:2580 -listen-peer-urls http://0.0.0.0:2380 -initial-cluster-token etcd-cluster -initial-cluster "autumn-client0=http://192.167.0.168:2380,autumn-client1=http://192.167.0.170:2480,autumn-client2=http://192.167.0.172:2580" -initial-cluster-state existing
2、将服务器统一添加进集群
(“-initial-cluster”中包含所有节点的ip,状态均为new)
a上执行
# docker run -d -p 2379:2379 -p 2380:2380 --restart=always --net etcdnet --ip 192.167.0.168 --name etcd0 quay.io/coreos/etcd /usr/local/bin/etcd --name autumn-client0 -advertise-client-urls http://192.167.0.168:2379 -listen-client-urls http://0.0.0.0:2379 -initial-advertise-peer-urls http://192.167.0.168:2380 -listen-peer-urls http://0.0.0.0:2380 -initial-cluster-token etcd-cluster -initial-cluster autumn-client0=http://192.167.0.168:2380,autumn-client1=http://192.167.0.170:2480,autumn-client2=http://192.167.0.172:2580 -initial-cluster-state new
b上执行
# docker run -d -p 2479:2479 -p 2480:2480 --restart=always --net etcdnet --ip 192.167.0.170 --name etcd1 quay.io/coreos/etcd /usr/local/bin/etcd --name autumn-client1 -advertise-client-urls http://192.167.0.170:2479 -listen-client-urls http://0.0.0.0:2479 -initial-advertise-peer-urls http://192.167.0.170:2480 -listen-peer-urls http://0.0.0.0:2480 -initial-cluster-token etcd-cluster -initial-cluster autumn-client0=http://192.167.0.168:2380,autumn-client1=http://192.167.0.170:2480,autumn-client2=http://192.167.0.172:2580 -initial-cluster-state new
c上执行
# docker run -d -p 2579:2579 -p 2580:2580 --restart=always --net etcdnet --ip 192.167.0.172 --name etcd2 quay.io/coreos/etcd /usr/local/bin/etcd --name autumn-client2 -advertise-client-urls http://192.167.0.172:2579 -listen-client-urls http://0.0.0.0:2579 -initial-advertise-peer-urls http://192.167.0.172:2580 -listen-peer-urls http://0.0.0.0:2580 -initial-cluster-token etcd-cluster -initial-cluster autumn-client0=http://192.167.0.168:2380,autumn-client1=http://192.167.0.170:2480,autumn-client2=http://192.167.0.172:2580 -initial-cluster-state new
集群验证。两种方法创建的集群可通过以下方式进行验证
1、验证集群members。在集群中的每台机器上查看members,得出的结果应该是相同的
[root@localhost ~]# curl -l http://127.0.0.1:2379/v2/members {"members":[{"id":"1a661f2b9997ba39","name":"autumn-client0","peerurls":["http://192.167.0.168:2380"],"clienturls":["http://192.168.7.168:2379"]},{"id":"4932c8ea462e079c","name":"autumn-client2","peerurls":["http://192.167.0.172:2580"],"clienturls":["http://192.167.0.172:2579"]},{"id":"c1dbdde07e61741e","name":"autumn-client1","peerurls":["http://192.167.0.170:2480"],"clienturls":[http://192.167.0.170:2479]}]}
2、某台机器上添加数据,其他机器上查看数据,得出的结果应该是相同的
a上执行
[root@localhost ~]# curl -l http://127.0.0.1:2379/v2/keys/message -xput -d value="hello autumn" {"action":"set","node":{"key":"/message","value":"hello autumn","modifiedindex":13,"createdindex":13},"prevnode":{"key":"/message","value":"hello world1","modifiedindex":11,"createdindex":11}}
b、c上执行
[root@localhost ~]# curl -l http://127.0.0.1:2379/v2/keys/message {"action":"get","node":{"key":"/message","value":"hello autumn","modifiedindex":13,"createdindex":13}}
etcd api接口
基本操作api: https://github.com/coreos/etcd/blob/6acb3d67fbe131b3b2d5d010e00ec80182be4628/documentation/v2/api.md 集群配置api: https://github.com/coreos/etcd/blob/6acb3d67fbe131b3b2d5d010e00ec80182be4628/documentation/v2/members_api.md 鉴权认证api: https://github.com/coreos/etcd/blob/6acb3d67fbe131b3b2d5d010e00ec80182be4628/documentation/v2/auth_api.md 配置项:https://github.com/coreos/etcd/blob/master/documentation/op-guide/configuration.md https://coreos.com/etcd/docs/latest/runtime-configuration.html https://coreos.com/etcd/docs/latest/clustering.html https://coreos.com/etcd/docs/latest/runtime-configuration.html https://coreos.com/etcd/docs/latest/ https://coreos.com/etcd/docs/latest/admin_guide.html#disaster-recovery 采用标准的restful 接口,支持http 和 https 两种协议。
服务注册与发现
传统的服务调用一般通过配置文件读取ip进行调用,这里有诸多限制,如不灵活,无法感知服务的状态,实现服务调用负载均衡复杂等缺点,而引入etcd后,问题将大大化简,这里划分为几个步骤
服务启动后向etcd注册,并上报自己的监听的端口以及当前的权重因子等信息,且对该信息设置ttl值。
服务在ttl的时间内周期性上报权重因子等信息。
client端调用服务时向etcd获取信息,进行调用,同时监听该服务是否变化(通过watch方法实现)。
当新增服务时watch方法监听到变化,将服务加入代用列表,当服务挂掉时ttl失效,client端检测到变化,将服务踢出调用列表,从而实现服务的动态扩展。
另一方面,client端通过每次变化获取到的权重因子来进行client端的加权调用策略,从而保证后端服务的负载均衡。
以上就是docker微服务的etcd集群搭建教程详解的详细内容,更多关于docker微服务etcd集群搭建的资料请关注其它相关文章!
推荐阅读
-
使用docker快速搭建Spark集群的方法教程
-
使用 Docker 搭建 Laravel 本地环境的教程详解
-
docker如何快速搭建几个常用的第三方服务详解
-
使用docker快速搭建Spark集群的方法教程
-
Docker Compose部署GitLab服务,搭建自己的代码托管平台(图文教程)
-
使用 Docker 搭建 Laravel 本地环境的教程详解
-
详解基于docker-swarm搭建持续集成集群服务
-
Docker环境搭建和全终端无插件网页摄像机直播管理服务EasyNVS的部署方案详解
-
docker 搭建svn服务器的教程
-
docker 安装 php-fpm 服务 / 扩展 / 配置的示例教程详解