etcd php,etcd集群备份和数据恢复

etcd是一个分布式k-v数据库,在kubernetes中使用其管理集群的元数据。这里介绍etcd集群数据的备份和数据恢复的方法和步骤。

快照定期备份

crontab定期执行备份脚本,每半小时备份一次,本地、异地都备份(暂定:本地备份保留最近10个备份,异地保留一个月的备份)

#!/bin/bash

#

ETCDCTL_PATH='/usr/etcd/bin/etcdctl'

ENDPOINTS='1.1.1.1:2379,1.1.1.2:2379,1.1.1.3:2379'

BACKUP_DIR='/home/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

镜像集群备份

提前准备部署好镜像集群

实时全量数据同步

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

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

定期数据同步

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

#!/bin/bash

#

ETCDCTL_PATH='/apps/svr/etcd/bin/etcdctl'

ENDPOINTS='1.1.1.1:2379,1.1.1.2:2379,1.1.1.3:2379'

DEST_ENDPOINT='1.1.1.1: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`

etcd集群恢复

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

leader故障

当leader故障时,etcd集群会自动选择一个新leader,由于失败检测模型是基于超时的(heartbeat-interval),因此选举新leader需要大约选举超时。

在leader选举期间,集群不能处理任何写入操作。在选举期间发送的写入请求排队等待处理,直到选出新的leader。

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

查看现时集群情况

[root@ETCD-CLUSTER-001 bin]# export ETCDCTL_API=3;./etcdctl --write-out="table" --endpoints='10.201.46.112:2379,10.201.46.113:2379,10.201.46.114:2379' endpoint status

+--------------------+------------------+---------+---------+-----------+-----------+------------+

| ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | RAFT TERM | RAFT INDEX |

+--------------------+------------------+---------+---------+-----------+-----------+------------+

| 10.201.46.112:2379 | fd86741fb271523a | 3.1.10 | 25 kB | false | 2 | 10 |

| 10.201.46.113:2379 | fe2dd3624258de7 | 3.1.10 | 25 kB | false | 2 | 10 |

| 10.201.46.114:2379 | c649fd5192da5ca1 | 3.1.10 | 25 kB | true | 2 | 10 |

+--------------------+------------------+---------+---------+-----------+-----------+------------+

[root@ETCD-CLUSTER-001 bin]# export ETCDCTL_API=3;./etcdctl put hello nihao

OK

停止leader

查看日志,在第3个选举周期的时候已经选举了新的leader

集群可以正常工作

[root@ETCD-CLUSTER-001 bin]# export ETCDCTL_API=3;./etcdctl get hello nihao

hello

nihao

follower故障

查看现时集群情况

停掉一台followe

[root@ETCD-CLUSTER-003 ~]# sh /apps/sh/etcd.sh stop

Stopping etcd: [ OK ]

集群正常工作

[root@ETCD-CLUSTER-001 bin]# export ETCDCTL_API=3;./etcdctl get hello nihao

hello

nihao

集群故障恢复

为了从灾难性故障中恢复,etcd v3提供了快照和恢复功能,以便在没有v3密钥数据丢失的情况下重新创建群集.

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

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

保存快照键空间

[root@ETCD-CLUSTER-001 bin]# export ETCDCTL_API=3;./etcdctl --endpoints='10.201.46.112:2379,10.201.46.113:2379,10.201.46.114:2379' snapshot save ~/.snapshot.db

Snapshot saved at /root/.snapshot.db

恢复快照信息

每台机器上执行,

$ etcdctl snapshot restore snapshot.db \

--name ETCD-CLUSTER-001 \

--initial-cluster ETCD-CLUSTER-001=http://10.201.46.112:2380,ETCD-CLUSTER-002=http://10.201.46.113:2380,ETCD-CLUSTER-003=http://10.201.46.114:2380 \

--initial-advertise-peer-urls http://10.201.46.112:2380

$ etcdctl snapshot restore snapshot.db \

--name ETCD-CLUSTER-002 \

--initial-cluster ETCD-CLUSTER-001=http://10.201.46.112:2380,ETCD-CLUSTER-002=http://10.201.46.113:2380,ETCD-CLUSTER-003=http://10.201.46.114:2380 \

--initial-advertise-peer-urls http://10.201.46.113:2380

$ etcdctl snapshot restore snapshot.db \

--name ETCD-CLUSTER-003 \

--initial-cluster ETCD-CLUSTER-001=http://10.201.46.112:2380,ETCD-CLUSTER-002=http://10.201.46.113:2380,ETCD-CLUSTER-003=http://10.201.46.114:2380 \

--initial-advertise-peer-urls http://10.201.46.114:2380

启动etcd机器

sudo sh /apps/sh/etcd.sh start

集群维护

剔除、新增成员

查看现有成员

