好吧,我这篇文章的题目已经非常的直白了,这是一篇招聘广告,唯一的目的就是吸引对 PD 有兴趣的同学参与到 PD 的开发中来。当然如果你对我们不感冒,你也可以通过这篇文章大概知道 PD 后面主要干啥。
职责
无论是我们公司,还是其他的公司,对于 Job 的描述,无非几块,第一块详细的说工作职责,再来就说对你的要求是啥,然后再来一个加分项,最后可能在谈谈公司的福利啥的。
这里我想来谈谈第一块,工作职责,这一块大家都会写的比较详细,但普遍的一个问题在于我们不可能告诉大家为啥要去做这些事情,做这些事情会有那些挑战等。毕竟公司的招聘页面篇幅有限,也不可能去长篇大论。如果要详细了解,只能在面试的好好讨论了。所以,我觉得有必要多提前多介绍点,让更多的同学了解我们,加入我们的行列。
下面是我写的 PD 的工作职责。
- 负责集群全局调度系统的设计,开发,文档撰写
- 负责集群模拟器的开发
- 负责集群可视化系统的开发
好吧,是不是一脸懵逼,至少我一下子就会蹦出来三个问题,什么是调度系统,什么是模拟器,什么是可视化?所以下面就来依次说一下。
Keyword
在继续之前,先简单介绍下一些基本的概念和流程。在 TiKV 里面,我们会把所有数据当成一个无限大的已经排序的 map,然后使用 range 的方式对数据切分成不同的 region。譬如 region 1 覆盖的 key range 范围可能是 [a, b)
,region 2 覆盖的可能就是 [b, c)
,range 区间是左闭右开的,不同 region range 不可能重叠。Region 是 PD 这边处理的最小单位。
我们使用 Raft 来保证数据的一致性,对于一个 region 来说,通常有 3 个副本,我们也可以配置其他的副本数,譬如 5 或者 7 个。关于 Raft,大家可以详细的去看我之前写的 「小猪佩奇」系列,这里重点强调一下,对于一个 Raft group 来说,所有的 write 和 read 都是通过 leader 来进行,虽然也可以支持 follwer read,但现在我们这边没有支持,先不做讨论。
调度
当你的集群有几百台机器,有非常多的数据的饿时候,调度的作用就非常明显了。如果调度设计的不好,很容易导致整个集群性能的抖动,甚至把集群搞得完全没法工作。所以,调度应该是 PD 最重要的工作。
先来看看下面的一种情况,我们有 3 个 TiKV 节点,3 个 region,然后所有的 region 的 leader 都在 TiKV 1 上面。
明显可知,TiKV 1 的压力会非常大,因为所有的读写都是经过这个节点,所以 PD 会考虑进行 leader balance,也就是将 leader 调度到不同的 TiKV 上面,譬如下面这样。
再来一个情况稍微复杂一点的场景,在一些用户那边,有可能是两地三中心这种架构(虽然三地三中心是最好的),也就是两个 IDC 放在一个城市 A,而另一个 IDC 放在远端的城市 B,通常业务都是跑到城市 A 的,所以 PD 会保证所有的 leader 都在城市 A 这边。
当数据量不断膨胀,我们需要添加一个新的 TiKV 节点,PD 就要考虑将一些数据调度到这台新的机器上面了。
这时候,我们不光就要考虑 leader 的平衡,也需要考虑数据 size 的平衡了。譬如像下面这样。PD 在新的节点上面放上了两个 region,保证了大体的 size 平衡。这里我们假设的是 region size 都差不多,但实际情况会更加复杂。
上面就是简单的列了一些 PD 一些调度策略,leader 和 size 调度,但还有更多,譬如 PD 会根据当前 TiKV 的业务情况,平衡有热点写,或者有热点读的 region,我们叫做 hot region 调度。或者升级 TiKV 的时候,为了不影响业务,先将 leader 从这个 TiKV 迁移到其他 TiKV,等 TiKV 升级完毕才重新迁移回来。
当然还有更复杂的,PD 有很多调度策略,当所有这些调度策略混合到一起的时候,调度会不会冲突,譬如调度 A 将一个 region 的 leader 迁移到一个 TiKV,而调度 B 又重新把这个 leader 给迁移回来了。
所以你看,要实现一个强大的调度系统,真的是一件非常困难的事情,挑战很大。
模拟器
当你开发了一个调度系统,如何看它能不能正常工作呢?简单的做法,就是自己搭建一套机器,测试呗。但如果你这个调度要测试数据量有几百 T 的时候,整个集群能不能正常工作,等你给集群灌道几百 T 数据,黄花菜都凉了。再说,通常公司也不可能直接跟你这么多机器来测试灌数据的。
解决这个问题的一个好办法就是写模拟器,这也是很多公司通常的做法,既然我们没有机器和时间,那就写模拟器来折腾这个事情。
要把模拟器写好可是一个大工程,首先你需要尽量模拟实际的情况,譬如我们需要定期分裂 region,考虑实际 TiKV 增加副本的时候有时间开销,不是瞬时的这些。
另外,我们也可以通过记录实际生产的调度情况,在模拟器里面重放,看调度效果。据我所知,某大厂的调度系统就经常录制线上的流量,然后用模拟器进行回放,来观察调度器的工作。
当然,模拟毕竟跟实际情况还是有区别,我们最终还是要去生产环境中检验调度的效果,但前期模拟还是能帮我们发现很多问题。
可视化
好了,上面说了调度,说了模拟器,那么我们如何知道实际的效果呢?当然可以通过日志, API 还有 metric 知道。但这些其实还不是特别方便,我们需要更直观的方式。
通过可视化,我们可以非常直观的看到整个集群的变化状态,知道现在集群是不是有问题。
上面是 PD 现在的一个可视化组件,是不是炫酷吊炸天。但还有很多东西需要去完善。现在只能大概知道集群的变动情况,还很难通过它去发现问题,要做的工作当然很多。
可视化其实对程序员的要求很高,毕竟这种交互界面,自己不没点美感,同时没丰富的人机交互经验,真的是很难做出来的。也就是说,弄出来你真的就可能是一个全栈工程师了,而且特么的还是分布式的。
福利待遇
好了,扯了这么多,相信各位大概也知道了 PD 要做什么了。总之,这是一个非常有挑战性的工作,难度还是很高的,但也会非常的有趣。我相信,加入我们,你会成长的非常快速。
好吧,再来说说现实一点的问题,加入 PingCAP 能有啥好处?我觉得可以有几方面吧:
- 金钱。这个不用说了,薪酬还是很有竞争力的,具体要跟我司崔老板去谈了。我承认现在大厂开的价钱已经离谱到匪夷所思的地步,但我们还有期权,也许你说这玩意就是张白纸,有啥用?但我觉得,贵司的老板们铁定不是那种坑爹类型的。期权对于一个处于上升期,正在腾飞的企业来说,真的就是未来的一笔能遇见的财富。随着 TiDB 新版本的发布,客户呈现了爆发式增长,各种不同业务案例也不少(当然,具体客户情况还是 confidential 的,不过你来了就了解了)。还有一个利好的消息是贵司现在海外湾区的分部已经搞起来了,刚落地有了 fulltime 的小伙伴全职加入,大家觉得更有信心了。
- 影响力。也许你会来一句,『名利于我如浮云』,但我觉得,我们非常重视大家的成长,对于大家的优秀成果,我们都会鼓励大家,或通过写文章,或出去参会这些的,分享出去,提升自己和公司的知名度。我们其实并不担心「把你锻炼出来了,别其他公司高价挖走了」这样的事情,因为这本来就是事实。如果你能力真的成长起来了,对公司就是一个好事,如果你这时候认可公司,留下来,我们会非常的欣喜,如果考虑其他机会,也未尝不可。这其实都是一个双赢的结果。当然,你喜欢了我们的工作方式,肯定就不想走了。
- 极客文化。弹性工作制,不打卡这种的不提了,毕竟是很多公司的标配了。你也可以尝试在家 remote,只要你能耐得住寂寞。周末我们通常会鼓励大家去参加 meetup,但来上班就随意了。相比很多公司把你做的核心东西藏着掖着,我们是真正的开源,让你能够跟全世界顶尖的开发者一起协作,共同成长。
要求
最后,来说说要求吧,毕竟招人就像是相亲,总得有个门槛的。
- 抗压能力。这没招,创业公司,压力真的很大,而且现在我们用户特多,压力就更大了。
- 知识背景。有多年分布式开发经验吧,至少 CAP,Raft 这些的总得知道。当然,如果你有调度系统的开发经验,折腾过 Kubernetes,Mesos 等东西,那更好了。
- 语言上面我们主要会使用 Go 和 Rust,如果没有这两门语言的开发经验,有C,Python 这些的也没问题。当然,Rust 可能对一些同学是一个坎,就看你能不能克服了,毕竟这门语言实在太难上手了。
当然,我们也非常欢迎实习生,对于想来实习的同学,你只要觉得自己主动性强,肯学习,能写代码就可以了。当然,也还是需要抗压能力的,因为我们有时候也直接会让实习生去解决用户问题,虽然压力很大,但能让你快速成长。
小结
好了,说了这么多,相信你也对我们有所了解了,你可以先去了解下 PD,代码在 https://github.com/pingcap/pd,欢迎给我们提 issue 和 PR。
如果你对我们感兴趣,欢迎联系我,直接发邮箱到 tl@pingcap.com 就可以了。