consul简介
Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置。 Consul是分布式的、高可用的、可横向扩展的。它具备以下特性 :
服务发现:consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易,一些外部服务,例如saas提供的也可以一样注册。
健康检查:健康检测使consul可以快速的告警在集群中的操作。和服务发现的集成,可以防止服务转发到故障的服务上面。
键/值存储:一个用来存储动态配置的系统。提供简单的HTTP接口,可以在任何地方操作。
多数据中心:无需复杂的配置,即可支持任意数量的区域。
Consul 的优势
使用 Raft 算法来保证一致性, 比复杂的 Paxos 算法更直接. 相比较而言, zookeeper 采用的是 Paxos, 而 etcd 使用的则是 Raft.
支持多数据中心,内外网的服务采用不同的端口进行监听。 多数据中心集群可以避免单数据中心的单点故障,而其部署则需要考虑网络延迟, 分片等情况等. zookeeper 和 etcd 均不提供多数据中心功能的支持.
支持健康检查. etcd 不提供此功能.
支持 http 和 dns 协议接口. zookeeper 的集成较为复杂, etcd 只支持 http 协议.
官方提供web管理界面, etcd 无此功能.
安装
# 这里以 Linux系统为例:
$ wget https://releases.hashicorp.com/consul/1.4.2/consul_1.4.2_linux_amd64.zip
$ unzip consul_1.4.2_linux_amd64.zip
$ mv consul /usr/local/bin/
Consul 的角色
client: 客户端, 无状态, 将 HTTP 和 DNS 接口请求转发给局域网内的服务端集群.
server: 服务端, 保存配置信息, 高可用集群, 在局域网内与本地客户端通讯, 通过广域网与其他数据中心通讯. 每个数据中心的 server 数量推荐为 3 个或是 5 个.
运行 Consul代理
完成Consul的安装后,必须运行agent. agent可以运行为server或client模式.每个数据中心至少必须拥有一台server . 建议在一个集群中有3或者5个server.部署单一的server,在出现失败时会不可避免的造成数据丢失.
其他的agent运行为client模式.一个client是一个非常轻量级的进程.用于注册服务,运行健康检查和转发对server的查询.agent必须在集群中的每个主机上运行.
启动 Consul Server
#node1:
$ consul agent -server -bootstrap-expect 2 -data-dir /tmp/consul -node=n1 -bind=192.168.110.155 -ui -config-dir /etc/consul.d -rejoin -join 192.168.110.155 -client 0.0.0.0
#运行cosnul agent以server模式
-server : 定义agent运行在server模式
-bootstrap-expect :在一个datacenter中期望提供的server节点数目,当该值提供的时候,consul一直等到达到指定sever数目的时候才会引导整个集群,该标记不能和bootstrap共用
-data-dir:提供一个目录用来存放agent的状态,所有的agent允许都需要该目录,该目录必须是稳定的,系统重启后都继续存在
-node:节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名
-bind:该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0
-ui: 启动web界面
-config-dir::配置文件目录,里面所有以.json结尾的文件都会被加载
-rejoin:使consul忽略先前的离开,在再次启动后仍旧尝试加入集群中。
-client:consul服务侦听地址,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1所以不对外提供服务,如果你要对外提供服务改成0.0.0.0
#node2:
$ consul agent -server -bootstrap-expect 2 -data-dir /tmp/consul -node=n2 -bind=192.168.110.169 -ui -rejoin -join 192.168.110.155
-server : 定义agent运行在server模式
-bootstrap-expect :在一个datacenter中期望提供的server节点数目,当该值提供的时候,consul一直等到达到指定sever数目的时候才会引导整个集群,该标记不能和bootstrap共用
-bind:该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0
-node:节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名
-ui: 启动web界面
-rejoin:使consul忽略先前的离开,在再次启动后仍旧尝试加入集群中。
-config-dir::配置文件目录,里面所有以.json结尾的文件都会被加载
-client:consul服务侦听地址,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1所以不对外提供服务,如果你要对外提供服务改成0.0.0.0
-join 192.168.110.121 : 启动时加入这个集群
/tmp/consul与**/etc/consul.d**需要自己创建
启动 Consul Client
#node3:
$ consul agent -data-dir /tmp/consul -node=n3 -bind=192.168.110.157 -config-dir /etc/consul.d -rejoin -join 192.168.110.155
运行cosnul agent以client模式,-join 加入到已有的集群中去。
查看集群成员
consul members
停止Agent
Ctrl-C
consul leave
注册服务
为Consul配置创建一个目录.Consul会载入配置文件夹里的所有配置文件.在Unix系统中通常类似 /etc/consul.d (.d 后缀意思是这个路径包含了一组配置文件).
mkdir /etc/consul.d
1
编写服务定义配置文件,假设我们有一个名叫web的服务运行在 10000端口.另外,我们将给他设置一个标签.这样我们可以使用他作为额外的查询方式:
{
"service": { #服务
"name": "web", #名称
"tags": ["master"], #标记
"address": "127.0.0.1", #ip
"port": 10000, #端口
"checks": [
{
"http": "http://localhost:10000/health",
"interval": "10s" #检查时间
}
]
}
}
测试程序
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Println("hello Web3! This is n3或者n2")
fmt.Fprintf(w, "Hello Web3! This is n3或者n2")
}
func healthHandler(w http.ResponseWriter, r *http.Request) {
fmt.Println("health check! n3或者n2")
}
func main() {
http.HandleFunc("/", handler)
http.HandleFunc("/health", healthHandler)
http.ListenAndServe(":10000", nil)
}
Consul架构
CLIENT表示consul的client模式,就是客户端模式。是consul节点的一种模式,这种模式下,所有注册到当前节点的服务会被转发到SERVER【通过HTTP和DNS接口请求server】,本身是不持久化这些信息。
SERVER表示consul的server模式,表明这个consul是个server,这种模式下,功能和CLIENT都一样,唯一不同的是,它会把所有的信息持久化的本地,这样遇到故障,信息是可以被保留的
SERVER-LEADER:中间那个SERVER下面有LEADER的字眼,表明这个SERVER是它们的老大,它和其它SERVER不一样的一点是,它需要负责同步注册的信息给其它的SERVER,同时也要负责各个节点的健康监测。
————————————————
1、consul的作用
- 服务发现
- Consul clients提供服务(例如API)
- 其他的client发现服务的提供者(通过DNS或http,应用可以轻松的发现他们所依赖的服务)
- 健康检查
- Key-Value存储操作
- 动态配置
- leader选举
- feature flagging
- coordination
- 多数据中心(DC)
- 用于容灾
2、基本架构
- 一个consul节点对应一个consul agent
- agent会负责节点的健康检查和节点上的服务的健康检查
- agent分为server和client
- server
- 存储数据
- 复制数据
- servers们自己选择一个leader
- 每个数据中心推荐有3或5个server(当然1个也没问题,但是若宕机,很烦,两台等于1台,因为如果两台宕了一台,之后仍旧无法选出leader)
- client
- server
安装环境:
- mac:64bit(查看mac位数:打开终端-->"uname -a")
- consul_0.6.4_darwin_amd64.zip和consul_0.6.4_web_ui.zip,从consul官网https://www.consul.io/downloads.html进行下载就好(选择好OS和位数)
一、安装
1、解压consul_0.6.4_darwin_amd64.zip
2、将解压后的二进制文件consul(上边画红框的部分拷贝到/usr/local/bin下)
说明:使用sudo是因为权限问题。
3、查看是否安装成功
直接在家目录下执行consul命令即可。
出现如下结果,表示安装成功。
二、启动
1、执行命令
查看显示结果:
说明:
- -dev(该节点的启动不能用于生产环境,因为该模式下不会持久化任何状态),该启动模式仅仅是为了快速便捷的启动单节点consul
- 该节点处于server模式
- 该节点是leader
- 该节点是一个健康节点
2、查看consul cluster中的每一个consul节点的信息
说明:
- Address:节点地址
- Status:alive表示节点健康
- Type:server运行状态是server状态
- DC:dc1表示该节点属于DataCenter1
注意:
- members命令的输出是基于gossip协议的,并且是最终一致的(也就是说,某一个时刻你去运用该命令查到的consul节点的状态信息可能是有误的)
三、停止服务(优雅退出)
命令:CTRL+C
说明:
- 该节点离开后,会通知cluster中的其他节点
第三章 consul服务注册与服务查询
1、定义一个服务
https://www.consul.io/docs/agent/services.html
该方法是服务注册中提供服务的最常用的方法。
关于服务的定义:服务的属性我们会在后边每出现一个总结一个,最后再做总结。
2、服务注册
2.1、创建服务文件所存放的文件夹
说明:
- .d做后缀:表示一系列配置文件的存放目录(directory)
2.2、创建服务并写入上述文件夹中的一个文件
说明:
- 一个服务我们会配置为json格式:比如上述的单引号之间的形式
- 一个服务会写在一个json文件中
注意:
- 如果上述文件夹没有权限进行操作,先改变文件夹权限,
3、服务查询
先启动consul进程。
切换屏幕-->
说明:
- 根据-config-dir指定根据服务注册的目录中的文件来启动服务。
两种查询方式:DNS和HTTP
3.1、DNS:
访问的服务名字:
- tag.servicename.service.consul tag和servicename都是创建服务的时候配置的
- DNS访问的端口是8600
3.2、HTTP:
说明:
- 访问的路径:host:port/版本号/catalog/service/服务名
- Address:用于指定一个特定service的IP地址,默认情况下,使用的是该service使用的agent。
4、多个服务注册的情况
4.1、每一个服务注册到一个文件
假设现在又创建了一个secondservice服务,我会将该服务写入secondservice.json文件中去,如下:
使用http去访问:
说明:按照服务名去访问。
4.2、多个服务写在同一个json文件中
说明:
- 放在services中而不是service里(上边的单文件单服务是放在service里的)
- 多个服务放在一个数组里边
使用http去访问:
说明:按照服务名去访问。
注意:在实际开发中,微服务数量众多,
如果每个文件都放在一个文件里,文件会非常多,不好!
如果所有微服务都放在一个文件里,文件太大,也不好!
所以,需要二者结合。例如,假设有100个微服务,放在10个json文件中去,每个json文件存放10个服务。
第四章 consul cluster
1、vagrant
为了模拟集群效果,使用vagrant。
1.1、首先下载vagrant
https://www.vagrantup.com/downloads.html
说明:浏览器下载可能比较慢,可以通过迅雷下载。
1.2、下载之后,安装vagrant
mac中下一步到底就可以。
说明:虽然vagrant需要依赖于virtualbox,需要事先安装。
1.3、打开终端,启动vagrant
1.3.1、初始化:
说明:以上是安装64bit的Linux系统(Ubuntu),32bit的将数字改为32即可。
参考:https://liuzhichao.com/p/1940.html
1.3.2、修改Vagrantfile文件
说明:ruby写的,内容改为如下:
1 # -*- mode: ruby -*- 2 # vi: set ft=ruby : 3 $script = <<SCRIPT 4 echo Installing dependencies... 5 sudo apt-get update 6 sudo apt-get install -y unzip curl 7 echo Fetching Consul... 8 cd /tmp/ 9 wget https://releases.hashicorp.com/consul/0.6.1/consul_0.6.1_linux_amd64.zip -O consul.zip 10 echo Installing Consul... 11 unzip consul.zip 12 sudo chmod +x consul 13 sudo mv consul /usr/bin/consul 14 sudo mkdir /etc/consul.d 15 sudo chmod a+w /etc/consul.d 16 SCRIPT 17 18 # Vagrantfile API/syntax version. Don't touch unless you know what you're doing! 19 VAGRANTFILE_API_VERSION = "2" 20 21 Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| 22 config.vm.box = "debian/wheezy64" 23 24 config.vm.provision "shell", inline: $script 25 26 config.vm.define "n1" do |n1| 27 n1.vm.hostname = "n1" 28 n1.vm.network "private_network", ip: "172.20.20.10" 29 end 30 31 config.vm.define "n2" do |n2| 32 n2.vm.hostname = "n2" 33 n2.vm.network "private_network", ip: "172.20.20.11" 34 end 35 end
1 # -*- mode: ruby -*- 2 # vi: set ft=ruby : 3 $script = <<SCRIPT 4 echo Installing dependencies... 5 sudo apt-get update 6 sudo apt-get install -y unzip curl 7 echo Fetching Consul... 8 cd /tmp/ 9 wget https://releases.hashicorp.com/consul/0.6.1/consul_0.6.1_linux_amd64.zip -O consul.zip 10 echo Installing Consul... 11 unzip consul.zip 12 sudo chmod +x consul 13 sudo mv consul /usr/bin/consul 14 sudo mkdir /etc/consul.d 15 sudo chmod a+w /etc/consul.d 16 SCRIPT 17 18 # Vagrantfile API/syntax version. Don't touch unless you know what you're doing! 19 VAGRANTFILE_API_VERSION = "2" 20 21 Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| 22 config.vm.box = "debian/wheezy64" 23 24 config.vm.provision "shell", inline: $script 25 26 config.vm.define "n1" do |n1| 27 n1.vm.hostname = "n1" 28 n1.vm.network "private_network", ip: "172.20.20.10" 29 end 30 31 config.vm.define "n2" do |n2| 32 n2.vm.hostname = "n2" 33 n2.vm.network "private_network", ip: "172.20.20.11" 34 end 35 end
该文件内容是consul官方推荐的demo。这一块儿内容可以根据实际情况去修改。(我将节点的IP自己指定了一下,尽量不要与自己本机的IP一样,否则可能会影响一些功能),以下是我的配置。
1 # -*- mode: ruby -*- 2 # vi: set ft=ruby : 3 $script = <<SCRIPT 4 echo Installing dependencies... 5 sudo apt-get update 6 sudo apt-get install -y unzip curl 7 echo Fetching Consul... 8 cd /tmp/ 9 wget https://releases.hashicorp.com/consul/0.6.1/consul_0.6.1_linux_amd64.zip -O consul.zip 10 echo Installing Consul... 11 unzip consul.zip 12 sudo chmod +x consul 13 sudo mv consul /usr/bin/consul 14 sudo mkdir /etc/consul.d 15 sudo chmod a+w /etc/consul.d 16 SCRIPT 17 18 # Vagrantfile API/syntax version. Don't touch unless you know what you're doing! 19 VAGRANTFILE_API_VERSION = "2" 20 21 Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| 22 config.vm.box = "debian/wheezy64" 23 24 config.vm.provision "shell", inline: $script 25 26 config.vm.define "n110" do |n1| 27 n1.vm.hostname = "n110" 28 n1.vm.network "private_network", ip: "192.168.21.110" 29 end 30 31 config.vm.define "n111" do |n2| 32 n2.vm.hostname = "n111" 33 n2.vm.network "private_network", ip: "192.168.21.111" 34 end 35 end
1 # -*- mode: ruby -*- 2 # vi: set ft=ruby : 3 $script = <<SCRIPT 4 echo Installing dependencies... 5 sudo apt-get update 6 sudo apt-get install -y unzip curl 7 echo Fetching Consul... 8 cd /tmp/ 9 wget https://releases.hashicorp.com/consul/0.6.1/consul_0.6.1_linux_amd64.zip -O consul.zip 10 echo Installing Consul... 11 unzip consul.zip 12 sudo chmod +x consul 13 sudo mv consul /usr/bin/consul 14 sudo mkdir /etc/consul.d 15 sudo chmod a+w /etc/consul.d 16 SCRIPT 17 18 # Vagrantfile API/syntax version. Don't touch unless you know what you're doing! 19 VAGRANTFILE_API_VERSION = "2" 20 21 Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| 22 config.vm.box = "debian/wheezy64" 23 24 config.vm.provision "shell", inline: $script 25 26 config.vm.define "n110" do |n1| 27 n1.vm.hostname = "n110" 28 n1.vm.network "private_network", ip: "192.168.21.110" 29 end 30 31 config.vm.define "n111" do |n2| 32 n2.vm.hostname = "n111" 33 n2.vm.network "private_network", ip: "192.168.21.111" 34 end 35 end
只是修改了节点位置,其实上边的script根本没让他去执行,可以去掉。
1.3.3、启动
说明:当看到日志输出到
就可以"ctrl+c"退出了(可能有时候需要"ctrl+c"两次),否则会将本机~/下的内容同步到n110这个节点,可能n110这个节点的空间会不够,导致后期工作无法进行。
这时候一个节点启动起来了,但是第二个没起来,需要再执行上边的操作一次。
最后,第三次执行启动命令。
这样就好了。
之后针对n110和n111两个节点分别安装软件。
2、安装软件
进入/tmp/,下载consul软件。
之后解压(前提是"unzip"命令已安装,如果没安装,执行)
解压之后出现一个二进制文件"consul",如下:
之后将这个二进制文件移动或拷贝到/usr/bin下
说明:以上步骤分别针对针对n110和n111两个节点执行一次。
3、n110以server模式启动服务
关于启动命令和启动参数查看 附1 consul常用命令+常用选项
4、n111以client模式启动服务
5、join
分别启动以上两个服务后,发现其实n110和n111两个彼此谁都不知道谁(可以通过切换屏幕后,使用来验证),此时必须其中一个节点join到另一个节点,这时候才能彼此组成集群。
说明:以上命令将n110节点加入到n111所在的集群(反过来去join也是没问题的),之后通过来看n110和n111时,彼此都是一个集群的两个member了。
注意:假设一个集群有2个节点(n1,n2),这时候有一个节点n3想加入集群,不需要join两遍,只需要join n1或n2就好。这样的话,集群之间通过gossip协议彼此沟通,n3就加入集群了。
6、创建服务并访问
这个是我后来写的,所以节点名字变了。
分别在两个节点上边创建一个服务,创建过程参照:第三章 consul服务注册与服务查询
服务访问:
采用DNS访问:
在client-111和server-110下均可以操作,命令如下:
命令:dig @127.0.0.1 -p 8600 server-110.node.zjgdc1.consul
格式:dig @127.0.0.1 -p 8600 节点名称.node.数据中心名称.consul
7、节点离开集群
"ctrl+c"
第五章 consul key/value
1、key/value作用
- 动态修改配置文件
- 支持服务协同
- 建立leader选举
- 提供服务发现
- 集成健康检查
2、使用
2.1、查看全部key/value
说明:
- 使用?recurse参数来指定查看多个KV
- 没有值--404
2.2、添加key/value
说明:key--zjg/key1 value--'test'
说明:flags--用于为任意一个KV添加一个有意义的metadata。
注意:上边的这个就是有问题的,一定要注意是flags而非flag。
2.3、查看单个key/value
说明:value是test的base64编码(使用base64编码是为了允许非UTF-8的字符)
2.4、修改key/value
说明:修改与增加的命令完全一样,只需要将修改部分的内容修改掉即可。
CAS修改:(原子性的执行修改)
cas的值如果与ModifyIndex相等,则修改成功,若不相等,则修改失败。
2.5、删除key/value
2.5.1、删除单一KV
2.5.2、删除一定范围的KV(指定前缀范围内的KV)
说明:
- 指定删除的KV的K的前缀(zjg)
第六章 consul UI
1、建立三个consul节点(一个server+两个client)
具体的过程见http://www.cnblogs.com/java-zhao/p/5375132.html
1)在终端下启动vagrant
vagrant up(Vagrantfile还是建立两个节点,如下)
2)进入n110节点并启动为server模式
2.1)进入n110节点:vagrant ssh n110
2.2)启动consul:
说明:
- -dc:指明数据中心的名字
- -ui:启动UI(为了方便后续的UI访问)
3)进入n111节点并启动为client模式
3.1)进入n111节点:vagrant ssh n111
3.2)启动consul:
3.3)加入集群:
4)将本机节点启动为client模式并打开UI
4.1)启动consul:
说明:本机启动UI
4.2)加入集群:
启动完成后,最好查看一下每一个节点的consul集群成员。
2、在本机浏览器访问UI
访问远程服务端点的UI
说明:在新版本的consul中访问远程服务端点的UI是有问题的,可能需要配置什么。老版本没问题。
解决方法:
-
consul agent -server -bootstrap-expect=1 -data-dir=/tmp/consul -node=server-110 -bind=192.168.21.110 -dc=zjgdc1 -client 0.0.0.0 -ui
说明:-client 0 0 0 0 -ui-->使得客户端可以直接通过url访问服务端的consul ui
访问本机的UI
http://localhost:8500/ui/
- services节点:放置服务
- nodes节点:放置consul节点
- key/value节点:放置一些配置信息
- zjgdc节点:配置数据中心
打开nodes节点,如下:
第七章 consul docker集群
--net=host:运行consul的docker镜像必须带有的参数,因为consul的consensus和gossip协议对于网络的延迟和丢包很敏感,所以引入额外的其他网络类型的层是不可取并且不必要的。
/consul/data:数据存储目录
/consul/config:配置文件所在目录,配置也可以通过环境变量名为CONSUL_LOCAL_CONFIG(其值为json串)来指定
一、下载docker镜像
- docker pull consul:0.7.1
- docker tag xxx 10.211.55.4:5000/consul:0.7.1
- docker push 10.211.55.4:5000/consul:0.7.1
二、10.211.55.6
- docker pull 10.211.55.4:5000/consul:0.7.1
- docker run -d --net=host 10.211.55.4:5000/consul:0.7.1 agent -server -bind=10.211.55.6 -node=server1 -bootstrap-expect 1 -client 0.0.0.0 -ui
- --net=host:使用宿主机网络,这是运行consul的docker镜像必须带有的参数,因为consul的consensus和gossip协议对于网络的延迟和丢包很敏感,所以引入额外的其他网络类型的层是不可取并且不必要的。这样之后,外界可以通过宿主机ip来访问该consul server。
- consul ps获取containerID后,consul logs containerId来查看日志
三、10.211.55.7
- docker pull 10.211.55.4:5000/consul:0.7.1
- docker run -d --net=host 10.211.55.4:5000/consul:0.7.1 agent -bind=10.211.55.7 -node=client1 -retry-join=10.211.55.6
- docker exec -t containerID consul members
- 进入内部查看consul
四、在本机浏览器输入10.211.55.6:8500/ui,查看consulUI
之后每用到一个command或options,都会记录在这里。
常用命令command:
- agent
- 作用:运行一个consul agent
- join
- 作用:将agent加入到consul cluster
- members
- 作用:列出consul cluster集群中的members
常用选项option:
- -data-dir
- 作用:指定agent储存状态的数据目录
- 这是所有agent都必须的
- 对于server尤其重要,因为他们必须持久化集群的状态
- -config-dir
- 作用:指定service的配置文件和检查定义所在的位置
- 通常会指定为"某一个路径/consul.d"(通常情况下,.d表示一系列配置文件存放的目录)
- -config-file
- 作用:指定一个要装载的配置文件
- 该选项可以配置多次,进而配置多个配置文件(后边的会合并前边的,相同的值覆盖)
- -dev
- 作用:创建一个开发环境下的server节点
- 该参数配置下,不会有任何持久化操作,即不会有任何数据写入到磁盘
- 这种模式不能用于生产环境(因为第二条)
- -bootstrap-expect
- 作用:该命令通知consul server我们现在准备加入的server节点个数,该参数是为了延迟日志复制的启动直到我们指定数量的server节点成功的加入后启动。
- -node
- 作用:指定节点在集群中的名称
- 该名称在集群中必须是唯一的(默认采用机器的host)
- 推荐:直接采用机器的IP
- -bind
- 作用:指明节点的IP地址
- -server
- 作用:指定节点为server
- 每个数据中心(DC)的server数推荐为3或5(理想的是,最多不要超过5)
- 所有的server都采用raft一致性算法来确保事务的一致性和线性化,事务修改了集群的状态,且集群的状态保存在每一台server上保证可用性
- server也是与其他DC交互的门面(gateway)
- -client
- 作用:指定节点为client
- 若不指定为-server,其实就是-client
- -join
- 作用:将节点加入到集群
- -domain
- -dc
- 作用:指定机器加入到哪一个dc中
- 例子:
zookeeper和consul比较
1、开发语言方面,zookeeper采用java开发,安装的时候需要部署java环境;consul采用golang开发,所有依赖都编译到了可执行程序中,即插即用。
2、部署方面,zookeeper一般部署奇数个节点方便做简单多数的选举机制。consul部署的时候分server节点和client节点(通过不同的启动参数区分),server节点做leader选举和数据一致性维护,client节点部署在服务机器上,作为服务程序访问consul的接口。
3、一致性协议方面,zookeeper使用自定义的zab协议,consul的一致性协议采用更流行的Raft。
4、zookeeper不支持多数据中心,consul可以跨机房支持多数据中心部署,有效避免了单数据中心故障不能访问的情况。
5、链接方式上,zookeeper client api和服务器保持长连接,需要服务程序自行管理和维护链接有效性,服务程序注册回调函数处理zookeeper事件,并自己维护在zookeeper上建立的目录结构有效性(如临时节点维护);consul 采用DNS或者http获取服务信息,没有主动通知,需要自己轮训获取。
6、工具方面,zookeeper自带一个cli_mt工具,可以通过命令行登录zookeeper服务器,手动管理目录结构。consul自带一个Web UI管理系统, 可以通过参数启动并在浏览器中直接查看信息。
Consul是一个用来实现分布式系统的服务发现与配置的开源工具。他主要由多个组成部分:
服务发现:客户端通过Consul提供服务,类似于API,MySQL,或者其他客户端可以使用Consul发现服务的提供者。使用类似DNS或者HTTP,应用程序和可以很轻松的发现他们依赖的服务。
检查健康:Consul客户端可以提供与给定服务相关的健康检查(Web服务器返回200 ok)或者本地节点(“内存利用率低于90%”)。这些信息可以监控集群的运行情况,并且使访问远离不健康的主机组件。
键值对存储:应用程序可以使用Cousul的层级键值对。
多数据中心:Consul有开箱及用的多数据中心。
Consul 的角色
client: 客户端, 无状态, 将 HTTP 和 DNS 接口请求转发给局域网内的服务端集群.
server: 服务端, 保存配置信息, 高可用集群, 在局域网内与本地客户端通讯, 通过广域网与其他数据中心通讯. 每个数据中心的 server 数量推荐为 3 个或是 5 个.
agent
组成 consul 集群的每个成员上都要运行一个 agent,可以通过 consul agent 命令来启动。agent 可以运行在 server 状态或者 client 状态。自然的,运行在 server 状态的节点被称为 server 节点;运行在 client 状态的节点被称为 client 节点。
client 节点
负责转发所有的 RPC 到 server 节点。本身无状态,且轻量级,因此,可以部署大量的 client 节点。
server 节点
负责组成 cluster 的复杂工作(选举、状态维护、转发请求到 lead),以及 consul 提供的服务(响应 RCP 请求)。考虑到容错和收敛,一般部署 3 ~ 5 个比较合适。
Consul内幕
术语
代理(agent):代理是Consul集群上每个成员的守护进程,它是由consul agent开始运行。代理能够以客户端或服务器模式运行。由于所有节点都必须运行代理,所以将节点引用为客户端或服务器更为简单,但还有其他实例的代理。所有代理可以运行DNS或HTTP接口,并负责运行检查和保持服务同步。
客户端:客户端可以将所有RPC请求转发到服务器的代理。客户端是相对无状态的。客户端执行的唯一后台活动是LANgossip池。它消耗最小的资源开销和少量的网络带宽。
服务器端:服务器端是具有扩展的功能的代理,它主要参与维护集群状态,响应RPC查询,与其他数据中心交换WAN gossip ,以及向上级或远程数据中心转发查询。
数据中心:虽然数据中心的定义似乎很明显,但仍有一些细微的细节必须考虑。我们将一个数据中心定义为一个私有、低延迟和高带宽的网络环境。这不包括通过公共互联网的通信,但是为了我们的目的,单个EC2区域内的多个可用区域将被视为单个数据中心的一部分
Gossip:consul是建立在serf之上的,它提供了一个完整的gossip协议,用在很多地方。Serf提供了成员,故障检测和事件广播。Gossip的节点到节点之间的通信使用了UDP协议。
LAN Gossip:指在同一局域网或数据中心的节点上的LAN Gossip池。
WAN Gossip:指包含服务器的WAN Gossip池,这些服务器在不同的数据中心,通过网络进行通信。
一致性协议采用 Raft 算法,用来保证服务的高可用.
成员管理和消息广播 采用GOSSIP协议,支持ACL访问控制。
-----------------------------------
做服务发现的框架常用的有
zookeeper
eureka
etcd
consul