序言

    上篇讲了一些etcd常见的集群操作,这篇主要讲述一些可能遇到的常见问题,毕竟上帝(运维)视角总是要看到问题,然后进行恢复。


    对于一个集群来说,常见的莫过于进程崩溃,物理机宕机,数据迁移备份,扩容缩容等操作。剩余的操作无非就是一些常见的问题处理。


备份恢复

    etcd从严格意义上来说,也就是一个存储,不过是分布式环境下的存储,而且保持强一致性,也就是每次有个leader进行发号指令,写入数据的时候,必须leader同意follower回复ok才能写入,而且必须大部分的节点正常响应。

    从而在数据备份的时候,随便备份哪个节点都是可以的。

1、 配置定时任务进行备份

    配置的定时任务,每天的凌晨2点执行脚本,只保留七天的备份,然后将数据备份到固定的目录,脚本备份主要使用自带的etcdctl来进行备份,如下:

[root@docker-ce python]# cat backup.sh 

#!/bin/bash

date_time=`date +%Y%m%d`

etcdctl backup --data-dir /etcd/ --backup-dir /python/etcdbak/${date_time}

find /python/etcdbak/ -ctime +7 -exec rm -r {} \;

    设置定时任务:

    将错误输出和正常输出都重定向掉,是为了防止发送邮件,造成inode数量增大。

2、 数据恢复

    当要进行数据恢复的时候,可以使用如下的步骤:

    打包备份数据,发送到要恢复的主机。

    解压运行etcd:

    在进行启动etcd的时候,除了要指定数据目录,而且必须使用force-new-cluster参数,不然会出现报错,集群id不匹配等信息。

3、 关于数据存储的说明

    在数据存储的目录中,在启动的时候,文件目录结果如下所示:

    在备份中的文件目录如下所示:

    从上面可以看到,丢弃了db文件和tmp文件,丢弃了tmp文件主要是未提交的数据记录,而丢弃的db信息就是集群和几点的一些信息。

4、 单节点扩展成集群

    备份之后,然后进行解压报错,然后启动etcd进程,启动的时候,注意使用相关的参数,如下:

[root@docker-ce etcd]# etcd --name docker-ce --data-dir /etcd1 --initial-advertise-peer-urls http://192.168.1.222:2380 --listen-peer-urls http://192.168.1.222:2380  --listen-client-urls http://192.168.1.222:2379,http://127.0.0.1:2379   --advertise-client-urls http://192.168.1.222:2379  --initial-cluster-token etcd-cluster --initial-cluster centos=http://192.168.1.22:2380,docker-ce=http://192.168.1.222:2380 --force-new-cluster

    添加新的member信息:

    在新的机器上启动etcd进程:

[root@docker1 /]# etcd --name docker1 --data-dir /etcd  --initial-advertise-peer-urls http://192.168.1.32:2380 --listen-peer-urls http://192.168.1.32:2380  --listen-client-urls http://192.168.1.32:2379,http://127.0.0.1:2379   --advertise-client-urls http://192.168.1.32:2379  --initial-cluster-token etcd-cluster  --initial-cluster docker-ce=http://192.168.1.222:2380,docker1=http://192.168.1.32:2380 --initial-cluster-state existing

    注意参数的更新,否则会出现集群的id信息不匹配,peer的信息不匹配等错误。


可能出现的问题

1、 时钟不同步

    时钟不同的时候,出现错误如下:

2018-02-09 05:45:37.636506 W | rafthttp: the clock difference against peer 5d951def1d1ebd99 is too high [8h0m2.595609129s > 1s]

2018-02-09 05:45:37.717527 W | rafthttp: the clock difference against peer f83aa3ff91a96c2f is too high [8h0m2.52274509s > 1s]

    将时间进行同步即可。

2、 集群id不匹配

    主要是因为数据目录没有删除,然后导致集群的id不匹配,删除数据目录,然后重新加入即可。

3、 删除的时候数据目录报错

2018-02-07 22:05:58.539721 I | raft: e0f5fe608dbc732d became follower at term 11

