2019独角兽企业重金招聘Python工程师标准>>>

一、软件下载

etcd最新版可以从官网github中下载,地址是https://github.com/etcd-io/etcd/releases,本次安装使用的版本是当前最新版本v3.3.12

二、环境准备

要部署集群需要至少三台服务器,因为etcd是基于raft协议实现数据一致性,所以安装的节点数量最好是奇数,方便做选举。这里我们准备的三台服务器如下:

主机名 IP地址
master01 10.70.68.122
master02 10.70.67.149
master03 10.70.67.150

确保三台主机之间的网络可以互通。

三、安装

1. 安装

在主机上创建目录/opt/apps/etcd, 并在下面创建dataconf目录。

2. 配置

  • A. master01的配置文件/opt/apps/etcd/conf/config.yml如下
name: etcd-1
data-dir: /opt/apps/etcd/data
listen-client-urls: http://10.70.68.122:2379,http://127.0.0.1:2379
advertise-client-urls: http://10.70.68.122:2379,http://127.0.0.1:2379
listen-peer-urls: http://10.70.68.122:2380
initial-advertise-peer-urls: http://10.70.68.122:2380
initial-cluster: etcd-1=http://10.70.68.122:2380,etcd-2=http://10.70.67.149:2380,etcd-3=http://10.70.67.150:2380
initial-cluster-token: etcd-cluster-token
initial-cluster-state: new
  • B. master02的配置文件/opt/apps/etcd/conf/config.yml如下
name: etcd-2
data-dir: /opt/apps/etcd/data
listen-client-urls: http://10.70.67.149:2379,http://127.0.0.1:2379
advertise-client-urls: http://10.70.67.149:2379,http://127.0.0.1:2379
listen-peer-urls: http://10.70.67.149:2380
initial-advertise-peer-urls: http://10.70.67.149:2380
initial-cluster: etcd-1=http://10.70.68.122:2380,etcd-2=http://10.70.67.149:2380,etcd-3=http://10.70.67.150:2380
initial-cluster-token: etcd-cluster-token
initial-cluster-state: new
  • C. master03的配置文件/opt/apps/etcd/conf/config.yml如下
name: etcd-3
data-dir: /opt/apps/etcd/data
listen-client-urls: http://10.70.67.150:2379,http://127.0.0.1:2379
advertise-client-urls: http://10.70.67.150:2379,http://127.0.0.1:2379
listen-peer-urls: http://10.70.67.150:2380
initial-advertise-peer-urls: http://10.70.67.150:2380
initial-cluster: etcd-1=http://10.70.68.122:2380,etcd-2=http://10.70.67.149:2380,etcd-3=http://10.70.67.150:2380
initial-cluster-token: etcd-cluster-token
initial-cluster-state: new
  • D. 更新etcd系统默认配置 我们要使用etcd v3的版本,系统默认的版本是v2,通过下面的命令修改配置。
vi /etc/profile

在文件末尾追加:

export ETCDCTL_API=3

使文件生效

source /etc/profile
  • E. 配置systemd服务 vi /usr/lib/systemd/system/etcd.service
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target[Service]
Type=notify
WorkingDirectory=/opt/apps/etcd/
# User=etcd
ExecStart=/opt/apps/etcd/etcd --config-file=/opt/apps/etcd/conf/config.yml
Restart=on-failure
LimitNOFILE=65536[Install]
WantedBy=multi-user.target
  • F. Centos6及以下版本使用service方式管理etcd启动脚本 vi /etc/init.d/etcd
#!/bin/bash
#chkconfig: - 99 01
##
#description: Etcd Server
case $1 instart)/opt/apps/etcd/etcd --config-file=/opt/apps/etcd/conf/config.yml &;;stop)ps -ef | grep etcd| grep -v grep | awk '{print $2}'| xargs kill -QUIT;;*)echo Usage:`basename $0 start|stop|restart`
esac

修改权限chmod +x /etc/init.d/etcd

添加服务 chkconfig --add etcd

设置开机自启动 chkconfig --level 3 etcd on