[root@ETCD-CLUSTER-001 etcd-v3.2.17-linux-amd64]# export ETCDCTL_API=3;/apps/svr/etcd/bin/etcdctl --write-out="table" --endpoints='1.1.1.1:2379,1.1.1.2:2379,1.1.1.3:2379' member list

+------------------+---------+------------------+---------------------------+-----------------------+

| ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS |

+------------------+---------+------------------+---------------------------+-----------------------+

| 28c987fd1ef634f8 | started | ETCD-CLUSTER-003 | http://1.1.1.3:2380 | http://localhost:2379 |

| 635b8eabdf3280ef | started | ETCD-CLUSTER-002 | http://1.1.1.2:2380 | http://localhost:2379 |

| e9a434659e36d3bc | started | ETCD-CLUSTER-001 | http://1.1.1.1:2380 | http://localhost:2379 |

+------------------+---------+------------------+---------------------------+-----------------------+

剔除成员

[root@ETCD-CLUSTER-001 etcd-v3.2.17-linux-amd64]# export ETCDCTL_API=3;/apps/svr/etcd/bin/etcdctl --endpoints='1.1.1.1:2379,1.1.1.2:2379,1.1.1.3:2379' member remove e9a434659e36d3bc

Member e9a434659e36d3bc removed from cluster 7055108fef63cdab

[root@ETCD-CLUSTER-001 etcd-v3.2.17-linux-amd64]# export ETCDCTL_API=3;/apps/svr/etcd/bin/etcdctl --write-out="table" --endpoints='1.1.1.1:2379,1.1.1.2:2379,1.1.1.3:2379' member list

+------------------+---------+------------------+---------------------------+-----------------------+

| ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS |

+------------------+---------+------------------+---------------------------+-----------------------+

| 28c987fd1ef634f8 | started | ETCD-CLUSTER-003 | http://1.1.1.3:2380 | http://localhost:2379 |

| 635b8eabdf3280ef | started | ETCD-CLUSTER-002 | http://1.1.1.2:2380 | http://localhost:2379 |

+------------------+---------+------------------+---------------------------+-----------------------+

新增成员至集群

注意步骤顺序

[root@ETCD-CLUSTER-001 ]# export ETCDCTL_API=3;/apps/svr/etcd/bin/etcdctl --endpoints='1.1.1.2:2379,1.1.1.3:2379' member add ETCD-CLUSTER-001 --peer-urls=http://1.1.1.1:2380

Member 433fd69a958b8432 added to cluster 7055108fef63cdab

ETCD_NAME="ETCD-CLUSTER-001"

ETCD_INITIAL_CLUSTER="ETCD-CLUSTER-003=http://1.1.1.3:2380,ETCD-CLUSTER-001=http://1.1.1.1:2380,ETCD-CLUSTER-002=http://1.1.1.2:2380"

ETCD_INITIAL_CLUSTER_STATE="existing"

[root@ETCD-CLUSTER-001 ]# export ETCDCTL_API=3;/apps/svr/etcd/bin/etcdctl --write-out="table" --endpoints='1.1.1.2:2379,1.1.1.3:2379' member list

+------------------+-----------+------------------+---------------------------+-----------------------+

| ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS |

+------------------+-----------+------------------+---------------------------+-----------------------+

| 28c987fd1ef634f8 | started | ETCD-CLUSTER-003 | http://1.1.1.3:2380 | http://localhost:2379 |

| 433fd69a958b8432 | unstarted | | http://1.1.1.1:2380 | |

| 635b8eabdf3280ef | started | ETCD-CLUSTER-002 | http://1.1.1.2:2380 | http://localhost:2379 |

+------------------+-----------+------------------+---------------------------+-----------------------+

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

[root@ETCD-CLUSTER-001 ~]# vim /apps/conf/etcd/etcd.conf

initial-cluster-state: "existing"

[root@ETCD-CLUSTER-001 ~]# export ETCDCTL_API=3;/apps/svr/etcd/bin/etcdctl --write-out="table" --endpoints='1.1.1.2:2379,1.1.1.3:2379' member list

+------------------+---------+------------------+---------------------------+-----------------------+

| ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS |

+------------------+---------+------------------+---------------------------+-----------------------+

| 28c987fd1ef634f8 | started | ETCD-CLUSTER-003 | http://1.1.1.3:2380 | http://localhost:2379 |

| 433fd69a958b8432 | started | ETCD-CLUSTER-001 | http://1.1.1.1:2380 | http://localhost:2379 |

| 635b8eabdf3280ef | started | ETCD-CLUSTER-002 | http://1.1.1.2:2380 | http://localhost:2379 |

+------------------+---------+------------------+---------------------------+-----------------------+

[root@ETCD-CLUSTER-001 ~]# export ETCDCTL_API=3;/apps/svr/etcd/bin/etcdctl --write-out="table" --endpoints='1.1.1.1:2379,1.1.1.2:2379,1.1.1.3:2379' endpoint status

