consul集群搭建
consul的基本介绍就不多说,官方文档肯定比我说的好,英语渣渣就不献丑了。这里只分享consul集群部署和使用过程中的步骤和遇到的坑。(本文有很多抄袭的地方,但是忘了从哪里copy的了,都是记在我的onenote上的。。。。。如果有作者看见,请联系我,我加上链接,非常感谢)
先来一张官网的图震贴,consul里面都是叫agent,但是区分server模式和client模式
我的理解,server作为服务注册的中心服务器,而client只是作为支撑(感觉更多的是分摊server端的压力,因为官方建议是在每台应用服务器上装一个client),不保存任何数据和状态,用完就废弃
server端建议最少3个节点,当然你也可以直接单点跑(你也可以在生产环境用dev模式跑,反正挂了不要来找我就行)
8500 端口基于HTTP协议,用于API接口或WEB UI访问
8600 端口作为DNS服务器,使我们可以通过节点名查询节点信息
8400 端口rpc通讯???
TCP/UDP/8301 端口用于单个数据中心所有节点之间的互相通讯,即对 LAN 池(包含位于同一局域网或数据中心上的节点)信息的同步。它使得整个数据中心能够自动发现服务器地址,分布式检测节点故障,事件广播(如领导选举事件)。
TCP/UDP/8302 端口用于单个或多个数据中心之间的服务器节点的信息同步,即对 WAN 池(只包含 server 的 WAN Gossip 池,这些服务器主要位于不同的数据中心,通常通过互联网或广域网进行通信。)信息的同步。它针对互联网的高延迟进行了优化,能够实现跨数据中心请求。
TCP/8300 端口用于服务器节点。client端通过该端口 RPC 协议调用server端节点。
本文的命令都是用的docker原生命令,没有采用docker-compose文件启动的形式,所以有些命令可能会非常长,我会对用到的参数做详细解释
假设有3台服务器(没那么多服务器,所以会出现server端和client端部署到同一台的情况):
172.16.0.123
172.16.0.124
172.16.0.125
启动server端命令如下: docker run -d --restart=always --name=consul --net=host -v /consul/data:/consul/data consul agent -server -ui -bind=172.16.0.123 -client=0.0.0.0 -bootstrap-expect=3 -node=gw1_server docker run -d --restart=always --name=consul --net=host -v /consul/data:/consul/data consul agent -server -join=172.16.0.123 -bind=172.16.0.124 -client=0.0.0.0 -node=gw2_server docker run -d --restart=always --name=consul --net=host -v /consul/data:/consul/data consul agent -server -join=172.16.0.123 -bind=172.16.0.125 -client=0.0.0.0 -node=gw3_server
consul agent -server 表示运行在server模式下
-ui:表示启动一个ui界面
-bind:当前界面的IP地址
-client:表示监听IP地址,应对多网口的情况,可以指定只监听从内网过来的通信
-node:可以不指定,但是如果client和server端部署在同一台机器时,需要配置,以防出现问题
-join:表示加入某个主节点(这里是123)
-bootstrap-expect=3:表示在一共有三个consul的server端接入时启动,该参数如果不设置会在单点起来之后就启动,然后就会报错
-v /consule/data:/consul/data : 因为是采用docker部署,consul会把注册好的服务数据暂存在本地,所以需要把data目录外部挂载,如果docker重启,不需要服务重新注册
启动client端命令如下:
docker run -d --restart=always --net=host --name=consulclient -v /consul/clientdata:/consul/data -e 'CONSUL_LOCAL_CONFIG={"leave_on_terminate": true}' consul agent -bind=172.16.0.123 -client=0.0.0.0 -server-port=18300 -http-port=18500 -dns-port=18600 -serf-lan-port=18301 -serf-wan-port=18302 -retry-join=172.16.0.136:8301 -retry-join=172.16.0.124:8301 -retry-join=172.16.0.123:8301 -node=gw1_client
CONSUL_LOCAL_CONFIG={"leave_on_terminate": true}:该参数好像是说docker部署下面,如果shell退出会导致程序终止,未尝试出来有啥区别
因为server端和client端都在同一台,所以需要修改client端的服务端口
-server-port=18300:参考上文8300端口的解释
-http-port=18500:参考上文8500的端口解释
-dns-port=18600:参考上文8600的端口解释
-serf-lan-port=18301:参考上文8301端口的解释
-serf-wan-port=18302:参考上文8302端口的解释
-retry-join=:写server端的地址,注意这里有三个retry-join,如果第一个节点的挂了,client端会自动注册到第二个节点,保证业务系统的正常运行,但是在切换过程中会出现短暂的从consul查不到数据的情况