验证启动情况 chkconfig --list etcd

  • G. 启动集群

在所有结点上运行service etcd start启动etcd服务

四、测试

  • 查看集群状态
etcdctl --write-out="table" --endpoints='10.70.67.150:2379,10.70.67.149:2379,10.70.68.122:2379' endpoint status

五、运维相关

A. 快照定期数据备份

crontab定期执行备份脚本,每半小时备份一次,本地、异地都备份。

#!/bin/bash
#
ETCDCTL_PATH='/opt/apps/etcd/etcdctl'
ENDPOINTS='10.70.67.150:2379,10.70.67.149:2379,10.70.68.122:2379'
BACKUP_DIR='/opt/apps/backup'
DATE=`date +%Y%m%d-%H%M%S`
[ ! -d $BACKUP_DIR ] && mkdir -p $BACKUP_DIR
export ETCDCTL_API=3;$ETCDCTL_PATH --endpoints=$ENDPOINTS snapshot save $BACKUP_DIR/snapshot-$DATE\.db
cd $BACKUP_DIR;ls -lt $BACKUP_DIR|awk '{if(NR>11){print "rm -rf "$9}}'|sh

B. 镜像集群备份

1. 实时全量数据同步

nohup etcdctl make-mirror <destination>  &> /apps/logs/etcdmirror.log &

/apps/logs/etcdmirror.log会保存已经同步的key数量,每30s打印一次

2. 定期数据同步

crontab定期数据同步,为避免数据遭到误删除清空造成灾难性影响,可恢复上一个同步周期之前的数据

#!/bin/bash
#
ETCDCTL_PATH='/apps/svr/etcd/bin/etcdctl'
ENDPOINTS='10.70.67.150:2379,10.70.67.149:2379,10.70.68.122:2379'
DEST_ENDPOINT='10.70.67.151:2389'
CMD="$ETCDCTL_PATH make-mirror --endpoints=$ENDPOINTS $DEST_ENDPOINT"
BaseName=$(basename $BASH_SOURCE)
export ETCDCTL_API=3
$CMD & echo $! > /tmp/$BaseName\.pid
sleep 90
kill `cat /tmp/$BaseName\.pid`

C. 镜像集群备份

1. 集群故障恢复

为了从灾难性故障中恢复,etcd v3提供了快照和恢复功能,以便在没有v3密钥数据丢失的情况下重新创建群集. 要恢复集群,只需要一个快照“db”文件。集群恢复将etcdctl snapshot restore创建新的etcd数据目录; 所有成员应该使用相同的快照进行恢复。恢复会覆盖某些快照元数据(特别是成员ID和群集ID); 该成员失去了其以前的身份。此元数据覆盖可防止新成员无意中加入现有群集。因此,为了从快照启动集群,还原必须启动新的逻辑集群。

在还原时可以选择验证快照完整性。如果使用快照etcdctl snapshot save,它将具有通过检查的完整性散列etcdctl snapshot restore。如果快照是从数据目录复制的(配置文件中的data-dir),则不存在完整性哈希,并且只能使用恢复--skip-hash-check。

etcdctl snapshot restore snapshot.db \--name etcd-1 \--initial-cluster etcd-1=http://10.70.68.122:2380,etcd-2=http://10.70.67.149:2380,etcd-3=http://10.70.67.150:2380 \--initial-advertise-peer-urls http://10.70.68.122:2380
etcdctl snapshot restore snapshot.db \--name etcd-2 \--initial-cluster etcd-1=http://10.70.68.122:2380,etcd-2=http://10.70.67.149:2380,etcd-3=http://10.70.67.150:2380 \--initial-advertise-peer-urls http://10.70.67.149:2380
etcdctl snapshot restore snapshot.db \--name etcd-3 \--initial-cluster etcd-1=http://10.70.68.122:2380,etcd-2=http://10.70.67.149:2380,etcd-3=http://10.70.67.150:2380 \--initial-advertise-peer-urls http://10.70.67.150:2380

待数据恢复完毕后,启动服务

