Consul 是一个支持多数据中心分布式高可用的 服务发现 和 配置共享 的服务软件,由 HashiCorp 公司用 Go 语言开发,基于 Mozilla Public License 2.0 的协议进行开源。
也可以说 Consul 是一个分布式、高可用的系统,用于实现分布式系统的服务发现与配置。
它有多个组件,提供如下几个关键功能:
① Client
② Server
③ Server-leader
④ Agent
注意:
1.consul 使用 Raft 算法来保证一致性,比复杂的 Paxos 算法更直接。
相比较而言,zookeeper 采用的是 Paxos,而 etcd使用的则是 Raft。
2.consul 支持 多数据中心,内外网的服务采用不同的端口进行监听。多数据中心集群可以避免单数据中心的单点故障,而其部署则需要考虑网络延迟,分片等情况等。
zookeeper 和 etcd 均不提供多数据中心功能的支持。
3.consul 支持 健康检查。 etcd 不提供此功能。
4.consul 支持 HTTP、DNS 和 GPRS 协议接口。 zookeeper 的集成较为复杂,etcd 只支持 http 协议。\
5.consul 官方提供 WEB管理界面,etcd 无此功能。
补充
端口 | 说明 |
---|---|
TCP/8300 | 8300端口用于服务器节点,客户端通过该端口RPC协议调用服务端节点 |
TCP/UDP/8301 | 8301端口用于单个数据中心所有节点之间的互相通信,即对LAN池信息的同步。它使得整个数据中心能够自动发现服务器地址,分布式检测节点故障,事件广播(如leader选举时间) |
TCP/UDP/8302 | 8302端口用于单个或多个数据中心之间的服务器节点的信息同步,即对WAN池信息的同步。它针对互联网的高延迟进行了优化,能够实现跨数据中心请求 |
8500 | 8500端口基于HTTP协议,用于API接口或 web UI 访问 |
8600 | 8600端口作为DNS服务器,它使得我们可以通过节点名查询节点信息 |
第一台centos 7 IP地址:192.168.140.22 (主节点)
需求的软件包:Docker-ce、Compose、Consul、Consul-template
第二台centos 7 IP地址:192.168.140.21 (nginx服务器)
需求的软件包:Docker-ce 、registrator
#下载compose
curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
设置环境变量
chmod 755 docker-compose
cp -p docker-compose /usr/local/bin/
docker-compose --version
[root@docker ~]# mkdir consul
[root@docker ~]# cd consul/
[root@docker consul]# rz -E //上传压缩包
rz waiting to receive.
[root@docker consul]# ls
consul_0.9.2_linux_amd64.zip
[root@docker consul]# unzip consul_0.9.2_linux_amd64.zip -d /usr/bin //解压到指定目录
Archive: consul_0.9.2_linux_amd64.zip
inflating: /usr/bin/consul
## 设置代理
[root@docker consul]# consul agent \
> -server \
> -bootstrap \
> -ui \
> -data-dir=/var/lib/consul-data \
> -bind=192.168.140.22 \
> -client=0.0.0.0 \
> -node=consul-server01 &> /var/log/consul.log &
[1] 114525
[root@docker consul]# jobs
[1]+ 运行中 consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=192.168.140.22 -client=0.0.0.0 -node=consul-server01 &>/var/log/consul.log &
[root@docker consul]# consul members //查看集群信息
Node Address Status Type Build Protocol DC
consul-server01 192.168.140.22:8301 alive server 0.9.2 2 dc1
[root@docker consul]# consul info | grep leader //查看管理信息
leader = true
leader_addr = 192.168.140.22:8300
curl 127.0.0.1:8500/v1/status/peers '/查看集群server成员'
curl 127.0.0.1:8500/v1/status/leaders '//查看集群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 '//集群节点详细信息'
[root@nginx ~]# docker run -d \
> --name=registrator \
> --net=host \
> -v /var/run/docker.sock:/tmp/docker.sock \
> --restart=always \
> gliderlabs/registrator:latest \
> -ip=192.168.140.21 \
> consul://192.168.140.22:8500
Unable to find image 'gliderlabs/registrator:latest' locally
latest: Pulling from gliderlabs/registrator
Image docker.io/gliderlabs/registrator:latest uses outdated schema1 manifest format. Please upgrade to a schema2 image for better future compatibility. More information at https://docs.docker.com/registry/spec/deprecated-schema-v1/
c87f684ee1c2: Pull complete
a0559c0b3676: Pull complete
a28552c49839: Pull complete
Digest: sha256:6e708681dd52e28f4f39d048ac75376c9a762c44b3d75b2824173f8364e52c10
Status: Downloaded newer image for gliderlabs/registrator:latest
4bf16763f7f0cbbe66f0e9ea37a8def1b858b0559aba5fac2935446a1cb2847b
查看镜像和容器列表
[root@nginx ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@nginx ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4bf16763f7f0 gliderlabs/registrator:latest "/bin/registrator -i…" 2 minutes ago Restarting (1) 32 seconds ago registrator
[root@nginx ~]# docker run -itd -p 85:80 --name test-01 -h test01 nginx
//创建容器,用来测试服务发现功能是否正常
[root@nginx ~]# docker run -itd -p:86:80 --name test-02 -h test02 nginx
//-name 给容器命名;-h 设置容器主机名
主节点上
查看防火墙是否开启,可以进行以下配置[root@docker ~]# systemctl start firewalld.service
[root@docker ~]# firewall-cmd --get-active-zones
public
interfaces: ens33
[root@docker ~]# firewall-cmd --zone=public --add-port=8500/tcp
success
Consul-Template 是一个守护进程,用户实时查询Consul集群信息,并更新文件系统上任意数量的指定模板,生成配置文件。更新完成后,可以选择运行shell命令执行更新操作,重新加载Nginx
特点:
1.consul-template是基于Consul的自动替换配置文件的应用
2.可以查询Consul中的服务目录,key、key-values
3.其强大的抽象功能和查询语言模板使得Consul-Template特别适合动态的创建配置文件,
例如:Nginx/Apache Proxy Balancers、Haproxy Backends
① 定义template nginx.ctmpl 模板
此配置文件仅与consul有关(consul使用此配置文件模板生成nignx的主配置文件)
② 配置nginx(修改文件,添加配置文件的路径)
③ 启动template(自动生成/更新配置文件供与nginx使用)
先上传并解压consul-template软件包
[root@docker consul]# rz -E //上传consul-template软件包
rz waiting to receive.
[root@docker consul]# ls
consul_0.9.2_linux_amd64.zip consul-template_0.19.3_linux_amd64.zip
[root@docker consul]# unzip consul-template_0.19.3_linux_amd64.zip -d /usr/bin
Archive: consul-template_0.19.3_linux_amd64.zip
inflating: /usr/bin/consul-template
在consul服务器上编写template nginx模板文件,添加nginx模板
[root@docker consul]# vim nginx.ctmpl
upstream http_backend {
{{range service "nginx"}}
server {{.Address}}:{{.Port}};
{{end}}
}
server {
listen 88;
server_name localhost 192.168.140.22;
access_log /var/log/nginx/tang.cn-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;
}
}
[root@docker consul]# yum install gcc gcc-c++ pcre-devel zlib-devel -y
[root@docker consul]# rz -E //上传Nginx1.12.2软件包
[root@docker consul]# tar zxvf nginx-1.12.2.tar.gz -C /opt
[root@docker consul]# cd /opt/nginx-1.12.2/
[root@docker nginx-1.12.2]# ./configure --prefix=/usr/local/nginx && make && make install //编译安装
[root@docker nginx-1.12.2]# cd /usr/local/nginx/conf/
[root@docker conf]# vim nginx.conf
...//在http模块下 添加
http {
include mime.types;
include vhost/*.conf; //添加的配置,且vhost目录需手动创建
...//省略部分信息
[root@docker conf]# mkdir vhost //创建vhost文件目录
[root@docker conf]# mkdir /var/log/nginx //创建nginx访问日志目录
[root@docker conf]# ln -s /usr/local/nginx/sbin/nginx /usr/bin //创建软链接
[root@docker conf]# nginx //启动nginx
配置template
[root@docker ~]# cd consul/
[root@docker consul]# unzip consul-template_0.19.3_linux_amd64.zip //解压缩consul-template
Archive: consul-template_0.19.3_linux_amd64.zip
inflating: consul-template
[root@docker consul]# mv consul-template /usr/bin //将脚本放入/usr/bin中
启动template
[root@docker consul]# consul-template -consul-addr 192.168.140.22:8500 \
> -template "/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/tang.conf:/usr/local/nginx/sbin/nginx -s reload" \
> --log-level=info
参数详解:
-consul-addr 192.168.140.22:8500:指向consul服务端节点
-template "/root/consul/nginx.ctmpl:指定模板路径
:/usr/local/nginx/conf/vhost/test.conf:指定文件生成到vhost中并命名为test.conf
:/usr/local/nginx/sbin/nginx -s reload:不中断服务reload重载nginx服务让配置文件生效
–log-level=info:产生日志,级别为info(日志生成位置在nginx.ctml中定义“access_log”)
[root@docker ~]# cd /usr/local/nginx/conf/vhost/
[root@docker vhost]# ls
tang.conf test.conf
[root@docker vhost]# vim test.conf
upstream http_backend {
server 192.168.140.21:85;
server 192.168.140.21:86;
}
server {
listen 88;
server_name localhost 192.168.140.22;
access_log /var/log/nginx/tang.cn-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;
}
}
[root@nginx ~]# docker run -itd -p:87:80 --name test-03 -h test03 nginx //添加容器
[root@docker ~]# cat /usr/local/nginx/conf/vhost/tang.conf