简言
1. 使用consul单节点有宕机,数据丢失的风险,为了安全,使用consul集群更靠谱
2. consul的各个版本下载地址在 Consul Versions | HashiCorp Releases
3. 本文使用consul的版本是consul1.15.1,所以请下载名字为 consul_1.15.1_linux_amd64.zip 的文件即可
4. 本次教程用到了三台机器,分别是 192.168.5.101,192.168.5.46,192.168.5.47
准备操作(注意:三台机器上都需要执行)
1. 打开网址 Consul Versions | HashiCorp Releases 下载consul的安装包,下载到 /usr/local/bin 目录,如下图
2. 运行命令 unzip consul_1.15.1_linux_amd64.zip 解压到当前目录,consul就是我们要使用的bin文件了。运行命令 consul --version 查看版本确实是v1.15.1, 如下图
3. 运行命令 mkdir consul_1.15.1 创建目录 consul_1.15.1,我们的目的是把本次实验的东西都放在这个目录下
进入到刚才创建的目录 consul_1.15.1
执行命令 mkdir data 创建data目录,用以存放consul的数据
执行命令 mkdir config 创建config目录,用以存放consul使用的配置文件
最终如下图
开始搭建集群
步骤1. 在机器 192.168.5.101 上的目录 /usr/local/bin/consul_1.15.1,新建文件 cluster.sh 内容如下
nohup ../consul agent -server -data-dir=./data -node=server1 -bind=192.168.5.101 -client=192.168.5.101 -advertise=192.168.5.101 -bootstrap-expect=3 -datacenter=datacenter1 -ui -enable-script-checks=true -config-dir=./config -server-port=8300 -serf-lan-port=8301 -serf-wan-port=8302 -http-port=8500 -dns-port=8600 > consul.log 2>&1 &
这里逐个属性解释下
nohup linux常用命令,表连接服务器的终端退出后,本次启动的进程不中断
agent 以代理模式启动
-server 以server模式启动,不设置时默认以client模式启动
-data-dir=./data 表consul的数据存放在当前目录下的data文件夹
-node=server1 本consul节点的名字,该名字在集群内不重复即可。这里暂用server1表第一个consul节点服务
-bind=192.168.5.101 内部集群通信,本consul节点绑定的地址
-client=192.168.5.101 绑定的客户端接口地址,客户端可以通过该地址连接到本consul
-advertise=192.168.5.101 内部集群通信时广播出去的IP地址,不设置时默认使用bind属性的IP作为集群内广播
-bootstrap-expect=3 表consul集群期望的consul节点数量,consul会等待这么多个consul节点可用时才会开始搭建集群,选举leader节点
datacenter=datacenter1 指定数据中心的名字,不同的cosul节点可以共用同一个数据中心
-enable-script-checks=true
-config-dir=./config 指定本consul进程使用的配置文件的路径
-server-port=8300 选取Leader节点(raft协议通信)和提供RPC调用时,consul节点之间的通信端口
-serf-lan-port=8301 集群通信端口,用在LAN网
-serf-wan-port=8302 数据中心通信端口,用在WAN网
-http-port=8500 提供http服务的端口
-dns-port=8600 提供dns服务的端口
> consul.log 意思是把进程的标准输出重定向到consul.log文件,没有该文件时会自动新建
2>&1 意思是进程的标准错误和进程的标准输出一样,也就是同样重定向到consul.log文件
& linux常用命令,表后台执行,这样进程的输出不要输出到当前终端上
步骤2. 执行命令 bash ./cluster.sh 启动本机consul节点,然后 ps aux |grep consul 查看consul进程,可以看到consul进程已经启动成功,如下图,73627即consul节点进程
步骤3.在浏览器上输入地址 http://192.168.5.101:8500,consul会自动转到 192.168.5.101:8500/ui/datacenter1/services 可以看到此时consul返回了错误,“No cluster leader”,意为consul进程启动成功了,但是没有leader节点,不能提供任何服务
步骤4. 在机器 192.168.5.46 上同样执行步骤1 ,步骤2,只是要先对cluster.sh修改
4.1 把cluster.sh中的 -node 的值改为serve2
4.2 把所有的ip(-bind,-client,-advertise)都修改成192.168.5.46
4.3 增加 -join=192.168.5.101:8301 意思是加入到机器192.168.5.101的consul集群中
其他内容可不变,如下
nohup ../consul agent -server -data-dir=./data -node=server2 -bind=192.168.5.46 -client=192.168.5.46 -advertise=192.168.5.46 -join=192.168.5.101:8301 -bootstrap-expect=3 -datacenter=datacenter1 -ui -enable-script-checks=true -config-dir=./config -server-port=8300 -serf-lan-port=8301 -serf-wan-port=8302 -http-port=8500 -dns-port=8600 > consul.log 2>&1 &
然后执行 bash ./cluster 启动consul,再ps查看下,以确保consul进程真的启动成功了
特别注意:此时在浏览器中输入地址 192.168.5.101:8500 或者 192.168.5.46:8500 查看,一样失败,因为consul节点数只有2个,不足我们指定的 -bootstrap-expect=3 ,所以consul尚未进行集群选举,没有leader节点
步骤5. 在机器 192.168.5.47 上同样执行步骤1 , 步骤2,只是要先对cluster.sh修改
5.1 把cluster.sh中的 -node 的值改为serve3
5.2 把所有的ip(-bind,-client,-advertise)都修改成192.168.5.47
5.3 增加 -join=192.168.5.101:8301 意思是加入到机器192.168.5.101的consul集群中
其他内容可不变,如下
nohup ../consul agent -server -data-dir=./data -node=server3 -bind=192.168.5.47 -client=192.168.5.47 -advertise=192.168.5.47 -join=192.168.5.101:8301 -bootstrap-expect=3 -datacenter=datacenter1 -ui -enable-script-checks=true -config-dir=./config -server-port=8300 -serf-lan-port=8301 -serf-wan-port=8302 -http-port=8500 -dns-port=8600 > consul.log 2>&1 &
然后执行 bash ./cluster 启动consul,再ps查看下,以确保consul进程真的启动成功了
步骤6: 再次在浏览器上输入地址 http://192.168.5.101:8500,consul会自动转到 192.168.5.101:8500/ui/datacenter1/services 可以看到此时consul集群已经组建成功,如下图
点击左侧列表的Nodes,可以查看所有的consul节点,如下图,其中sever1为leader节点
步骤7. 测试集群,我们把机器192.168.5.101的consul进程关掉, 在浏览器上输入地址 http://192.168.5.101:8500 会看到已经无法连接通了,如下图
我们再在浏览器上输入地址 http://192.168.5.46:8500 即另一个机器的consul地址,可以看到consul集群仍在,新的leader节点已经选举成功,这次是切换成了 192.168.5.47,如下图
说明3个consul节点的集群,当consul主节点出问题时,剩下的2个consul节点会自动选举出新的leader节点