乐趣区

关于java: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

退出移动版