文章目录
一、consul概述
Consul 是一个复杂的系统,它是HashiCorp公司的一个用于实现分布式系统的服务发现于配置工具,Consul内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,同时,Consul具有功能完善,部署简单,使用方便等特点
架构术语
- Agent:Agent是长期运行在每个consul集群成员节点上守护进程。通过命令consul agent启 动。Agent有client和server两种模式。由于每个节点都必须运行agent,所有节点要么是client要 么是server。所有的Agent都可以调用DNS或HTTPAPI,并负责检查和维护服务同步
- client:运行client模式的Agent,将所有的RPCs转发到Server。Client是相对无状态的。 Client唯一所做的是在后台参与LAN gossip pool。只消耗少量的资源,少量的网络带宽。
- Server:运行Server模式的Agent,参与Raft quorum,维护集群的状态,响应RPC查询,与 其他数据中心交互WAN gossip,转发查询到Leader或远程数据中心
- datacenter:数据中心,定义为:网络环境是私有,低延迟,高带宽的,排除和公网的通 信。但有一些细节需要注意,比如在AWS的EC2,多个可用性区域是否被认为组成了单一的数据 中心?而数据中心的定义不包括基于公共互联网环境,但是对于我们使用者而言,在同一个EC2 的多个可用性区域会被认为是一个的数据中心
- Consensus :consensus,意味着leader election协议,以及事务的顺序。由于这些事务是基 于一个有限状态机,consensus的定义意味着复制状态机的一致性。
- Gossip :consul是建立在Serf(去中心化服务发现和编排)之上,提供了完成的Gossip协议(下文会简单介绍此协议),用于成员维护故障检测、事件广播。
gossip是基于UDP协议实现随机的节点到节点的通信,主要是在UDP。 - LAN Gossip:指的是LAN gossip pool,包含位于同一个局域网或者数据中心的节点。
- WAN Gossip:指的是WANgossip pool,只包含server节点,这些server主要分布在不同的数 据中心或者通信是基于互联网或广域网的。
- RPC:远程过程调用。是允许client请求服务器的请求/响应机制。
Consul的使用场景
Consul的应用场景包括服务发现、服务隔离、服务配置
比如:docker实例的注册与配置共享、coreos实例的注册与配置共享、vitess集群、SaaS应用的配置共享、Consul与confd服务集成,动态生成nginx和haproxy配置文件或者Consul结合nginx构建高可用可扩展的Web服务。
二、consul环境搭建
1.server(192.168.220.110)部署
[root@localhost ~] # mkdir consul
[root@localhost ~] # cd consul/
[root@localhost ~/consul] # rz -E
rz waiting to receive. ## 这里将安装包拖入consul目录下
[root@localhost ~/consul] # ls
consul_0.9.2_linux_amd64.zip
[root@localhost ~/consul] # unzip consul_0.9.2_linux_amd64.zip
Archive: consul_0.9.2_linux_amd64.zip
inflating: consul
[root@localhost ~/consul] # ls
consul consul_0.9.2_linux_amd64.zip
[root@localhost ~/consul] # mv consul /usr/bin
[root@localhost ~/consul] # consul agent \
> -server \
> -bootstrap \
> -ui \
> -data-dir=/var/lib/consul-data \
> -bind=192.168.220.110 \
> -client=0.0.0.0 \
> -nade=consul-server01 &> /var/log/consul.log &
[1] 75549
[root@localhost ~/consul] # consul members
Node Address Status Type Build Protocol DC
consul-server01 192.168.220.110:8301 alive server 0.9.2 2 dc1
[root@localhost ~/consul] # consul info | grep leader
leader = true
leader_addr = 192.168.220.110:8300
curl 127.0.0.1:8500/v1/status/peers //查看集群server成员
curl 127.0.0.1:8500/v1/status/leader //集群Raf leader
curl 127.0.0.1:8500/v1/catalog/services //注册的所有服务
curl 127.0.0.1:8500/v1/catalog/nginx //查看nginx服务信息
curl 127.0.0.1:8500/v1/catalog/nodes //集群节点详细信息
netstat -natp |grep consul
这5个端口的作用:
8300:集群内数据的读写和复制
8301:单个数据中心gossip协议通讯
8302:跨数据中心gossip协议通讯
8500:提供获取服务列表、注册服务、注销服务等HTTP接口;提供UI服务
8600:采用DNS协议提供服务发现功能
2.client部署(192.168.220.120)
docker run -d \
--name=registrator \
--net=host \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart=always \
gliderlabs/registrator:latest \
-ip=192.168.220.120 \
consul://192.168.220.110:8500
[root@ppp ~] # docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
gliderlabs/registrator latest 3b59190c6c80 4 years ago 23.8MB
[root@ppp ~] # docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
39c380b4b512 gliderlabs/registrator:latest "/bin/registrator -i…" 22 seconds ago Up 21 seconds registrator
systemctl restart docker
docker run -itd -p:81:80 --name pyy01 -h pyy01 nginx
docker run -itd -p:82:80 --name pyy02 -h pyy02 nginx
docker run -itd -p:83:80 --name pyy03 -h pyy03 httpd
docker run -itd -p:84:80 --name pyy04 -h pyy04 httpd
此时访问浏览器
http://192.168.220.110:8500
3.配置template模板自动更新
- Consul-Template是一个守护进程,用于实时查询Consul集群信息,并更新文件系统上任意数量的指定模板,生成配置文件,更新完成以后,可以查询Consul中的服务目录,Key、Key-values等。
server 192.168.220.110
vim nginx.ctmpl
upstream http_backend {
{{range service "nginx"}}
server {{.Address}}:{{.Port}};
{{end}}
}
server {
listen 100;
server_name localhost 192.168.220.110;
access_log /var/log/nginx/pyy.com-access.log;
index index.html index.php;
location / {
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Client-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://http_backend;
}
}
yum -y install gcc pcre-devel zlib-devel
这里将Nginx安装包拖入终端
tar zxvf nginx-1.12.0.tar.gz -C /opt
cd /opt/nginx-1.12.0/
./configure --prefix=/usr/local/nginx
make && make install
vim /usr/local/nginx/conf/nginx.conf
##19行插入 include vhost/*.conf;
cd /usr/local/nginx/conf/
mkdir vhost
mkdir /var/log/nginx
/usr/local/nginx/sbin/nginx
cd /opt
拖入安装包 consul-template_0.19.3_linux_amd64.zip
unzip consul-template_0.19.3_linux_amd64.zip
mv consul-template /usr/bin
consul-template -consul-addr 192.168.220.110:8500 -template "/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/pyy.conf:/usr/local/nginx/sbin/nginx -s reload" --log-level=info
cat /usr/local/nginx/conf/vhost/pyy.conf
4.测试访问代理服务器以及多节点
浏览器查询192.168.220.110
http://192.168.220.110
docker logs -f pyy01
consul多节点
###添加一台有docker环境的服务器192.168.220.130加入已有的集群
consul agent \
-server \
--bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-bind=192.168.220.130 \
-client=0.0.0.0 \
-node=consul-server02 \
-enable-script-checks=true \
-datacenter=dc1 \
-join 192.168.220.130 &> /var/log/consul.log &
###############################################
--enable-script-ckecks=true:设置检查服务为可用
-datacenter:数据中心名称
-join:加入到已有的集群中