Consul 是一套开源的分布式服务发现和配置管理系统,由 HashiCorp 公司用 Go 语言开发。它具有很多优点。包括:基于 raft 协议,比较简洁; 支持健康检查, 同时支持 HTTP 和 DNS 协议 支持跨数据中心的 WAN(广域网) 集群 提供图形界面 跨平台,支持 Linux、Mac、Windows。
consul是使用go语言开发的服务发现、配置管理中心服务。内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等)。服务部署简单,只有一个可运行的二进制的包。每个节点都需要运行agent,他有两种运行模式server和client。每个数据中心官方建议需要3或5个server节点以保证数据安全,同时保证server-leader的选举能够正确的进行。
@client
CLIENT表示consul的client模式,就是客户端模式。是consul节点的一种模式,这种模式下,所有注册到当前节点的服务会被转发到SERVER,本身是不持久化这些信息。
@server
SERVER表示consul的server模式,表明这个consul是个server,这种模式下,功能和CLIENT都一样,唯一不同的是,它会把所有的信息持久化的本地,这样遇到故障,信息是可以被保留的。
@server-leader
中间那个SERVER下面有LEADER的字眼,表明这个SERVER是它们的老大,它和其它SERVER不一样的一点是,它需要负责同步注册的信息给其它的SERVER,同时也要负责各个节点的健康监测。
@raft(分布式一致性协议)
server节点之间的数据一致性保证,一致性协议使用的是raft,而zookeeper用的paxos,etcd采用的也是raft。
@服务发现协议
consul采用http和dns协议,etcd只支持http
@服务注册
consul支持两种方式实现服务注册,一种是通过consul的服务注册http API,由服务自己调用API实现注册,另一种方式是通过json个是的配置文件实现注册,将需要注册的服务以json格式的配置文件给出。consul官方建议使用第二种方式。
@服务发现
consul支持两种方式实现服务发现,一种是通过http API来查询有哪些服务,另外一种是通过consul agent 自带的DNS(8600端口),域名是以NAME.service.consul的形式给出,NAME即在定义的服务配置文件中,服务的名称。DNS方式可以通过check的方式检查服务。
@服务间的通信协议
Consul使用gossip协议管理成员关系、广播消息到整个集群,他有两个gossip pool(LAN pool和WAN pool),LAN pool是同一个数据中心内部通信的,WAN pool是多个数据中心通信的,LAN pool有多个,WAN pool只有一个。
在描述架构之前,这里提供了一些术语来帮助声明正在探讨的东西:
Consul Architecture 架构图
拆解开这个体系,从每一个组件开始了解。首先,可以看到有两个数据中心,分别标记为“one”和“two”。Consul是支持多数据中心一流,并且是常用业务场景。
每个数据中心都是由Server和client组成。建议有3~5 Server——基于故障处理和性能的平衡之策。如果增加越多的机器,则Consensus会越来越慢。对client没有限制,可以很容易地扩展到成千上万或数万。
同一个数据中心的所有节点都要加入Gossip协议。这意味着gossip pool包含给定数据中心的所有节点。有以下目的:首先,没有必要为client配置服务器地址参数;发现是自动完成的。第二,节点故障检测的工作不是放置在服务器上,而是分布式的。这使故障检测比心跳机制更可扩展性。第三,可用来作为消息层通知重要的事件,如leader选举。
每个数据中心的服务器都是属于一个Raft peer。这意味着,他们一起工作,选出一个的Leader,Leader server是有额外的职责。负责处理所有的查询和事务。事务也必须通过Consensus协议复制到所有的伙伴。由于这一要求,当非Leader Server接收到一个RPC请求,会转发到集群的leader。
Server节点也是作为WAN gossip pool的一部分。这个pool是与LAN gossip pool是不同的,它为具有更高延迟的网络响应做了优化,并且可能包括其他consul集群的server节点。设计WANpool的目的是让数据中心能够以low-touch的方式发现彼此。将一个新的数据中心加入现有的WAN Gossip是很容易的。因为池中的所有Server都是可控制的,这也使跨数据中心的要求。当一个Serfer接收到不同的数据中心的要求时,它把这个请求转发给相应数据中心的任一Server。然后,接收到请求的Server可能会转发给Leader。
多个数据中心之间是低耦合,但由于故障检测、连接缓存复用、跨数据中心要求快速和可靠的响应。
1 使用docker下载consul镜像,默认下载最consul最新版本,目前版本号为1.4.0,如果需要其他版本请登录https://hub.docker.com/进行搜索
2 下载完毕后分别创建/home/docker/consul、consul-server1-data、consul-server2-data、consul-server3-data、consul-client-data、consul-server1-conf、consul-server2-conf、consul-server3-conf、consul-client-conf这九个文件夹
[root@docker-02 ~]# cd /home/ [root@docker-02 home]# mkdir docker [root@docker-02 home]# cd docker [root@docker-02 docker]# mkdir consul [root@docker-02 docker]# cd consul [root@docker-02 consul]# mkdir consul-server1-data consul-server2-data consul-server3-data consul-client-data consul-server1-conf consul-server2-conf consul-server3-conf consul-client-conf
[root@docker-02 consul]# cd consul-server1-conf/ [root@docker-02 consul-server1-conf]# touch consul-server1.json
3.2.2 vi编辑consul-server1.json配置文件,复制下列代码
[root@docker-02 consul-server1-conf]# cat consul-server1.json { "datacenter": "DC1", "data_dir": "/consul/data", "log_level": "INFO", "node_name": "consul-server1", "server": true, "bootstrap_expect": 1, "retry_join": ["172.17.0.2","172.17.0.3","172.17.0.4","172.17.0.5","172.17.0.6","172.17.0.7","172.17.0.8","172.17.0.9"], "retry_interval": "3s", "enable_debug": false, "rejoin_after_leave": true, "enable_syslog": false }
3.3 创建consul-server2节点服务配置文件
3.3.1 进入consul-server2-conf文件夹创建consul-server2.json文件
[root@docker-02 consul-server1-conf]# cd .. [root@docker-02 consul]# cd consul-server2-conf/
3.3.2 vi编辑consul-server2.json配置文件,复制下列代码
[root@docker-02 consul-server2-conf]# cat consul-server2.json { "datacenter": "DC1", "data_dir": "/consul/data", "log_level": "INFO", "node_name": "consul-server2", "server": true, "bootstrap_expect": 2, "retry_join": ["172.17.0.2","172.17.0.3","172.17.0.4","172.17.0.5","172.17.0.6","172.17.0.7","172.17.0.8","172.17.0.9"], "retry_interval": "3s", "enable_debug": false, "rejoin_after_leave": true, "enable_syslog": false }
3.4 创建consul-server3节点服务配置文件
3.4.1 进入consul-server3-conf文件夹创建consul-server3.json文件
[root@docker-02 consul-server2-conf]# cd ../consul-server3-conf/ [root@docker-02 consul-server3-conf]# vi consul-server3.json
3.4.2 vi编辑consul-server3.json配置文件,复制下列代码
[root@docker-02 consul-server3-conf]# cat consul-server3.json { "datacenter": "DC1", "data_dir": "/consul/data", "log_level": "INFO", "node_name": "consul-server3", "server": true, "bootstrap_expect": 2, "retry_join": ["172.17.0.2","172.17.0.3","172.17.0.4","172.17.0.5","172.17.0.6","172.17.0.7","172.17.0.8","172.17.0.9"], "retry_interval": "3s", "enable_debug": false, "rejoin_after_leave": true, "enable_syslog": false }
3.4 创建consul-client节点服务配置文件
3.4.1 进入consul-client-conf文件夹创建consul-client.json文件
[root@docker-02 consul-server3-conf]# cd ../consul-client-conf/ [root@docker-02 consul-client-conf]# touch consul-client.json
3.4.2 vi编辑consul-client.json配置文件,复制下列代码
[root@docker-02 consul-client-conf]# vi consul-client.json { "datacenter": "DC1", "data_dir": "/consul/data", "log_level": "INFO", "node_name": "consul-client", "server": false, "ui": true, "bootstrap_expect": 0, "bind_addr": "192.168.43.234", "client_addr": "192.168.43.234", "retry_join": ["172.17.0.2","172.17.0.3","172.17.0.4","172.17.0.5","172.17.0.6","172.17.0.7","172.17.0.8","172.17.0.9"], "retry_interval": "3s", "enable_debug": false, "rejoin_after_leave": true, "enable_syslog": false }
[root@docker-02 consul-client-conf]# docker run -d --name consul-server1 --restart=always -v /home/docker/consul/consul-server1-data:/consul/data -v /home/docker/consul/consul-server1-conf:/consul/config consul agent -data-dir /consul/data -config-dir /consul/config Unable to find image ‘consul:latest‘ locally latest: Pulling from library/consul e7c96db7181b: Pull complete 06ba64850324: Pull complete e2cfcbd06e76: Pull complete 211aae54ca69: Pull complete 1f22c1b42a0a: Pull complete 028c01a3f1b3: Pull complete Digest: sha256:a167e7222c84687c3e7f392f13b23d9f391cac80b6b839052e58617dab714805 Status: Downloaded newer image for consul:latest a0d30329efbf677e0924ec0a4f6ab79ac0e12187a8fcc91acbff363efd0f840c [root@docker-02 consul-client-conf]# docker run -d --name consul-server2 --restart=always -v /home/docker/consul/consul-server2-data:/consul/data -v /home/docker/consul/consul-server2-conf:/consul/config consul agent -data-dir /consul/data -config-dir /consul/config 8b95ae0306473272a6e25329067c991c0a3f455121b74f2f189d46363f03b6b5 [root@docker-02 consul-client-conf]# docker run -d --name consul-server3 --restart=always -v /home/docker/consul/consul-server3-data:/consul/data -v /home/docker/consul/consul-server3-conf:/consul/config consul agent -data-dir /consul/data -config-dir /consul/config 4eb530c9c155b4e361e4a002ccf521dc51baf72ef46a5be15b963e1efec3d420 [root@docker-02 consul-client-conf]# docker run -d --net=host --name consul-client --restart=always -p 8400:8400 -p 8500:8500 -p 8600:53/udp -v /home/docker/consul/consul-client-data:/consul/data -v /home/docker/consul/consul-client-conf:/consul/config consul agent -data-dir /consul/data -config-dir /consul/config WARNING: Published ports are discarded when using host network mode 6b0180f50dec54f0a83902c8335ddb18d0719b806dd9c42a04bd641885232186
原文:https://www.cnblogs.com/liujunjun/p/12221736.html