分布式架构分布式系统分布式

Consul Quick Start

2018-08-08  本文已影响26人  零度沸腾_yjz

[toc]

Consul介绍

使服务发现和配置变得简单(1.2版本后换了口号:网格服务变的更简单,Service Mesh Made Easy)。


consul

Consul是什么

Consul本身是由多个组件组成的,但我们可以把它看作一个整体。它是在你基础架构中负责服务发现和配置服务的工具,我们可以直接将其应用于基础设施中。Consul本身是使用go语言开发的,但提供了RESTful HTTP API(https://www.consul.io/api/index.html)和其它语言的SDK(https://www.consul.io/api/libraries-and-sdks.html ,包括Java、Python、Go、C#等)。

Consul特性

Consul的设计对于DevOps社区和应用开发任务非常友善,consul的目标是成为现代弹性基础设施的完美选择。

Consul基础简介

Consul是一个分布式、高可用的系统。Consul集群中的每个节点都需要启动一个agent,这个agent不需要负责任务发现、getting/setting KV数据,这个agent只负责注册在该节点的服务和节点自身的health check(健康检查)。
agent运行模式有client和server模式,client模式是一个非常轻量级的进程,负责注册服务、健康检查、转发查询请求给server;server负责数据存储和备份,接收client的查询请求。每个数据中心都至少有一个server,官方建议三到五个server,以防止节点服务挂掉后导致数据丢失,server也会选举一个leader。


consul cluster

Consul部署

consul安装

Consul提供了所有平台的二进制安装包(https://www.consul.io/downloads.html,最新版本1.2.2),Consul的安装包为.zip结尾的压缩包,压缩包内只需要运行名为consul的二进制文件,其它文件都可以删除。解压缩后,设置consul的PATH路径。
输入consul,检验Consul是否安装成功:

#输入consul命令
consul
 Usage: consul [--version] [--help] <command> [<args>]

Available commands are:
    agent          Runs a Consul agent
    catalog        Interact with the catalog
    connect        Interact with Consul Connect
    event          Fire a new event
    exec           Executes a command on Consul nodes
    force-leave    Forces a member of the cluster to enter the "left" state
    info           Provides debugging information for operators.
    intention      Interact with Connect service intentions
    join           Tell Consul agent to join cluster
    keygen         Generates a new encryption key
    keyring        Manages gossip layer encryption keys
    kv             Interact with the key-value store
    leave          Gracefully leaves the Consul cluster and shuts down
    lock           Execute a command holding a lock
    maint          Controls node or service maintenance mode
    members        Lists the members of a Consul cluster
    monitor        Stream logs from a Consul agent
    operator       Provides cluster-level tools for Consul operators
    reload         Triggers the agent to reload configuration files
    rtt            Estimates network round trip time between nodes
    snapshot       Saves, restores and inspects snapshots of Consul server state
    validate       Validate config files/directories
    version        Prints the Consul version
    watch          Watch for changes in Consul

启动agent服务

consul安装完成后,需要在集群中的每个节点运行一个代理(agent),agent可以为client模式或者server模式。

开发环境

使用./consul agent [options]来启动agent节点,consul提供了开发者模式./consul agent dev,该模式只适合做一些学习和测试,不适用于生产环境,因为他不会持久化任何状态。

./consul agent -dev

==> Starting Consul agent...
==> Consul agent running!
           Version: 'v1.2.2'
           Node ID: '00dace45-df79-06cf-c9a3-2a89c50d3454'
         Node name: 'yangjianzhangdeMacBook-Pro.local'
        Datacenter: 'dc1' (Segment: '<all>')
            Server: true (Bootstrap: false)
       Client Addr: [127.0.0.1] (HTTP: 8500, HTTPS: -1, DNS: 8600)
      Cluster Addr: 127.0.0.1 (LAN: 8301, WAN: 8302)
           Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false

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

    2018/08/08 21:18:59 [DEBUG] agent: Using random ID "00dace45-df79-06cf-c9a3-2a89c50d3454" as node ID
    2018/08/08 21:18:59 [WARN] agent: Node name "yangjianzhangdeMacBook-Pro.local" will not be discoverable via DNS due to invalid characters. Valid characters include all alpha-numerics and dashes.
    2018/08/08 21:18:59 [INFO] raft: Initial configuration (index=1): [{Suffrage:Voter ID:00dace45-df79-06cf-c9a3-2a89c50d3454 Address:127.0.0.1:8300}]
    2018/08/08 21:18:59 [INFO] raft: Node at 127.0.0.1:8300 [Follower] entering Follower state (Leader: "")
    2018/08/08 21:18:59 [INFO] serf: EventMemberJoin: yangjianzhangdeMacBook-Pro.local.dc1 127.0.0.1
    2018/08/08 21:18:59 [INFO] serf: EventMemberJoin: yangjianzhangdeMacBook-Pro.local 127.0.0.1
    2018/08/08 21:18:59 [INFO] consul: Adding LAN server yangjianzhangdeMacBook-Pro.local (Addr: tcp/127.0.0.1:8300) (DC: dc1)
    2018/08/08 21:18:59 [INFO] consul: Handled member-join event for server "yangjianzhangdeMacBook-Pro.local.dc1" in area "wan"
    2018/08/08 21:18:59 [DEBUG] agent/proxy: managed Connect proxy manager started
    2018/08/08 21:18:59 [INFO] agent: Started DNS server 127.0.0.1:8600 (tcp)
    2018/08/08 21:18:59 [INFO] agent: Started DNS server 127.0.0.1:8600 (udp)
    2018/08/08 21:18:59 [INFO] agent: Started HTTP server on 127.0.0.1:8500 (tcp)
    2018/08/08 21:18:59 [INFO] agent: started state syncer
    2018/08/08 21:19:00 [WARN] raft: Heartbeat timeout from "" reached, starting election
    2018/08/08 21:19:00 [INFO] raft: Node at 127.0.0.1:8300 [Candidate] entering Candidate state in term 2
    2018/08/08 21:19:00 [DEBUG] raft: Votes needed: 1
    2018/08/08 21:19:00 [DEBUG] raft: Vote granted from 00dace45-df79-06cf-c9a3-2a89c50d3454 in term 2. Tally: 1
    2018/08/08 21:19:00 [INFO] raft: Election won. Tally: 1
    2018/08/08 21:19:00 [INFO] raft: Node at 127.0.0.1:8300 [Leader] entering Leader state
    2018/08/08 21:19:00 [INFO] consul: cluster leadership acquired
    2018/08/08 21:19:00 [INFO] consul: New leader elected: yangjianzhangdeMacBook-Pro.local
    2018/08/08 21:19:00 [INFO] connect: initialized CA with provider "consul"
    2018/08/08 21:19:00 [DEBUG] consul: Skipping self join check for "yangjianzhangdeMacBook-Pro.local" since the cluster is too small
    2018/08/08 21:19:00 [INFO] consul: member 'yangjianzhangdeMacBook-Pro.local' joined, marking health alive
    2018/08/08 21:19:00 [DEBUG] agent: Skipping remote check "serfHealth" since it is managed automatically
    2018/08/08 21:19:00 [INFO] agent: Synced node info
    2018/08/08 21:19:02 [DEBUG] agent: Skipping remote check "serfHealth" since it is managed automatically
    2018/08/08 21:19:02 [DEBUG] agent: Node info in sync

通过日志信息可以看到,该节点以server模式运行,并且该节点被选为leader。注意节点名称使用的是你主机名称,如果你的主机名称包含periods(句号),对于该节点的DNS查询将不能使用Consul。

集群生产环境

生成环境下我们可以指定三到五个server点,其他节点都为client模式节点。当我们启动一个agent后,是一个独立的集群,它并不知道集群中的其它成员。如果启动一个agent后想要加入集群,需要将该节点主动join到集群中。节点join到一个集群需要知道集群中任意一个成员member(无论client还是server),当加入后该agent通过gossip协议会自动广播通知集群中的其它成员。

启动server节点

启动参数

参数 说明
-node consul集群的每个节点都需要有一个唯一name,你可以通过-node来指定节点名称,默认为机器的主机名称(hostname)
-bind-address 我们也需要指定一个绑定地址,这个地址(本机地址)是consul用来监听的(确保consul集群节点状态),需要注意这个地址能够访问集群中的所有节点(用来通信)。默认你可以不指定,不指定的话Consul会尝试监听所有ipv4地址,但是如果发现多个私有IP,则启动直接失败。
-bootstrap-expect 我们期望Consul启动的server节点数,只有当server个数满足后期望个数后,才会启动。
-enable-script-checks 是否允许使用外部脚本作为健康检查。对于生成环境,应该结合ACL一起使用,以便控制注册脚本的权限。
-config-dir 指定consul配置文件目录,该目录的所有文件会以字母序列顺序读取。可以在里面配置服务和健康检查。
-data-dir 指定server数据存储目录。

启动命令:

./consul agent -server -bootstrap-expect=2 -node=consul-node01 -bind-address=192.168.0.1 -enable-script-checks=true -data-dir=/home/yangjianzhang/server/consul/data -config-dir=/home/yangjianzhang/server/consul/consul.d

启动client

client启动不用指定-client,因为除了server其它节点都是client。配置和server一样,只需修改节点名称和绑定地址。

./consul agent -node=consul-node01 -bind-address=192.168.0.3 -enable-script-checks=true -config-dir=/home/yangjianzhang/server/consul/consul.d -data-dir=/home/yangjianzhang/server/consul/data

添加集群节点

节点启动后并不能自动识别集群中其他节点,需要手动join:

./consul join 192.168.0.1

查看集群成员

你需要重新启动一个终端来查看集群成员,目前集群成员只有自身。

./consul members

Node                              Address         Status  Type    Build  Protocol  DC   Segment
yangjianzhangdeMacBook-Pro.local  127.0.0.1:8301  alive   server  1.2.2  2         dc1  <all>

显示了我们的节点名称、地址、状态、在集群中的类型、所属数据中心和一些其它版本信息。更多详细信息使用–detailed信息。

注意:由于members命令基于 gossip protocol ,它是最终一致性的。也就说你使用memebers看到的可能与当前集群状态不是一样的,如果想要强一致性,可以使用HTTP API 来向consul server发起查询请求。

停止agent

你可以使用control+c来优雅的停止agent,你能够从日志看到节点离开信息,consul会通知集群其它成员节点该节点已经离开,这时候关于该节点的catalog不会移除。如果使用kill process,其它成员节点检测到该节点失败,节点的catalog不会被移除,consul将自动尝试重新连接该节点。

UI

consul提供了ui界面用于显示consul中的所有服务、节点、健康检查、kv存储等信息。通过-ui参数来启动ui服务,默认端口为8500。

consul ui
上一篇下一篇

猜你喜欢

热点阅读