搭建consul 集群

这里写图片描述
此图是官网提供的一个事例系统图,图中的Server是consul服务端高可用集群,Client是consul客户端。consul客户端不保存数据,客户端将接收到的请求转发给响应的Server端。Server之间通过局域网或广域网通信实现数据一致性。每个Server或Client都是一个consul agent。Consul集群间使用了GOSSIP协议通信和raft一致性算法。上面这张图涉及到了很多术语:

  • Agent——agent是一直运行在Consul集群中每个成员上的守护进程。通过运行 consul agent来启动。
  • agent可以运行在client或者server模式。指定节点作为client或者server是非常简单的,除非有其他agent实例。所有的agent都能运行DNS或者HTTP接口,并负责运行时检查和保持服务同步。
  • Client——一个Client是一个转发所有RPC到server的代理。这个client是相对无状态的。client唯一执行的后台活动是加入LAN
  • gossip池。这有一个最低的资源开销并且仅消耗少量的网络带宽。
  • Server——一个server是一个有一组扩展功能的代理,这些功能包括参与Raft选举,维护集群状态,响应RPC查询,与其他数据中心交互WAN
  • gossip和转发查询给leader或者远程数据中心。
  • DataCenter——虽然数据中心的定义是显而易见的,但是有一些细微的细节必须考虑。例如,在EC2中,多个可用区域被认为组成一个数据中心?我们定义数据中心为一个私有的,低延迟和高带宽的一个网络环境。这不包括访问公共网络,但是对于我们而言,同一个EC2中的多个可用区域可以被认为是一个数据中心的一部分。
  • Consensus——在我们的文档中,我们使用Consensus来表明就leader选举和事务的顺序达成一致。由于这些事务都被应用到有限状态机上,Consensus暗示复制状态机的一致性。
  • Gossip——Consul建立在Serf的基础之上,它提供了一个用于多播目的的完整的gossip协议。Serf提供成员关系,故障检测和事件广播。更多的信息在gossip文档中描述。这足以知道gossip使用基于UDP的随机的点到点通信。
  • LAN Gossip——它包含所有位于同一个局域网或者数据中心的所有节点。 WAN
  • Gossip——它只包含Server。这些server主要分布在不同的数据中心并且通常通过因特网或者广域网通信。

在每个数据中心,client和server是混合的。一般建议有3-5台server。这是基于有故障情况下的可用性和性能之间的权衡结果,因为越多的机器加入达成共识越慢。然而,并不限制client的数量,它们可以很容易的扩展到数千或者数万台。

同一个数据中心的所有节点都必须加入gossip协议。这意味着gossip协议包含一个给定数据中心的所有节点。这服务于几个目的:第一,不需要在client上配置server地址。发现都是自动完成的。第二,检测节点故障的工作不是放在server上,而是分布式的。这是的故障检测相比心跳机制有更高的可扩展性。第三:它用来作为一个消息层来通知事件,比如leader选举发生时。

每个数据中心的server都是Raft节点集合的一部分。这意味着它们一起工作并选出一个leader,一个有额外工作的server。leader负责处理所有的查询和事务。作为一致性协议的一部分,事务也必须被复制到所有其他的节点。因为这一要求,当一个非leader得server收到一个RPC请求时,它将请求转发给集群leader。

server节点也作为WAN gossip Pool的一部分。这个Pool不同于LAN Pool,因为它是为了优化互联网更高的延迟,并且它只包含其他Consul server节点。这个Pool的目的是为了允许数据中心能够以low-touch的方式发现彼此。这使得一个新的数据中心可以很容易的加入现存的WAN gossip。因为server都运行在这个pool中,它也支持跨数据中心请求。当一个server收到来自另一个数据中心的请求时,它随即转发给正确数据中想一个server。该server再转发给本地leader。

这使得数据中心之间只有一个很低的耦合,但是由于故障检测,连接缓存和复用,跨数据中心的请求都是相对快速和可靠的。
使用Consul也非常简单,基本可以做到开箱即用

