一 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 |
- # hostnamectl set-hostname etcd1.example.com
- # hostnamectl set-hostname etcd2.example.com
- # hostnamectl set-hostname etcd3.example.com
- # vi /etc/hosts
- #......
- 172.24.8.31 etcd1.example.com
- 172.24.8.32 etcd2.example.com
- 172.24.8.33 etcd3.example.com
提示: CentOS6.x 则修改 / etc/sysconfig/network.
2.2 安装 etcd
- # ETCD_VER=v3.3.9
- # GITHUB_URL=https://github.com/coreos/etcd/releases/download
- # DOWNLOAD_URL=${GITHUB_URL}
- # rm -f /tmp/etcd-${ETCD_VER}-Linux-amd64.tar.gz
- # rm -rf /tmp/etcd-download-test
- # mkdir -p /tmp/etcd-download-test # 创建下载保存目录
- # curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-Linux-amd64.tar.gz -o /tmp/etcd-${ETCD_VER}-Linux-amd64.tar.gz
- # tar xzvf /tmp/etcd-${ETCD_VER}-Linux-amd64.tar.gz -C /tmp/etcd-download-test --strip-components=1
- # cp /tmp/etcd-download-test/etcd /usr/local/bin/
- # cp /tmp/etcd-download-test/etcdctl /usr/local/bin/
- # rm -f /tmp/etcd-${ETCD_VER}-Linux-amd64.tar.gz
- # rm -rf /tmp/etcd-download-test/
- # ETCDCTL_API=3
- # etcd --version
- # etcdctl --version # 查看已安装版本
提示: 所有节点均需要安装 etcd.
2.3 启动前准备
- # mkdir -p /var/log/etcd/ # 建议创建 etcd 日志保存目录
- # mkdir -p /data/etcd # 建议创建单独的 etcd 数据目录
2.4 启动集群
- [root@etcd1 ~]# etcd --name etcd1 --data-dir /data/etcd \
- --initial-advertise-peer-urls http://172.24.8.31:2380 \
- --listen-peer-urls http://172.24.8.31:2380 \
- --listen-client-urls http://172.24.8.31:2379,http://127.0.0.1:2379 \
- --advertise-client-urls http://172.24.8.31:2379 \
- --initial-cluster-token etcd-cluster-1 \
- --initial-cluster etcd1=http://172.24.8.31:2380,etcd2=http://172.24.8.32:2380,etcd3=http://172.24.8.33:2380 \
- --initial-cluster-state new
注意: 第一台启动的 etcd 服务器将会不断等待其他集群成员完成初始化连接, 处于 waiting 状态.
- [root@etcd2 ~]# etcd --name etcd2 --data-dir /data/etcd \
- --initial-advertise-peer-urls http://172.24.8.32:2380 \
- --listen-peer-urls http://172.24.8.32:2380 \
- --listen-client-urls http://172.24.8.32:2379,http://127.0.0.1:2379 \
- --advertise-client-urls http://172.24.8.32:2379 \
- --initial-cluster-token etcd-cluster-1 \
- --initial-cluster etcd1=http://172.24.8.31:2380,etcd2=http://172.24.8.32:2380,etcd3=http://172.24.8.33:2380 \
- --initial-cluster-state new
- [root@etcd3 ~]# etcd --name etcd3 --data-dir /data/etcd \
- --initial-advertise-peer-urls http://172.24.8.33:2380 \
- --listen-peer-urls http://172.24.8.33:2380 \
- --listen-client-urls http://172.24.8.33:2379,http://127.0.0.1:2379 \
- --advertise-client-urls http://172.24.8.33:2379 \
- --initial-cluster-token etcd-cluster-1 \
- --initial-cluster etcd1=http://172.24.8.31:2380,etcd2=http://172.24.8.32:2380,etcd3=http://172.24.8.33:2380 \
- --initial-cluster-state new
提示: etcd 可通过配置文件, 命令行参数和环境变量进行配置, 在命令行上设置的选项优先于来自环境的选项. 如果提供了配置文件, 则将忽略其他命令行参数和环境变量. 例如, etcd --config-file etcd.conf.YAML --data-dir /tmp 将忽略该 --data-dir 标志. 即优先级为: 配置文件>命令行参数>环境变量.
配置文件为 YAML 的文件, 可参考《附 001.etcd 实例配置文件》
建议:
建议根据以下操作将启动命令写成固定脚本:
- [root@etcd1 ~]# vi /root/startetcd.sh
- #!/bin/sh
- #****************************************************************#
- # ScriptName: /root/startetcd.sh
- # Author: Xiang Hongying
- # Create Date: 2018-09-10 01:14
- # Modify Author: Xiang Hongying
- # E-Mail: x120952576@126.com
- # Version:
- #***************************************************************#
- LOGFILE=/var/log/etcd/etcd.log
- /usr/local/bin/etcd --name etcd1 --data-dir /data/etcd \
- --initial-advertise-peer-urls http://172.24.8.31:2380 \
- --listen-peer-urls http://172.24.8.31:2380 \
- --listen-client-urls http://172.24.8.31:2379,http://127.0.0.1:2379 \
- --advertise-client-urls http://172.24.8.31:2379 \
- --initial-cluster-token etcd-cluster-1 \
- --initial-cluster etcd1=http://172.24.8.31:2380,etcd2=http://172.24.8.32:2380,etcd3=http://172.24.8.33:2380 \
- -initial-cluster-state new>> $LOGFILE 2>&1 &
- [root@etcd1 ~]# chmod u+x startetcd.sh
2.5 集群健康检测
1 [root@etcd1 ~]# etcdctl cluster-health
附录: 使用 systemd 管理 etcd.
- [root@etcd1 ~]# vi /lib/systemd/system/etcd.service
- [Unit]
- Description=etcd
- Documentation=https://github.com/coreos/etcd
- Conflicts=etcd.service
- [Service]
- Type=notify
- Restart=always
- RestartSec=5s
- LimitNOFILE=40000
- TimeoutStartSec=0
- ExecStart=/usr/local/bin/etcd --name etcd1 --data-dir /data/etcd \
- --initial-advertise-peer-urls http://172.24.8.31:2380 \
- --listen-peer-urls http://172.24.8.31:2380 \
- --listen-client-urls http://172.24.8.31:2379,http://127.0.0.1:2379 \
- --advertise-client-urls http://172.24.8.31:2379 \
- --initial-cluster-token etcd-cluster-1 \
- --initial-cluster etcd1=http://172.24.8.31:2380,etcd2=http://172.24.8.32:2380,etcd3=http://172.24.8.33:2380 \
- --initial-cluster-state new
- [Install]
- WantedBy=multi-user.target
- [root@etcd1 ~]# systemctl daemon-reload
- [root@etcd1 ~]# systemctl start etcd.service
- [root@etcd1 ~]# systemctl enable etcd.service
提示: 其他节点类似即可.
2.6 关闭集群
1 [root@etcd1 ~]# systemctl stop etcd
提示:
使用 systemctl stop etcd 关闭集群, 在重新启动集群, 之前 etcd 保存的资料不会丢失 要对 etcd 集群进行重置, 最简单的方式是关闭集群后, 删除了所有 etcd member 中 ETCD_DATA_DIR 配置中定义的目录下的所有子目录, 然后启动所有 member 即可.
三 集群管理
3.1 集群成员检测
1 [root@etcd1 ~]# etcdctl member list
3.2 更新成员 url
若成员 etcd2 的 IP 地址有变动, 需要更新 url, 则需要执行以下操作:
- [root@etcd3 ~]# ifconfig eth0
- .NET 172.24.8.40
- [root@etcd3 ~]# vi /lib/systemd/system/etcd.service # 将所有旧 IP 改为最新 IP.
提示: 将所有 IP 修改为新的 IP, 若使用命令参数启动, 则在命令参数中修改此 IP 为新值即可.
- [root@etcd3 ~]# systemctl restart etcd
- [root@etcd1 ~]# etcdctl member list # 在 leader 节点查看所有节点
1 [root@etcd1 ~]# etcdctl member update 14ff148c62a24fb2 http://172.24.8.40:2380 # 更新对等 url
提示: 错误更新的客户端 URL 不会影响 etcd 群集的运行状况.
3.3 添加新成员
1 [root@localhost ~]# hostnamectl set-hostname etcd4.example.com
参考 2.3 步骤在 etcd4.example.com 节点安装 etcd.
1 [root@etcd1 ~]# etcdctl member add etcd4 http://172.24.8.34:2380
- [root@etcd4 ~]# export ETCD_NAME="etcd4"
- [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"
- [root@etcd4 ~]# export ETCD_INITIAL_CLUSTER_STATE="existing"
- [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
- [root@etcd1 ~]# etcdctl member list
- [root@etcd1 ~]# etcdctl cluster-health
提示: 当使用已删除成员的数据目录启动 etcd 时, 如果 etcd 连接到集群中的任何活动成员, 它将自动退出, 可通过以下方式删除旧 member 的数据, 然后重新启动:
- # rm -rf /var/lib/etcd/default.etcd/
- # systemctl start etcd
3.4 删除成员
- [root@etcd1 ~]# etcdctl member remove 5a6397499417250
- Removed member 5a6397499417250 from cluster
提示: 删除 leader 是安全的, 但是当选出新领导者时, 群集将处于非活动状态. 此持续时间通常是选举超时和投票过程的时间段.
四 集群部署 - 发现
见《004.etcd 集群部署 - 发现》
参考官方文档:
https://github.com/etcd-io/etcd/blob/master/Documentation/op-guide/configuration.md
来源: https://www.cnblogs.com/itzgr/p/10243082.html