当前位置: 首页 > 后端技术 > Java

etcdv3版本生产级集群搭建及一键启动脚本实现

时间:2023-04-02 10:24:34 Java

本专栏上一篇文章写了《长篇图解etcd核心应用场景及编码实战》,本文继续。后续计划章节如下:《长篇图解etcd核心应用场景及编码实战》《搭建高可用etcd集群》《基于etcd实现分布式锁(java代码实现)》《基于etcd实现配置变更通知(java代码实现)》《基于etcd实现服务注册与发现(java代码实现)》《基于etcd实现分布式系统节点leader选举(java代码实现)》很多人都知道etcd是基于kubernetes的,所以搭建etcd集群最常用的方法就是通过k8s配置启动etcd集群。但是,除了配合k8s使用etcd之外,还有很多其他的应用场景,比如:分布式锁、配置变更通知、分布式系统中多节点的leader选举等。因此,本文介绍的etcd集群安装与k8s,也就是直接在linux服务器上安装etcd高可用服务集群。1.准备工作以下准备工作必须在三台服务器上完成。1.1.规划宿主服务器首先需要规划服务器,因为etcd集群需要选举Leader,所以集群节点数建议3个或者5个,不要太多,节点之间会有数据复制到保证数据一致性,节点越多,对网络和服务器性能消耗越大。需要确保服务器之间的网络连接。使用root用户在/etc/hosts文件中添加如下配置,建立主机名hostname和ip的映射关系。访问peer1就是访问对应的主机ip。192.168.161.3peer1192.168.161.4peer2192.168.161.5peer31.2。创建etcd用户在CentOSLinux发行版下,执行以下命令创建etcd用户和用户组,并自动创建/home/etcd目录。如果您使用的是其他操作系统发行版,您可能需要使用useradd命令并自行创建此目录。groupaddetcdadduser-getcdetcd使用root用户创建新用户和用户主目录。默认新用户没有密码,可以使用passwdetcd命令为其设置密码。1.3.打开防火墙端口要打开防火墙,使用以下三个命令打开etcd的标准端口2379和2380。在实际安装过程中,笔者通常不会使用这两个端口,因为端口越固定,被攻击的可能性就越大。我们随机选择一个不常用的端口,安全性会好一些。这里我还是使用标准端口。集群中各节点通过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命令解压,不用多说了。wgethttps://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-trsa将公钥保存到authorized_keys文件cat~/.ssh/id_rsa.pub>~/.ssh/authorized_keys将公钥分发到peer2和peer3主机。根据提示输入etcd的登录密码ssh-copy-id-i~/.ssh/id_rsa.pub-p22etcd@peer2;需要单独执行,因为执行命令的时候需要输入密码。ssh-copy-id-i~/.ssh/id_rsa.pub-p22etcd@peer3;这样就完成了peer1免密登录peer2和peer3的配置。在peer2和peer3服务器上进行同样的操作,将自己的公钥发送给另外两台服务器,并替换主机名。这样设置完成后,我们可以在三台服务器任意一台etcd用户下执行sshetcd@peer3登录peer3,无需输入密码,证明我们操作成功。2.集群启动与验证2.1.一键启动脚本完成以上准备工作。其实我们的etcd集群安装已经完成了。实际安装动作是解压。解压目录下的etcd、etcdctl、etcdutl均有可执行文件,可直接使用。接下来,我们使用这个脚本来启动etcd集群(你只需要在3个计划的服务器中的任何一个上执行一次脚本)。我们将此脚本命名为start-etcds.sh,并赋予其可执行权限。#!/bin/bash##----------config----------------exportETCDCTL_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})##--------------启动etcd节点----------------foriin$(seq0`expr${#CLUSTER_IPS[@]}-1`);做nodeip=${CLUSTER_IPS[i]}nodename=${CLUSTER_NAMES[i]}ssh-T$nodeip<>${DATADIR}/etcd.log2>&1&EOFecho来自节点$nodename启动etcd节点...[done]sleep5done这个脚本分为两部分,第一部分config是我们自定义的shell脚本变量exportETCDCTL_API=3意味着使用版本号为3的etcdctlAPICLUSTER_TOKEN用于etcd集群有一个唯一的令牌,可以随意设置以确保唯一性。DATADIR表示etcd的数据盘存放路径。HOSTNAME1、2、3表示我们事先规划的三台服务器的主机名,即hostname命令在linux主机上的执行结果。HOSTIP1、2、3代表我们事先规划的三台服务器的IP地址。(如果有多个网卡,请选择对外提供服务的网卡ip。)CLUSTER是etcd集群配置的标准格式。CLUSTER_IPS和CLUSTER_NAMES是集群服务器各节点的ip和主机名数组。第二部分是etcd集群的启动脚本。因为我们已经配置了etcd用户的hosts可以免密登录,所以我们可以通过脚本在三台服务器上启动etcd服务。我在$(seq0expr${#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的新集群,以及加入现有集群的节点由现有--initial-cluster-token集群的令牌唯一标识。2.2.验证集群使用etcdctlmemberlist查看当前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\memberlist在上面的命令结果中可以看到状态是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\endpointstatus-w表显示如下结果。可以看出“ISLEADER=true”的节点是集群的leader节点:代码文字不易,如果觉得对你有帮助,请点击观看或分享,没有你的支持,我可能不会能坚持!欢迎关注我的公告号:字母哥杂谈,回复003送作者专栏《docker修炼之道》30余篇优质docker文章PDF版。Antetokounmpo博客:zimug.com