下文是搭建一套3节点的集群,搭建过程如下:
1.准备节服务器:
- consul1:10.100.110.71
- consul2:10.100.110.72
- consul3:10.100.110.73
2.下载consul 二进制文件包
官网下载地址:https://www.consul.io/downloads.html
选择对应系统的下载包:

sudo wget https://releases.hashicorp.com/consul/0.7.2/consul_0.7.2_linux_amd64.zip
unzip consul_0.7.2_linux_amd64.zip
mv consul /usr/local/bin/

3.启动consul
10.100.110.72执行:

consul agent -server -bootstrap-expect 2 -bind=10.100.110.71 -client=0.0.0.0 -data-dir=/data/consul -node=consul1 -ui &

i. server: 以server身份启动。
ii. bootstrap-expect:集群要求的最少server数量,当低于这个数量,集群即失效。
iii. data-dir:data存放的目录,更多信息请参阅consul数据同步机制
iv. node:节点id,在同一集群不能重复。
v. bind:监听的ip地址。
vi. client 客户端的ip地址
vii. & :在后台运行,此为linux脚本语法
vii. 更多参数及配置说明见consul官方说明文档 https://www.consul.io/docs/agent/options.html
viii. ui:启动web客户端

其他两台机器(10.100.110.72、10.100.110.73)分别执行:

consul agent -server -bootstrap-expect 2 -bind=10.100.110.72 -client=0.0.0.0 -data-dir=/data/consul -node=consul2 -ui

consul agent -server -bootstrap-expect 2 -bind=10.100.110.73 -client=0.0.0.0 -data-dir=/data/consul -node=consul3 -ui

分别在consul2、consul3 执行加入集群:

扫描二维码关注公众号,回复: 3278289 查看本文章
consul join 10.100.110.71

整个consul server 集群就算完成了,可以利用consul members查看集群中包含的node信息。使用consul info命令可以查看当前节点状态,包括是否在集群中,是否为leader(主)。

[root@localhost yum.repos.d]# consul members
Node     Address            Status  Type    Build  Protocol  DC   Segment
consul1  10.100.110.71:8301  alive   server  1.2.2  2         dc1  <all>
consul2  10.100.110.72:8301  alive   server  1.2.2  2         dc1  <all>
consul3  10.100.110.73:8301  alive   server  1.2.2  2         dc1  <all>

可视化的服务web界面:
在浏览器上输入:http://10.100.110.71:8500/ui
这里写图片描述

consul命令格式:
consul [--version] [--help] <command> [<args>]

Available commands are:

agent          Runs a Consul agent

force-leave    Forces a member of the cluster to enter the "left" state

info           Provides debugging information for operators

join           Tell Consul agent to join cluster

keygen         Generates a new encryption key

leave          Gracefully leaves the Consul cluster and shuts down

members        Lists the members of a Consul cluster

monitor        Stream logs from a Consul agent

reload         Triggers the agent to reload configuration files

version        Prints the Consul version

命令行参数:
-advertise:通知展现地址用来改变我们给集群中的其他节点展现的地址,一般情况下-bind地址就是展现地址

-bootstrap:用来控制一个server是否在bootstrap模式,在一个datacenter中只能有一个server处于bootstrap模式,当一个server处于bootstrap模式时,可以自己选举为raft leader。

-bootstrap-expect:在一个datacenter中期望提供的server节点数目,当该值提供的时候,consul一直等到达到指定sever数目的时候才会引导整个集群,该标记不能和bootstrap公用

-bind:该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0

-client:consul绑定在哪个client地址上,这个地址提供HTTPDNSRPC等服务,默认是127.0.0.1

-config-file:明确的指定要加载哪个配置文件

-config-dir:配置文件目录,里面所有以.json结尾的文件都会被加载

-data-dir:提供一个目录用来存放agent的状态,所有的agent允许都需要该目录,该目录必须是稳定的,系统重启后都继续存在

-dc:该标记控制agent允许的datacenter的名称,默认是dc1

-encrypt:指定secret key,使consul在通讯时进行加密,key可以通过consul keygen生成,同一个集群中的节点必须使用相同的key

