简介

  • Consul是基于GO语言开发的开源工具,主要面向分布式,服务化的系统提供服务注册、服务发现和配置管理的功能。
  • Consul的功能都很实用,其中包括:服务注册/发现、健康检查、Key/Value存储、多数据中心和分布式一致性保证等特性。
  • Consul本身只是一个二进制的可执行文件,所以安装和部署都非常简单,只需要从官网下载后,在执行对应的启动脚本即可。
  • 官网下载地址: https://www.consul.io/downloads.html

特性

  • 基础特性

    1. 服务注册/发现
    2. 数据强一致型保证
    3. 多数据中心
    4. 健康检查
    5. Key/Value存储
  • 高级特性
    • HTTP API
    • ACL

工作模式

  • Consul中包括的3种不同的角色:Client、Server、Server-Leader。

  • 还有一个在图上没有标出来的角色Agent,一共4个角色。

  • Agent

    • 是一个守护线程

    • 跟随Consul应用启动而启动

    • 负责检查、维护节点同步

  • Client

    • 转发所有请求给Server
    • 无状态, 不持久化数据
    • 参与LAN Gossip的健康检查
  • Server

    • 持久化数据
    • 转发请求给Server-Leader
    • 参与Server-Leader选举
    • 通过WAN Gossip(流言算法协议, Cassandra和比特币的底层算法, 符合弱一致性), 与其他数据中心交换数据
  • Server-Leader

    • 响应RPC请求
    • 将服务列表数据同步给Server

