Consul是一种分布式、高可用、支持水平扩展的服务注册与发现工具。包含的特性有:服务发现、健康检查、键值存储、多数据中心和服务管理页面等。
官方服务架构图:
图中包含两个Consul数据中心(即两个Consul集群)。数据中心1由多个SERVER和CLIENT组成,数据中心2由多个CLIENT组成。对于Consul集群而言,SERVER或CLIENT都是集群的一个节点,服务可注册到任意节点上,从而实现注册信息共享。
# CLIENT
表示consul的client模式,所有注册到当前节点的服务会被转发到SERVER,本身不持久化数据。其职责是健康检查、服务注册等,当服务数量特别庞大时,分别启动多个client可减少server压力。
# SERVER
表示consul的server模式,功能和CLIENT都一样,区别是它能把所有信息持久化到本地,遇到故障时,信息是可以被保留的。
# LEADER
图中中间SERVER带有LEADER标识,说明在多个SERVER中,其为老大。它负责各个节点的健康检查和同步注册信息给其他SERVER。
一、在docker中部署portainer
Portainer是Docker的图形化管理工具,由GO语言编写的,提供状态显示、应用模板快速部署、对于Docker(容器、镜像、网络、数据卷)的基本操作、日志显示、容器控制台等功能。
1)、docker search portainer命令查询最新的protainer镜像
2)、docker pull portainer/portainer 拉取镜像
3)、docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock \ -v /home/docker/portainer:/data \ --name portainer --restart=always portainer/portainer 运行镜像
4)、访问:http://ip:9000 ,首次登陆需要初测portainer用户
二、部署consul集群
1、docker search consul 查询consul镜像
2、docker pull consul 拉取consul镜像
3、docker run -d --name=consul1 -p 8500:8500 -e CONSUL_BIND_INTERFACE=eth0 --restart=always consul agent --server=true --bootstrap-expect=3 --client=0.0.0.0 -ui 运行第一个consul容器
4、通过portainer查看consul1的ip地址(或者docker inspect --format '{{ .NetworkSettings.IPAddress }}' consul1 ,consul1是对应的容器名称)来查看consul1的ip地址
5、docker run -d --name=consul2 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --client=0.0.0.0 --join 172.17.0.3 运行第二个consul容器
6、docker run -d --name=consul3 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --client=0.0.0.0 --join 172.17.0.3 运行第三个consul容器
7、docker run -d --name=consul4 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --client=0.0.0.0 --join 172.17.0.3 运行第四个consul容器
8、查看集群成员
通过portainer进入到容器,输入命令consul members 即可查看consul集群成员
9、查看投票状态
通过portainer进入到容器,输入命令consul operator raft list-peers即可查看节点选举投票结果
10、访问 http://localhsot:8500 访问consul,即可发现:
其中,带leader标识的节点即为服务的老大,由它将数据同步到各个service上
三、配置参数说明
-bootstrap-expect
--配置数据中心中预期的SERVER的数量,当集群中启动的SERVER达到预期值时,Consul开始引导集群;
-bind
--内部集群通信绑定的地址,默认情况下是"0.0.0.0";
-client
--consul服务侦听地址,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1所以不对外提供服务,如果你要对外提供服务改成0.0.0.0;
-config-file
--服务启动时要加载的配置文件;
-config-dir
--配置文件目录;
-config-format
--指定要加载的配置文件的格式;
-data-dir
--数据目录;
-dev
--启用开发服务器模式。对于在关闭所有持久性选项的情况下快速启动consul代理非常有用,不适合生产使用,因为它不将任何数据写入磁盘;
-join
--启动时要加入到的另一位代理地址;
-retry-join
--加入失败后重试连接,对于明确可用地址的情况下很有用;
四、故障演示
此集群有4个节点,期望节点数是3,当其中一台server故障时,将自动选取新的leader,操作如下:
1、在停掉某一台服务之前,每个节点的状态如下:
2、将leader 节点停掉之后,将自动选取一个新的leader节点,如下图所示:
五、docker重启,如何将其他节点加入到集群
1、查看leader节点的ip地址
2、通过 consul join IP地址,使节点加入到集群
六、如何在window下启动consul server模式
1、下载consul,并解压到到文件
2、配置环境变量
3、新建data文件夹
4、运行命令 consul agent -server -bootstrap-expect 1 -data-dir=D:\consul\server1\data -node=consul1 -client=0.0.0.0 -bind=127.0.0.1 -ui
7、consul集群
1、准备三台服务器,分别是 s1:192.168.15.1、s2:192.168.15.2、s3:192.168.15.3
2、分别在三台服务器上执行以下命令
consul agent -server -bootstrap-expect 1 -data-dir=D:\consul\server1\data -node=consul1 -client=0.0.0.0 -bind=192.168.15.1 -ui
consul agent -server -bootstrap-expect 2 -data-dir=D:\consul\server1\data -node=consul1 -client=0.0.0.0 -bind=192.168.15.2 -ui
consul agent -server -bootstrap-expect 3 -data-dir=D:\consul\server1\data -node=consul1 -client=0.0.0.0 -bind=192.168.15.3 -ui
3、分别在s2,s3服务器上执行,consul -join 192.168.15.1
4、打开浏览器访问:http://ip:8500地址