• consul介绍


    consul 是一个支持多数据中心分布式高可用,用于服务发现和配置共享的工具。 consul与其它工具的不同,官方介绍如下:

    https://www.consul.io/intro/vs/index.html

    http://thesecretlivesofdata.com/raft/   consul的分布式一致性原理,动画

    HTTP API接口 https://www.consul.io/api/index.html

    consul服务架构和核心概念

    官方给出了一个很直观的图片:

    图中的SERVER是consul服务端高可用集群,CLIENT是consul客户端。

    这里存在两个数据中心:DATACENTER1、DATACENTER2。每个数据中心有着 3 到 5 台 server(该数量使得在故障转移和性能之间达到平衡)。

    Consul利用两个不同的gossip pool。我们分别把他们称为局域网池(LAN Gossip Pool)或广域网池(WAN Gossip Pool)。每个Consul数据中心(Datacenter)都有一个包含所有成员(Server和Client)的LAN gossip pool。

    LAN Pool有如下目的:

    • 成员关系允许Client自动发现Server节点,减少所需的配置量

    • 分布式故障检测允许的故障检测的工作在某几个Server几点执行,而不是集中整个集群所有节点上

    • gossip允许可靠和快速的事件广播,比如Leader选举

    WAN Pool是全局唯一的,无论属于哪一个数据中心,所有Server应该加入到WAN Pool。由WAN Pool提供会员信息让Server节点可以执行跨数据中心的请求。也就是说这个Pool不同于LAN Pool,它的目的是为了允许数据中心能够以low-touch的方式发现彼此。当数据中心的server收到来自不同数据中心的请求时,它可转发请求到数据中心的leader。

    一般来说,数据不会在不同的领事数据中心之间复制。当对另一数据中心的资源进行请求时,本地 consul 服务器将
    RPC 请求转发给该资源的远程 consul 服务器并返回结果。如果远程数据中心不可用,那么这些资源也将不可用,但这不会影响本地数据中心。有一些特殊情况可以复制有限的数据子集,例如使用 consul 内置的 ACL replication 功能,或外部工具如 consul-replicate

    consul 关键特性

    • 服务发现:支持服务发现。你可以通过 DNS 或 HTTP 的方式获取服务信息。
    • 健康检查:支持健康检查。可以提供与给定服务相关联的任何数量的健康检查(如 web 状态码或 cpu 使用率)。
    • K/V 存储:键/值对存储。你可用通过 consul 存储如动态配置之类的相关信息。
    • 多数据中心:支持多数据中心,开箱即用。
    • WEB UI:支持 WEB UI。快速了解你的服务现在的运行情况,一目了然。

    consul 术语

    • node:节点,需要 consul 注册发现或配置管理的服务器。
    • agent:consul 中的核心程序,它将以守护进程的方式在各个节点运行,有 client 和 server 启动模式。每个 agent 维护一套服务和注册发现以及健康信息。
    • client:agent 以 client 模式启动的节点。在该模式下,该节点会采集相关信息,通过 RPC 的方式向 server 发送。
    • server:agent 以 server 模式启动的节点。一个数据中心中至少包含 1 个 server 节点。不过官方建议使用 3 或 5 个 server 节点组建成集群,以保证高可用且不失效率。server 节点参与 Raft、维护会员信息、注册服务、健康检查等功能。
    • datacenter:数据中心,私有的,低延迟的和高带宽的网络环境。一般的多个数据中心之间的数据是不会被复制的,但可用过 ACL replication 或使用外部工具 onsul-replicate
    • Consensus共识协议,使用它来协商选出 leader。
    • Gossip:consul 是建立在 Serf,它提供完整的 gossip protocol维基百科
    • LAN Gossip,Lan gossip 池,包含位于同一局域网或数据中心上的节点。
    • WAN Gossip,只包含 server 的 WAN Gossip 池,这些服务器主要位于不同的数据中心,通常通过互联网或广域网进行通信。
    • members:成员,对 consul 成员的称呼。提供会员资格,故障检测和事件广播。有兴趣的朋友可以深入研究下。

    consul 端口说明

    • TCP/8300 端口用于服务器节点。客户端通过该端口 RPC 协议调用服务端节点。
    • TCP/UDP/8301 端口用于单个数据中心所有节点之间的互相通信,即对 LAN 池信息的同步。它使得整个数据中心能够自动发现服务器地址,分布式检测节点故障,事件广播(如领导选举事件)。
    • TCP/UDP/8302 端口用于单个或多个数据中心之间的服务器节点的信息同步,即对 WAN 池信息的同步。它针对互联网的高延迟进行了优化,能够实现跨数据中心请求。
    • 8500 端口基于 HTTP 协议,用于 API 接口或 WEB UI 访问。
    • 8600 端口作为 DNS 服务器,它使得我们可以通过节点名查询节点信息。

    部署

    下载地址:https://www.consul.io/downloads.html

    1、单台Server启动命令

    /usr/local/consul/consul agent -server -bootstrap-expect 1 -ui -data-dir /usr/local/consul/data -node=w1 -bind=0.0.0.0 -rejoin -config-dir=/usr/local/consul/etc -client 0.0.0.0
    
    • server : 定义agent运行在server模式,如果是client模式则不需要添加这个参数

    • bootstrap-expect :datacenter中期望提供的server节点数目,当该值提供的时候,consul一直等到达到指定sever数目的时候才会引导(启动)整个集群,为了测试演示,我们这里使用1

    • bind:该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0

    • node:节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名

    • rejoin:使consul忽略先前的离开,在agent再次启动后仍旧尝试加入集群中。也就是说如果不加入这个参数,当前节点一旦退出,下次重启后是不会自动加入到集群中去的,除非是手动触发 consul join xxxx ,所以为了降低重启后对本身服务的影响,这里统一使用 -rejoin参数。

    • config-dir:配置文件目录,里面文件统一规定是以.json结尾才会被自动加载并读取服务注册信息的

    • client:consul服务侦听地址,处于client mode的Consul agent节点比较简单,无状态,仅仅负责将请求转发给Server agent节点

    2、配置文件启动方式

    /usr/local/consul/consul agent -config-file /usr/local/consul/etc/consul.json > /usr/local/consul/logs/consul.log 2>&1 &

    配置文件内容

    {  
      "datacenter": "devops",  
      "data_dir": "/usr/local/consul/data",  
      "log_level": "INFO",  
      "node_name": "w01",
      "server": true,
      "ui": true,
      "bootstrap_expect": 1,
      "bind_addr": "192.168.1.93",
      "client_addr": "0.0.0.0",
      "retry_interval": "30s",
      "raft_protocol": 3,
      "enable_debug": false,
      "rejoin_after_leave": true,
      "enable_syslog": false,
      "acl_datacenter": "DEVOPS",
      "acl_master_token": "qwerasdf",
      "acl_default_policy": "deny"
    }

    3、页面访问 http://192.168.1.93:8500/ui

    4、ACL配置

    5、查看集群状态

    consul operator raft list-peers
    

    配置介绍

    • 命令行参数
    -advertise:通知展现地址用来改变我们给集群中的其他节点展现的地址,一般情况下-bind地址就是展现地址
    -bootstrap:用来控制一个server是否在bootstrap模式,在一个datacenter中只能有一个server处于bootstrap模式,当一个server处于bootstrap模式时,可以自己选举为raft leader。
    -bootstrap-expect:在一个datacenter中期望提供的server节点数目,当该值提供的时候,consul一直等到达到指定sever数目的时候才会引导整个集群,该标记不能和bootstrap公用。
    -bind:该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0。
    -client:consul绑定在哪个client地址上,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1。
    -config-file:明确的指定要加载哪个配置文件
    -config-dir:配置文件目录,里面所有以.json结尾的文件都会被加载
    -data-dir:提供一个目录用来存放agent的状态,所有的agent都需要该目录,该目录必须是稳定的,系统重启后都继续存在。
    -dc:该标记控制agent的datacenter的名称,默认是dc1。
    -encrypt:指定secret key,使consul在通讯时进行加密,key可以通过consul keygen生成,同一个集群中的节点必须使用相同的key。
    -join:加入一个已经启动的agent的ip地址,可以多次指定多个agent的地址。如果consul不能加入任何指定的地址中,则agent会启动失败。默认agent启动时不会加入任何节点。
    -retry-join:和join类似,但是允许你在第一次失败后进行尝试。
    -retry-interval:两次join之间的时间间隔,默认是30s。
    -retry-max:尝试重复join的次数,默认是0,也就是无限次尝试。
    -log-level:consul agent启动后显示的日志信息级别。默认是info,可选:trace、debug、info、warn、err。
    -node:节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名。
    -protocol:consul使用的协议版本。
    -rejoin:使consul忽略先前的离开,在再次启动后仍旧尝试加入集群中。
    -server:定义agent运行在server模式,每个集群至少有一个server,建议每个集群的server不要超过5个。
    -syslog:开启系统日志功能,只在linux/osx上生效。
    -ui-dir:提供存放web ui资源的路径,该目录必须是可读的。
    -pid-file:提供一个路径来存放pid文件,可以使用该文件进行SIGINT/SIGHUP(关闭/更新)agent。
    • 配置文件
    acl_datacenter:只用于server,指定的datacenter的权威ACL信息,所有的servers和datacenter必须同意ACL datacenter
    acl_default_policy:默认是allow。
    acl_token:agent会使用这个token和consul server进行请求。
    acl_ttl:控制TTL的cache,默认是30s。
    addresses:一个嵌套对象,可以设置以下key:dns、http、rpc。
    advertise_addr:等同于-advertise。
    bootstrap:等同于-bootstrap。
    bootstrap_expect:等同于-bootstrap-expect。
    bind_addr:等同于-bind。
    ca_file:提供CA文件路径,用来检查客户端或者服务端的链接。
    cert_file:必须和key_file一起。
    client_addr:等同于-client。
    datacenter:等同于-dc。
    data_dir:等同于-data-dir。
    disable_anonymous_signature:在进行更新检查时禁止匿名签名。
    disable_remote_exec:禁止支持远程执行,设置为true,agent会忽视所有进入的远程执行请求。
    disable_update_check:禁止自动检查安全公告和新版本信息。
    dns_config:是一个嵌套对象,可以设置以下参数:allow_stale、max_stale、node_ttl 、service_ttl、enable_truncate。
    domain:默认情况下consul在进行DNS查询时查询的是consul域,可以通过该参数进行修改。
    enable_debug:开启debug模式。
    enable_syslog:等同于-syslog。
    encrypt:等同于-encrypt。
    key_file:提供私钥的路径。
    leave_on_terminate:默认是false,如果为true,当agent收到一个TERM信号的时候,它会发送leave信息到集群中的其他节点上。
    log_level:等同于-log-level。
    node_name:等同于-node。
    ports:这是一个嵌套对象,可以设置以下key:dns(dns地址:8600)、http(http api地址:8500)、rpc(rpc:8400)、serf_lan(lan port:8301)、serf_wan(wan port:8302)、server(server rpc:8300)。
    protocol:等同于-protocol。
    rejoin_after_leave:等同于-rejoin。
    retry_join:等同于-retry-join。
    retry_interval:等同于-retry-interval。
    server:等同于-server。
    server_name:会覆盖TLS CA的node_name,可以用来确认CA name和hostname相匹配。
    skip_leave_on_interrupt:和leave_on_terminate比较类似,不过只影响当前句柄。
    start_join:一个字符数组提供的节点地址会在启动时被加入。
    syslog_facility:当enable_syslog被提供后,该参数控制哪个级别的信息被发送,默认Local0。
    ui_dir:等同于-ui-dir。
    verify_incoming:默认false,如果为true,则所有进入链接都需要使用TLS,需要客户端使用ca_file提供ca文件。只用于consul server端,因为client从来没有进入的链接。
    verify_outgoing:默认false,如果为true,则所有出去链接都需要使用TLS,需要服务端使用ca_file提供ca文件,consul server和client都需要使用,因为两者都有出去的链接。
    watches:watch一个详细名单。

     Consul在Go微服务中的应用

    参考博客

    http://lihaoquan.me/2018/5/31/consul-in-action.html

    https://www.jianshu.com/p/3d074ed76a68

    http://www.liangxiansen.cn/2017/04/06/consul/

    http://techblog.zeomega.com/devops/golang/2015/06/09/consul-kv-api-in-golang.html

    https://medium.com/amartha-engineering/leveraging-consul-as-service-discovery-health-checking-and-key-value-kv-store-in-go-e475cf63ab6a

    https://www.hi-linux.com/posts/28048.html

    https://www.zhang21.cn/2018/04/05/Consul/

  • 相关阅读:
    微服务架构最佳实践 基础设施篇
    深入理解微服务架构:银弹 or 焦油坑?
    uniapp canvasToTempFilePath
    uniapp easycom
    前端302通常不处理,通常使用链接
    linux性能监控命令dstat详解【杭州多测师_王sir】【杭州多测师】
    杭州市民卡面试题【杭州多测师】【杭州多测师_王sir】
    Java创建多线程的3种方式和Java当中的线程池【杭州多测师】【杭州多测师_王sir】
    Python笔试题:给定一个整数数组和一个目标值、找出数组中为2个俩个数、若无返回1【杭州多测师】【杭州多测师_王sir】
    GR/IR差异价格
  • 原文地址:https://www.cnblogs.com/shhnwangjian/p/9139866.html
Copyright © 2020-2023  润新知