Docker 容器部署 Consul 集群

Consul 介绍

  Consul 提供了分布式系统的服务发现和配置的解决方案。基于go语言实现。并且在git上开放了源码consul-git。consul还包括了分布式一致协议的实现,健康检查和管理UI。Consul和zk相比较起来,更加轻量级,而且一致性上基于RAFT算法,zk使用的Paxos 算法。跟zk比较起来更加轻量级,Consul提供了通过一个DNS或者HTTP接口的方式来控制执行,而zk却需要自己定制解决方案。同样比较被广泛使用的服务发现解决方案中也有etcd 。etcd也是采用RAFT算法实现,但是etcd不提供管理UI。Consul跟Vagrant都是Hashicorp 公司的产品。作为一整套的分布式系统解决方案,配合同样基于go语言实现的Docker开源技术,都是一个不错的选择。Docker 的简单介绍,可以参考 Docker 介绍 (本文后面将不再介绍docker 命令以及容器等相关概念)。配合Docker来做应用容器,用Consul 来做集群的服务发现和健康检查,并且还可以轻量级得做到水平和垂直可扩展。

Consul Agent、Server、Client

  通过运行 consul agent 命令,可以通过后台守护进程的方式运行在所有consul集群节点中。并且可以以server或者client 模式运行。并且以HTTP或者DNS 接口方式,负责运行检查和服务同步。Server模式的agent负责维护consul集群状态,相应RPC查询,并且还要负责和其他数据中心(DataCenter)进行WAN Gossips交换。Client 节点是相对无状态的,Client的唯一活动就是转发(foward)请求给Server节点,以保持低延迟和少资源消耗。
  如下图,是官网的一个典型系统结构,Consul建议我们每个DataCenter的Server的节点最好在3到5个之间,以方便在失败以及数据复制的性能。Client的数量可以任意。图中,最重要的两个概念一个是Gossip协议,一个是Consensus 协议。DataCenter的所有节点都会参与到Gossip协议。Client 到Server 会通过LAN Gossip。所有的节点都在Gossip pool中,通过消息层来实现节点之间的通信以达到故障检测的目的,并且不需要给Client配置Server的地址。而Server节点还会参与到WAN Gossip池中。这样,通过Server节点就可以让DataCenter之间做简单的服务发现。比如增加一个Datacenter就只需要让Server节点参与到Gossip Pool中。并且,DataCneter之间的通信和服务请求就可以通过WAN Gossip 来随机请求另外一个DataCenter的Server节点,然后被请求的Server 会再把请求foward到本DataCenter的leader节点。Server leader的选举是通过Consul的Raft 算法实现。Leader 节点需要负责所有请求和处理,并且这些请求也必须复制给所有的其他非leader的Server节点。同样,非Leader节点接收到RPC请求的时候也会foward 到Leader节点。

结构图

在Docker 容器中启动Consul Agent

  1. 下载 progrium/consul 镜像
  2. 以Server 模式在容器中启动一个agent
    docker run -p 8600:53/udp -h node1 progrium/consul -server -bootstrap
docker@boot2docker:~$ docker run -p 8600:53/udp -h node1 progrium/consul -server -bootstrap 
==> WARNING: Bootstrap mode enabled! Do not enable unless necessary
==> WARNING: It is highly recommended to set GOMAXPROCS higher than 1
==> Starting raft data migration...
==> Starting Consul agent...
==> Starting Consul agent RPC...
==> Consul agent running!
         Node name: 'node1'
        Datacenter: 'dc1'
            Server: true (bootstrap: true)
       Client Addr: 0.0.0.0 (HTTP: 8500, HTTPS: -1, DNS: 53, RPC: 8400)
      Cluster Addr: 172.17.0.1 (LAN: 8301, WAN: 8302)
    Gossip encrypt: false, RPC-TLS: false, TLS-Incoming: false
             Atlas: <disabled>

==> Log data will now stream in as it occurs:

    2015/09/29 03:13:43 [INFO] serf: EventMemberJoin: node1 172.17.0.1
    2015/09/29 03:13:43 [INFO] serf: EventMemberJoin: node1.dc1 172.17.0.1
    2015/09/29 03:13:43 [INFO] raft: Node at 172.17.0.1:8300 [Follower] entering Follower state
    2015/09/29 03:13:43 [INFO] consul: adding server node1 (Addr: 172.17.0.1:8300) (DC: dc1)
    2015/09/29 03:13:43 [INFO] consul: adding server node1.dc1 (Addr: 172.17.0.1:8300) (DC: dc1)
    2015/09/29 03:13:43 [ERR] agent: failed to sync remote state: No cluster leader
    2015/09/29 03:13:45 [WARN] raft: Heartbeat timeout reached, starting election
    2015/09/29 03:13:45 [INFO] raft: Node at 172.17.0.1:8300 [Candidate] entering Candidate state
    2015/09/29 03:13:45 [INFO] raft: Election won. Tally: 1
    2015/09/29 03:13:45 [INFO] raft: Node at 172.17.0.1:8300 [Leader] entering Leader state
    2015/09/29 03:13:45 [INFO] consul: cluster leadership acquired
    2015/09/29 03:13:45 [INFO] raft: Disabling EnableSingleNode (bootstrap)
    2015/09/29 03:13:45 [INFO] consul: New leader elected: node1
    2015/09/29 03:13:45 [INFO] consul: member 'node1' joined, marking health alive
    2015/09/29 03:13:45 [INFO] agent: Synced service 'consul'

  这里试验一下8600(DNS) 接口,然后我们就用dig的方式可以交互和访问了。

用Docker 容器启动Consul集群

分别启动三个server节点

  刚才启动单独的服务节点,用bootstrap。现在启动三个节点需要用bootstrap-expect 3 ,并且绑定到容器的同一个ip,这里绑定到server1上。

docker@boot2docker:~$ docker run -d –name server1 -h server1 progrium/consul -server -bootstrap-expect 3

docker@boot2docker:~ JOINIP=" (docker inspect -f ‘{ { .NetworkSettings.IPAddress }}’ server1)”

docker@boot2docker:~

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值