MegaThinking

better tokens, better intelligence, contributing superior tokens to models

etcd v3.1.9

什么时候生成

etcd 启动时设置了参数 –snapshot-count 即 index 变化 达到该值时,会生成 .snap 文件

相关代码如下

1
2
3
4
5
6
7
8
func (s *EtcdServer) triggerSnapshot(ep *etcdProgress) {
if ep.appliedi-ep.snapi <= s.snapCount {
return
}
plog.Infof("start to snapshot (applied: %d, lastsnap: %d)", ep.appliedi, ep.snapi)
s.snapshot(ep.appliedi, ep.confState)
ep.snapi = ep.appliedi
}

文件名规则

snap 的全称呢 snapshot,是快照的意思,在 etcd v3 里面呢,是把 v2 的内存数据存储到磁盘上,生成 [Term]-[Index].snap 一类的文件

snap 文件名生成规则

fname := fmt.Sprintf(“%016x-%016x%s”, snapshot.Metadata.Term, snapshot.Metadata.Index, snapSuffix)

是否可以删除

说到 v2 的存储,全部在内存中,而且是一个非常直接的实现,看着就是个多叉树

那么是否 .snap 文件就可以删除掉了呢

  1. 如果存储了 v2 的数据,显然不能删除,否则 etcd 重启之后,就无法从 .snap 文件中恢复出 v2 的数据了;当然恢复也不会是全量的数据,因为有 —snapshot-count 控制,会丢这个数的 Index
  2. 如果没存储 v2 的数据,都是存的 v3 的数据,这种情况下,能否删除?
    这就要看 .snap 文件除了存储 v2 的数据还存了什么东东;以及存的这东东,还有什么其他重要的用途了

看了 etcd v3 的 restore 代码之后,我们知道 restore 会在 snap 文件下生成 v3 的存储 db 文件,以及一个 .snap 文件,这个 .snap 文件存储了啥东西嘞

相关代码如下

1
2
3
4
5
6
7
8
9
10
11
// first snapshot
raftSnap := raftpb.Snapshot{
Data: b,
Metadata: raftpb.SnapshotMetadata{
Index: commit,
Term: term,
ConfState: raftpb.ConfState{
Nodes: nodeIDs,
},
},
}

其中的 Data 并不重要,只是存储了两个 namespace,其实就是两路径

1
st := store.New(etcdserver.StoreClusterPrefix, etcdserver.StoreKeysPrefix)

重要的是 Metadata 中的 Index 和 Term

显然也不能删除

etcd 在启动时,会读取 .snap 文件,获取其中的 Metadata.Index,使用这个值去搜索应该从哪个 wal 文件开始继续处理

回忆一下 .wal 文件名的第二段,正是当时 wal 存储中的 index

wal 的搜索代码如下

1
2
3
4
nameIndex, ok := searchIndex(names, snap.Index)
if !ok || !isValidSeq(names[nameIndex:]) {
return nil, ErrFileNotFound
}

从最旧的 wal 搜索到最新的 wal sort.Strings(names),直到搜索到

1
2
3
if index >= curIndex {
return i, true
}

如果 .snap 文件不存在,那么会从 index = 0 开始搜索 wal 文件,也就是说 .snap 文件不存在的时候,必须存在 0000000000000000-0000000000000000.wal 文件,否则 etcd 启动时会报如下错误

1
2017-10-02 13:49:08.313573 C | etcdserver: open wal error: wal: file not found

wal 中存储了 raft MemoryStorage 的 entries / raft HardState,etcd member id 和集群 id

构造一个异常情况

purge 保留 1,snapshot count 设置的超大,重启 etcd 会发生什么?

1
./bin/etcd --max-snapshots '1' --max-wals '1' --snapshot-count '20000000'

这个异常意义在于 snapshot 文件并未生成,而此时 wal 被 purge 之后,第一个 wal 被删掉了,那么重启 etcd 后会出现前述 wal: file not found 的错误。

