consul命令行查看服务_consul服务搭建

微服务框架使用consul

###consul 是什么

consul 是提供有发现服务,配置,分段功能全特性控制面板的服务网络解决方案。它关键特性有服务发现,健康检查,kv保存,安全服务通信,多数据中心等。就不翻译文档了...

条件

consul 命令包括以下

``` sell

Usage: consul [--version] [--help] []

Available commands are:

agent Runs a Consul agent

catalog Interact with the catalog

connect Interact with Consul Connect

event Fire a new event

exec Executes a command on Consul nodes

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

info Provides debugging information for operators.

intention Interact with Connect service intentions

join Tell Consul agent to join cluster

keygen Generates a new encryption key

keyring Manages gossip layer encryption keys

kv Interact with the key-value store

leave Gracefully leaves the Consul cluster and shuts down

lock Execute a command holding a lock

maint Controls node or service maintenance mode

members Lists the members of a Consul cluster

monitor Stream logs from a Consul agent

operator Provides cluster-level tools for Consul operators

reload Triggers the agent to reload configuration files

rtt Estimates network round trip time between nodes

snapshot Saves, restores and inspects snapshots of Consul server state

validate Validate config files/directories

version Prints the Consul version

watch Watch for changes in Consul

```

#### 运行 agent

agent : consul核心进程,管理成员信息,注册服务,运行检查服务,响应请求,等等。有两种模式,server 和client,

server 服务节点需要去执行Raft算法,需要更多的资源,而client则不用,把所有的,因此client更轻量,client构成集群的主体。

运行 agent

```shell

consul agent -data-dir=/tmp/consul

```

有几个比较重要的参数

* 节点名 (node name) : 要唯一,默认是本机主机名,可以通过 -node xxx 设置

* 数据中心(datacenter): agent所在的数据中心,consul支持多个数据中心,但是每个节点必须配置自己的数据中心,默认dc1

* 服务(-server): 加上这个参数,就会以server模式运行节点。另外,服务器可以处于“引导(bootstrap)”模式。多个服务器不能处于Bootstrap模式,因为这会使集群处于不一致的状态。

* 客户端地址(client addr): 用于客户端接口,包括http和dns接口。默认,绑定localhost,如果修改,需要指定 -http-addr 在你运行命令例如consul成员怎样到达agent。

* 集群地址(Cluster Addr):集群是一系列的通信地址和端口,没有必要所有端口都是一样的,但是集群中的地址必须的可达的。

#### 停止agent

1. 体面地: Ctrl +c 或者 kill -INT consul_pid ,这种方式会发送一个中断信号,这种方式下,agent会首先通知集群它要离开。

2. 强行中断,其他节点会检测到该节点已经关闭,并通知集群该节点失败(failed)状态

体面地终止对集群的影响最小。

#### DNS接口

dns接口允许应用在没有与consul高度集成的情况下使用服务发现。

举个例子,主机可以通过名字查询直接使用DNS服务 比如: redis.service.us-east-1.consul,而不是使用HTTP api请求。该请求会自动转换并定位到us-east-1数据中心、无故障的、能提供redis服务的节点。