+--------------------+------------------+---------+---------+-----------+-----------+------------+

| ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | RAFT TERM | RAFT INDEX |

+--------------------+------------------+---------+---------+-----------+-----------+------------+

| 1.1.1.1:2379 | 433fd69a958b8432 | 3.1.10 | 98 kB | false | 3 | 13 |

| 1.1.1.2:2379 | 635b8eabdf3280ef | 3.1.10 | 98 kB | false | 3 | 13 |

| 1.1.1.3:2379 | 28c987fd1ef634f8 | 3.1.10 | 98 kB | true | 3 | 13 |

+--------------------+------------------+---------+---------+-----------+-----------+------------+

etcd v2数据迁移到v3版本

# 迁移前,需要逐台服务停止

sh /apps/sh/etcd.sh stop

# 迁移数据,数据目录根据实际填写

export ETCDCTL_API=3

etcdctl --endpoints=$ENDPOINT migrate --data-dir="default.etcd" --wal-dir="default.etcd/member/wal"

# 逐台服务启动

sh /apps/sh/etcd.sh start

# 检查确认数据已经迁移

export ETCDCTL_API=3;etcdctl --endpoints=$ENDPOINTS get /foo

快照条目数量调整

--snapshot-count:指定有多少事务(transaction)被提交时,触发截取快照保存到磁盘,在v3.2之前的版本,默认的参数是10000条,3.2之后调整为100000条

这个条目数量不能配置过高或者过低,过低会导致频繁的io压力,过高会导致占用高内存以及会导致etcd GC过慢。建议设置为10W-20W条。

历史数据压缩

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

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

手动压缩

使用客户端工具进行清理

#压缩清理revision为10之前的历史数据

[apps@test ~]$ export ETCDCTL_API=3;/apps/svr/etcd/bin/etcdctl compaction 10

compacted revision 10

#访问revision10之前的数据会提示已经不存在

[apps@test ~]$ export ETCDCTL_API=3;/apps/svr/etcd/bin/etcdctl get aa --rev=9

Error: etcdserver: mvcc: required revision has been compacted

自动压缩

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

碎片清理

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

[apps@test ~]$ etcdctl defrag

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303900.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ingress-nginx工作原理和实践

本文记录/分享 目前项目的 K8s 部署结构和请求追踪改造方案这个图算是一个通用的前后端分离的 k8s 部署结构:Nginx Ingress 负责暴露服务(nginx前端静态资源服务), 根据十二要素应用的原 则,将后端 api 作为 nginx 服务的附加动态资源。Ingress vs Ingre…

oracle 查看用户状态,Oracle数据库查看用户状态

一、当前ORACLE用户的状态可查看视图DBA_USERS;一般情况下在使用的正常用户均处于OPEN状态。select username,account_status from dba_users;二、ORACLE数据库用户有多种状态,可查看视图USER_ASTATUS_MAP。select * from user_astatus_map;九种状态可分为两类&…

Dotnet洋葱架构实践

一个很清晰的架构实践,同时刨刨MySQL的坑。一、洋葱架构简介洋葱架构出来的其实有一点年头了。大约在2017年下半年,就有相关的说法了。不过,大量的文章在于理论性的讨论,而我们今天会用一个项目来完成这个架构。洋葱架构&#xff…

显示桌面,原来这么简单的

显示桌面的按钮其实很简单,我也是无意中发现的,代码如下,复制到记事本中,另存为.scf文件,文件名随便去,双击即可看看效果,^_^[Shell]Command2IconFileexplorer.exe,3[Taskbar]CommandToggleDesktop转载于:https://www.cnblogs.com/crid/archive/2010/11/28/5172732.html

php 面向对象 教程,PHP学习笔记之面向对象设计_PHP教程

面向对象设计是php程序开发中一个很重要的内容块,如果你想成为高级php程序员我们必须知道面向对象设计具体用法与写法。维护简单 模块化是面向对象编程中的一个特征。实体被表示为类和同一名字空间中具有相同功能的类,我们可以在名字空间中添加一个类而不…

EF Core3.0+ 通过拦截器实现读写分离与SQL日志记录

前言本文主要是讲解EF Core3.0 通过拦截器实现读写分离与SQL日志记录注意拦截器只有EF Core3.0 支持,2.1请考虑上下文工厂的形式实现.说点题外话..一晃又大半年没更新技术博客..唉,去年一年发生了太多事情..博主真的 一言难尽..有兴趣的可以去看看:记录一下,也许是转折,也许是结…

oracle clob 查询换行,sqoop clob从Oracle导入到hive   回车换行导致记录增多