持续往 etcd 写入数据,直到生成新的 wal 文件,然而不幸的是,并没有观察到 purge 的动作。 那么问题来了,etcd 是在哪儿做了保护?

查看 purge 的代码发现了如下的轨迹

1
2
3
4
l, err := TryLockFile(f, os.O_WRONLY, PrivateFileMode)
if err != nil {
break
}

也就是说 TryLockFile 成功才可以被 purge 掉,那么我们可以进一步推测没生成 .snap 文件之前,etcd 不会释放 LockFile,阻止仍然有用的 wal 文件被 purge 掉

为了验证我们的猜想,查看 wal/wal.go 的 ReleaseLockTo 方法,直接贴该方法的注释吧

1
2
ReleaseLockTo releases the locks, which has smaller index than the given index except the largest one among them.
For example, if WAL is holding lock 1,2,3,4,5,6, ReleaseLockTo(4) will release lock 1,2 but keep 3. ReleaseLockTo(5) will release 1,2,3 but keep 4.

继续看,ReleaseLockTo 方法被谁调用,即什么时候释放 wal 文件的 lock,什么时候允许 wal 被 purge

okay,答案符合我们的预期。ReleaseLockTo 在 etcdserver/storage.go 的 SaveSnap 方法中被调用,还是直接贴该方法的注释吧

1
SaveSnap saves the snapshot to disk and release the locked wal files since they will not be used.

忙了一周 + 1 天,又是一个全员加班的周六

从上周六开始,独立维护了一套平台环境,验证服务升级部署

只能说进一步熟悉了业务

支撑了另外一个部门的服务部署,对面那哥们问我来多久了,我曰一个半月,对方回感觉都要成 xx 专家了,我曰怎么会,术业有专攻,对方回之前在哪儿待的,我曰啊,在学校呀,对方回天将降大任于斯人也

工作呀,对我来说,最需要成就感,哎,果然是个骄傲的不行的人,老师评价的不错,是得改改了,没必要和自己过不去

刚看了一个文档,终于理解了 etcd 的神逻辑。Disaster recovery 的时候,需要使用旧的数据 force-start-new 一个单节点集群,该集群正常启动后,将其 peer url 更新为对外 url,后继可正常添加成员

在 cluster-health 的情况下才可以 Member add。Member add 之前,删除其 data-dir,避免数据不一致

从 snapshot 恢复时,不用 force-start-new,因为 snapshot 没有集群 metadata,只有 key 数据

如果是数据从 v2 迁移至 v3,对 data-dir 执行 migrate 之后只是将 key data 转成了 mvcc 格式,而 cluster meta data 还是旧的,因此需要走 force new start 流程

如果是全新的集群启动,则所有 etcd 以 new 状态启动即可

这样就覆盖了所有流程

终于要去见来杭的 Gloria 了,据说为了见人,还特意剪了个发型,不过剪的不好,笑,等会儿看看有多惊艳

杭州应该进入了梅雨季节,一言不合就下雨,天气略闷热,而我的工作略忙

这篇在地铁,公交上写完

2017年06月11日12:53:16 杭州

这次不文艺风了,吐槽篇

昨晚第一次刷夜完成了一次安装,哦对了,是提心吊胆,一脸懵逼的完成了

这么复杂一个系统,那么多组件,随便崩一个,修复起来都够呛,对于新手如我,简单问题能弄就直接弄了,不能也只能一遍一遍的重装。现在才理解“概率性”失败的含义,囧,总之就是因为事情太复杂,偶尔一些未知因素叠加在一起,就导致了异常的情况,然后就概率性失败了,重试的时候可能好可能不好。

这些天好混乱,各种事情堆着,这个事儿还没做出个结果,又有其他事情也说要了结一下,总感觉这样子赶鸭子上架,没有准备和思考时间,对自己能力提升有限,更别说底下的工作效率了。

