Consul初识及Consul 集群部署

一、构建consul集群

1、加载已经打包好的consul镜像
  1. docker load < consul1.4.tar

https://pan.baidu.com/s/17ClMNQkMCCZ4uVNmqW5s2Q 密码: pltb

 

2、构建consul集群服务

consul的集群构建一般来说建议采用奇数个数(consul集群个数为3,5,7),然后就可以启动集群了,这里启动 5 个 Consul Agent,3 个 Server(会选举出一个 Leader),2 个 Client。

创建并编写 docker-compose.yaml:

  1. version: "3.6" # 确定docker-composer文件的版本
  2. services: # 代表一组服务(简单来说一组容器)
  3. # server
  4. consul_master_server_170_30: # 这个表示服务的名称,可自定义; 注意不是容器名称
  5. image: consul1.4 # 指定容器的镜像文件
  6. ports: # 配置容器与宿主机的端口
  7. - "8500:8500"
  8. networks: # 引入外部预先定义的网段
  9. consul:
  10. ipv4_address: 170.200.7.30 #设置ip地址
  11. container_name: consul_master_server_170_30 # 这是容器的名称
  12. command: ./consul agent -server -bootstrap-expect 3 -data-dir /tmp/consul -node=consul_master_server_170_30 -bind=170.200.7.30 -ui -client=0.0.0.0
  13. consul_slaves_server_170_10:
  14. image: consul1.4
  15. ports:
  16. - "8510:8500"
  17. networks:
  18. consul:
  19. ipv4_address: 170.200.7.10
  20. container_name: consul_slaves_server_170_10
  21. command: ./consul agent -server -data-dir /tmp/consul -node=consul_slaves_server_170_10 -bind=170.200.7.10 -ui -client=0.0.0.0 -join 170.200.7.30
  22. consul_slaves_server_170_20:
  23. image: consul1.4
  24. ports:
  25. - "8520:8500"
  26. networks:
  27. consul:
  28. ipv4_address: 170.200.7.20
  29. container_name: consul_slaves_server_170_20
  30. command: ./consul agent -server -data-dir /tmp/consul -node=consul_slaves_server_170_20 -bind=170.200.7.20 -ui -client=0.0.0.0 -join 170.200.7.30
  31. # client
  32. consul_client_170_40:
  33. image: consul1.4
  34. ports:
  35. - "8540:8500"
  36. networks:
  37. consul:
  38. ipv4_address: 170.200.7.40
  39. container_name: consul_client_170_40
  40. command: ./consul agent -data-dir /tmp/consul -node=consul_client_170_40 -bind=170.200.7.40 -ui -client=0.0.0.0 -join 170.200.7.30
  41. consul_client_170_50:
  42. image: consul1.4
  43. ports:
  44. - "8550:8500"
  45. networks:
  46. consul:
  47. ipv4_address: 170.200.7.50
  48. container_name: consul_client_170_50
  49. command: ./consul agent -data-dir /tmp/consul -node=consul_client_170_50 -bind=170.200.7.50 -ui -client=0.0.0.0 -join 170.200.7.30
  50. # 设置自定义网络
  51. networks:
  52. consul:
  53. driver: bridge
  54. ipam:
  55. config:
  56. - subnet: "170.200.7.0/24"

 

3、启动集群

在上面编写的docker-compose.yaml 文件所在文件夹执行命令 docker-compose up -d

注:使用docker ps -a 查看容器启动情况,如果有非up状态的容器,重新执行一遍docker-compose up -d即可

关闭集群:

  1. docker-compose down

 

4、查看consul集群状态

(1)进入主consul

  1. docker exec -it consul_master_server_170_30 sh

(2)查看集群状态

  1. ./consul operator raft list-peers

可以看到,生成了1台leader和2台follower

(3)浏览器访问consul ui 界面,就可以看到consul集群的ui界面了

  1. http://localhost:8500

 

二、关于Consul的一些重要说明

1、Consul集群工作原则

Consul是一个分布式的解决方案,可以部署多个Consul实例,以确保数据中心的持续稳定。

在Consul集群中,内部采用投票的方式选举出leader,然后才开始运行整个集群,只有正确选举出leader后,集群才开始工作。

 

2、服务注册到Consul后到被发现过程中需要知道的

当一个服务注册到Consul后,集群将该服务进行同步,确保Consul集群中的每个节点都存储了该服务的信息;

然后Consul集群将对该服务进行健康检查和投票,超过半数通过,将认为该服务正常(或者异常);

一旦被投票认为异常的服务,该服务将不会被外部发现(不可访问);

在此过程中,Consul将持续对异常的服务进行检查,一旦服务恢复,Consul将立马将其加入正常服务。

 

 3、Consul的两种运行方式

 
 Consul支持两种运行方式,分别是server和client模式。
 
 当一个Consul节点以server模式运行时,就表示该Consul节点会存储服务和配置等相关信息,并且参与到健康检查、leader选举等服务事件中
 
 当一个Consul节点以client模式运行时,不会存储服务信息,但会把这些信息转发到server。

 

 4、数据中心

 Consul支持多数据中心,他们通过Internet互联。

 同时请注意,为了提高通信效率,只有server节点才加入跨数据中心的通信。

 在单个数据中心中,Consul分为server和client两种节点,server节点保存数据,client节点负责健康检查以及转发数据请求到server。

 

5、server节点

server节点有一个leader和多个follower,leader节点会将数据同步到follower,server的数量推荐是奇数个(3、5、7),在leader挂掉的时候会启动选举机制产生一个新的leader。

 

6、Consul集群内的成员关系维护

Consul集群内的节点通过gossip(流言协议)维护成员关系,也就是说某个节点了解集群内现在还有哪些节点,这些节点是server还是client。

单个数据中心的流言协议同时使用TCP和UDP通信,使用端口为8301.

跨数据中心的流言协议同时使用TCP和UDP通信,使用端口为8302.

 

7、读写请求

集群内的数据的读写请求既可以直接发到server,也可以通过client使用RPC转发到server,请求最终会到达leader节点。

在允许数据轻微陈旧的情况下,读请求也可以直接发送到普通的server节点,集群内数据的读写和复制都是通过TCP的8300端口完成。

 

三、Consul 服务发现原理

首先需要有一个正常工作的Consul集群,有server,也有leader。

假设他们选举了 Server2 上的 Consul Server 节点为 Leader。

然后在服务器 Server4 和 Server5 上通过 Consul Client 分别注册 Service A、B、C。

服务注册到 Consul 可以通过 HTTP API(8500 端口)的方式,也可以通过 Consul 配置文件的方式。

Consul Client 将注册信息通过 RPC 转发到 Consul Server,服务信息保存在 Server 的各个节点中,并且通过 Raft 实现了强一致性。

最后在服务器 Server6 中,service D 需要访问 Service B,这时候 service D 首先访问本机 Consul Client 提供的 HTTP API, Client 会将请求转发到 Consul
Server。

Consul Server 查询到 Service B 当前的信息返回,最终 service D 拿到了 Service B 的所有部署的 IP 和端口,然后就可以选择 Service B 的其中一个部署并向其发
起请求了。

 

 



Top