service etcd start

D. 镜像集群备份

1. 集群维护

  • 查看现有成员
ENDPOINTS='10.70.67.150:2379,10.70.67.149:2379,10.70.68.122:2379'
etcdctl --write-out="table" --endpoints="$ENDPOINTS" member list
  • 删除成员
ENDPOINTS='10.70.67.150:2379,10.70.67.149:2379,10.70.68.122:2379'
etcdctl --endpoints="$ENDPOINTS" member remove memberid
  • 新增成员
ENDPOINTS='10.70.67.150:2379,10.70.67.149:2379,10.70.68.122:2379'
etcdctl --endpoints="$ENDPOINTS" member add member-name --peer-urls=http://10.70.67.150:2380

删除新增成员旧数据目录,并且启动新增成员etcd服务,加入集群时要改下配置文件,把初始化集群状态由new改成existing

E. etcd v2数据迁移到v3版本

ENDPOINTS='10.70.67.150:2379,10.70.67.149:2379,10.70.68.122:2379'
# 迁移前,需要逐台服务停止
service etcd stop
# 迁移数据,数据目录根据实际填写
export ETCDCTL_API=3
etcdctl --endpoints=$ENDPOINT migrate --data-dir="/opt/apps/etcd/data" --wal-dir="/opt/apps/etcd/data/member/wal"# 逐台服务启动
service etcd start
# 检查确认数据已经迁移
export ETCDCTL_API=3;etcdctl --endpoints=$ENDPOINTS get /foo

F. 历史数据压缩

key空间长期的时候,如果没有做压缩清理,到达上限的阈值时,集群会处于一个只能删除和读的状态,无法进行写操作。因此对集群的历史日志做一个压缩清理是很有必要。

数据压缩并不是清理现有数据,只是对数据的历史版本进行清理,清理后数据的历史版本将不能访问,但不会影响现有最新数据的访问。

  • 手动压缩
#压缩清理revision为10之前的历史数据
etcdctl compaction 10#访问revision10之前的数据会提示已经不存在
etcdctl get aa --rev=9
Error:  etcdserver: mvcc: required revision has been compacted
  • 自动压缩

使用--auto-compaction-retention=1,表示每小时进行一次数据压缩。

  • 碎片清理

进行compaction操作之后,旧的revision被压缩,会产生内部的碎片,内部碎片是指空闲状态的,能被后端使用但是仍然消耗存储空间的磁盘空间。去碎片化实际上是将存储空间还给文件系统。

etcdctl defrag

五、总结

  • etcd集群恢复

etcd集群与zk集群相似,建议采用基数设备来搭建集群,可用性为(N-1)/2,假设集群数量N是3台设备,可最多可故障1台设备,而不影响集群使用。

  • leader故障

当leader故障时,etcd集群会自动选择一个新leader,由于失败检测模型是基于超时的(heartbeat-interval),因此选举新leader需要大约选举超时。 在leader选举期间,集群不能处理任何写入操作。在选举期间发送的写入请求排队等待处理,直到选出新的leader。

已经发送给old leader但尚未提交的文字可能会丢。新leader有权重写old leader的任何未提交的条目。从用户的角度来看,一些写入请求可能会超时,但是,没有提交的写入会丢失。

转载于:https://my.oschina.net/eonezhang/blog/3038156