工作原理

  • 服务注册的方式

    1. HTTP API

      http://{ip}:8500/v1/agent/service/register/:service
    2. JSON 配置文件

      {
      "services": [
      {
      "id": "serverId",
      "name": "serverName",
      "tags": [
      "primary"
      ],
      "address": "127.0.0.1",
      "port": 9003,
      "checks": [
      {
      "id": "api-servie",
      "name": "Service 'xx' check",
      "http": "http://127.0.0.1:9003/public/health",
      "method": "GET",
      "interval": "10s",
      "timeout": "1s"
      }
      ]
      }
      ]
      • 启动增加参数: -config-dir

        nohup ./consul agent -dev -config-dir=/consul-conf/service.json &
  • 服务发现的方式

    1. HTTP API

      • 获取某个service下健康的服务列表信息

        http://{ip}:8500/v1/health/service/:service
    2. DNS Agent

  • 工作流程

集群搭建

  • 这次我们以二进制包方式搭建, 其实还有docker的方式。

  • 我使用的系统为ubuntu18.04LTS

  • 集群规划:node01, node02, node03, node04, node05上都安装

  • 集群前置准备请参考: https://www.cnblogs.com/ronnieyuan/p/11461377.html

  • 上传二进制包并解压到指定目录

    unzip consul_1.6.2_linux_amd64.zip -d /usr/bin
  • 解压后直接就是一个可执行文件了

  • vim ~/.bashrc 修改环境变量

    # Consul
    export CONSUL_HOME=/usr/bin/consul
    export PATH=$PATH:CONSUL_HOME
  • 验证Consul安装是否成功

    root@node01:/home/ronnie/soft# consul version
    Consul v1.6.2
    Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use protocol >2 when speaking to compatible agents)
    root@node01:/home/ronnie/soft# vim ~/.bashrc
  • 将二进制文件拷贝至其他几台虚拟机上, 记得修改配置文件

    cd /usr/bin/
    scp consul root@node02:`pwd`
    scp consul root@node03:`pwd`
    scp consul root@node04:`pwd`
    scp consul root@node05:`pwd`
  • 分别在五台虚拟机上输入以下对应的命令

    # node01
    consul agent -server -ui -bootstrap-expect=5 -data-dir=/data/consul -node=agent-1 -client=0.0.0.0 -bind=192.168.180.130 -datacenter=dc1 # node02
    consul agent -server -ui -bootstrap-expect=5 -data-dir=/data/consul -node=agent-2 -client=0.0.0.0 -bind=192.168.180.131 -datacenter=dc1 -join 192.168.180.130 # node03
    consul agent -server -ui -bootstrap-expect=5 -data-dir=/data/consul -node=agent-3 -client=0.0.0.0 -bind=192.168.180.132 -datacenter=dc1 -join 192.168.180.130 # node04
    consul agent -server -ui -bootstrap-expect=5 -data-dir=/data/consul -node=agent-4 -client=0.0.0.0 -bind=192.168.180.133 -datacenter=dc1 -join 192.168.180.130 # node05
    consul agent -server -ui -bootstrap-expect=5 -data-dir=/data/consul -node=agent-5 -client=0.0.0.0 -bind=192.168.180.134 -datacenter=dc1 -join 192.168.180.130
    • 命令解读:

      • -bootstrap-expect=5: 指定了集群有5台
      • -node=agent-x: 指定服务器
      • -client=0.0.0.0: 指定当前主机客户端侦听地址为0.0.0.0
      • -bind: 绑定当前主机的ip地址
      • -datacenter=dc: 指定了一个数据中心的名称
      • -join 192.168.180.130: 后几台服务器在启动的时候加入第一台代理服务器node01(PS, 比较坑的是即使已经改过hostname文件, 还是得敲ip)
      • -ui指定了启用每台服务器的内置 WebUI 服务器组件
      • 当五台服务器都正确运行起来以后,Consul 集群将自动选举 leader,自动进行集群事务,无需干预。
    • 启动成功案例

      ==> bind_addr cannot be empty
      root@node02:~# consul agent -server -ui -bootstrap-expect=5 -data-dir=/data/consul -node=agent-2 -client=0.0.0.0 -bind=192.168.180.131 -datacenter=dc1 -join 192.168.180.130
      bootstrap_expect > 0: expecting 5 servers
      ==> Starting Consul agent...
      Version: 'v1.6.2'
      Node ID: '304a1a5a-2987-e7ad-738d-7d21f9dbd887'
      Node name: 'agent-2'
      Datacenter: 'dc1' (Segment: '<all>')
      Server: true (Bootstrap: false)
      Client Addr: [0.0.0.0] (HTTP: 8500, HTTPS: -1, gRPC: -1, DNS: 8600)
      Cluster Addr: 192.168.180.131 (LAN: 8301, WAN: 8302)
      Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false, Auto-Encrypt-TLS: false ==> Log data will now stream in as it occurs: 2019/11/29 22:19:15 [INFO] raft: Initial configuration (index=0): []
      2019/11/29 22:19:15 [INFO] raft: Node at 192.168.180.131:8300 [Follower] entering Follower state (Leader: "")
      2019/11/29 22:19:15 [INFO] serf: EventMemberJoin: agent-2.dc1 192.168.180.131
      2019/11/29 22:19:15 [INFO] serf: EventMemberJoin: agent-2 192.168.180.131
      2019/11/29 22:19:15 [INFO] consul: Adding LAN server agent-2 (Addr: tcp/192.168.180.131:8300) (DC: dc1)
      2019/11/29 22:19:15 [INFO] agent: Started DNS server 0.0.0.0:8600 (udp)
      2019/11/29 22:19:15 [INFO] consul: Handled member-join event for server "agent-2.dc1" in area "wan"
      2019/11/29 22:19:15 [INFO] agent: Started DNS server 0.0.0.0:8600 (tcp)
      2019/11/29 22:19:15 [INFO] agent: Started HTTP server on [::]:8500 (tcp)
      ==> Joining cluster...
      2019/11/29 22:19:15 [INFO] agent: (LAN) joining: [192.168.180.130]
      2019/11/29 22:19:15 [INFO] serf: EventMemberJoin: agent-1 192.168.180.130
      2019/11/29 22:19:15 [INFO] agent: (LAN) joined: 1
      Join completed. Synced with 1 initial agents
      2019/11/29 22:19:15 [INFO] agent: started state syncer
      ==> Consul agent running!
      2019/11/29 22:19:15 [INFO] consul: Adding LAN server agent-1 (Addr: tcp/192.168.180.130:8300) (DC: dc1)
      2019/11/29 22:19:15 [INFO] serf: EventMemberJoin: agent-1.dc1 192.168.180.130
      2019/11/29 22:19:15 [INFO] consul: Handled member-join event for server "agent-1.dc1" in area "wan"
      2019/11/29 22:19:17 [INFO] serf: EventMemberJoin: agent-3.dc1 192.168.180.132
      2019/11/29 22:19:17 [INFO] consul: Handled member-join event for server "agent-3.dc1" in area "wan"
      2019/11/29 22:19:17 [INFO] serf: EventMemberJoin: agent-3 192.168.180.132
      2019/11/29 22:19:17 [INFO] consul: Adding LAN server agent-3 (Addr: tcp/192.168.180.132:8300) (DC: dc1)
      2019/11/29 22:19:17 [INFO] serf: EventMemberJoin: agent-4.dc1 192.168.180.133
      2019/11/29 22:19:17 [INFO] consul: Handled member-join event for server "agent-4.dc1" in area "wan"
      2019/11/29 22:19:18 [INFO] serf: EventMemberJoin: agent-4 192.168.180.133
      2019/11/29 22:19:18 [INFO] consul: Adding LAN server agent-4 (Addr: tcp/192.168.180.133:8300) (DC: dc1)
      2019/11/29 22:19:18 [INFO] serf: EventMemberJoin: agent-5 192.168.180.134
      2019/11/29 22:19:18 [INFO] consul: Adding LAN server agent-5 (Addr: tcp/192.168.180.134:8300) (DC: dc1)
      2019/11/29 22:19:18 [INFO] consul: Existing Raft peers reported by agent-5, disabling bootstrap mode
      2019/11/29 22:19:18 [INFO] serf: EventMemberJoin: agent-5.dc1 192.168.180.134
      2019/11/29 22:19:18 [INFO] consul: Handled member-join event for server "agent-5.dc1" in area "wan"
      2019/11/29 22:19:19 [WARN] raft: Failed to get previous log: 1 log not found (last: 0)
      2019/11/29 22:19:19 [INFO] agent: Synced node info
      2019/11/29 22:19:19 [INFO] consul: New leader elected: agent-1
      ==> Failed to check for updates: Get https://checkpoint-api.hashicorp.com/v1/check/consul?arch=amd64&os=linux&signature=6977bf57-e750-2607-d65d-fa3ab1444055&version=1.6.2: net/http: request canceled (Client.Timeout exceeded while awaiting headers)
  • 在浏览器上访问node01节点的8500端口

  • 那么本次集群的安装就到此为止了