最近基本都和程序打交道,别提遇到坑爹的领路人。我遇到的问题,去咨询他,blabla 胡乱给我解释一通,老哥,我也是写过代码的好不好,那么容易忽悠么,总之,好几次最后都是我和他说了正确的解释。哎初来乍到,就当供着你吧,谁让我也是好人。

本来这周末是部门出游的,部门其他组都去的差不多的,就我们组只去了零星几个,可见强度。特别是看着群里的两位小伙伴(hcl, yy)还在端午假期中,无限感慨呀。

2017年06月04日12:44:32 杭州

昨晚团队第一次聚餐,喝了点儿小酒,仍然是不胜酒力呀,一杯就脸红,囧。

工作上的事情么,最近在研究 etcd,经过好几天的熟悉摸索,现在总算把框架写好了,后继往上加功能即可。反思是开工之前,先好好研究文档吧,直接看别人的代码,听人讲思路,还是理解不能。

新接了一个 issue,还没看懂啥意思呢,节后再问老司机到底啥情况了,先把 etcd 那个搞完吧,毕竟思路还顺着,一鼓作气。

最近还是疯狂加班,工作效率低么。主因语言还不太熟悉,有点重回大一那个时候,编译通过,都有振臂高呼的兴奋心情,哈哈,有点夸张了。另外就是部署测试效率低,自己很想研究下相关自动化的工具,无奈担心不误正业,只能手工一遍一遍的操作了。

杭州呢,还是保持着一星期下一次雨的节奏,天气并不是特别炎热的感觉,毕竟早出晚归,没机会体验。昨晚聚餐,本地同事开车捎去的,本地人都好低调,朴朴素素的,然而车库一看奔驰 SUV,厉害了我的哥。

一学弟和学妹近期就要来杭州实习了,杭帮又壮大了;六月份也是毕业季,准备又可以见到新同事了,同样是满怀期待。

这个端午屋里好热闹,来了室友A男票、室友B表妹。先写到这儿了,周末研究家常菜系列又开始了。

Windy Hill

2017年05月28日10:54:39 杭州

最近好像天气变热了不少,然而早出晚归的我,几乎没有感受到夏天的炎热。早上七点起床,收拾一会儿就出发,在天气好的时候,自然是能披一道阳光在身上了。晚上不时十一点才回来,路上偶尔还能遇到几个不知何原因同样晚归的路人,不过有时候也会有些害怕就是了,毕竟只有大马路上来往的车辆,才提醒你还有人烟的存在,要是阴暗处杀出个神魔鬼怪,还是挺担心的。所以如果当天穿着运动装的话,就一路小跑回去了,好在也只是 1.7 公里而已。

这周又到了月末周六上班的时候,因为下周就是端午节假期了,好吧,想想又是一个六天工作日的一个星期。昨天早上起来的时候,还一直纳闷闹钟怎么还没有响,忍不住去看了一眼时间,结果早过点了。原来闹钟只定了工作日,这月末周六不按常理出牌,当然闹钟没动静了。话说回来,其实很少被闹钟叫醒,几乎都是在闹钟时间之前就有意识的醒了,可能还是微微有些压力,或者是 passion?passion 多一些,有时工作时间解决不了的问题,回到家洗个澡,悠闲的看着自己的电脑,查查资料,很快就想明白了,第二天到公司验证,果然解决了。

对公司业务、用到的技术有了更多了解,开始能解决一些问题了;写了点儿代码,合并到主干去了,昨晚已经转测试了。然而还有很多不懂的东西,经常去请教老员工或者是比我来的稍微早一些的同事就是了,不懂就要问么。问题都是带着目的性的,比如问这个问题,了解这个问题之后,我可以完成什么任务。解决问题之后,自己也会思考着总结一下,写写 wiki。感觉自己不太能记东西,就是别人说一遍,非得理解清楚背后因果关系,或者自己实践一下,才能掌握。