sqoop clob从Oracle导入到hive 回车换行导致记录增多发布时间:2020-06-27 02:45:01来源:51CTO阅读:3159作者:jackwxhsqoop import --hive-import --hive-overwrite --connect jdbc:oracle:thin:192.168.92.136:1521:cyporcl --…

对于scanf的使用一点体会心得

今天非常的突发气象的在acm上面做了一下题目,悲剧的是多年不用c的人忘记了怎么样的使用scanf了,今天还学到了一点东西。 题目里面提示了输入两个数,规定第1~6列是第一个数的范围,第8~9列是第二个数的范围。…

毕业二十年,为什么人和人之间的差距那么大?

这是头哥侃码的第237篇原创最近天气逐渐转暖,身边的各种聚会也开始多了起来。找个周末,朋友之间喝点小酒,或者跟高中同学来一场久违的重逢,重温着曾经的回忆,加深着彼此之间的感情,想必都是不错的选择。什么…

oracle查询案例,2道经典的oracle查询案例

第一题:第一题:直接贴代码:select Id,Name,Money,(select Money from test1 a where a.Id decode(b.Id - 1,0,null,b.Id-1)) Money1 from test1 b;经典的子查询,注意的就是null值的处理问题,decode或者case是oracle很…

在一起的时候很好,离开后就感觉像是路上的陌生人,没有交点的平行线,也许它们在很遥远的地方交汇了,也许是下辈子吧! 你对我的好,我不是很清楚,你是伪装的,其实用的着那么辛苦吗&…

oracle 12c 多线程,Oracle 12c(12.1)中性能优化功能增强之通过参数THREADED_EXECTION使用多线程模型...

1. 后台UNIX/Linux系统上,Oracle用多进程模型。例如:linux上一个常规安装的数据库会有如下进程列:$ ps -ef | grep [o]ra_oracle 15356 1 0 10:53 ? 00:00:00 ora_pmon_db12coracle 15358 1 0 10:53 ? 00:00:00 o…

使用工作单元UnitOfWork实现事务

概述工作单元模式有如下几个特性:1、使用同一上下文2、跟踪实体的状态3、保障事务一致性。工作单元用来维护一个由已经被业务事物修改的业务对象组成的列表。Unit Of Work模式负责协调这些修改的持久化工作以及所有标记的并发问题。在数据访问层中采用Unit Of Work…

MyEclipse配置Tomcat(图解)

1) 安装完MyEclipse后,在Eclpise的菜单栏可看到MyEclipse一项, 下面的工具栏中可看到MyEclipse的Tomcat图标2) 进行MyEclipse的配置, 从菜单栏中进入“Windows --> Preferences”3) 先要进行JDK的配置&#x…

Python难懂?买一次西瓜就懂了!

什么是code?code就就是一种语言,一种计算机能读懂的语言。计算机是一个傻*,他理解不了默认两可的任何东西。比如,你让你老公去买个西瓜,你老公会自己决定去哪里买,买几个,找个搞活动打折的买,总…

制作oracle11g yum源,利用安装盘简单制作yum源

第一步:创建一个新文件夹,并挂载光驱.[rootlocalhost ~]# mkdir /yum[rootlocalhost ~]# mount /dev/cdrom /mnt/cdrom第二步:安装工具包:[rootlocalhost ~]# rpm -ivh /mnt/cdrom/CentOS/createrepo-0.4.11-3.el5.noarch.rpm第三步&#xff…

安全删除U盘时,遇到提示“无法停止‘通用卷’设备时解决方法

安全删除U盘时,大家常常会遇到提示“无法停止‘通用卷’设备,请稍候再停止该设备。” 这种情况下可以强行拔下U盘吗?当然不可以!这时候如果强行拔除的话,很容易损坏计算机U口或者你的U盘。如果你的U盘上有重要的资料&a…

宠粉老鱼皮带你 “入坑” GitHub!

昨天刚刚教大家 如何更快地访问 GitHub,按照惯例,今天不得来一个 GitHub 教程?最近,鱼皮在持续完善自己 GitHub 上的开源项目,也分享给了很多小伙伴,苦苦哀求大家可以给个 star。liyupi 的 GitHub但是&…

linux中显示目录名,在linux下显示中文目录和文件名

选择一个一劳永逸的方法,就是修改/etc/下的fstab文件,我的fstab内容如下:/dev/hda9 / ext2 defaults 1 1/dev/hda8 /boot ext2 defaults 1 2none /dev/pts devpts gid5,mode620 0 0none /proc proc defaults 0 0none /dev/shm tmpfs defaults…

统计学入门需掌握的四点思想

大家晚上好,自从小天悄悄报名Power Query课程并利用休息时间学习,结果因为太嗨被超模君发现了之后,小天又多了一个任务:利用统计学知识处理和分析之前累积的大量数据。(抱歉,暴露超模君老是鞭策我的事实了&…