• 微服务之 Consul 单机版到集群搭建详细步骤【转】


    一、简介

    了解微服务的朋友应该不陌生这个组件,Consul 是一种服务网络解决方案,提供服务注册、服务发现、健康检查等微服务架构系统中必不可少的功能。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建完整的服务网格。并且它还提供 web ui 界面,让使用者可以实时的了解系统中各服务的健康状态

    二、单机版 consul 部署使用

    首先需要下载 consul 的程序文件,有条件的小伙伴建议直接前往官网下载:https://www.consul.io/downloads.html ,无法下载官网的可以使用下面链接进行下载(Consul v1.6.1) https://download.csdn.net/download/wchenjt/12408364 ,consul 的程序文件下载后直接就是可执行的,下载相应平台版本 的Consul 解压 copy 至 /usr/local/bin/(系统的环境变量)目录下。

    创建 /data/consul 目录,作为 consul 的数据存放目录,此目录可以自定义。
    在此目录下创建一个启动 consul 的脚本文件 start_consul.sh

    [root@benarchen ~]# vim /data/consul/start_consul.sh
    nohup /usr/local/bin/consul agent -server -ui -client 0.0.0.0 -bootstrap-expect=1 -data-dir=/data/consul/consul_data -node=consul-01 -advertise=10.5
    .90.10 -datacenter SH-TMP -bind=0.0.0.0 -client=0.0.0.0 -log-file=/data/consul/consul_data/consul.log &
    
    # agent -server 表示已 server 模式启动服务
    # -ui 参数提供一个 web ui 界面
    # -bootstrap-expect=1 意思是以集群的方式启动,只不过集群中只有当前这个节点
    # -data-dir 目录会用来存放 consul 的数据信息,如服务注册、是否健康等
    # -node=consul-01 节点名称
    # -advertise=10.5.90.10 改成自己的ip,或者去掉这个参数
    # 对安全性没有要求的情况下其余都可以照抄

    保存退出后给文件可执行权限就可以启动服务了

    [root@benarchen ~]# chmod u+x start_consul.sh
    [root@benarchen ~]# /bin/sh start_consul.sh

    不出意外此时可以在浏览器输入服务器的公网 ip:8500 访问 consul 提供的 ui 页面

    三、Consul 集群搭建

    1、consul 的集群架构

    consul 的集群和其他组件略有不同,它在启动后有两种模式,分别是:

    Server 模式: 一个 Server 是一个有一组扩展功能的代理,这些功能包括参与 Raft 选举,维护集群状态,响应 RPC 查询,与其他数据中心交互 WAN gossip 和转发查询给 leader 或者远程数据中心。
    Client 模式: 一个 Client 是一个转发所有 RPC 到 Server 的代理。这个 Client 是相对无状态的;Client 唯一执行的后台活动是加入 LAN gossip 池,这有一个最低的资源开销并且仅消耗少量的网络带宽。
    下面的 consul 官方提供的 consul 集群架构图

    从官方给出的架构图可以看出,Consul 是支持多数据中心的,图中有两个 DataCenter 通过 Internet 连接,并且只有 Server 可以跨数据中心通信,多数据中心的架构相对复杂一些,这里我们只讨论单数据中心。

    在单个数据中心中,Consul 分为 Client 和 Server 两种节点(所有的节点也被称为 Agent),Server 节点保存数据,Client 负责健康检查及转发数据请求到 Server;Server 节点有一个 Leader 和多个Follower,Leader 节点会将数据同步到 Follower,官方推荐 Server 的数量是 3 个或者 5 个,在 Leader 挂掉的时候会启动选举机制产生一个新的 Leader,以保证整个集群的正常运转。

    集群内数据的读写请求既可以直接发到 Server(上文中的单节点就是这种情况),也可以通过 Client 使用 RPC 转发到 Server,请求最终会到达 Leader 节点,在允许数据轻微陈旧的情况下,读请求也可以在普通的 Server 节点完成,集群内数据的读写和复制都是通过 TCP 的 8300 端口完成。

    2、项目背景


    公司的微服务项目大概有三十多个服务,考虑到单机版的 consul 在性能和容错性上都会有所不足,所以打算搭建集群版。微服务使用 docker 的方式部署在两台宿主机上,两台宿主机在配置上、部署的服务完全一样,网关入口做负载均衡以使其高可用。

    此处采用的是 3Server + 2Client 的集群架构,3 台 Servler 在单独的虚拟机上,2 台 Client 则直接在部署服务的宿主机运行。

    节点类型 IP 版本

    3、搭建 Consul 集群


    下载相应的版本 consul 程序文件解压 copy 至 /usr/local/bin/(系统环境变量)目录。
    创建 /data/consul 目录,作为 consul 的数据及相关配置文件存放目录,此目录可以自定义。
    创建 /data/consul/consul.d 目录,在此目录下创建一个 consul 启动的配置文件 consul.json

    部署第一台 Server
    在第一台机器上创建如下文件

    [root@consul-01 ~]# mkdir -p /data/consul/consul.d
    [root@consul-01 ~]# mkdir -p /data/consul/consul_data/logs/
    [root@consul-01 ~]# vim /data/consul/consul.d/consul.json
    {
    "datacenter": "SH",
    "node_name": "consul-svr-01",
    "server": true,
    "bootstrap_expect": 3,
    "data_dir": "/data/consul/consul_data",
    "log_level": "INFO",
    "log_file": "/data/consul/consul_data/logs/",
    "ui": true,
    "bind_addr": "10.5.90.4",
    "client_addr": "0.0.0.0",
    "retry_join": ["10.5.90.16","10.5.90.12"],
    "retry_interval": "10s",
    "raft_protocol": 3,
    "enable_debug": false,
    "rejoin_after_leave": true,
    "enable_syslog": false
    }

    datacenter :数据中心名称
    node_name :节点名称
    server :是否为 Server 模式,false 为 Client 模式
    bootstrap_expect :此标志提供数据中心中预期的服务器数量。要么不提供此值,要么该值必须与集群中的其他服务器一致。如果提供,Consul 将等待直到指定数量的服务器可用为止,然后引导群集。这样可以自动选举最初的领导者。不能与旧 -bootstrap 标志一起使用。该标志需要 -server 模式。
    data_dir :Server 节点数据目录
    -log-file-将所有 Consul 代理日志消息写入文件
    ui :是否开启 UI 访问
    bind_addr :Server 绑定的 IP,填本机即可
    client_addr :作为 Client 绑定的 IP,默认为 127.0.0.1,也就是只有本地服务可以注册,这很明显是不符合需求的
    retry_join :尝试加入的其他节点,填写集群中的其他节点 ip 即可
    raft_protocol :Raft 协议版本
    rejoin_after_leave :允许重新加入集群
    保存 consul.json 文件后执行启动命令

    [root@benarchen ~]# sudo nohup /usr/local/bin/consul agent -config-file=/data/consul/consul.d/consul.json &
    #也可以把该命令写入一个脚本文件,每次执行脚本文件启动 consul 即可,如下所示
    [root@benarchen ~]# cat start_consul.sh
    sudo nohup /usr/local/bin/consul agent -config-file=/data/consul/consul.d/consul.json &
    1
    2
    3
    4
    部署第二台 Server
    copy 第一台的配置文件到第二台机器稍作修改即可:

    [root@consul-02 ~]# mkdir -p /data/consul/consul.d
    [root@consul-02 ~]# mkdir -p /data/consul/consul_data/logs/
    [root@consul-02 ~]# vim /data/consul/consul.d/consul.json
    {
    "datacenter": "SH",
    "node_name": "consul-svr-02",
    "server": true,
    "bootstrap_expect": 3,
    "data_dir": "/data/consul/consul_data",
    "log_level": "INFO",
    "log_file": "/data/consul/consul_data/logs/",
    "ui": true,
    "bind_addr": "10.5.90.16",
    "client_addr": "0.0.0.0",
    "retry_join": ["10.5.90.4","10.5.90.12"],
    "retry_interval": "10s",
    "raft_protocol": 3,
    "enable_debug": false,
    "rejoin_after_leave": true,
    "enable_syslog": false
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    保存 consul.json 文件后启动第二台 Server

    [root@consul-02 ~]# sudo nohup /usr/local/bin/consul agent -config-file=/data/consul/consul.d/consul.json &
    1
    部署第三台 Server
    copy 第一台的配置文件到第三台机器稍作修改即可:

    [root@consul-03 ~]# mkdir -p /data/consul/consul.d
    [root@consul-03 ~]# mkdir -p /data/consul/consul_data/logs/
    [root@consul-03 ~]# vim /data/consul/consul.d/consul.json
    {
    "datacenter": "SH",
    "node_name": "consul-svr-03",
    "server": true,
    "bootstrap_expect": 3,
    "data_dir": "/data/consul/consul_data",
    "log_level": "INFO",
    "log_file": "/data/consul/consul_data/logs/",
    "ui": true,
    "bind_addr": "10.5.90.12",
    "client_addr": "0.0.0.0",
    "retry_join": ["10.5.90.4","10.5.90.16"],
    "retry_interval": "10s",
    "raft_protocol": 3,
    "enable_debug": false,
    "rejoin_after_leave": true,
    "enable_syslog": false
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    保存 consul.json 文件后启动第三台 Server

    [root@consul-03 ~]# sudo nohup /usr/local/bin/consul agent -config-file=/data/consul/consul.d/consul.json &
    1
    部署 Client
    部署第一台 Client

    [root@Client-01 ~]# mkdir -p /data/consul/consul.d
    [root@Client-01 ~]# mkdir -p /data/consul/consul_data/logs/
    [root@Client-01 ~]# vim /data/consul/consul.d/consul.json
    {
    "datacenter": "SH",
    "node_name": "consul-cli-01",
    "data_dir": "/data/consul/consul_data",
    "log_level": "INFO",
    "log_file": "/data/consul/consul_data/logs/",
    "ui": true,
    "bind_addr": "10.5.90.10",
    "client_addr": "0.0.0.0",
    "retry_join": ["10.5.90.4","10.5.90.12","10.5.90.16"],
    "retry_interval": "10s",
    "raft_protocol": 3,
    "enable_debug": false,
    "rejoin_after_leave": true,
    "enable_syslog": false
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    保存 consul.json 文件后启动第一台 Client

    [root@Client-01 ~]# sudo nohup /usr/local/bin/consul agent -config-file=/data/consul/consul.d/consul.json &
    1
    部署第二台 Client

    [root@Client-02 ~]# mkdir -p /data/consul/consul.d
    [root@Client-02 ~]# mkdir -p /data/consul/consul_data/logs/
    [root@Client-02 ~]# vim /data/consul/consul.d/consul.json
    {
    "datacenter": "SH",
    "node_name": "consul-cli-02",
    "data_dir": "/data/consul/consul_data",
    "log_level": "INFO",
    "log_file": "/data/consul/consul_data/logs/",
    "ui": true,
    "bind_addr": "10.5.90.6",
    "client_addr": "0.0.0.0",
    "retry_join": ["10.5.90.4","10.5.90.12","10.5.90.16"],
    "retry_interval": "10s",
    "raft_protocol": 3,
    "enable_debug": false,
    "rejoin_after_leave": true,
    "enable_syslog": false
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    保存 consul.json 文件后启动第二台 Client

    [root@Client-02 ~]# sudo nohup /usr/local/bin/consul agent -config-file=/data/consul/consul.d/consul.json &
    1
    4、验证集群可用性及相关命令
    3 台 Server 和 2 台 Client 上的 Consul 服务都启动后会根据 consul.json 中的配置自动组成一个集群,并且 Server 会通过 Raft 协议在 Server 节点中选举出 leader 节点,可以用如下命令在任意一台机器上查看集群状态:

    [root@Client-01 ~]# /usr/local/bin/consul operator raft list-peers
    Node ID Address State Voter RaftProtocol
    consul-svr-01 aeb7f53c-c66e-f0cc-3bde-cff37139df74 10.5.90.4:8300 leader true 3
    consul-svr-02 f1a32255-1beb-7de1-7f2e-3ed4238f087e 10.5.90.16:8300 follower true 3
    consul-svr-03 dea6db54-9d46-a755-9acc-3d7446d9c42d 10.5.90.12:8300 follower true 3
    1
    2
    3
    4
    5
    这里只能显示出 Server 节点的信息,如果要查看集群中所有节点的信息可以用如下命令:

    [root@Client-01 ~]# /usr/local/bin/consul members
    Node Address Status Type Build Protocol DC Segment
    consul-svr-01 10.5.90.4:8301 alive server 1.6.1 2 sh <all>
    consul-svr-02 10.5.90.16:8301 alive server 1.6.1 2 sh <all>
    consul-svr-03 10.5.90.12:8301 alive server 1.6.1 2 sh <all>
    consul-cli-01 10.5.90.10:8301 alive client 1.6.1 2 sh <default>
    consul-cli-02 10.5.90.6:8301 alive client 1.6.1 2 sh <default>
    1
    2
    3
    4
    5
    6
    7
    并且还能查看到每个节点的类型、存货状态、Consul 版本、数据中心等信息。

    此时也可以试试集群的 ui 界面,打开任意一台服务器的 ip:8500 ,因为我的机器有公网 IP,如果是虚拟机可以直接访问虚拟机 IP:8500 ,consul 的 ui 界面还算友好,可以更加直观的查看到 consul 集群的各服务状态,到此为止整个 Consul 集群就算是搭建完成了。

    Consul 相关命令

    /usr/local/bin/consul --version #查看版本
    /usr/local/bin/consul agent -dev -enable-script-checks -config-dir=./consul.d #启动一个开发版的 consul,多用于测试
    /usr/local/bin/consul members #查看集群中的所有成员
    /usr/local/bin/consul operator raft list-peers #查看集群状态,如 leade、follower 等信息
    /usr/local/bin/consul operator raft remove-peer -id=10.5.90.10:8500 #退出集群
    curl http://localhost:8500/v1/catalog/service/服务名 #用 API 查询一个服务的信息
    dig @10.5.90.4 -p 8600 服务名.service.consul #用 dig 查询一个服务的信息
    curl 'http://10.5.90.4:8500/v1/catalog/service/服务名?passing' #过滤服务的健康实例
    /usr/local/bin/consul --help #最厉害的命令,没有之一
    ————————————————

    转载
    版权声明:本文为CSDN博主「benarchen」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/wchenjt/article/details/106055797

  • 相关阅读:
    Travis 编译使用 JDK 的版本
    《程序员的职业素养》读书笔记
    先做人,在做事
    CAP理论
    ZGC实践
    虚拟化技术的分类及介绍
    C# AD域验证登录
    dotnet core 3.1 站点发布成windows服务
    windows 服务无法调用office word COM接口
    Ext 动态加载js文件
  • 原文地址:https://www.cnblogs.com/paul8339/p/16202015.html
Copyright © 2020-2023  润新知