上周比较无语的一个事情是和一个异地团队联合调试,踩了各种坑,同时也填了各种坑。事情背景:我团队需集成 Ta 团队提供的一个 SDK 到产品中。事情过程:本来是个很简单的操作,然而由于该 SDK 他们也在开发中,版本升级没提前知会;一开始我使用的旧版本,输出结果总是不对;问主管找到他们的咨询人员,联系后被告知在开会,回有时间帮忙看看;一等等一上午,到下午两点多的时候,才说版本升级了,用 xx 版本的试试;用了 xx 版本之后,总算解决问题了;到此以为问题完了,才不是,简直噩梦的开始,后来验证过程中发现对方 SDK 中有几句错误代码,导致运行不正常,代码截图发他们的咨询人员看,对方还强调说他们没加这个代码,说再去确认一下;反正我是无语了,SDK 就你们给的,而且还在里面发现了这个代码,那这代码是谁加的呀。不管怎么说,这个集成任务完成了,不过后续和对方团队的联调,感觉还是困难重重。

感触就是工作中,很多事情不是自己一个人能解决的,等待、沟通、扯皮(笑)都需要时间,慢慢习惯咯。

这次文字拖的比较晚,有点忙 ~ 坐在客厅的沙发上,闻着邻居家的菜香,写了此篇。看会儿菜谱出去买菜去了,还要买一周的水果。

最后,最近只能听的下纯音,推一些纯音好了

美丽的神话
最浪漫的事
斯卡布罗集市
绿野仙踪
高雅~メインテーマ

遥祝你们一切都好。

2017年05月21日11:26:59 杭州

童话镇

除了工作还是工作呢。

挺有意思的,刚来的一波新人,还啥都不懂呢,就被拉上去做 support 了,囧,能 support 什么,也是得找各种直接负责人一起定位问题。可能也是被找来帮老员工挡问题的吧。

毕竟是底层基础架构的,每天问题单雪片似的飞来。分布式软件真是不好调试,加上系统复杂之后,引入的额外负担,更别提多小组多部门的各种推诿了。

go 语言好么,目前觉得看的很难受,接口非常松散,不太容易搞清楚调用关系,经常看着看着就晕了。

上周我是被派了一个 issue,本来以为要写代码的,后来仔细看了,并不是一个 bug。和 leader 沟通后,转成了一个通过代码整理文档的任务,工作量之大,不可小觑。

转接了一个 ticket,本来以为要写代码,后来和开发沟通后,又确认了并不是一个 bug。和提 ticket 的同事解释了很久,对方终于接受了。

今天是刚接了一个升级任务,晚上刚想到环境上面去测试,结果环境崩了,正逢周末,得拖到下周才能验证了。时运不济呀。

挺累的,身心俱疲。

该给自己的身心减减负了,let it be。

2017年05月12日23:53:45 杭州

这星期过的好快,因为只有四天。

杭州最近是一星期得两三天下雨,还挺凉快。

回想起来这星期并没有做很多事情,当然不是我偷懒了,培训就占用了两天时间,讲些泛泛的概念,各种名词,听不懂。还是做成了一件事的,为了把 kubernetes 要求的网络环境弄通,真是花了自己的十八般武艺加上各种请教人,最后解决的时候,还是很喜欢解决问题和合作的感觉的。也没多少技术含量,就是使用工具加思考定位问题而已了。

总之下周要上一个小项目,五个人,两个技术核心 + 三小弟(我是其中之一),有点小压力。工作的事情不多说啦,总之我很努力就是了。

想想学弟们的近况,反正更是厉害了,不想说有 2 G家,10 A家 … 吓人,实验室下一届大概有 50 人的样子。

上周末去了一学弟家做客,绍兴的诸暨,诸暨的乡下好美丽,感觉挺富足的,五泄风景区很漂亮,顾名思义,其实就是有五个小瀑布,那个地方还有个小水库,我们还坐船玩儿了会儿。学弟爸爸问,五泄怎么样呀,我觉得我词穷了,简直觉得读书少,对答不上了,只能说很美呀,一车人都笑了。好喜欢乡里乡亲人与人之间亲密的联系,中午在学弟家吃的,晚上去了他一亲戚家吃,叔叔阿姨都很热情。