要实现上述场景,还需要配置client_addr,ports.dns,recursors,domain,dns_config。默认,consul监听127.0.0.1:8600含有 .consul域的dns请求,但不支持更进一步的dns递归。参考配置 [documentation on configuration options](https://www.consul.io/docs/agent/options.html)

有多种方法使用DNS接口,一种是使用自定义DNS解析器动态库。另一个方法是为节点设置Consul的DNS服务器,并提供recursors配置,也可以解决non-Consul查询。最后一种方法是将所有的关于"consul."域的查询都从现有的DNS服务器转移consul Agent。

可以尝试使用的Consul DNS服务器的命令行工具dig:

```

$ dig @127.0.0.1 -p8600 redis.service.dc1.consul. ANY

```

>注:在DNS中,都是不区分大小写的。比如PostgreSQL.node.dc1.consul会查询所有节点中名字为postgresql的节点。

DNS查询系统利用健康检查以防止不良节点路由信息。当服务查询时,如果服务健康检查失败或者系统检查失败,服务信息将会从查询结果中删除。为了实现简单的负载平衡,返回的节点集合每次都是随机的。这种机制使得利用DNS接口基于应用级重试实现面向auto-healing服务体现架构变得更加容易。

###### 查找

要解决名称,Consul依赖于非常具体的查询格式。基本上有两种类型的查询:节点查找和服务查找。

节点查找,类似如下:包含节点的address

```

.node[.datacenter].

```

例如,如果有默认节点“foo”,可以查找“foo.node.dc1.consul.”其中数据中心名称dc1是可选参数,如果不提供,Agent将选择默认数据中心——agent肯定属于一个数据中心。可以采用"foo.node.consul."进行查找,本约束可以在适当的地方使用,同时支持在远程数据中心得节点查询。

节点查找,唯一的返回记录——包含节点IP地址的A记录。

服务查询

格式如下:

```

[tag.].service[.datacenter].

```

Tag是可选的,而且与节点查找一样,数据中心也是可选。如果没有提供Tag,就不会有过滤,如果没有数据中心,就会选择默认的数据中心。

在本地数据中心,如果想查找redis服务提供商,可以通过命令"redis.service.consul.",如果想在指定的数据中心中查找PostgreSQL master,命令如下"master.postgresql.service.dc2.consul."

RFC2782 查找

格式如下:

```

_._.service[.datacenter][.domain]

```

根据RFC 2782, SRV请求都应该在service和protocol前使用*_*作为前缀。避免发生DNS冲突。Protocol可以是service任何一个tag,如果service没有tag,使用tcp作为protocol。如果一旦设置了tcp,那么查询时将不会执行任何标签过滤。

处理查询格式和默认的tcp外, RFC查找方式与标准查找是相同的。

假设通过port5672和Tag “amqp”注册服务"rabbitmq",可以发现RFC2782的SRV查询,如"_rabbitmq._amqp.service.consul":

###配置

参数非常多,还是参考文档吧

[options](https://www.consul.io/docs/agent/options.html)

分为命令参数

```shell

consul agent -server -data-dir /data/consul -datacenter dc178 -bootstrap_expect 1 -node dc178

-bind 192.168.0.177 -client 192.168.0.177 -ui

```

输入命令麻烦,可以将命令写入json文件,读取命令

```shell

consul agent -config-file server.json

```

server.json

```json

{

"data_dir": "/data/consul",

"datacenter": "dc178",

"log_level": "info",

"server": true,

"bootstrap_expect": 1,

"node_name": "node177",

"bind_addr": "192.168.0.177",

"client_addr": "192.168.0.177",

"ui":true,

"client_addr":"0.0.0.0"

}

```

```json

{

"data_dir": "/data/consul",

"enable_script_checks": true,

"bind_addr": "10.215.20.13",

"retry_join": ["10.9.51.13"],

"retry_interval": "15s",

"rejoin_after_leave": true,

"start_join": ["10.9.51.13"]

}

```

ui 可以访问本地8500端口访问web版界面

bind 绑定ip

client 客户访问的ip

node_name 节点名称

datacenter 每个节点处在一个数据中心

data_dir 数据保存的位置

log_level 日志级别有"trace", "debug", "info", "warn", "err"。

##例子

说的多不如一做

四个虚拟机

192.168.0.175

192.168.0.176

192.168.0.177

192.168.0.178

可以随意练习

我的每个主机都安装有一键 lnmp 和 consul 并且lnmp安装了redis。

其他服务器联系看服务是否能够选举领导,

常用

```shell

consul agent -server -ui -data-dir /data/dir -node dc175 -config-file(或者 -config-dir 多个服务) //启动服务

consul join ip 将节点加入集群

consul operator raft list-peers 查看集群情况

```

可以通过web ui 默认8500端口以web方式查看集群情况,比较方便。

联系输入命令

```shell

consul agent -config-file server.json

```

这个配置可以同时监控 nginx 和redis。经过多次测试 起停 redis和nginx , 在192.168.0.178:8500/ui/dc178/services 连接上可以观察出 两个(nginx178,redis178)的服务状态,关闭redis后 redis178会变成criticle状态,恢复

下面是配置

```

{

"datacenter":"dc178",

"node_name":"mode178",

"services": [

{

"id":"redis178",

"name":"redis178",

"address":"127.0.0.1",

"port":6379,

"tags":["redis178-dev"],

"checks":[

{

"tcp":"127.0.0.1:6379",

"interval":"10s",

"timeout":"5s"

}

]

},

{

"id":"nginx178",

"name":"nginx178",

"address":"127.0.0.1",

"port":80,

"tags":["nginx178-dev"],

"checks":[

{

"http":"http://127.0.0.1/",

"interval":"10s"

}

]

}

],

"data_dir":"/data/consul",

"retry_interval":"15s",

"enable_script_checks": true,

"ui":true,

"client_addr":"0.0.0.0"

}

```

redis健康的提示

```

TCP connect 127.0.0.1:6379: Success

```

redis criticle的提示

```

dial tcp 127.0.0.1:6379: connect: connection refused

```

同样 nginx 服务关闭后陷入 criticle状态

```

dial tcp 127.0.0.1:6379: connect: connection refused

```

恢复恢复正常

日志中捕获的该过程

```

2018/07/10 22:12:46 [INFO] agent: Synced check "service:nginx178"

2018/07/10 22:12:53 [WARN] agent: Check "service:redis178" socket connection failed: dial tcp 127.0.0.1:6379: connect: connection refused

...

2018/07/10 22:13:26 [WARN] agent: Check "service:nginx178" HTTP request failed: Get http://127.0.0.1/: dial tcp 127.0.0.1:80: connect: connection refused

2018/07/10 22:13:33 [WARN] agent: Check "service:redis178" socket connection failed: dial tcp 127.0.0.1:6379: connect: connection refused

2018/07/10 22:13:36 [INFO] agent: Synced check "service:nginx178"

2018/07/10 22:13:43 [INFO] agent: Synced check "service:redis178"

```

下一步,给服务check绑定事件脚本,一旦有事件发生,则执行脚本,这对于系统稳定性有很大帮助。

则checks 可以这么写,配置多个check

```

{

"check": [

{

"id": "mem-util",

"name": "Memoryutilization",

"docker_container_id": "f972c95ebf0e",

"shell": "/bin/bash",

"script": "/usr/local/bin/check_mem.py",

"interval": "10s"

},

{

"args":["sh","-c","/data/consul/shell/check_redis_master.sh 6380 "],

"interval": "15s"

}

}

```

参考文章

http://www.itboth.com/d/Rnuyea/consul-redis

https://www.consul.io/docs/agent/options.html

https://blog.csdn.net/younger_china/article/details/52243759

https://blog.csdn.net/younger_china/article/details/52264525

你可能感兴趣的:(consul命令行查看服务)