微服务学习记录(一)—— Consul最小化集群搭建
介绍
功能介绍
Consul
一款服务发现和配置的工具。其使用Golang实现,天然具备可移植性,安装包仅有一个可执行文件,部署方便,可与docker等轻量级容器无缝配合。 它提供了几个关键功能:
- 服务发现:Consul client 可以提供服务,例如api或mysql,也可以使用Consul client来发现指定服务的提供者。 使用DNS或HTTP,应用程序可以轻松找到他们所依赖的服务。
- 健康检查:Consul client 可以提供任何数量的健康检查,或者与给定的服务(“Web服务器是否返回200 OK”),或与本地节点(“内存利用率是否低于90%”)相关联。 可以使用此信息来监控集群运行状况,服务发现组件使用此信息将流量从有问题的主机中移除出去。
- KV Store:应用程序可以使用Consul的分层键/值存储,包括动态配置,功能标记,协调,leader选举等等。 简单的HTTP API使其易于使用。
- 多数据中心:Consul支持多个数据中心。 这意味着Consul的用户不必担心构建额外的抽象层以扩展到多个区域。
竞品比较
功能 | Consul | zookeeper | etcd | euerka |
---|---|---|---|---|
Health Check | 服务状态,内存,硬盘等 | 长连接,keepalive | 连接心跳 | 可配支持 |
Data Center | √ | × | × | × |
KV Store | √ | √ | √ | × |
一致性 | raft | paxos | raft | × |
cap | ca | cp | cp | ap |
使用接口 | http,dns | 客户端 | http,grpc | http(didecar) |
watch | 全量/支持long polling | √ | 支持long polling | 支持long polling/大部分增量 |
自身监控 | metrics | × | metrics | metrics |
安全 | acl/https | acl | https支持(弱) | × |
角色与架构
Agent
agent是一直运行在Consul集群中每个成员上的守护进程。通过运行 consul agent 来启动。agent可以运行在client或者server模式。指定节点作为client或者server是非常简单的,除非有其他agent实例。所有的agent都能运行DNS或者HTTP接口,并负责运行时检查和保持服务同步。
- Client
表示consul的client
模式,就是客户端模式。一个Client是一个转发所有RPC到server的代理。这个client是相对无状态的。client唯一执行的后台活动是加入LAN gossip池。这有一个最低的资源开销并且仅消耗少量的网络带宽。这种模式下,所有注册到当前节点的服务会被转发到SERVER,不持久化信息。 Server
表示consul的
server
模式,表明这个consul是个server。server是一个有一组扩展功能的代理,这些功能包括参与Raft选举,维护集群状态,响应RPC查询,与其他数据中心交互WAN gossip和转发查询给leader或者远程数据中心。它会把所有的信息持久化的本地,这样遇到故障,信息是可以被保留的。SERVER-LEADER
SERVER-LEADER是该DataCenter的Leader,它需要负责同步注册的信息给其它的SERVER,同时也要负责各个节点的健康监测。
DataCenter
虽然数据中心的定义是显而易见的,但是有一些细微的细节必须考虑。例如,在EC2中,多个可用区域被认为组成一个数据中心?我们定义数据中心为一个私有的,低延迟和高带宽的一个网络环境。这不包括访问公共网络,但是对于我们而言,同一个EC2中的多个可用区域可以被认为是一个数据中心的一部分。
Raft
Consul通过
Raft
来保证各节点的数据一致性。Consensus
在我们的文档中,我们使用Consensus来表明就leader选举和事务的顺序达成一致。由于这些事务都被应用到有限状态机上,Consensus暗示复制状态机的一致性。
Gossip
Consul建立在Serf的基础之上,它提供了一个用于多播目的的完整的gossip协议。Serf提供成员关系,故障检测和事件广播。Consul使用
gossip
协议管理成员关系、广播消息到整个集群,他有两个gossip pool(LAN
pool和WAN
pool),LAN pool
是同一个数据中心
内部通信的,WAN pool
是多个数据中心
通信的,LAN pool有多个,WAN pool只有一个。LAN Gossip
它包含所有位于同一个局域网或者数据中心的所有节点。
WAN Gossip
它只包含Server。这些server主要分布在不同的数据中心并且通常通过因特网或者广域网通信。
RPC
远程过程调用。这是一个允许client请求server的请求/响应机制。
服务注册
Consul支持两种方式实现服务注册,一种是通过consul的服务注册http API,由服务自己调用API实现注册,另一种方式是通过json个是的配置文件实现注册,将需要注册的服务以json格式的配置文件给出。官方建议使用第二种方式。
服务发现
consul支持两种方式实现服务发现,一种是通过http API来查询有哪些服务,另外一种是通过consul agent 自带的DNS(8600端口),域名是以
NAME.service.consul
的形式给出,NAME即在定义的服务配置文件中,服务的名称。DNS方式可以通过check的方式检查服务。
注意
- 每个数据中心官方建议需要3或5个server节点以保证数据安全,同时保证server-leader的选举能够正确的进行。如果增加越多的机器,则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。
- 多个数据中心之间是低耦合,但由于故障检测、连接缓存复用、跨数据中心要求快速和可靠的响应。
搭建
使用VirtualBox虚拟机
首先应该下载好你所使用的的系统镜像,我比较熟悉CentOS,因此我下载了CentOS 7。
新建虚拟机
在新建虚拟机这里,我需要偷个懒,因为各个节点的环境都是一致的,而VirtualBox有个复制功能,因此我新建了个模板虚拟机,配置好基础环境,以后需要的时候就可以直接复制一台出来了。
修改网卡模式
如上图所示,我选择了桥接模式
,之所以是网卡3,是因为我之前分别用网卡1、网卡2尝试了NAT
和Host-Only Adapter
模式。
然后启动虚拟机,安装系统,配置好基础环境即可,如更换软件源
、系统更新
、安装必须软件
等。
安装必须软件
yum install -y wget
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum clean all
yum makecache
yum upgrade -y
yum update -y
yum install -y curl vim zip unzip yum-utils bash-completion screen net-tools
关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
复制节点
我需要5个节点,因此复制出了5台虚拟机。
需要注意的是,复制时MAC地址设定
请选择为所有网卡重新生成MAC地址
。
VirtualBox可使用无界面启动,启动后点击显示,打开虚拟机界面。
修改主机名
vim /ect/hostname // 修改主机名
reboot //修改成功后,重启生效
获取机器的Ip地址
// 需要安装 net-tools,需要使用ipconfig命令,如有,请略过
yum install -y net-tools
// 运行ipconfig,获取IP地址
ipconfig
安装screen
// 用于后台运行Consul,如有,请略过
yum install -y screen
安装Consul
// 在screen中使用Consul
screen
// 安装 Consul
wget https://releases.hashicorp.com/consul/1.3.0/consul_1.3.0_linux_amd64.zip && unzip consul_1.3.0_linux_amd64.zip
以上为每台机器都需要执行的共同操作。
分别运行Consul
./consul agent -server -ui -bootstrap-expect=2 -data-dir=/tmp/consul -node=consul-1 -client=0.0.0.0 -bind=192.168.3.189 -datacenter=dc1
./consul agent -server -ui -bootstrap-expect=2 -data-dir=/tmp/consul -node=consul-2 -client=0.0.0.0 -bind=192.168.3.190 -datacenter=dc1 -join 192.168.3.189
./consul agent -server -ui -bootstrap-expect=2 -data-dir=/tmp/consul -node=consul-3 -client=0.0.0.0 -bind=192.168.3.191 -datacenter=dc1 -join 192.168.3.189
./consul agent -bind 192.168.3.192 -client 192.168.3.194 -data-dir=/tmp/consul -node=Test.Client.DEV -join 192.168.3.189
./consul agent -bind 192.168.3.193 -client 192.168.3.196 -data-dir=/tmp/consul -node=Test.Client.PRD -join 192.168.3.189
Consul启动参数说明
启动参数 | 说明 |
---|---|
-advertise | 通知展现地址用来改变我们给集群中的其他节点展现的地址,一般情况下-bind地址就是展现地址 |
-bootstrap | 用来控制一个server是否在bootstrap模式,在一个datacenter中只能有一个server处于bootstrap模式,当一个server处于bootstrap模式时,可以自己选举为raft leader |
-bootstrap-expect | 在一个datacenter中期望提供的server节点数目,当该值提供的时候,consul一直等到达到指定sever数目的时候才会引导整个集群,该标记不能和bootstrap公用 |
-bind | 该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0 |
-client | consul绑定在哪个client地址上,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1 |
-config-file | 明确的指定要加载哪个配置文件 |
-config-dir | 配置文件目录,里面所有以.json结尾的文件都会被加载 |
-data-dir | 提供一个目录用来存放agent的状态,所有的agent允许都需要该目录,该目录必须是稳定的,系统重启后都继续存在 |
-dc | 该标记控制agent允许的datacenter的名称,默认是dc1 |
-encrypt | 指定secret key,使consul在通讯时进行加密,key可以通过consul keygen生成,同一个集群中的节点必须使用相同的key |
-join | 加入一个已经启动的agent的ip地址,可以多次指定多个agent的地址。如果consul不能加入任何指定的地址中,则agent会启动失败,默认agent启动时不会加入任何节点。 |
-retry-join | 和join类似,但是允许你在第一次失败后进行尝试 |
-retry-interval | 两次join之间的时间间隔,默认是30s |
-retry-max | 尝试重复join的次数,默认是0,也就是无限次尝试 |
-log-level | consul agent启动后显示的日志信息级别。默认是info,可选:trace、debug、info、warn、err |
-node | 节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名 |
-protocol | consul使用的协议版本 |
-rejoin | 使consul忽略先前的离开,在再次启动后仍旧尝试加入集群中 |
-server | 定义agent运行在server模式,每个集群至少有一个server,建议每个集群的server不要超过5个 |
-syslog | 开启系统日志功能,只在linux/osx上生效 |
-ui | 使用自带的ui |
-ui-dir | 提供存放web ui资源的路径,该目录必须是可读的 |
-pid-file | 提供一个路径来存放pid文件,可以使用该文件进行SIGINT/SIGHUP(关闭/更新)agent |
命令使用
查看所有Consul成员
./consul members
Node Address Status Type Build Protocol DC Segment
consul-1 192.168.3.189:8301 alive server 1.3.0 2 dc1 <all>
consul-2 192.168.3.190:8301 alive server 1.3.0 2 dc1 <all>
consul-3 192.168.3.191:8301 alive server 1.3.0 2 dc1 <all>
Test.Client.DEV 192.168.3.194:8301 alive client 1.3.0 2 dc1 <default>
Test.Client.PRD 192.168.3.196:8301 alive client 1.3.0 2 dc1 <default>
查看Consul成员类型
./consul operator raft list-peers
Node ID Address State Voter RaftProtocol
consul-1 b686d2b3-70eb-e4a4-fe4e-71059e0b4eb7 192.168.3.189:8300 leader true 3
consul-2 39a45ff0-b8c8-5b4c-ac54-8eb35f046a59 192.168.3.190:8300 follower true 3
consul-3 8450e6b7-30f0-92c2-d273-ccb9589272b7 192.168.3.191:8300 follower true 3
由上可知192.168.3.189
是现有集群的leader,那当现有的leader宕机后,会有什么措施呢?那我们就把189
重启下试试:
Node ID Address State Voter RaftProtocol
consul-1 b686d2b3-70eb-e4a4-fe4e-71059e0b4eb7 192.168.3.189:8300 follower true 3
consul-2 39a45ff0-b8c8-5b4c-ac54-8eb35f046a59 192.168.3.190:8300 follower true 3
consul-3 8450e6b7-30f0-92c2-d273-ccb9589272b7 192.168.3.191:8300 leader true 3
可以看到,leader已经变成了192.168.3.191
通过Web UI查看服务状态
访问任意一台 http://[server ip]:8500
都可以查看。如 http://192.168.3.189:8500
退出Consul
// 假设client地址是 192.168.3.189
// 使用 leave 优雅的通知集群
./consul leave -http-addr=192.168.3.189:8500
如果使用screen,则可以Ctrl+C
直接退出