1、背景知识
1.1、Consul 是什么
Consul 是一个支持多数据中心分布式高可用的服务发现和配置共享的服务软件,由 HashiCorp 公司用 Go 语言开发, 基于 Mozilla Public License 2.0 的协议进行开源. Consul 支持健康检查,并允许 HTTP 和 DNS 协议调用 API 存储键值对.
命令行超级好用的虚拟机管理软件 vgrant 也是 HashiCorp 公司开发的产品.
一致性协议采用 Raft 算法,用来保证服务的高可用. 使用 GOSSIP 协议管理成员和广播消息, 并且支持 ACL 访问控制.
1.2、Consul 的使用场景
- docker 实例的注册与配置共享
- coreos 实例的注册与配置共享
- vitess 集群
- SaaS 应用的配置共享
- 与 confd 服务集成,动态生成 nginx 和 haproxy 配置文件
1.3、Consul 的优势
- 使用 Raft 算法来保证一致性, 比复杂的 Paxos 算法更直接. 相比较而言, zookeeper 采用的是 Paxos, 而 etcd 使用的则是 Raft.
- 支持多数据中心,内外网的服务采用不同的端口进行监听。 多数据中心集群可以避免单数据中心的单点故障,而其部署则需要考虑网络延迟, 分片等情况等. zookeeper 和 etcd 均不提供多数据中心功能的支持.
- 支持健康检查. etcd 不提供此功能.
- 支持 http 和 dns 协议接口. zookeeper 的集成较为复杂, etcd 只支持 http 协议.
- 官方提供web管理界面, etcd 无此功能.
综合比较, Consul 作为服务注册和配置管理的新星, 比较值得关注和研究.
1.4、Consul 的角色
client: 客户端, 无状态, 将 HTTP 和 DNS 接口请求转发给局域网内的服务端集群.
server: 服务端, 保存配置信息, 高可用集群, 在局域网内与本地客户端通讯, 通过广域网与其他数据中心通讯. 每个数据中心的 server 数量推荐为 3 个或是 5 个.
ps:用了consul我才发现,go语言编写的库不用满足依赖,看起来很爽啊。
2、软件环境
阿里云(ubuntu 16.04)
局域网:172.18.32.24x 外网:120.77.45.1x
腾讯云(windows server 2012)
局域网:10.104.185.10x 外网:119.29.233.7x
本地(deepin 15.4.1)
局域网:192.168.0.12x 外网:58.62.202.4x
consul版本:v0.9.2
3、集群发现
这里每个局域网开一个consul server,用于不用局域网集群的通信节点
3.1、启动服务
阿里云:
consul agent -server -bootstrap-expect 1 -node=localServer -bind=172.18.32.24x -advertise-wan=120.77.45.1x -data-dir /opt/data1 -dc=ali-dc1
参数含义:
- -server表示启动一个服务
- -bootstrap-expect 1表示等待多少个节点再启动,这里1个,就是自己一个就启动了
- -node=localServer 就是给consul服务起个别名为localServer
- -bind=172.18.32.24x 绑定内网ip
- -advertise-wan=120.77.45.1x绑定外网ip
- -data-dir /opt/data1 数据存储目录为/opt/data1
- -dc=ali-dc1给数据中心起个别名ali-dc1
腾讯云:
consul agent -server -bootstrap-expect 1 -node=localServer -bind=0.0.0.0 -advertise-wan=119.29.233.7x -data-dir c:/consul -dc=tx-dc1
-bind=0.0.0.0不行话,换成具体ip,0.0.0.0表示任意ip
本地:
consul agent -server -bootstrap-expect 1 -node=localServer -bind=192.168.0.12x -advertise-wan=58.62.202.4x -data-dir /opt/data1 -dc=deepin-dc1 > /dev/null &
如无意外我们就启动了三个能被其他server加入的server节点
我遇到一种情况是:阿里云不能加入到腾讯云的server中。
所以,我把其余两个节点加入到阿里云节点中
腾讯云输入如下,加入到阿里云:
consul join -wan 120.77.45.1x
本地也输入如下,加入到阿里云:
consul join -wan 120.77.45.1x
成功加入,提示如下:Successfully joined cluster by contacting 1 nodes.
查看阿里云 wan链接节点情况:
root@iZwz96uh8912ewgq9yv5nxZ:~# consul members -wan
Node Address Status Type Build Protocol DC
localServer.ali-dc1 120.77.45.1x:8302 alive server 0.9.2 2 ali-dc1
localServer.deepin-dc1 58.62.202.4x:8302 alive server 0.9.2 2 deepin-dc1
localServer.tx-dc1 119.29.233.7x:8302 alive server 0.9.2 2 tx-dc1
localServer.tx-dc2 58.62.202.4x:8302 failed server 0.9.2 2 tx-dc2
localServer.tx-dc2 58.62.202.4x:8302 failed server 0.9.2 2 tx-dc2这个是我本机window搞的一个,系统切到linux了,所以不在线
查看本机 wan链接节点情况:
root@hui-PC:/home/hui# consul members -wan
Node Address Status Type Build Protocol DC
localServer.ali-dc1 120.77.45.1x:8302 alive server 0.9.2 2 ali-dc1
localServer.deepin-dc1 58.62.202.4x:8302 alive server 0.9.2 2 deepin-dc1
localServer.tx-dc1 119.29.233.7x:8302 alive server 0.9.2 2 tx-dc1
自此局域网的节点间连接完成。
参考博客:consul多数据中心搭建