etcd3 安装与运维相关推荐

  1. 620安装linux_Linux运维基础 Linux的quot;桑巴quot;

    一.了解samba: Samba是用于Linux和Unix的标准Windows互操作性程序套件. Samba是根据GNU通用公共许可证许可的自由软件,Samba项目是Software Freedom ...

  2. linux jdk安装_linux运维 - 用脚本快速安装jdk

    安装 jdk 需要先到 oracle 官网下载对应的压缩包,放到跟脚本同一个目录,然后执行脚本即可. jdk 归档版本 直接到oracle官网直接查找,一般都是展示最新版本的JDK,如果需要之前的版本 ...

  3. mysql8.0版本的服务器名称_MySQL 8.0安装部署-运维笔记

    MySQL 8 正式版 8.0.11 已发布,官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,还带来了大量的改进和更快的性能! 一.  Mysql8.0版本相比之前版本的一些特性 1) ...

  4. gitlab centos 安装配置运维笔记

    写在前面 如果你需要一个git服务器,为企业或自己的团队托管代码而又不希望将代码仓库存储到第三方.你可以在自己的服务器上搭建一个gitlab. 本文为我在最初安装配置gitlab服务器的时候留存的笔记 ...

  5. Conmi的正确答案——linux/ubuntu安装web运维工具(Cockpit)

    系统版本:Ubuntu server 20.04 # 想安装K8S,但fedora缺少一些指令,所以想改回Ubuntu,Ubuntu却没有fedora的web操作界面, # 后来找了一圈才找到这个:C ...

  6. Redmine 安装及运维

    文章目录 前言 1. 安装 1.1 选择语言 1.2 欢迎页面 1.3 选择组件 1.4 选择安装路径 1.5 创建管理员账户 1.6 选择端口号 1.7 选择配置语言 1.8 配置邮件通知 1.9 ...

  7. jupyterhub安装与运维

    演示视频:https://www.bilibili.com/video/BV1jP4y1V7YT/ # 安装jupyterhub基础环境 >>> apt install nodejs ...

  8. 运维(22) 制作启动U盘安装黑苹果macOS

    文章目录 一.前言 二.下载系统 三.制作启动U盘 1.`TransMac`制作启动U盘 -- 法一 2.`balenaEtcher`制作启动U盘 -- 法二 3.下载适合自己机型的EFI 4.替换` ...

  9. 运维工程师的职责和前景

    转载自网络 运维中关键技术点解剖:1 大量高并发网站的设计方案 :2 高可靠.高可伸缩性网络架构设计:3 网站安全问题,如何避免被黑?4 南北互联问题,动态CDN解决方案:5 海量数据存储架构 一.什 ...

最新文章

  1. springboot rabbitmq direct exchange和topic exchange 写法上关于路由键的区别
  2. java word 纸张大小_如何在Java中为Word文档(.doc或.docx)设置背景色(页面颜色)?...
  3. eclipse git commit
  4. mysql数据库备份出错_mysql数据库备份成功,再还原却失败,什么原
  5. 使用PaddleFluid和TensorFlow训练RNN语言模型
  6. 三十二、电子商务服务推荐模型构建
  7. c++常见并且必须记住的问题
  8. 【转】构建微服务架构的最佳实践2/3
  9. OGEngine教程:声音载入
  10. linux 系统改名,linux改名命令
  11. javaScript通用数据类型校验2
  12. 拼多多市值超2100亿美元 黄峥成中国第二大富豪
  13. Window CE 驱动开发流程(Windows CE.5.0系统、pxa270平台)
  14. c语言不合法字符串常量,不合法的字符常量是什么
  15. 时间序列预测 | Python实现GAN时间序列数据生成建模
  16. 常用邮箱哪家好用?TOM邮箱口碑评价
  17. python的invalid syntax是什么意思_请问在python 中 出现 invalid syntax 是什么意思 ?
  18. 学习Tomcat这一篇就够了
  19. html5网页制作电脑版,页未央HTML5制作神器PC版
  20. windows 7 UEFI 启动模式安装,解决win7 64 setup会提示GPT分区不支持的问题

热门文章

  1. 《Python数据挖掘:概念、方法与实践》一2.4 小结
  2. 又拍云沈志华:如何打造一款安全的App
  3. 普通用户通过Putty密钥方式登录
  4. SQL Server2014安装流程及注意事项
  5. python之高性能网络编程并发框架eventlet实例
  6. 聚焦BCS|吴云坤产业峰会演讲:用内生安全框架提升网络安全产值
  7. 寒假训练营第四次作业
  8. [译] 美国证券法对 ICO 及相关 Fund 的最新动态
  9. centos7改语言包
  10. 为什么用 Java:一个 Python 程序员告诉你