consul: 集群搭建和数据中心通信

发布于:2024-04-06 ⋅ 阅读:(145) ⋅ 点赞:(0)

基于 docker-compose.yml 搭建


1 )docker-compose.yml 的配置

version: '3'
services:
  server1:
    image: consul:latest
    command: "agent -server -config-file=/consul/config/consul.json -node=consul-server1 -bootstrap-expect=5"
    volumes:
      - ./data/server1:/consul/data
      - ./config:/consul/config
    networks:
      - light_network
  server2:
    image: consul:latest
    command: "agent -server -config-file=/consul/config/consul.json -node=consul-server2 -join=server1"
    volumes:
      - ./data/server2:/consul/data
      - ./config:/consul/config
    depends_on:
      - server1
    networks:
      - light_network
  server3:
    image: consul:latest
    command: "agent -server -config-file=/consul/config/consul.json -node=consul-server3 -join=server1"
    volumes:
      - ./data/server3:/consul/data
      - ./config:/consul/config
    depends_on:
      - server1
    networks:
      - light_network
  server4:
    image: consul:latest
    command: "agent -server -config-file=/consul/config/consul.json -node=consul-server4 -join=server1"
    volumes:
      - ./data/server4:/consul/data
      - ./config:/consul/config
    depends_on:
      - server1
    networks:
      - light_network
  server5:
    image: consul:latest
    command: "agent -server -config-file=/consul/config/consul.json -node=consul-server5 -join=server1"
    volumes:
      - ./data/server5:/consul/data
      - ./config:/consul/config
    depends_on:
      - server1
    networks:
      - light_network
  client1:
      image: consul:latest
      command: "agent -config-file=/consul/config/consul.json -node=consul-client1 -join=server1"
      volumes:
       - ./data/client1:/consul/data
       - ./config:/consul/config
      depends_on:
        - server1
        - server2
        - server3
        - server4
        - server5
      networks:
        - light_network
  client2:
      image: consul:latest
      command: "agent -config-file=/consul/config/consul.json -node=consul-client2 -join=server1"
      volumes:
        - ./data/client2:/consul/data
        - ./config:/consul/config
      depends_on:
        - server1
        - server2
        - server3
        - server4
        - server5
      networks:
        - light_network

networks:
  light_network:
    external: true
  • 这里是简洁版的,最快搭建方式,这里创建了5台服务器,2台客户端
  • 这里挂载了consul 的数据,暂且忽略日志的配置,给consul 配置意义不是很大
  • 相关data目录的创建,可以再 server1 下使用命令来创建,这里省略了配置
  • 之后,2台客户端可以在nginx上配置一个负载均衡来提供一个统一的地址
  • 这里不暴露接口,是因为假设有一个nginx集群也在网络之内,基于nginx来暴露
  • 这里共用配置文件,但数据文件,每个都独立
  • 网络也是,基于 light_network,也是提前创建的,这里不再赘述

2 )consul.json

{  
  "datacenter": "x-project-dc1",
  "data_dir": "/consul/data",
  "log_level": "INFO",
  "client_addr": "0.0.0.0",
  "bind_addr": "0.0.0.0",
  "ui": true
}
  • 这里定义了 datacenter, 定义了服务端和客户端通用的配置
  • 不同的配置,都写在 command 配置中
  • 注意,服务端和客户端使用同一个 datacenter,否则将会出现错误

3 )运行起来并查看

  • $ docker compose up -d
  • $ docker compose ps -a
  • 如果 之前在同一个网络,或已打通的网络中已经配置了 两个客户端的nginx代理负载,假设暴露的是 8500
  • 那么访问 localhost:8500 即可访问
  • 这时候,单个的数据中心已经搭建完毕
  • 其他配置方案,不再举例,最终达成目的即可

4 )查看具体成员信息

  • docker exec -it consul-client1-1 consul members

    Node            Address          Status  Type    Build   Protocol  DC             Partition  Segment
    consul-server1  172.28.0.2:8301  alive   server  1.11.1  2         x-project-dc1  default    <all>
    consul-server2  172.28.0.3:8301  alive   server  1.11.1  2         x-project-dc1  default    <all>
    consul-server3  172.28.0.5:8301  alive   server  1.11.1  2         x-project-dc1  default    <all>
    consul-server4  172.28.0.4:8301  alive   server  1.11.1  2         x-project-dc1  default    <all>
    consul-server5  172.28.0.6:8301  alive   server  1.11.1  2         x-project-dc1  default    <all>
    consul-client1  172.28.0.7:8301  alive   client  1.11.1  2         x-project-dc1  default    <default>
    consul-client2  172.28.0.8:8301  alive   client  1.11.1  2         x-project-dc1  default    <default>
    
  • 这时候,可以看到 5台 server, 2台 client