一天都玩的挺开心的,就是回程的时候不太顺利:室友手机看剧,我也看了会儿手机没注意时间,等看到时间的时候,只剩两分钟就开车了,走到检票口的时候,公告牌都显示停止检票了。这还是第一次这么愚蠢的错过火车来着 sigh。

先写到这里咯,回来看这乱七八糟写的都是什么呀。

遥祝你们一切都好。

2017年05月05日21:59:01 杭州

忙碌了一星期,终于可以安心的坐下来,听着小音乐 (《神话(古筝)》),安静的写东西了,也是幸福的时刻之一。

工作上的挑战还挺大的,具体来说呢,因为之前我都是在写业务代码,所以只要熟悉之后,写起来也轻车熟路的。然而工作做的这个方向,偏技术,使用的语言也不同,需要学习很多东西,着急不了,就是得耐心去补一些知识,才能慢慢上手。其次项目的代码量挺大的,一天看下来,头晕眼花,还没太理清楚,不过也是越看越有感觉了。另外一个挑战是,项目近期要出版本,整个组都疯了似的,坐我后面的好几个“兄弟”在公司睡好几晚了。项目太忙,新人虽然都有导师,然而实际上属于没人带的节奏,节后等项目交付了会好一些吧。同事都挺厉害的,来自浙大、杭电的比较多,毕竟本地的学校。

至于工作的时间点,早上八点之前,晚上一般得九点之后,中午十二点到一点半休息。午休算是比较有公司特色的了,会关灯,大部分人都会睡觉的,所以大多都买了午睡床。我一般是早上七点起床,到公司吃早餐,然后到工位大概七点四五十的样子。

周末的时候童鞋来杭出差,和他们去了九溪,挺美的一个地方,图片已发圈,有张图片拍的还挺有九寨沟的感觉的;吃了杭州酒家,哈哈,还记得么,那一大块东坡肉。

昨晚回来的时候十点多了,忘记带钥匙了,遇到一个小姑娘,帮开了门禁,我说了谢谢。后来没想到居然还在同一单元,和她同一电梯上去了,她还让我帮她按了 10 楼,我说她怎么这么晚才回来,她说下去买东西啦。不知道为什么,莫名觉得温暖。朋友看了那状态说 “心无邪,爱永恒”。

对了,杭州这边是有公共自行车租用的,公交车站附近一般都有这种公共自行车停放点,用公交卡就可以刷开骑走,一小时内是免费的,还挺方便的。这里当然也有共享单车,不过没有摩拜就是了。

室友 A 早上会起来在小区里跑步来着;我呢,周末做做饭,看看书,偶尔出去看看风景,还挺有意思的。想想 Work life balance 挺难的,因为 work life 觉得并不能彻底分开的,珍惜时间才是永恒,工作的时候就全力以赴,生活的时候就认真生活。

还有就是最近学弟学妹们找实习已渐进尾声了,听闻收获不少大实习 offer 的消息,g 家好几个,a 家好几十个,微软结果快出了吧,真是后生可畏呀,感觉都不好意思说自己是这个实验室出来的了,老学长连沙滩都够不着就被打翻了。

不过老学长心态还是很好的,好好做自己了。

最近比较大的失误觉得是,刚工作,不熟悉,又着急想出成绩,心态不太好,总之就是浮躁,会好好调整的。

突然想到室友 B 明天回北京去看男票呢,也祝这 cp 有好结果咯。

写的不好,流水账,也不温暖,就是生活本来的样子。

2017年04月28日22:54:12 杭州

今天还是例行写点咯,记录下流淌的岁月,以后拿出来再回味也是极好的 ~

