前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >003.etcd集群部署-静态发现

003.etcd集群部署-静态发现

作者头像
木二
发布2019-07-26 10:23:59
7540
发布2019-07-26 10:23:59
举报
文章被收录于专栏:木二天空

一 etcd集群概述

1.1 概述

静态启动etcd集群要求每个成员都知道集群中的另一个成员。Etcd运行在集群的每个coreos节点上,可以保证coreos集群的稳定,可靠的运行。当集群网络出现动荡,或者当前master节点出现异常时,etcd可以进行master节点的选举工作,同时恢复集群中损失的数据。

1.2 集群容错能力

集群大小

最大容错

1

0

2

1

4

1

5

2

6

2

7

3

8

3

9

4

1.3 集群基础

每个 etcd cluster 都由若干个 member 组成的,每个 member 是一个独立运行的 etcd 实例,单台机器上也可以运行多个 member。

在正常运行的状态下,集群中会有一个 leader,其余的 member 都是 followers。leader 向 followers 同步日志,保证数据在各个 member 都有副本。leader 还会定时向所有的 member 发送心跳报文,如果在规定的时间里 follower 没有收到心跳,就会重新进行选举。

客户端所有的请求都会先发送给 leader,leader 向所有的 followers 同步日志,等收到超过半数的确认后就把该日志存储到磁盘,并返回响应客户端。

每个 etcd 服务有三大主要部分组成:raft 实现、WAL 日志存储、数据的存储和索引。

WAL 会在本地磁盘(即 --data-dir)上存储日志内容(wal file)和快照(snapshot)。

提示:etcd 默认只保存 1000 个历史事件,因此不适合有大量更新操作的场景,否则会导致数据的丢失。etcd 典型的应用场景是配置管理和服务发现,即读多写少的。

1.4 引导机制

  • 静态的

在启动 etcd server 的时候,通过 --initial-cluster 参数配置好所有的节点信息

  • etcd Discovery

使用已有的 etcd cluster 来注册和启动

  • DNS发现

使用 DNS 启动。

二 集群部署-静态

2.1 环境准备

ntp配置:略 #建议配置ntp服务,保证时间一致性

etcd版本:v3.3.9

防火墙及SELinux:关闭防火墙和SELinux

名称

地址

主机名

备注

etcd1

172.24.8.31

etcd1.example.com

etcd2

172.24.8.32

etcd2.example.com

etcd3

172.24.8.33

etcd3.example.com

代码语言:javascript
复制
  1 # hostnamectl set-hostname etcd1.example.com
  2 # hostnamectl set-hostname etcd2.example.com
  3 # hostnamectl set-hostname etcd3.example.com
  4 # vi /etc/hosts
  5 #……
  6 172.24.8.31 etcd1.example.com
  7 172.24.8.32 etcd2.example.com
  8 172.24.8.33 etcd3.example.com

提示:CentOS6.x则修改/etc/sysconfig/network。

2.2 安装etcd

代码语言:javascript
复制
  1 # ETCD_VER=v3.3.9
  2 # GITHUB_URL=https://github.com/coreos/etcd/releases/download
  3 # DOWNLOAD_URL=${GITHUB_URL}
  4 # rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
  5 # rm -rf /tmp/etcd-download-test
  6 # mkdir -p /tmp/etcd-download-test		#创建下载保存目录
  7 # curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz -o /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
  8 # tar xzvf /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz -C /tmp/etcd-download-test --strip-components=1
  9 # cp /tmp/etcd-download-test/etcd /usr/local/bin/
 10 # cp /tmp/etcd-download-test/etcdctl /usr/local/bin/
 11 # rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
 12 
 13 # rm -rf /tmp/etcd-download-test/
 14 # ETCDCTL_API=3
 15 # etcd --version
 16 # etcdctl --version				#查看已安装版本

提示:所有节点均需要安装etcd。

2.3 启动前准备

代码语言:javascript
复制
  1 # mkdir -p /var/log/etcd/			#建议创建etcd日志保存目录
  2 # mkdir -p /data/etcd				#建议创建单独的etcd数据目录

2.4 启动集群

代码语言:javascript
复制
  1 [root@etcd1 ~]# etcd --name etcd1 --data-dir /data/etcd \
  2 --initial-advertise-peer-urls http://172.24.8.31:2380 \
  3 --listen-peer-urls http://172.24.8.31:2380 \
  4 --listen-client-urls http://172.24.8.31:2379,http://127.0.0.1:2379 \
  5 --advertise-client-urls http://172.24.8.31:2379 \
  6 --initial-cluster-token etcd-cluster-1 \
  7 --initial-cluster etcd1=http://172.24.8.31:2380,etcd2=http://172.24.8.32:2380,etcd3=http://172.24.8.33:2380 \
  8 --initial-cluster-state new