-join:加入一个已经启动的agent的ip地址,可以多次指定多个agent的地址。如果consul不能加入任何指定的地址中,则agent会启动失败,默认agent启动时不会加入任何节点。

-retry-join:和join类似,但是允许你在第一次失败后进行尝试。

-retry-interval:两次join之间的时间间隔,默认是30s

-retry-max:尝试重复join的次数,默认是0,也就是无限次尝试

-log-level:consul agent启动后显示的日志信息级别。默认是info,可选:trace、debug、info、warn、err。

-node:节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名

-protocol:consul使用的协议版本

-rejoin:使consul忽略先前的离开,在再次启动后仍旧尝试加入集群中。

-server:定义agent运行在server模式,每个集群至少有一个server,建议每个集群的server不要超过5
-syslog:开启系统日志功能,只在linux/osx上生效

-ui-dir:提供存放web ui资源的路径,该目录必须是可读的

-pid-file:提供一个路径来存放pid文件,可以使用该文件进行SIGINT/SIGHUP(关闭/更新)agent
配置文件参数:
acl_datacenter:只用于server,指定的datacenter的权威ACL信息,所有的servers和datacenter必须同意ACL datacenter

acl_default_policy:默认是allow

acl_down_policy:

acl_master_token:

acl_token:agent会使用这个token和consul server进行请求

acl_ttl:控制TTL的cache,默认是30s

addresses:一个嵌套对象,可以设置以下key:dns、http、rpc

advertise_addr:等同于-advertise

bootstrap:等同于-bootstrap

bootstrap_expect:等同于-bootstrap-expect

bind_addr:等同于-bind

ca_file:提供CA文件路径,用来检查客户端或者服务端的链接

cert_file:必须和key_file一起

check_update_interval:

client_addr:等同于-client

datacenter:等同于-dc

data_dir:等同于-data-dir

disable_anonymous_signature:在进行更新检查时禁止匿名签名

disable_remote_exec:禁止支持远程执行,设置为true,agent会忽视所有进入的远程执行请求

disable_update_check:禁止自动检查安全公告和新版本信息

dns_config:是一个嵌套对象,可以设置以下参数:allow_stale、max_stale、node_ttl 、service_ttl、enable_truncate

domain:默认情况下consul在进行DNS查询时,查询的是consul域,可以通过该参数进行修改

enable_debug:开启debug模式

enable_syslog:等同于-syslog

encrypt:等同于-encrypt

key_file:提供私钥的路径

leave_on_terminate:默认是false,如果为true,当agent收到一个TERM信号的时候,它会发送leave信息到集群中的其他节点上。

log_level:等同于-log-level

node_name:等同于-node

ports:这是一个嵌套对象,可以设置以下key:dns(dns地址:8600)、http(http api地址:8500)、rpc(rpc:8400)、serf_lan(lan port:8301)、serf_wan(wan port:8302)、server(server rpc:8300)

protocol:等同于-protocol

recursor:

rejoin_after_leave:等同于-rejoin

retry_join:等同于-retry-join

retry_interval:等同于-retry-interval 

server:等同于-server

server_name:会覆盖TLS CA的node_name,可以用来确认CA name和hostname相匹配

skip_leave_on_interrupt:和leave_on_terminate比较类似,不过只影响当前句柄

start_join:一个字符数组提供的节点地址会在启动时被加入

statsd_addr:

statsite_addr:

syslog_facility:当enable_syslog被提供后,该参数控制哪个级别的信息被发送,默认Local0

ui_dir:等同于-ui-dir

verify_incoming:默认false,如果为true,则所有进入链接都需要使用TLS,需要客户端使用ca_file提供ca文件,只用于consul server端,因为client从来没有进入的链接

verify_outgoing:默认false,如果为true,则所有出去链接都需要使用TLS,需要服务端使用ca_file提供ca文件,consul server和client都需要使用,因为两者都有出去的链接

watches:watch一个详细名单

猜你喜欢

转载自blog.csdn.net/qq_25934401/article/details/82459486
今日推荐