本专栏的上一篇文章写了《长篇图解etcd外围利用场景及编码实战》,本文持续。后续打算章节内容如下:
- 《长篇图解etcd外围利用场景及编码实战》
- 《搭建高可用etcd集群》
- 《基于etcd实现分布式锁(java代码实现)》
- 《基于etcd实现配置变更告诉(java代码实现)》
- 《基于etcd实现服务注册与发现(java代码实现)》
- 《基于etcd实现分布式系统节点leader选举(java代码实现)》
很多人晓得etcd是因为kubernetes,所以最罕用的etcd集群的搭建办法是通过k8s来配置启动一个etcd集群。然而etcd除了搭配k8s进行应用,还有很多其余的利用场景,比方:分布式锁、配置变更告诉、分布式系统多节点的leader选举等。所以此文为大家介绍的etcd集群装置脱离k8s,就是在linux服务器上间接装置etcd的高可用服务集群。
一、筹备工作
以下的筹备工作在三台服务器上都要实现
1.1. 布局主机服务器
首先须要布局服务器,因为etcd集群须要选举Leader,所以倡议集群节点的个数是3或者5。也不要太多,节点之间会有数据复制保证数据一致性,节点越多网络及服务器性能耗费越大。须要确保服务器之间的网络联通性。
应用root用户在/etc/hosts
文件中追加如下的配置,使主机名称hostname与ip之间建设映射关系。拜访peer1就是拜访对应的主机ip。
192.168.161.3 peer1192.168.161.4 peer2192.168.161.5 peer3
1.2. 新建etcd用户
在CentOS的linux发行版下,执行如下命令会创立用户及用户组etcd,并主动创立/home/etcd
目录。如果你应用的是其余的操作系统发行版,可能须要应用useradd
命令,并自行创立这个目录。
groupadd etcdadduser -g etcd etcd
应用root用户新建用户及用户主目录。默认的新建用户是没有明码,能够应用passwd etcd
命令为其设置明码。
1.3.凋谢防火墙端口
凋谢防火墙,应用如下3条命令凋谢etcd的规范端口2379、2380的端口。笔者在理论装置的过程中,通常不应用这2个端口,因为端口越固定,被攻打的可能性就越大。咱们随机抉择一个不罕用的端口,安全性会更好一些,这里我还是应用规范端口了。集群外部的各个节点通过2380端口进行通信,2379端口负责对外与客户端通信
firewall-cmd --zone=public --add-port=2379/tcp --permanent;firewall-cmd --zone=public --add-port=2380/tcp --permanent;firewall-cmd --reload
应用root用户操作防火墙。
1.4.创立必要的目录
应用su - etcd
从root用户切换到etcd用户,在etcd用户的主目录/home/etcd
上面新建如下的目录, 用于etcd数据存储
mkdir -p /home/etcd/data;
1.5.下载etcd并解压
etcd用户下载etcd安装包,从github上下载比较慢,我抉择的是国内华为云提供的减速镜像。如果你不想应用我的版本,你也能够搜寻“etcd国内下载减速”抉择本人须要的版本。wget命令下载,tar命令进行解压,这个不用多说。
wget https://mirrors.huaweicloud.com/etcd/v3.5.4/etcd-v3.5.4-linux-amd64.tar.gz;tar -xzvf /home/etcd/etcd-v3.5.4-linux-amd64.tar.gz;
1.6. 集群主机免密登陆
后续咱们在进行etcd运维,比如说启动集群的时候不心愿一台服务器一台服务器的执行命令,而是心愿在一台服务器上实现操作,这就须要集群etcd用户之间可能免密登陆对方。这里我就简略介绍了,解说该如何实现,原理大家搜文章学习下。etcd权限用户根目录下执行如下命令,不管提醒输出什么,一路回车即可。
ssh-keygen -t rsa
将公钥保留到authorized_keys文件中
cat ~/.ssh/id_rsa.pub > ~/.ssh/authorized_keys
- 将公钥分发给peer2、peer3主机。按提醒输出etcd的登陆密码
ssh-copy-id -i ~/.ssh/id_rsa.pub -p22 etcd@peer2;
须要离开执行,因为执行命令的过程中须要输出明码。
ssh-copy-id -i ~/.ssh/id_rsa.pub -p22 etcd@peer3;
这样,咱们peer1免密登录peer2、peer3的配置工作就实现了。 同样的操作,在peer2、peer3服务器上执行,将本人的公钥发给另外2台服务器,主机名称替换一下。这样设置实现之后,咱们在这三台服务器中的任意一台服务器上etcd用户下执行如ssh etcd@peer3
就能够登陆peer3,不须要输出明码,证实咱们的操作胜利了。
二、集群启动与验证
2.1. 一键启动脚本实现
实现下面的筹备工作,实际上咱们的etcd集群装置就曾经实现了,理论的装置动作就是解压,解压目录下的etcd、etcdctl、etcdutl都是可执行文件,能够间接应用。
上面咱们应用这个脚本来启动etcd集群(只须要在布局好的3台服务器上任意一台执行一次该脚本即可)。咱们给这个脚本起个名字start-etcds.sh
,并给它赋予可执行权限。
#!/bin/bash## ------------config-----------------export ETCDCTL_API=3CLUSTER_TOKEN=etcdcluster01DATADIR=/home/etcd/dataHOSTNAME1=peer1HOSTNAME2=peer2HOSTNAME3=peer3HOSTIP1=192.168.161.3HOSTIP2=192.168.161.4HOSTIP3=192.168.161.5CLUSTER=${HOSTNAME1}=http://${HOSTIP1}:2380,${HOSTNAME2}=http://${HOSTIP2}:2380,${HOSTNAME3}=http://${HOSTIP3}:2380CLUSTER_IPS=(${HOSTIP1} ${HOSTIP2} ${HOSTIP3})CLUSTER_NAMES=(${HOSTNAME1} ${HOSTNAME2} ${HOSTNAME3})## ---------------start etcd node------------------for i in $(seq 0 `expr ${#CLUSTER_IPS[@]} - 1`); do nodeip=${CLUSTER_IPS[i]} nodename=${CLUSTER_NAMES[i]} ssh -T $nodeip <<EOF nohup /home/etcd/etcd-v3.5.4-linux-amd64/etcd \ --name ${nodename} \ --data-dir ${DATADIR} \ --initial-advertise-peer-urls http://${nodeip}:2380 \ --listen-peer-urls http://${nodeip}:2380 \ --advertise-client-urls http://${nodeip}:2379 \ --listen-client-urls http://${nodeip}:2379 \ --initial-cluster ${CLUSTER} \ --initial-cluster-state new \ --initial-cluster-token ${CLUSTER_TOKEN} >> ${DATADIR}/etcd.log 2>&1 &EOFecho 从节点 $nodename 启动etcd节点...[ done ]sleep 5done
这个脚本分成两个局部,第一个局部config是咱们自定义的shell脚本变量
export ETCDCTL_API=3
示意应用版本号为3的etcdctl API。- CLUSTER_TOKEN一个etcd集群有一个惟一的token,随便设置保障唯一性即可。
- DATADIR示意etcd的数据磁盘存储门路
- HOSTNAME1、2、3示意咱们当时布局好的3台服务器的主机名称,即:linux主机
hostname
命令的执行后果。 - HOSTIP1、2、3示意咱们当时布局好的3台服务器的IP地址。(如果有多块网卡,请抉择对外提供服务的网卡ip)
- CLUSTER是etcd集群配置的规范格局
- CLUSTER_IPS、CLUSTER_NAMES别离是集群服务器各节点的ip和主机名称数组
第二个局部是etcd集群的启动脚本,因为咱们曾经配置了etcd用户的主机之间免密登陆,所以能够通过一个脚本启动3台服务器上的etcd服务。
for i in $(seq 0
expr ${#CLUSTER_IPS[@]} - 1); do
示意for循环,循环CLUSTER_IPS数组的长度赋值给i,所以i随着for循环顺次等于1、2、3。- nodeip、nodename等于CLUSTER_IPS、CLUSTER_NAMES数组中下标为i的元素,即:主机的ip、主机的名称。
- for循环遍历3台服务器,顺次应用
ssh -T $nodeip
登陆3台服务器,因为上文曾经做过免密登陆,所以无需明码。 - EOF作为段落宰割,其中间包裹的命令就是etcd实例的启动命令。
etcd的启动命令如下:
/home/etcd/etcd-v3.5.4-linux-amd64/etcd
:启动etcd
命令--name
: etcd节点名称,保障唯一性,咱们应用etcd所部署的主机名称即可。--data-dir
: etcd数据存储地位--initial-advertise-peer-urls
,--listen-peer-urls
指定以后节点与集群内其余节点通信的url。如果该节点存在网络代理,--initial-advertise-peer-urls
设置为代理的地址:2379。--advertise-client-urls
,--listen-client-urls
指定客户端与以后节点通信的url。如果该节点存在网络代理,--advertise-client-urls
设置为代理的地址:2380。--initial-cluster
集群各节点的通信地址列表--initial-cluster-state
新建的级群应用new,一个节点退出曾经存在的集群用existing--initial-cluster-token
集群的token惟一标识。
2.2.验证集群
应用etcdctl member list
查看以后的etcd集群蕴含多少个节点以及节点的状态
/home/etcd/etcd-v3.5.4-linux-amd64/etcdctl \--endpoints=192.168.161.3:2379,192.168.161.4:2379,192.168.161.5:2379 \member list
下面的命令后果中能看到状态是started证实咱们的集群处于失常运行状态。如果想查问集群内那个节点是Leader节点,我更常常应用的命令是上面的这个
/home/etcd/etcd-v3.5.4-linux-amd64/etcdctl \--endpoints=192.168.161.3:2379,192.168.161.4:2379,192.168.161.5:2379 \endpoint status -w table
显示后果如下。能够看到“IS LEADER=true”的节点是集群的Leader节点:
码文不易,如果您感觉有帮忙,请帮忙点击在看或者分享,没有您的反对我可能无奈坚持下去!
欢送关注我的布告号:字母哥杂谈,回复003赠送作者专栏《docker修炼之道》的PDF版本,30余篇精品docker文章。字母哥博客:zimug.com