欢迎光临
我们一直在努力

基于Docker的Consul集群实现服务发现

服务发现

其实简单说,服务发现就是解耦服务与IP地址之间的硬绑定关系,
以典型的集群为例,对于集群来说,是有多个节点的,这些节点对应多个IP(或者同一个IP的不同端口号),集群中不同节点责任是不一样的。
比如说一个数据集群中,可以分为读节点或者写节点,写节点和读节点都是相对的,不是硬绑定的,某一个逻辑节点,随着故障转移及恢复,是可以变换身份的(写变读,读变写;主降从,从升主等等)
集群对外提供服务的时候,对于外界来说,集群中节点身份变换的时候需要对外透明,外界无需因为集群节点的身份变换而更改配置,这就需要一个解耦合的服务。

Consul,zookeeper等中间件,就是做这个透明转换的,也就是服务发现。这里简单测试consul作为服务发现的实现。

Consul是一种服务解耦解决方案(service mesh solution,纠结了好久不知道怎么翻译),提供具有服务发现,配置和分段功能的全功能控制系统(control plane)。
这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建完整的服务解耦。 即便是用了谷歌翻译的情况下,这段翻译纠结了半天,不知道怎么翻译合适。

如下是按照自己对consul做服务发现的理解,简单整理的逻辑结构图,其原理还是比较容易理解的。

Consul is a service mesh solution providing a full featured control plane with service discovery, configuration, and segmentation functionality. Each of these features can be used individually as needed, or they can be used together to build a full service mesh. Consul requires a data plane and supports both a proxy and native integration model. Consul ships with a simple built-in proxy so that everything works out of the box, but also supports 3rd party proxy integrations such as Envoy. https://www.consul.io/intro/index.html

它提供如下几个关键功能:

服务发现:

  Consul的某些客户端可以提供一个服务,例如api或者mysql,其它客户端可以使用Consul去发现这个服务的提供者。

  使用DNS或者HTTP,应用可以很容易的找到他们所依赖的服务。

健康检查:
  Consul客户端可以提供一些健康检查,这些健康检查可以关联到一个指定的服务(服务是否返回200 OK),也可以关联到本地节点(内存使用率是否在90%以下)。

  这些信息可以被一个操作员用来监控集群的健康状态,被服务发现组件路由时用来远离不健康的主机。

键值存储:
  应用可以使用Consul提供的分层键值存储用于一些目的,包括动态配置、特征标记、协作、leader选举等等。通过一个简单的HTTP API可以很容易的使用这个组件。
多数据中心:
  Consul对多数据中心有非常好的支持,这意味着Consul用户不必担心由于创建更多抽象层而产生的多个区域。

Consul被设计为对DevOps群体和应用开发者友好,他非常适合现代的、可伸缩的基础设施。

本文基于docker来实现consul的服务发现配置,方法consul agent是通过json注册的模式实现服务注册,
其中consul的服务端是3节点的集群,客户点是6节点3主3从的redis服务器集群,consul实现redis集群中读写服务注册于发现。
尽管Redis cluster有多IP方式驱动连接,这里仅仅为了测试“服务发现”的。
其实本来想测试MySQL单主模式的MGR,实现读写分离的服务发现,但是MySQL有点太重了,机器配置不够,所以做了Redis的集群来测试服务发现

consul服务端集群安装配置
作为服务发现的载体,consul是可以使用单节点运行的,作为解析服务的载体,是一个非常重要的角色,集群化具有更强的抗灾性,因此更多的时候是以多节点集群的方式运行解析服务的这个载体。
这里使用三个节点作为consul的集群服务端来运行,三个consul的服务节点IP分别是:172.18.0.11 ,172.18.0.12,172.18.0.13,需要固定IP

docker network create –subnet=172.18.0.11/16 mynetwork

docker run -itd –name consul01 –net mynetwork –ip 172.18.0.11 -v /usr/local/docker_file/consul01/:/usr/local/ CentOS

docker run -itd –name consul02 –net mynetwork –ip 172.18.0.12 -v /usr/local/docker_file/consul02/:/usr/local/ centos

docker run -itd –name consul03 –net mynetwork –ip 172.18.0.13 -v /usr/local/docker_file/consul03/:/usr/local/ centos

分别在每个容器中创建consul服务(unzip consul_1.6.2_linux_amd64.zip解压缩即可,非常简单)

三个容器节点的server.json节点配置文件如下,唯一的区别就是bind_addr指定为当前节点的IP
如下是172.18.0.11节点的配置,不同节点仅需修改bind_addr为对应机器(容器)的IP

/usr/local/server.json
{
“datacenter”: “dc1”,
“data_dir”: “/usr/local/”,
“log_level”: “INFO”,
“server”: true,
“bootstrap_expect”: 3,
“bind_addr”: “172.18.0.11”,
“client_addr”: “0.0.0.0”,
“start_join”: [“172.18.0.11″,”172.18.0.12″,”172.18.0.13”],
“ui”:true
}

依次登录三个容器中,以server模式启动consul服务
./consulagent-server -config-dir=/usr/local>/usr/local/consul.log&
由于配置文件中制定了集群的IP列表,因此无需显式加入集群(cluster join),正常情况下,启动三个节点后,会自动组成一个集群,并且自动选举出来一个leader。

赞(0)
【声明】:本博客不参与任何交易,也非中介,仅记录个人感兴趣的主机测评结果和优惠活动,内容均不作直接、间接、法定、约定的保证。访问本博客请务必遵守有关互联网的相关法律、规定与规则。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。