zoukankan      html  css  js  c++  java
  • Consul 学习笔记(二)之生产环境部署

    一. 部署

        本次示例中,为了简化部署,仅使用一个数据中心,数据中心三台服务器,分别安装 2 个 consul server 实例,2个 consul client 实例,具体部署图如下:

     

       其中 2个consul server 实例,128 的consul server 默认是初始 leader.129 会配置加入128。

    二.  部署

    1、创建目录

        在 128、129、130 分别上传 consul 软件包,目录结构如下:

    192.168.149.128:

         

     192.168.149.129:

    192.168.149.130:

    2、上传软件包

        将 从官网下载的软件包(consul_1.8.0_linux_amd64.zip)上传到上述所有服务器的bin目录,并将内容解压到 bin 目录下。

    3、配置

    1)将 128、129、130 consul server 和 consul client 的端口均通过防火墙

           128:

              consul server

    • http_port=8500
    • serf_lan_port =8301
    • serf_wan_port=8302
    • dns_port=8600

             consul client

    • http_port=8700
    • serf_lan_port =8701
    • serf_wan_port=8702
    • dns_port=8703

         129:

         consul server

    • http_port=8500
    • serf_lan_port =8301
    • serf_wan_port=8302
    • dns_port=8600

       130:

      consul client

    • http_port=8500
    • serf_lan_port =8301
    • serf_wan_port=8302
    • dns_port=8600

    2) consul server 配置

        准备 server_start.json文件,128、129 上均部署 consul server,server_start.json的内容分别如下:

    {
            "datacenter": "test-datacenter1",
            "data_dir": "/opt/consul/consul/data/",
            "log_file": "/opt/consul/consul/log/",
            "log_level": "INFO",
            "bind_addr": "192.168.149.128",
            "client_addr": "0.0.0.0",
            "node_name": "consul server1",
            "ui": true,
            "server": true
    }

    3) consul client 配置

      128 上的 consul client 配置,将其直接加入到 128 上的 consul server 中。

    {
        "datacenter": "test-datacenter1",
        "data_dir": "/opt/consul/client/data/",
        "log_file": "/opt/consul/client/log/",
        "log_level": "INFO",
        "bind_addr": "192.168.149.128",
        "client_addr": "0.0.0.0",
        "node_name": "consul client1on128",
        "retry_join": ["192.168.149.128:8301"],
        "ports": {
            "dns": 8703,
            "http": 8700,
            "serf_wan": 8702,
            "serf_lan": 8701
        }
    }

      130 上的 consul client 配置,将其直接加入到 129 上的 consul server 中。

    {
        "datacenter": "test-datacenter1",
        "data_dir": "/opt/consul/client/data/",
        "log_file": "/opt/consul/client/log/",
        "log_level": "INFO",
        "bind_addr": "192.168.149.130",
        "client_addr": "0.0.0.0",
        "node_name": "consul client2 on129",
        "ports": {
            "dns": 8703,
            "http": 8700,
            "serf_wan": 8702,
            "serf_lan": 8701
        },
    "retry_join": ["192.168.149.129:8301"] }

    4、启动

    1) consul server 端

    128、129 consul server:

         执行命令:cd /opt/consul/consul

                         bin/consul agent -config-dir=conf

    执行结果:

        上图为 128 上的启动效果图

     

         上图为 129 上的启动效果图

    发现在 128 启动结果上 其未选举出 leader; 其中 2 处是启动 129 的consul server 时,129 通过 gossip 协议 通过 128 的 8302 加入进来的,但是 3 处显示即使此时加入了 129 的 consul server,通过 raft 协议仍然未选举出 leader。

    问题:

    a) 现象: 两个 consul server 没有选举出 leader;

        原因: server_start.properties 中缺失:bootstrap_expect 配置项;

        解决办法: 在 128 的配置文件中增加该配置项:"bootstrap_expect=1",128、129 consul server 重启:

      上图 为 128 consul server 结果

     上图为 129 consul server 结果

    b) 现象:128 在加入 129 成员时发现 8300 端口访问不通;

        原因:128、129的 8300 端口都没有打开,raft 协议通过 8300 端口进行将server加入到集群中。

        解决办法:通过防火墙命令打开两个服务器上的8300端口。

    128、129 的 consul server 重启结果如下:

     上图为 128 consul  server 启动效果图

     上图为 129 consul server 最终启动效果图

    结果:

     a) 打开 128 的 UI 界面查看

     b) 打开 129 的 UI 界面查看:

    结论:

     1) 经过以上,第一个 consul server的最终配置需要是:

    {
        "datacenter": "test-datacenter1",
        "data_dir": "/opt/consul/consul/data/",
        "log_file": "/opt/consul/consul/log/",
        "log_level": "INFO",
        "bind_addr": "192.168.149.128",
        "client_addr": "0.0.0.0",
        "node_name": "consul server1",
        "ui": true,
        "server": true,
        "bootstrap_expect":1
    }

    第二个 consul server 的最终部署配置需要是:

    {
        "datacenter": "test-datacenter1",
        "data_dir": "/opt/consul/consul/data/",
        "log_file": "/opt/consul/consul/log/",
        "log_level": "INFO",
        "bind_addr": "192.168.149.129",
        "client_addr": "0.0.0.0",
        "node_name": "consul server2",
        "ui": true,
        "server": true,
        "start_join":["192.168.149.128:8301"]
    }

    2) consul server 用到的 http_port serf_lan_portserf_wan_portdns_port aft_port 端口均要通过通过防火墙;

    3) 第一个 consul server 实例必须默认存在 bootstrap_expect 配置项,值可为1;否则服务启动不了,通过web访问,会显示 500,后台日志显示:

    2020-06-29T20:39:07.071+0800 [ERROR] agent.http: Request error: method=GET url=/v1/internal/ui/nodes?dc=test-datacenter1 from=192.168.149.1:54377 error="No cluster leader"
    2020-06-29T20:39:18.831+0800 [ERROR] agent: Coordinate update error: error="No cluster leader"

    4) 虽然有默认leader,但是在集群运行过程,会通过raft 协议 和 gossip协议检测 cosnul server 是否在线,是否运行正常,当leader 出现问题,会重新选举 leader。

    2) consul client

      128 启动

        执行命令:cd /opt/consul/client                    

                         bin/consul agent -config-dir=conf

     执行结果:

       129 启动

        执行命令:cd /opt/consul/client                    

                         bin/consul agent -config-dir=conf

     执行结果:

     以上表示成功加入 consul server,但是从日志显示,是加入到集群中的所有 consul server 中了。

    结果:

     a) 打开 128、129 的 UI 界面查看

     从上图可以看到 两个 client 都加进来了。

     三. 服务注册与发现

        本次为了方便,直接在 128、130 上编写 服务的 json文件,用于 服务发现,通常情况下 服务程序会集成 consul SDK 或者使用 spring boot consul 自动注册到 所属服务器上 的consul client上。

    1、web 服务定义的json文件内容如下:

    {
      "service": {
        "name": "web",
        "tags": [
          "rails"
        ],
        "port": 80
      }
    }

    2、将 1 中定义的 web 服务json 文件放到 consul  client 的 conf 目录下(即认为是默认注册的服务)。

    3、使用如下命令,重新加载客户端的配置。

       cd /opt/consul/client

       bin/consul reload

    4、结果(查看是否注册到 consul server 集群上)

     128、130 的 consul client 日志上都可以看到输出内容,表示注册成功。

     打开 128、129 的 consul server ui 页面,均可以注册的服务

     5、问题

    问题现象:在进行 reload 的时候,发现 130 服务器 的reload 失败,而 128 上一直是consul  server 在输出 reload 的相关日志

    原因:130128 的 consul client 配置均修改了 httpserf_lanserf_wandns 端口,而 reload 时默认就请求发送到了8500上。

     解决办法:reload 时增加 -http-addr ,指定请求url

  • 相关阅读:
    maven
    ELK
    gitlab 升级
    平安工作流程
    平安云应用场景
    nginx基于uwsgi部署Django (单机搭建)
    ansible
    nginx理论
    GIT
    docker(三)
  • 原文地址:https://www.cnblogs.com/sandyflower/p/13194974.html
Copyright © 2011-2022 走看看