DevilKing's blog

冷灯看剑,剑上几分功名?炉香无需计苍生,纵一穿烟逝,万丈云埋,孤阳还照古陵

0%

原文链接

Timbala

“A distributed system is a model in which components located on networked computers communicate and coordinate their actions by passing messages.”

Requirements:

  • Sharding
  • Replication
  • High availability and throughputfor data ingestion

OpenTSDB

分成多个里程碑

  • 单节点,可存,可查
  • 多节点的shared, replication部分,以及手动方式的rebalance
  • anti-entropy?
  • 研究性的,numa,data/cache locally, SSDs, 等等

最终集中在几点:

  • Coordination
    • keep coordination to a minimum
    • avoid coordination bottlenecks
  • Indexing
    • each node knows what data is
    • Consistent view; knows where each piece of data should reside
  • On-disk storage format
    • Log-structured merge
    • LevelDB
    • RocksDB
    • LMDB
    • B-trees and b-tries (bitwise trie structure) for indexes
    • Locality-preserving hashes
  • Cluster membership
  • node in cluster
  • could be static动态更好?
  • node dead to stop use
  • Data placement (replication/sharding)
    • Consistent hashing,
    • 1/n of data should be displaced/relocated when a single node fails, partition key
  • Failure modes

hashicorp’s memberlist

Consistent hashing:

1
2
3
4
5
6
7
8
9
10
func Hash(key uint64, numBuckets int) int32 {
var b int64 = -1
var j int64
for j < int64(numBuckets) {
b = j
key = key*2862933555777941757 + 1
j = int64(float64(b+1) * (float64(int64(1)<<31) / float64((key>>33)+1)))
}
return int32(b)
}

这里的测试挺有意思

  • Unit tests

    • data distributed tests 涉及到分配的平均性

    • data displacement tests 迁移的测试

    • data displacement failure 迁移失败的处理

    • jump hash gotcha 进入cluster,所有nodes的jump hash算法的调整

  • Acceptance tests

  • Integration tests

  • Benchmarking

原文链接

基于infrastructure代码的自动化测试部分,针对基础框架部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
func TestWebServer(t *testing.T) {
terraformOptions := &terraform.Options {
// The path to where your Terraform code is located
TerraformDir: "../web-server",
}
// At the end of the test, run `terraform destroy`
defer terraform.Destroy(t, terraformOptions)
// Run `terraform init` and `terraform apply`
terraform.InitAndApply(t, terraformOptions)
// Run `terraform output` to get the value of an output variable
url := terraform.Output(t, terraformOptions, "url")
// Verify that we get back a 200 OK with the expected text. It
// takes ~1 min for the Instance to boot, so retry a few times.
status := 200
text := "Hello, World"
retries := 15
sleep := 5 * time.Second
http_helper.HttpGetWithRetry(t, url, status, text, retries, sleep)
}

原文链接

内存模型的目的是为了定义清楚变量的读写在不同执行体里的可见性

Go的并发模型是基于CSP(Communicating Sequential Process)的,不同的Goroutine通过一种叫Channel的数据结构来通信;Java的并发模型则基于多线程和共享内存,有较多的概念(violatie, lock, final, construct, thread, atomic等)和场景,当然java.util.concurrent并发工具包大大简化了Java并发编程。

happen before

Happens-before用来指明Go程序里的内存操作的局部顺序。如果一个内存操作事件e1 happens-before e2,则e2 happens-after e1也成立;如果e1不是happens-before e2,也不是happens-after e2,则e1和e2是并发的。

在这个定义之下,如果以下情况满足,则对变量(v)的内存写操作(w)对一个内存读操作(r)来说允许可见的:

  1. r不在w开始之前发生(可以是之后或并发);
  2. w和r之间没有另一个写操作(w’)发生;

为了保证对变量(v)的一个特定写操作(w)对一个读操作(r)可见,就需要确保w是r唯一允许的写操作,于是如果以下情况满足,则对变量(v)的内存写操作(w)对一个内存读操作(r)来说保证可见的:

  1. w在r开始之前发生;
  2. 所有其它对v的写操作只在w之前或r之后发生;

可以看出后一种约定情况比前一种更严格,这种情况要求没有w或r没有其他的并发写操作

从本质上来讲,happens-before规则确定了CPU缓冲和主存的同步时间点(通过内存屏障等指令),从而使得对变量的读写顺序可被确定–也就是我们通常说的“同步”。

在Go编程中,Channel是被推荐的执行体间通信的方法,Go的编译器和运行态都会尽力对其优化。

  1. 对一个Channel的发送操作(send) happens-before 相应Channel的接收操作完成
  2. 关闭一个Channel happens-before 从该Channel接收到最后的返回值0
  3. 不带缓冲的Channel的接收操作(receive) happens-before 相应Channel的发送操作完成

sync.Once仅一次的调用

菩萨畏因,众生畏果。

有点迷信转运什么的,其实有些东西都是注定和计划好的。尝试去进行正念修行。。。


本周工作:

  • 3.14的接入修复以及运营策略
  • 预装部分的支持

本周所得:

  • 几场面试得到的一些总结,尤其是关于lazy data的问题
  • 尝试养成每天1-2道leetcode题目的习惯

下周工作:

  • 整理一些相关文档,调整相关的环境以及报警部分
  • 是否可以针对每一家的点击部分,做些展示方面,方便进行对比

所期待的freewheel算是挂掉了,算是自己最有把握的也挂掉了。。哎。。。就这样吧,也算是见识到外企的风格,总体上不算那么差,毕竟偶尔说下英文也不错的感觉。。。

那么剩下来,可能就是第四范式了。。。给合适的offer,就去吧。。。

徐建相关的事情,也就这样,把该说的也说了,也无所谓顾及感受什么的。。。就这样吧,情况已经如斯坏了,也管不了那么多了。。。

本职工作上,最近有点心不在焉,需要警惕了。。现在也没有面试了,把精力收一收,把相关的工作做好。。

生活上,按部就班地进行,算是在慢慢体验所谓的同居生活什么的,慢慢来吧。。

把自己想象成为万物的一种,去沉浸在自己做的事情中,这样就不会去焦虑和急躁。。。

锻炼上慢慢开始恢复。。

相关的一些时间管理上,慢慢恢复起来。。。不要偷懒。。。

由于本身工作,找工作,借钱等问题,导致这段时间异常焦躁,异常地烦躁不安,心静不下来。。哎。。。


找工作的事情

  • 还是很想去freewheel这样,看有没有机会去感受一下大一点的数据,也去感受一下所谓的外企的氛围
  • 或者去ai公司去搞后端。。
  • 或者其他的方向

按照计划,按部就班的来,准备好一些tips,对于面试部分准备充分一些。。

把面试当做学习,做好总结和归纳。。

没有什么是一定可以获得的,也不要太多幻想以后的事情,做好现在的事情,学习更多的东西就可以了,其他的都不受控制。。

能给个offer就可以了。。


本身工作的事情:

  • 总结一下,运维上的一些事情,关于tracker部分的一些工作,
  • 复习以及本身工作方面,平衡好。。。

做好正念,把心思放到做的每一件事情上,不要让心思各种摇摆,导致杂念丛生。。