注意:第一台启动的 etcd 服务器将会不断等待其他集群成员完成初始化连接, 处于 waiting 状态。

代码语言:javascript
复制
  1 [root@etcd2 ~]# etcd --name etcd2 --data-dir /data/etcd \
  2 --initial-advertise-peer-urls http://172.24.8.32:2380 \
  3 --listen-peer-urls http://172.24.8.32:2380 \
  4 --listen-client-urls http://172.24.8.32:2379,http://127.0.0.1:2379 \
  5 --advertise-client-urls http://172.24.8.32:2379 \
  6 --initial-cluster-token etcd-cluster-1 \
  7 --initial-cluster etcd1=http://172.24.8.31:2380,etcd2=http://172.24.8.32:2380,etcd3=http://172.24.8.33:2380 \
  8 --initial-cluster-state new
  9 
 10 [root@etcd3 ~]# etcd --name etcd3 --data-dir /data/etcd \
 11 --initial-advertise-peer-urls http://172.24.8.33:2380 \
 12 --listen-peer-urls http://172.24.8.33:2380 \
 13 --listen-client-urls http://172.24.8.33:2379,http://127.0.0.1:2379 \
 14 --advertise-client-urls http://172.24.8.33:2379 \
 15 --initial-cluster-token etcd-cluster-1 \
 16 --initial-cluster etcd1=http://172.24.8.31:2380,etcd2=http://172.24.8.32:2380,etcd3=http://172.24.8.33:2380 \
 17 --initial-cluster-state new

提示:etcd可通过配置文件、命令行参数和环境变量进行配置,在命令行上设置的选项优先于来自环境的选项。如果提供了配置文件,则将忽略其他命令行参数和环境变量。例如,etcd --config-file etcd.conf.yml --data-dir /tmp将忽略该--data-dir标志。即优先级为:配置文件>命令行参数>环境变量。

配置文件为yml的文件,可参考《附001.etcd实例配置文件》

建议:

建议根据以下操作将启动命令写成固定脚本:

代码语言:javascript
复制
  1 [root@etcd1 ~]# vi /root/startetcd.sh
  2 #!/bin/sh
  3 #****************************************************************#
  4 # ScriptName: /root/startetcd.sh
  5 # Author: Xiang Hongying
  6 # Create Date: 2018-09-10 01:14
  7 # Modify Author: Xiang Hongying
  8 # E-Mail: x120952576@126.com
  9 # Version:
 10 #***************************************************************#
 11 LOGFILE=/var/log/etcd/etcd.log
 12 /usr/local/bin/etcd --name etcd1 --data-dir /data/etcd \
 13 --initial-advertise-peer-urls http://172.24.8.31:2380 \
 14 --listen-peer-urls http://172.24.8.31:2380 \
 15 --listen-client-urls http://172.24.8.31:2379,http://127.0.0.1:2379 \
 16 --advertise-client-urls http://172.24.8.31:2379 \
 17 --initial-cluster-token etcd-cluster-1 \
 18 --initial-cluster etcd1=http://172.24.8.31:2380,etcd2=http://172.24.8.32:2380,etcd3=http://172.24.8.33:2380 \
 19 -initial-cluster-state new >> $LOGFILE 2>&1 &
 20 [root@etcd1 ~]# chmod u+x startetcd.sh

2.5 集群健康检测

代码语言:javascript
复制
  1 [root@etcd1 ~]# etcdctl cluster-health

附录:使用systemd管理etcd。

代码语言:javascript
复制
  1 [root@etcd1 ~]# vi /lib/systemd/system/etcd.service
  2 [Unit]
  3 Description=etcd
  4 Documentation=https://github.com/coreos/etcd
  5 Conflicts=etcd.service
  6 
  7 [Service]
  8 Type=notify
  9 Restart=always
 10 RestartSec=5s
 11 LimitNOFILE=40000
 12 TimeoutStartSec=0
 13 
 14 ExecStart=/usr/local/bin/etcd --name etcd1 --data-dir /data/etcd \
 15 --initial-advertise-peer-urls http://172.24.8.31:2380 \
 16 --listen-peer-urls http://172.24.8.31:2380 \
 17 --listen-client-urls http://172.24.8.31:2379,http://127.0.0.1:2379 \
 18 --advertise-client-urls http://172.24.8.31:2379 \
 19 --initial-cluster-token etcd-cluster-1 \
 20 --initial-cluster etcd1=http://172.24.8.31:2380,etcd2=http://172.24.8.32:2380,etcd3=http://172.24.8.33:2380 \
 21 --initial-cluster-state new
 22 
 23 [Install]
 24 WantedBy=multi-user.target
 25 [root@etcd1 ~]# systemctl daemon-reload
 26 [root@etcd1 ~]# systemctl start etcd.service
 27 [root@etcd1 ~]# systemctl enable etcd.service

