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

字母哥博客 字母哥博客     2022-12-03     246

关键词:

  • 一、准备工作
  • 1.1. 规划主机服务器
  • 1.2. 新建etcd用户
  • 1.3.开放防火墙端口
  • 1.4.创建必要的目录
  • 1.5.下载etcd并解压
  • 1.6. 集群主机免密登陆
  • 二、集群启动与验证
  • 2.1. 一键启动脚本实现
  • 2.2.验证集群


本专栏的上一篇文章写了《长篇图解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。也不要太多,节点之间会有数据复制保证数据一致性,节点越多网络及服务器性能消耗越大。需要确保服务器之间的网络联通性。

etcd

使用root用户在​​/etc/hosts​​文件中追加如下的配置,使主机名称hostname与ip之间建立映射关系。访问peer1就是访问对应的主机ip。

192.168.161.3       peer1
192.168.161.4 peer2
192.168.161.5 peer3

1.2. 新建etcd用户

在CentOS的linux发行版下,执行如下命令会创建用户及用户组etcd,并自动创建​​/home/etcd​​​目录。如果你使用的是其他的操作系统发行版,可能需要使用​​useradd​​命令,并自行创建这个目录。

groupadd etcd
adduser -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
  • 将公钥分发给peer1、peer2主机。按提示输入kafka登录密码
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=3
CLUSTER_TOKEN=etcdcluster01
DATADIR=/home/etcd/data
HOSTNAME1=peer1
HOSTNAME2=peer2
HOSTNAME3=peer3
HOSTIP1=192.168.161.3
HOSTIP2=192.168.161.4
HOSTIP3=192.168.161.5
CLUSTER=$HOSTNAME1=http://$HOSTIP1:2380,$HOSTNAME2=http://$HOSTIP2:2380,$HOSTNAME3=http://$HOSTIP3:2380
CLUSTER_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 &
EOF
echo 从节点 $nodename 启动etcd节点...[ done ]

sleep 5
done

这个脚本分成两个部分,第一个部分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

etcd

上面的命令结果中能看到状态是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节点:

etcd

「码文不易,如果您觉得有帮助,请帮忙点击在看或者分享,没有您的支持我可能无法坚持下去!」

欢迎关注公众号:字母哥杂谈




2021年大数据kafka:❤️kafka的集群搭建以及shell启动命令脚本编写❤️(代码片段)

...;帮助大家回顾前面的知识重点。目录系列历史文章Kafka的集群搭建以及shell启动命令脚本编写一、搭建Kafka集群1、将Kafka的安装包上传到虚拟机,并解压2、修改server.properties3、将安装好的kafka复制到另外两台服务器4、配置 查看详情

如何使用容器实现生产级别的mongodbsharding集群的一键交付(代码片段)

...o集群的成熟度已经非常稳定,被大量公司用到自己的生产环境下。如何使用容器技术来实现Mongo集群的一键式交付部署,屏蔽底层实现的细节,是很多人关心的话题。本文将给大家介绍基于进程的容器技术实现Mongoshar... 查看详情

docker环境下使用docker-compose一键式搭建rocketmq(4.5.0版本)集群及其管理工具(外网版)(代码片段)

前言本节内容延续前期博客内容,使用docker-compose一键式搭建docker环境下的RocketMQ集群及其管理工具,实现rocketmq在docker环境容器外部访问。特别说明,内网版的RocketMQ集群只能实现docker环境内部访问,并不适用于... 查看详情

使用docker一键搭建hadoop,hbase,hive等大数据集群(代码片段)

...oop162,hadoop163,hadoop164容器构建后,直接可用的环境包括hadoop集群zookeeper集群kafka集群hbase集群es集群redishivesparkPhoenix容器启动说明contains.shstart启动集群容器启动的时候会自动根据当前宿主机的ip进行配置,3个容器的ip分别是xxx.162,xxx.16... 查看详情

docker启动redis服务以及搭建redis集群(代码片段)

...is启动下载redis镜像dockerpullredis由于docker镜像的redis是精简版本的所以没有配置文件和数据存储目录,需要在启动容器时候做映射,把自己配置好redis配置文件,通过数据卷挂载进来,再次以配置文件启动redis容器服... 查看详情

kubernetes(k8s)生产级实践指南从部署到核心应用

第1章课程简介【学前须知】本章对这门课程进行说明,包括:课程整体设计思路、课程使用的技术介绍、课程的学习规划、高效学习的方式方法等。第2章kubernetes快速入门【k8s必知必会】本章中将从核心概念、架构设计、认证授... 查看详情

脚本一键启动zk,kafka集群(代码片段)

