认识 Consul
Consul有多个组件,但是整体来看,它是你基础设施中用于发现和配置服务的一个工具。它提供如下几个关键功能:
- 服务发现: Consul的某些客户端可以提供一个服务,例如api或者mysql,其它客户端可以使用Consul去发现这个服务的提供者。使用DNS或者HTTP,应用可以很容易的找到他们所依赖的服务。
- 健康检查: Consul客户端可以提供一些健康检查,这些健康检查可以关联到一个指定的服务(服务是否返回200 OK),也可以关联到本地节点(内存使用率是否在90%以下)。这些信息可以被一个操作员用来监控集群的健康状态,被服务发现组件路由时用来远离不健康的主机。
- 键值存储: 应用可以使用Consul提供的分层键值存储用于一些目的,包括动态配置、特征标记、协作、leader选举等等。通过一个简单的HTTP API可以很容易的使用这个组件。
- 多数据中心: Consul对多数据中心有非常好的支持,这意味着Consul用户不必担心由于创建更多抽象层而产生的多个区域。
Consul被设计为对DevOps群体和应用开发者友好,他非常适合现代的、可伸缩的基础设施。
下面开始搭建 Consul 集群和测试
配置过程
1、拉取官方镜像
docker search consul
docker pull consul
2、启动consul
docker run -d -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' --name=node1 consul agent -server -bind=172.26.0.2 -bootstrap-expect=3 -node=node1
-node:节点的名称
-bind:绑定的一个地址,用于节点之间通信的地址,可以是内外网,必须是可以访问到的地址
-server:这个就是表示这个节点是个SERVER
-bootstrap-expect:这个就是表示期望提供的SERVER节点数目,数目一达到,它就会被激活,然后就是LEADER了
docker run -d -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' --name=node2 consul agent -server -bind=172.26.0.3 -join=172.26.0.2 -node-id=$(uuidgen | awk '{print tolower($0)}') -node=node2
docker run -d -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' --name=node3 consul agent -server -bind=172.26.0.4 -join=172.26.0.2 -node-id=$(uuidgen | awk '{print tolower($0)}') -node=node3 -client=172.26.0.4
-join:这个表示启动的时候,要加入到哪个集群内,这里就是说要加入到节点1的集群
-node-id:这个貌似版本8才加入的,这里用这个来指定唯一的节点ID,可以查看这个issue
-client:这个表示注册或者查询等一系列客户端对它操作的IP,如果不指定这个IP,默认是127.0.0.1。
docker run -d -e 'CONSUL_LOCAL_CONFIG={"leave_on_terminate": true}' --name=node4 consul agent -bind=172.26.0.5 -retry-join=172.26.0.2 -node-id=$(uuidgen | awk '{print tolower($0)}') -node=node4
测试过程
3、查看集群状态
docker exec -t node1 consul members
返回
Node Address Status Type Build Protocol DC Segment
node1 172.26.0.2:8301 alive server 1.0.6 2 dc1 <all>
node2 172.26.0.3:8301 alive server 1.0.6 2 dc1 <all>
node3 172.26.0.4:8301 alive server 1.0.6 2 dc1 <all>
node4 172.26.0.5:8301 alive client 1.0.6 2 dc1 <default>
4、查看 leader
curl http://172.26.0.4:8500/v1/status/leader
// 返回
"172.26.0.2:8300"
5、添加新节点
docker run -d -e 'CONSUL_LOCAL_CONFIG={"leave_on_terminate": true}' --name=node6 consul agent -bind=172.26.0.6 -retry-join=172.26.0.2 -node-id=$(uuidgen | awk '{print tolower($0)}') -node=node6
查看node1日志 docker logs node1
,成功添加信息如下,可以再检查一下集群状态
2018/03/21 02:56:21 [INFO] serf: EventMemberJoin: node6.dc1 172.26.0.6
2018/03/21 02:56:21 [INFO] consul: Handled member-join event for server "node6.dc1" in area "wan"
2018/03/21 02:56:21 [INFO] serf: EventMemberJoin: node6 172.26.0.6
2018/03/21 02:56:21 [INFO] consul: Adding LAN server node6 (Addr: tcp/172.26.0.6:8300) (DC: dc1)
6、节点异常consul的处理
停掉 node1 , 其他节点会重新选举出新的 leader
docker stop node1
看看其他节点的日志 docker logs node2
,日志打印,心跳检查node1的ip超时,接着开始选举,node6被选举为新的leader。
Heartbeat timeout from "172.26.0.2:8300" reached, starting election
consul: New leader elected: node6
收官~
本文由 Chakhsu Lau 创作,采用 知识共享署名4.0 国际许可协议进行许可。
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。