目录
(1).下载
(2).etcd配置文件与启动
1.etcd启动参数说明
2.启动脚本模版
3.启动etcd集群
(3).验证etcd集群
(4).参考资料
一共3台机器。每台机器都需要按照如下步骤进行。
每台机器部署一个etcd实例:etcd-master1、etcd-master2、etcd-master3。
统一在用户app下操作,这是良好习惯。
(1).下载
下载页面:
https://github.com/etcd-io/etcd/releases
选择最新稳定版:3.5.0
wget https://github.com/etcd-io/etcd/releases/download/v3.5.0/etcd-v3.5.0-linux-amd64.tar.gz
mv etcd-v3.5.0-linux-amd64 etcd-v3.5.0
mv etcd-v3.5.0 /app/3rd
ln -s /app/3rd/etcd-v3.5.0/etcd /usr/local/bin/etcd
ln -s /app/3rd/etcd-v3.5.0/etcdctl /usr/local/bin/etcdctl
ln -s /app/3rd/etcd-v3.5.0/etcdutl /usr/local/bin/etcdutl
export PATH="$PATH:/usr/local/bin"
在root和app用户下都要执行:
source /etc/profile
(2).etcd配置文件与启动
1.etcd启动参数说明
nohup /usr/local/bin/etcd
#方便理解的节点名称,默认为 default,在集群中应该保持唯一,可以使用 hostname
--name=etcd-current-master-node-name
#节点与其他节点通信的地址,会通告给集群的其他成员。这个地址用来传输集群数据。因此这个地址必须是可以被集群中所有的成员访问http://ip:2380
--initial-advertise-peer-urls=http://etcd-current-master-node:2380
#和集群内其他节点通信的地址, http://ip:2380
--listen-peer-urls=http://etcd-current-master-node:2380
#节点与客户端通信的地址,比如 http://ip:2379,http://127.0.0.1:2379,客户端会连接到这里和 etcd 交互
--listen-client-urls=http://etcd-current-master-node:2379,http://127.0.0.1:2379
#对外通告的该节点客户端监听地址,http://ip:2379,这个值会通知集群中其他节点
--advertise-client-urls=http://etcd-current-master-node:2379
#创建集群的 token,这个值每个集群保持唯一。这样的话,如果你要重新创建集群,即使配置和之前一样,也会再次生成新的集群和节点 uuid;否则会导致多个集群之间的冲突,造成未知的错误
--initial-cluster-token=etcd-cluster-for-apisix
#集群中所有节点的信息,格式为 node1=http://ip1:2380,node2=http://ip2:2380,…。注意:这里的 node1 是节点的 --name 指定的名字;后面的 ip1:2380 是 --initial-advertise-peer-urls 指定的值
--initial-cluster=etcd-master0=http://etcd-master0-ip:2380,etcd-master1=http://etcd-master1-ip:2380,etcd-master2=http://etcd-master2-ip:2380
#新建集群的时候,这个值为 new;假如已经存在的集群,这个值为 existing
--initial-cluster-state=new
#服务运行数据保存的路径,默认为 ${name}.etcd
--data-dir=/app/data/etcd
#leader 多久发送一次心跳到 followers。默认值是 100ms
--heartbeat-interval=250
#重新投票的超时时间,如果 follow 在该时间间隔没有收到心跳包,会触发重新投票,默认为 1000 ms
--election-timeout=2000
--log-level='info'
--log-outputs='/app/logs/etcd/etcd.log'
--enable-log-rotation='true'
#fs.StringVar(&cfg.ec.LogRotationConfigJSON, "log-rotation-config-json", embed.DefaultLogRotationConfig, "Configures log rotation if enabled with a JSON logger config. Default: MaxSize=100(MB), MaxAge=0(days,no limit), MaxBackups=0(no limit), LocalTime=false(UTC), Compress=false(gzip)")
--log-rotation-config-json='{"maxsize": 100, "maxage": 7, "maxbackups": 7, "localtime": false, "compress": true}' >/dev/null 2>&1 &
etcd日志使用UTC时间。
2.启动脚本模版
注意要建立启动参数中提到的目录:
mkdir -p /var/lib/etcd
mkdir -p /app/data/etcd
mkdir -p /app/logs/etcd
否则会有问题。
启动脚本模版:
nohup /usr/local/bin/etcd --name=etcd-current-master-node-name --initial-advertise-peer-urls=http://etcd-current-master-node:2380 --listen-peer-urls=http://etcd-current-master-node:2380 --listen-client-urls=http://etcd-current-master-node:2379,http://127.0.0.1:2379 --advertise-client-urls=http://etcd-current-master-node:2379 --initial-cluster-token=etcd-cluster-for-apisix --initial-cluster=etcd-master0=http://etcd-master0-ip:2380,etcd-master1=http://etcd-master1-ip:2380,etcd-master2=http://etcd-master2-ip:2380 --initial-cluster-state=new --data-dir=/app/data/etcd --heartbeat-interval=250 --election-timeout=2000 --log-level='info' --log-outputs='/app/logs/etcd/etcd.log' --enable-log-rotation='true' --log-rotation-config-json='{"maxsize": 100, "maxage": 7, "maxbackups": 7, "localtime": false, "compress": true}' >/dev/null 2>&1 &
master0需要替换的字符:apisix-user-cluster-1是master0
:%s/etcd-current-master-node-name/etcd-master0/g
:%s/etcd-current-master-node/0内网IP/g
:%s/etcd-master0-ip/0内网IP/g
:%s/etcd-master1-ip/1内网IP/g
:%s/etcd-master2-ip/2内网IP/g
master1需要替换的字符:apisix-user-cluster-2是master1
:%s/etcd-current-master-node-name/etcd-master1/g
:%s/etcd-current-master-node/1内网IP/g
:%s/etcd-master0-ip/0内网IP/g
:%s/etcd-master1-ip/1内网IP/g
:%s/etcd-master2-ip/2内网IP/g
master2需要替换的字符:apisix-market-cluster-1是master2
:%s/etcd-current-master-node-name/etcd-master2/g
:%s/etcd-current-master-node/2内网IP/g
:%s/etcd-master0-ip/0内网IP/g
:%s/etcd-master1-ip/1内网IP/g
:%s/etcd-master2-ip/2内网IP/g
验证是否都修改:
grep -i master start.sh
只命中4个。
3.启动etcd集群
启动脚本:start.sh
(3).验证etcd集群
查看集群节点:
etcdctl member list -w table
都不是learner节点就对了(learner节点不参与投票选举)。
但是我们还需要确认leader情况:
etcdctl -w table --endpoints=etcd0:2379,etcd1:2379,etcd2:2379 endpoint status
leader正常。
或者直接使用:这样不用写--endpoints
etcdctl endpoint status --cluster -w table
再查看一下健康情况:
etcdctl endpoint health --cluster -w table
(4).参考资料
1.Clustering Guide
https://etcd.io/docs/v3.5/op-guide/clustering/
2.快速搭建高可用 ETCD 集群
https://mp.weixin.qq.com/s/HLSh6iknGvsSWYb9p1I-kg
3.Etcd 的分布式一致性详解
https://fuckcloudnative.io/posts/etcd-server-learner/