etcd v3版本生产级集群搭建以及实现一键启动脚本
本专栏的上一篇文章写了《长篇图解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 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
- 将公钥分发给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=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
上面的命令结果中能看到状态是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
etcd v3版本生产级集群搭建以及实现一键启动脚本的更多相关文章
- Neo4j 2.0 生产环境集群搭建
一.在windows上搭建Neo4j ha cluster的配置方法: 例如:建立集群的三台机器的ip分别为:10.230.9.91,10.230.9.92,10.230.9.93. 10.230.9 ...
- quay.io/coreos/etcd 基于Docker镜像的集群搭建
etcd是一个高可用的键值存储系统,主要用于共享配置和服务发现.etcd是由CoreOS开发并维护的,灵感来自于 ZooKeeper 和 Doozer,它使用Go语言编写,并通过Raft一致性算法处理 ...
- Etcd学习(二)集群搭建Clustering
1.单个etcd节点(测试开发用) 之前我一直开发测试一直是用的一个Etcd节点,然后启动命令一直都是直接打一个etcd(我已经将etcd安装目录的bin目录加入到PATH环 境变量中),然后启动信息 ...
- Centos7下Etcd集群搭建
一.简介 "A highly-available key value store for shared configuration and service discovery." ...
- 使用Ansible部署etcd 3.2高可用集群
之前写过一篇手动搭建etcd 3.1集群的文章<etcd 3.1 高可用集群搭建>,最近要初始化一套新的环境,考虑用ansible自动化部署整套环境, 先从部署etcd 3.2集群开始. ...
- hadoop2.2.0集群搭建与部署
原创文章,转载请注明: 转载自http://www.cnblogs.com/tovin/p/3818908.html 一.安装环境 1.系统环境 CentOS 6.4 2.集群机器节点ip 节点一i ...
- Redis学习笔记(5)—— Redis的持久化方案&Redis的集群搭建
一.Redis的持久化方案 Redis的高性能是由于其将所有数据都存储在了内存中,为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程就是持久化. Redis支持两种 ...
- Kubernetes-3.3:ETCD集群搭建及使用(https认证+数据备份恢复)
etcd集群搭建 环境介绍 基于CentOS Linux release 7.9.2009 (Core) ip hostname role 172.17.0.4 cd782d0a790b etcd1 ...
- MongoDBV3.0.7版本(shard+replica)集群的搭建及验证
集群的模块介绍: 从MongoDB官方给的集群架构了解,整个集群主要有4个模块:Config Server.mongs. shard.replica set: Config Server:用来存放集群 ...
随机推荐
- nginx转发rabbitmq
第一种: 直接加个location块 location /rabbitmq/ { proxy_pass http://127.0.0.1:15672/; } 第二种: location /rabbit ...
- UML图记忆技巧
什么是UML类图 Class Diagram:用于表示类.接口.实例等之间相互的静态关系 虽然名字叫类图,但类图中并不只有类 记忆技巧 UML箭头方向: 从子类指向父类 我相信 很多同学都会有和我一样 ...
- APISpace 成语大全API接口 免费好用
成语有一个很大一部分是从古代相承沿用下来的,在用词方面往往不同于现代汉语,它代表一个故事或者典故.成语又是一种现成的话,跟习用语.谚语相近,但是也略有区别.成语是中华文化中的一颗璀璨的明珠. 成语 ...
- Solution -「Luogu 4135」作诗
写在前面 & 前置芝士 好像是好久没有打理 blog 了.感觉上学期是有点颓.嘶,初三了好好冲一次吧. 那么回到这道题目.你会分块就能看懂. 题目大意 先挂个来自洛谷的 link. ...
- day03_2_流程控制
# 流程控制 学习目标: ~~~txt1. idea安装与使用2. 流程控制if...else结构3. 流程控制switch结构4. 流程控制循环结构5. 流程控制关键字~~~ # 一.流程控制概述 ...
- .Net CLR R2R编译的原理简析
前言 躺平了好一段时间了,都懒得动了.本文均为个人理解所述,如有疏漏,请指正. 楔子 金庸武侠天龙八部里面,少林寺至高无上的镇寺之宝,武林人士梦寐以求的内功秘笈易筋经被阿朱偷了,但是少林寺也没有大张旗 ...
- python 文件操作(读写等)
简介 在实际开发中我们需要对文件做一些操作,例如读写文件.在文件中新添内容等,通常情况下,我们会使用open函数进行相关文件的操作,下面将介绍一下关于open读写的相关内容. open()方法 ope ...
- 筛 sigma_k
问题 定义 \(\sigma_k(n)\) 表示 \(n\) 的所有约数的 \(k\) 次方和,即 \[\sigma_k(n)=\sum_{d\mid n}d^k \] 问题:求 \(\sigma_k ...
- PHP小工具
防SQL注入 function clean($input) { if (is_array($input)) { foreach ($input as $key => $val) { $outpu ...
- Python3的单元测试模块Mock与性能测试模块CProfile
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_92 我们知道写完了代码需要自己跑一跑进行测试,一个写好的程序如果连测试都没有就上到生产环境是不敢想象的,这么做的人不是太自信就是太 ...