提示:其他节点类似即可。

2.6 关闭集群

代码语言:javascript
复制
  1 [root@etcd1 ~]# systemctl stop etcd

提示:

使用systemctl stop etcd 关闭集群, 在重新启动集群, 之前 etcd 保存的资料不会丢失 要对 etcd 集群进行重置, 最简单的方式是关闭集群后, 删除了所有 etcd member 中ETCD_DATA_DIR 配置中定义的目录下的所有子目录,然后启动所有 member 即可。

三 集群管理

3.1 集群成员检测

代码语言:javascript
复制
  1 [root@etcd1 ~]# etcdctl member list

3.2 更新成员url

若成员etcd2的IP地址有变动,需要更新url,则需要执行以下操作:

代码语言:javascript
复制
  1 [root@etcd3 ~]# ifconfig eth0
  2 inet 172.24.8.40
  3 [root@etcd3 ~]# vi /lib/systemd/system/etcd.service		#将所有旧IP改为最新IP。

提示:将所有IP修改为新的IP,若使用命令参数启动,则在命令参数中修改此IP为新值即可。

代码语言:javascript
复制
  1 [root@etcd3 ~]# systemctl restart etcd
  2 [root@etcd1 ~]# etcdctl member list		#在leader节点查看所有节点
代码语言:javascript
复制
  1 [root@etcd1 ~]# etcdctl member update 14ff148c62a24fb2 http://172.24.8.40:2380	#更新对等url

提示:错误更新的客户端URL不会影响etcd群集的运行状况。

3.3 添加新成员

代码语言:javascript
复制
  1 [root@localhost ~]# hostnamectl set-hostname etcd4.example.com

参考2.3步骤在etcd4.example.com节点安装etcd。

代码语言:javascript
复制
  1 [root@etcd1 ~]# etcdctl member add etcd4 http://172.24.8.34:2380
代码语言:javascript
复制
  1 [root@etcd4 ~]# export ETCD_NAME="etcd4"
  2 [root@etcd4 ~]# export ETCD_INITIAL_CLUSTER="etcd4=http://172.24.8.34:2380,etcd3=http://172.24.8.40:2380,etcd1=http://172.24.8.31:2380,etcd2=http://172.24.8.32:2380"
  3 [root@etcd4 ~]# export ETCD_INITIAL_CLUSTER_STATE="existing"
  4 [root@etcd4 ~]# etcd --listen-client-urls http://172.24.8.34:2379,http://127.0.0.1:2379 --advertise-client-urls http://172.24.8.34:2379 --listen-peer-urls http://172.24.8.34:2380 --initial-advertise-peer-urls http://172.24.8.34:2380 --data-dir /data/etcd
  5 [root@etcd1 ~]# etcdctl member list
  6 [root@etcd1 ~]# etcdctl cluster-health

提示:当使用已删除成员的数据目录启动etcd时,如果etcd连接到集群中的任何活动成员,它将自动退出,可通过以下方式删除旧member的数据,然后重新启动:

代码语言:javascript
复制
  1 # rm -rf /var/lib/etcd/default.etcd/
  2 # systemctl start etcd

3.4 删除成员

代码语言:javascript
复制
  1 [root@etcd1 ~]# etcdctl member remove 5a6397499417250
  2 Removed member 5a6397499417250 from cluster

提示:删除leader是安全的,但是当选出新领导者时,群集将处于非活动状态。此持续时间通常是选举超时和投票过程的时间段。

四 集群部署-发现

见《004.etcd集群部署-发现》

参考官方文档:

https://github.com/etcd-io/etcd/blob/master/Documentation/op-guide/configuration.md

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-01-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一 etcd集群概述
    • 1.1 概述
      • 1.2 集群容错能力
        • 1.3 集群基础
          • 1.4 引导机制
          • 二 集群部署-静态
            • 2.1 环境准备
              • 2.2 安装etcd
                • 2.3 启动前准备
                  • 2.4 启动集群
                    • 2.5 集群健康检测
                    • 附录:使用systemd管理etcd。
                      • 2.6 关闭集群
                      • 三 集群管理
                        • 3.1 集群成员检测
                          • 3.2 更新成员url
                            • 3.3 添加新成员
                              • 3.4 删除成员
                              • 四 集群部署-发现
                              领券
                              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档