Consul0

some info about consul

This project is maintained by wangfakang

对consul的简单分析:

内容:

一:consul的总结

二:consul的优点

三:consul的基本操作

1.consul的总结:

client: 客户端, 无状态, 将 HTTP 和 DNS 接口请求转发给局域网内的服务端集群. server: 服务端, 保存配置信息, 高可用集群, 在局域网内与本地客户端通讯, 通过广域网与其他数据中心通讯. 每个数据中心的 server 数量推荐为 3 个或是 5 个.

2.consul的优点:

1.使用 Raft 算法来保证一致性, 比复杂的 Paxos 算法更直接. 相比较而言, zookeeper 采用的是 Paxos, 而 etcd 使用的则是 Raft.
2.支持多数据中心,内外网的服务采用不同的端口进行监听,多数据中心集群可以避免单数据中心的单点故障,而其部署则需要考虑网络延迟, 分片等情况等. zookeeper 和 etcd 均不提供多数据中心功能的支持.
3.支持健康检查. etcd 不直接提供此功能(利用etcd使用创建节点的ttl机制可以实现健康检测).
4.支持 http 和 dns 协议接口. zookeeper 的集成较为复杂, etcd 只支持 http 协议.
5.官方提供web管理界面, etcd 无此功能. 

首先consul etcd zookeepeer都是一个类似的服务发现健康检查,都是使用的key/value的形式进行数据存储的,如果
单纯的不考虑其服务发现的时候其实就是一个nosql型的数据库.

3.consul的基本操作与特点:

1.运行consule以server的形式运行:

 ./consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul  
 ./consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul -ui-dir=./dist  -config-dir /etc/consul.d -bind=192.168.1.100
 其中参数-ui-dir表示ui的界面处理,-config-dir表示自己所注册的服务文件的存储路径(consul会读取该路径下所有以json接吻的文件)
 最后一个参数bind是在搭建集群的时候使用的,用于绑定自己的ip.
 注意:当consul以client的模式运行的时候不要加参数server就ok.
 ./consul agent -data-dir /tmp/consul -node='nodename'  -bind=192.168.1.102

2.查看集群中的成员: ./consul members //这个命令其实使用了gossip协议产生的.

3.搭建consul集群的时候,开始启动的每一个consul都是独立的,只有使用join才会把其加入到相应的集群中去:

  ./consul agent -data-dir /tmp/consul -node=Docker-2 -bind=192.168.1.101       
方式一: 
  ./consul  join 192.168.1.101 (是在 192.168.1.100中执行的) 加入到 192.168.1.101 集群中.     
方式二:启动的时候直接加入192.168.1.100集群      
 ./consul agent -data-dir /tmp/consul -node=Docker-3 -join=192.168.1.100 -bind=192.168.1.102

4.health check(健康检查部分): 现在我们已经知道怎么运行consul、增加节点和服务、查询节点和服务、以及创建集群,这一节我们增加节点和服务间的健康监测,这是服务发现的重要组成部分,因为它要阻止访问不健康的服务。

 检测定义:就像服务定义一样,我们可以通过检测定义配置文件或者HTTP API接口来定义检测.我们定义检测配置就像配置服务定义一样,我们在Docker-2节点的consul配置目录增加两个配置文件,一个配置文件是host层面的检测,一个是server层面的检测.

 host检测,每30s检测一次:

      echo '{"check": {"name": "ping", "script": "ping -c1 www.baidu.com >/dev/null", "interval": "30s"}}' >/etc/consul.d/ping.json

 server检测,每10秒中检测一次。已经在机器上启动了nginx(80端口)服务:

      echo '{"service": {"name": "web", "tags": ["rails"], "port": 80,
            "check": {"script": "curl localhost:80 >/dev/null 2>&1", "interval": "10s"}}}' >/etc/consul.d/web.json

  然后重启agent或者给当前的agent进程发送一个SIGHUP信号(kill -s SIGHUP agent_pid).
  注意:
       若开始启动agent的时候并没有添加-config-dir标记,所以agent并不知道consul的配置文件目录在哪里,所以我们要ctrl-c来重启agent,并添加配置文件目录.

5.服务升级(一种热升级): 服务定义的升级可以通过先修改服务定义配置文件,然后给agent发送一个SIGHUP信号即可,这样允许你在升级服务时,而不会产生agent宕机时间或者服务不可达.或者通过HTTP API接口来动态的增加、删除、修改服务.

6.全新的健康检查功能:
比etcd的健康检查来说简单多了,在etcd中健康检查需要自己去利用etcd的ttl机制进行封装的(利用所设置key的ttl当每隔多长时间server进行修改一下(在ttl时间内),
则该节点不会被删除,当其超过ttl时间的话就会被删除该key,所以最终有一个来判断该key是否存在就好了).
在consul直接提供了相应的功能(http方式或直接写配置文件两种方式),
echo '{"check": {"name": "ping", "script": "ping -c1 www.baidu.com >/dev/null", "interval": "30s"}}' >/etc/consul.d/ping.json此时给consul发送SIGHUB信号,此时就可以检测网址www.baidu.com是否可以ping通,当然也可以为机器上的某一个服务进行健康检查.

7.consul启动的一些参数理解:

    -bootstrap:用来控制一个server是否在bootstrap模式,在一个datacenter中只能有一个server处于bootstrap模式,当一个server处于bootstrap模式时,可以自己选举为raft leader.
    -bootstrap-expect:在一个datacenter中期望提供的server节点数目,当该值提供的时候,consul一直等到达到指定sever数目的时候才会引导整个集群,该标记不能和bootstrap公用,一般要是单机consule的话直接指定 -bootstrap-expect 1 默认就是leader.
    -config-file:明确的指定要加载哪个配置文件.
    -config-dir:配置文件目录,里面所有以.json结尾的文件都会被加载.
    -data-dir:提供一个目录用来存放agent的状态,所有的agent允许都需要该目录,该目录必须是稳定的,系统重启后都继续存在.

8.consul的client与server模式:

   Agent - 运行在consul集群的每个node上的daemon,agent可以run在server或者是client上,每个agent都可以提供DNS或者是HTTP的接口,负责health check和service发现等。用consul agent命令可以启动,具体可run "consul agent --help"查看参数。
   Client - client把所有的RPCs转发到server端,是相对无状态的。唯一在后台运行的时client端执行了LAN gossip pool,只消耗极少的资源和网络带宽。   
   Server - server 负责维护cluster state, RPC quiries, 和其他数据中心交换WAN gossip,转发queries给leader或者其他数据中心

9.注意当consul使用不同的方式退出的时候,最终consul处理结果是不一样的:

   当使用Ctrl+c的方式停止consul的时候,consul的状态会变为left状态,但是当使用kill杀死其client的时候其状态变为fails,left状态的(会把当前所注册的服务以及checks删除),而fails状态的则不会删除,server会定期的检测其节点,允许节点在某些网络状况中恢复.

有问题反馈

在使用中有任何问题,欢迎反馈给我,可以用以下联系方式跟我交流

感激

chunshengsterATgmail.com

关于作者

Linux\nginx\golang\c\c++爱好者

欢迎一起交流 一起学习#