• 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
    • 3
    • 4

    1.2. 新建etcd用户

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

    groupadd etcd
    adduser -g etcd etcd
    
    
    • 1
    • 2
    • 3

    使用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
    
    
    • 1
    • 2
    • 3
    • 4

    使用root用户操作防火墙。

    1.4.创建必要的目录

    使用su - etcd从root用户切换到etcd用户,在etcd用户的主目录/home/etcd下面新建如下的目录, 用于etcd数据存储

    mkdir -p /home/etcd/data;
    
    
    • 1
    • 2

    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
    • 2
    • 3

    1.6. 集群主机免密登陆

    后续我们在进行etcd运维,比如说启动集群的时候不希望一台服务器一台服务器的执行命令,而是希望在一台服务器上完成操作,这就需要集群etcd用户之间能够免密登录对方。这里我就简单介绍了,讲解该如何实现,原理大家搜文章学习下。etcd权限用户根目录下执行如下命令,不论提示输入什么,一路回车即可。

    ssh-keygen -t rsa
    
    
    • 1
    • 2
    • 将公钥保存到authorized_keys文件中
    cat ~/.ssh/id_rsa.pub > ~/.ssh/authorized_keys
    
    
    • 1
    • 2
    • 将公钥分发给peer1、peer2主机。按提示输入kafka登录密码
    ssh-copy-id -i ~/.ssh/id_rsa.pub -p22 etcd@peer2;
    
    
    • 1
    • 2

    需要分开执行,因为执行命令的过程中需要输入密码。

    ssh-copy-id -i ~/.ssh/id_rsa.pub -p22 etcd@peer3;
    
    
    • 1
    • 2

    这样,我们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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    这个脚本分成两个部分,第一个部分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
    
    
    • 1
    • 2
    • 3
    • 4

    图片上面的命令结果中能看到状态是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
    
    
    • 1
    • 2
    • 3
    • 4

    显示结果如下。可以看到“IS LEADER=true”的节点是集群的Leader节点:图片

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

  • 相关阅读:
    8、python中的模块和包
    向毕业妥协系列之机器学习笔记:神经网络(三)Tensorflow实现(上)
    python基础语法(十)
    Spring Boot Admin2 自定义异常监控
    腾讯待办停止运营,怎么继续提醒事情呢?
    【Qt】桌面应用开发 | 绘图事件和绘图设备 |文件操作
    02. Docker安装记录&卸载
    医院安全不良事件报告系统源码 PHP+ vue2+element+ laravel8+ mysql5.7+ vscode开发
    自定义类型详解(上)
    PDF被限制会出现什么情况?
  • 原文地址:https://blog.csdn.net/hanxiaotongtong/article/details/126752351