最近最大的事情就是知道了自己的工作方向了,说实话,有点出乎意料了,毕竟这个方向之前木有深入的实践过,只了解一些皮毛,所以得投入大量的时间在工作中学习咯,快速学习新知识也是一种能力嘛,毕竟现在这个知识爆炸的时代,这个能力也是很重要的,不亏,总之努力对得起吹过的牛逼。

导师是个team leader,级别不低,不是年轻人咯,不过还挺幽默的。之前在宜信的时候,导师也是刚入职的新人,没啥时间指导。这正式工作了,虽是个老司机,不过更没时间指导。还是得靠自己,不懂就多问,厚着脸皮问咯。至于同事呢,各个学校的都有,浙大、杭电人居多,各种专业的也都有。

这边忙不忙,看部门看组的,也有不少部门是准点下班的。我是得早上八点前,晚上不时得到最晚时间(11点)。由于公司比较大,招人多,也有不少看起来不像程序猿的非典型程序猿的。食堂吃饭,不时能看到一些外籍员工。培训的时候,同组还有一个台湾小哥,挺 fashion 的。当然也有很多典型的 IT 男了。

周日两童鞋从帝都来杭,说是要一起吃个饭呢,蛮好的,从来就不孤单。来这边一开始是辛苦了一点,不过这慢慢的工作生活,都走上了正规,也算是过好小日子了吧。“带着这份温暖和善意一直走下去”。

呃,有个不幸的事情,刚去看照片的时候,发现在台湾的最后一天的照片原图找不到了,只有很少一部分处理过的照片,有点遗憾 ~ 不知道有木有机会再去一次,把这些照片补上[机智]啊。另外特别感谢文兄还留着那健身照!不然真就丢了。

也没到要睡的时间,这次就不说好梦了。

2017年04月21日22:23:25 杭州

有很多想写的话,待付诸笔端之时,又不知从何下手。断断续续的写了这些。

《时间煮雨》

这些天连着下了两天雨,接着半天阴天,到下午才有阳光的影子。开心的是晾了三天的鞋子可算有了要干的迹象。雨水充沛,四处绿色,是这座城市的一大观感。

室友 A 前几天匆匆买了去北京的票,心里想着五一、端午过后,就只有十一了,中间隔着好几个月,还是回去看看 TA 吧。A 就职网易云音乐前端部门,平均下班时间九点到九点半。下班回来后,偶尔会在客厅的沙发上闲聊一二,而后到点回屋歇着。

沙县小吃(特别多,感觉到哪儿都有),黄焖鸡米饭(也是一样,哪儿都有),周边小店已然吃腻。待室友 B 锅碗瓢盆、菜米油盐买齐了,我们涮火锅 or 煮面条 or 有闲心的时候做饭吃。室友 B 在阿里 B2B 部门从事后台开发工作,平均下班时间八点,热爱生活。

室友 A 和 B 都是之前实验室的同学了,彼此熟悉,以后很长时间会互相帮助的。

偶然间看到微信订阅号上显示的标题《是你们见证了破壳的生命之光》,点进去看了下,惊奇的发现这不就是刘晓晔和王印么,不就是上次去看的《两只狗的生活意见》的主演么。再往后翻,扫到了新话剧的名字《蛋》。回想起当时出剧场时,对着墙上的宣传画拍照,画上宣传的应该就是这剧了。杭州也有蜂巢剧场呢,不知道会发生怎么样的故事。

啊,刚回屋的路上,突然一个语音进来。之前老打架的学妹开心的说,居然收到了阿里的 offer,喜极而泣。据她自己说的,面完二面觉得自己挂了,没想到还是收到了 offer,并且是核心部门。不过真不太敢想象她过来的样子,希望她还有更好的去处。

另外体检的地方离西湖好近,所以体检结束后又去西湖走了走。哎,抱歉,美得有点腻了,绿水雾天,直接上图吧。

(图去了吧,今天想起来自己看一眼,发现加载速度很慢 …)

《青空》

2017年04月14日23:31:47 杭州

0%