2018-02-07 22:05:58.539833 C | raft: tocommit(25) is out of range [lastIndex(0)]. Was the raft log corrupted, truncated, or lost?

panic: tocommit(25) is out of range [lastIndex(0)]. Was the raft log corrupted, truncated, or lost?

goroutine 59 [running]:

github.com/coreos/pkg/capnslog.(*PackageLogger).Panicf(0xc4201730e0, 0x559ecf0e5ebc, 0x5d, 0xc420121400, 0x2, 0x2)

/builddir/build/BUILD/etcd-1e1dbb23924672c6cd72c62ee0db2b45f778da71/Godeps/_workspace/src/github.com/coreos/pkg/capnslog/pkg_logger.go:75 +0x15e

github.com/coreos/etcd/raft.(*raftLog).commitTo(0xc42021a380, 0x19)

/builddir/build/BUILD/etcd-1e1dbb23924672c6cd72c62ee0db2b45f778da71/src/github.com/coreos/etcd/raft/log.go:191 +0x15e

github.com/coreos/etcd/raft.(*raft).handleHeartbeat(0xc42022c1e0, 0x8, 0xe0f5fe608dbc732d, 0x5d951def1d1ebd99, 0xb, 0x0, 0x0, 0x0, 0x0, 0x0, ...)

/builddir/build/BUILD/etcd-1e1dbb23924672c6cd72c62ee0db2b45f778da71/src/github.com/coreos/etcd/raft/raft.go:1100 +0x56

github.com/coreos/etcd/raft.stepFollower(0xc42022c1e0, 0x8, 0xe0f5fe608dbc732d, 0x5d951def1d1ebd99, 0xb, 0x0, 0x0, 0x0, 0x0, 0x0, ...)

/builddir/build/BUILD/etcd-1e1dbb23924672c6cd72c62ee0db2b45f778da71/src/github.com/coreos/etcd/raft/raft.go:1046 +0x2b5

github.com/coreos/etcd/raft.(*raft).Step(0xc42022c1e0, 0x8, 0xe0f5fe608dbc732d, 0x5d951def1d1ebd99, 0xb, 0x0, 0x0, 0x0, 0x0, 0x0, ...)

/builddir/build/BUILD/etcd-1e1dbb23924672c6cd72c62ee0db2b45f778da71/src/github.com/coreos/etcd/raft/raft.go:778 +0x10f9

github.com/coreos/etcd/raft.(*node).run(0xc420354000, 0xc42022c1e0)

/builddir/build/BUILD/etcd-1e1dbb23924672c6cd72c62ee0db2b45f778da71/src/github.com/coreos/etcd/raft/node.go:323 +0x67d

created by github.com/coreos/etcd/raft.RestartNode

/builddir/build/BUILD/etcd-1e1dbb23924672c6cd72c62ee0db2b45f778da71/src/github.com/coreos/etcd/raft/node.go:223 +0x340

    这种主要是需要将节点作为一个新的节点加入到集群中,直接启动的话由于找不到集群的文件和日志文件,从而报错。

待续。。。。


©著作权归作者所有:来自51CTO博客作者mb5fdb131956bf3的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. etcd集群之序
  2. CentOS8配置本地yum
  3. MySQL企业版备份工具MEB
  4. 分享两个Mysql在线全备和binlog日志备份脚本
  5. 【springboot】使用redisson分布式锁
  6. K8S 之 通过kubeadmin安装K8S集群
  7. 记录一次Postgresql的repmgr高可用集群切换故障
  8. 使用zabbix监控ceph集群的三种方式
  9. 二进制部署K8s集群第25节之k8s技术点整理

随机推荐

  1. SDK Platform Tools component is missin
  2. Android四大布局
  3. android视频播放库
  4. XML Drawable
  5. eclipse中查看Android SDK源代码
  6. Android调用手机拍照以及从相册选择照片
  7. Android面试题集(陆续更新中)
  8. [zz]Android TableLayout
  9. Andorid学习笔记(ADT)-常见的UI布局
  10. Android 测试技能树