一zk的一键启动脚本注意:停止Kafka集群时,一定要等Kafka所有节点进程全部停止后再停止Zookeeper集群。因为Zookeeper集群当中记录着Kafka集群相关信息,Zookeeper集群一旦先停止,Kafka集群就没有办法再获取停止进程的... 查看详情

用kubeadm部署生产级k8s集群(代码片段)

概述kubeadm?已?持集群部署,且在1.13?版本中?GA,?持多?master,多?etcd?集群化部署,它也是官?最为推荐的部署?式,?来是由它的?sig?组来推进的,?来?kubeadm?在很多??确实很好的利?了?kubernetes?的许多特性,接下来?篇我们来实践并了解... 查看详情

docker环境下使用docker-compose一键式搭建rocketmq(4.5.0版本)集群及其管理工具(代码片段)

前言本节我们主要讲解下如何使用docker-compose一键式搭建一套RocketMQ的消息中间键集群服务,在项目开发中kafka与rockerMQ应该是我们最常用的消息中间键,为了最大化的利用系统资源,便于研究测试,docker容器搭建... 查看详情

elk中的elasticsearch集群的部署

...earch(以下简称ES)搭建集群的经验。以Elasticsearch-rtf-2.2.1版本为例。我搭过三个集群:研究ELK时搭了一个;测试环境搭了一个;生产环境搭了一个。回想起来,搭建这三个集群时遇到的问题都不一样(我这么说,主要针对集群中... 查看详情

大数据集群一键启动脚本(代码片段)

1.一键启动大数据集群启动脚本,包括zk,hadoop,spark,kafka,hbase,redisclickhouse。vistartall.sh#!/bin/bashSPARK_HOME=/opt/module/sparkREDIS_HOME=/opt/module/redis/bin/zk_shtd.shstart/bin/hadoop_shtd.shstart/bin/hive_shtd.shstart$SPARK_HOM... 查看详情

搭建zookeeper集群(代码片段)

...ookeeper集群官网下载https://zookeeper.apache.org/我下载的是3.5.7版本修改配置文件在/opt/module/zookeeper-3.5.7/zkData目录下创建一个myid的文件(自己先创一个zkData用来存储数据)一定要是myid的名字文档内容为ID号&# 查看详情

kakfa从入门到放弃:kafka入门,环境搭建,命令行操作(代码片段)

...队列:1.消息队列:2.消息队列中间:3.消息队列的应用场景:4.生产者,消费者模型:5.消息队列的两种模式:5.1点对点模式5.2发布订阅模式二、Kafka简介:1.什么是kafka2,应用场景:3.kafka生态圈三、kafka环境部署1.搭建集群环境2.目录结构3.onekey... 查看详情

kubernetes最新版本1.15.1,shell脚本一键部署,刚刚完成测试,实用。(代码片段)

根据上一篇博客内容,《K8S最新版本集群部署超详细(k8s版本1.5.1)docker版本19.03.1以及基本操作和服务介绍》文章目录1.k8s-openrc.sh脚本内容2.K8SMaster节点的脚本3.K8SWorker节点脚本由于自己一步一步安装,步骤有些不... 查看详情

1.5小时!一键部署oracle11gr2rac集群

...ttps://github.com/pc-study/InstallOracleshell一、主机准备节点主机版本主机内存主机磁盘空间主机网卡ASM盘rac01redhat7. 查看详情

使用docker一键搭建hadoop,hbase,hive等大数据集群(代码片段)

注意资源的下载地址:链接:https://pan.baidu.com/s/1jB3j_wKFOXaWOfVR9o9WVg?pwd=f16j提取码:f16j有问题联系我:lizhenchao@atguigu.cn脚本的运行环境:centos7.5+目录说明不要更改docker_bigdata及子目录的目录结构进入到docker_bigdata目录下再执行脚... 查看详情

mysql从入门到精通50讲(三十二)-scylladb生产环境集群搭建

...CS:32C/128G/8T(存储优化IO型本地NVMeSSD直通盘)×5台操作系统版本CentOSLinuxrelease7.4.1708(Core)操作系统内核版本3.10.0-693.el7.x86_64ScyllaDB版本4.4.4因为ScyllaDB集群的数据最终会以SSTable文件方式落盘,所以对磁盘的性能要求非常高, 查看详情

mysql从入门到精通50讲(三十二)-scylladb生产环境集群搭建

...CS:32C/128G/8T(存储优化IO型本地NVMeSSD直通盘)×5台操作系统版本CentOSLinuxrelease7.4.1708(Core)操作系统内核版本3.10.0-693.el7.x86_64ScyllaDB版本4.4.4因为ScyllaDB集群的数据最终会以SSTable文件方式落盘,所以对磁盘的性能要求非常高, 查看详情