Consul 简介及集群安装的更多相关文章

  1. HBase简介及集群安装

    一.Hbase概述 Apache HBase™是Hadoop数据库,是一个分布式,可扩展的大数据存储. 当您需要对大数据进行随机,实时读/写访问时,请使用Apache HBase™.该项目的目标是托 ...

  2. etcd简介及集群安装部署使用

    目录 1. 简介 2. Linux下载安装 3. 单机模式启动 4. 指定各集群成员的方式配置集群 5. 使用discovery service的方式配置集群 6. 集群模式下客户端命令行 7. et ...

  3. centos7上consul的集群安装

    centos7上consul的安装 ###一 下载 下载文件 wget https://releases.hashicorp.com/consul/0.6.4/consul_0.6.4_linux_a ...

  4. consul 集群安装

    上图是官网提供的一个事例系统图,图中的Server是consul服务端高可用集群,Client是consul客户端.consul客户端不保存数据,客户端将接收到的请求转发给响应的Server端.Ser ...

  5. Hadoop多节点集群安装配置

    目录: 1.集群部署介绍 1.1 Hadoop简介 1.2 环境说明 1.3 环境配置 1.4 所需软件 2.SSH无密码验证配置 2.1 SSH基本原理和用法 2.2 配置Master无密码登录所有 ...

  6. 一步步教你Hadoop多节点集群安装配置

    1.集群部署介绍 1.1 Hadoop简介 Hadoop是Apache软件基金会旗下的一个开源分布式计算平台.以Hadoop分布式文件系统HDFS(Hadoop Distributed Filesys ...

  7. spark集群安装配置

    spark集群安装配置 一. Spark简介 Spark是一个通用的并行计算框架,由UCBerkeley的AMP实验室开发.Spark基于map reduce 算法模式实现的分布式计算,拥有Hadoo ...

  8. kafka分布式消息队列介绍以及集群安装

    简介 首先简单说下对kafka的理解: 1.kafka是一个分布式的消息缓存系统: 2.kafka集群中的服务器节点都被称作broker 3.kafka的客户端分为:一是producer(消息生产者) ...

  9. CDH集群安装&测试总结

    0.绪论 之前完全没有接触过大数据相关的东西,都是书上啊,媒体上各种吹嘘啊,我对大数据,集群啊,分布式计算等等概念真是高山仰止,充满了仰望之情,觉得这些东西是这样的: 当我搭建的过程中,发现这些东西是 ...

随机推荐

  1. Servlet 学习(六)

    会话 1.定义 一般意义会话:指两人以上的对话(多用于学习别种语言或方言时) 计算机中的会话:客户端和服务器的通讯 web客户端 A ------>Tomcat web客户端 B ------& ...

  2. 3_02_MSSQL课程_Ado.Net_连接池_连接字符串

    连接池技术:是一种对象池技术. 连接对象频繁的开启和关闭操作. innerConnection  先从池子里面拿,如果没有创建新的!!连接池有大小,最大/最小.  提高了连接对象的重用. Asp.ne ...

  3. 避免学习Linux走弯路

    我并不是一位Linux老鸟.在学习Linux的一路上.也是走了很多弯路,踩了不少坑.而今日就把自己趟过的那些坑给我们总结出来,期望能给初学Linux的童靴们带来一丝丝的帮助吧.文采可能没有那么高深,只 ...

  4. java中读取文本文件的时候@Test方法中没有中文乱码,但是@Controller中却有中文乱码

    今天遇到了一个非常牛逼的BUG,在@Test标注的测试类中没有中文乱码,但是访问@Controller标注的接口却报中文乱码,找了一系列资料以及各种尝试之后,发现是因为eclipse编辑工具字符编码的 ...

  5. Dubbo 18 问

    dubbo是什么 dubbo是一个分布式框架,远程服务调用的分布式框架,其核心部分包含: 集群容错:提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集 ...

  6. 用Hyper-v 在win10下使用Docker-Desktop体验kubernetes

    首先开启Hyper-v ,会自动创建一个交换机. 开启internet共享,自动创建的那个交换机(虚拟的网络适配器)会分配一个默认的IP 192.168.137.1,这个IP你不爽,就用注册表搜索并修 ...

  7. free to monitor your sqlserver easy and safe and ...

    Unlike AWR in Oracle, Sqlserver does not have offical way to make history performance information fo ...

  8. Django 学习视图之FBV与CBV

    一. CBV与FBV CBV:Class Based View FBV:Function Based View 我们之前写过的都是基于函数的view,就叫FBV.还可以把view写成基于类的,那就是C ...

  9. C++11并发编程3------线程传参

    /* 基本类型传值 */ #include <iostream> #include <thread> void func(int num) { num = ; std::cou ...

  10. python之常见模块(time,datetime,random,os,sys,json,pickle)

    目录 time 为什么要有time模块,time模块有什么用?(自己总结) 1. 记录某一项操作的时间 2. 让某一块代码逻辑延迟执行 时间的形式 时间戳形式 格式化时间 结构化时间 时间转化 总结: ...