5 )源码地址

多数据中心配置


1 ) 概述

  • 为了实现跨数据中心的通信和复制,您需要配置Consul的WAN Gossip层

  • 这通常涉及到设置gossip_wan相关的配置项

  • 然而,在单机部署的场景下,通常不需要显式配置WAN Gossip层

  • 因为每个数据中心内部只有一个Consul服务器节点

  • 但如果您计划将来扩展集群或连接多个数据中心,则需要配置WAN Gossip层

  • 对于当前的两台机器和单机部署的场景,每台机器上的Consul实例已经是其数据中心内的唯一服务器节点,因此它们不会通过WAN Gossip层进行通信

  • 但如果未来您想要连接这两个数据中心,您需要在每个Consul的配置文件中添加WAN Gossip相关的配置

  • 例如指定WAN Gossip的地址列表(gossip_wan)和WAN Gossip的端口(默认为8302)

  • 如果您将来想要连接dc1和dc2,您可能需要 dc1 的 server.json 中添加类似以下的配置

    "gossip_wan": {  
      "address": "机器A的WAN IP地址",  
      "port": 8302  
    },  
    "retry_join_wan": ["机器B的WAN IP地址"]
    
  • 同样的,并在 dc2 的 server.json 中添加指向dc1的配置,这里不再赘述

  • 注意,上述配置中的“WAN IP地址”指的是机器在广域网中可访问的IP地址

  • 在实际环境中,您需要根据网络架构和安全性要求来配置这些地址

2 )关于 server.json 与 client.json 中的多数据中心配置

  • 在多数据中心的Consul配置中,client和server的配置会有所不同,具体取决于它们在架构中的角色和功能。

  • 对于server节点,配置gossip_wan和retry_join_wan通常是必要的。

    • gossip_wan用于配置WAN(广域网)Gossip池,这是跨数据中心之间通信的关键部分
    • 它确保数据中心之间的Consul服务器能够相互发现和通信。retry_join_wan则用于指定在WAN环境中尝试加入的Consul服务器地址列表,以及在首次尝试失败时进行重试
  • 然而,对于client节点,情况可能有所不同

    • Client节点通常不需要跨数据中心通信,它们主要与本地数据中心的server节点通信
    • 因此,在大多数情况下,client节点不需要配置gossip_wan和retry_join_wan
    • 它们主要关注与本地server节点的连接和注册服务
  • 注意,具体的配置取决于你的网络架构和需求

    • 在某些特殊情况下,你可能需要在client节点上启用某些跨数据中心的通信功能
    • 这时,你可能需要相应地配置gossip_wan和retry_join_wan
  • 总之,是否需要在client和server上配置gossip_wan和retry_join_wan取决于你的具体需求和架构

  • 在大多数情况下,server节点需要这些配置来确保跨数据中心的通信,而client节点则主要关注与本地server节点的通信

3 ) 具体配置示例

{
  "datacenter": "my-datacenter",
  "data_dir": "/consul/data",
  "log_level": "INFO",
  "node_meta": {
    "role": "production"
  },
  "server": true
  "ui": true,
  "telemetry": {  
    "prometheus_retention_time": "30d",  
    "disable_hostname": true  
  },  
  "gossip_config": {  
    "name": "wan",  
    "bind": "0.0.0.0",  
    "port": 8302,  
    "probe_interval": "10s",  
    "probe_timeout": "5s",  
    "suspicion_mult": 7,  
    "gossip_interval": "1s",  
    "udp_flood_interval": "100ms",  
    "encrypt": "", // 这里可以放置gossip的加密密钥,如果启用了加密的话  
    "tls": {  
      "enabled": false,  
      "ca_file": "",  
      "ca_path": "",  
      "cert_file": "",  
      "key_file": "",  
      "verify_incoming": false,  
      "verify_outgoing": false  
    }  
  },  
  "retry_join_wan": [  
    "provider=aws tag_key=ConsulCluster tag_value=production",  
    "192.168.1.10",  
    "192.168.1.11",  
    "192.168.1.12"  
  ],  
  "retry_interval_wan": "30s",  
  "retry_max_wan": 3  
}
  • 上述示例仅供参考,随着 consul 架构升级,可能一些配置会失效
  • 如果需要区分客户端和服务端的配置,可以使用环境变量配置,具体不再赘述

网站公告

今日签到

点亮在社区的每一天
去签到