技术研究

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
message Expression {
MetaInfo metaInfo = 1;
ExpressionType type = 2;
// 值表达式
Value valExpr = 3;
// 计算表达式
CalcExpression calcExpr = 4;
// 逻辑表达式
LogicExpression logicExpr = 5;
// 关系表达式
RelationExpression relationExpr = 6;
// 函数表达式
FuncExpression funcExpr = 7;
}

message CalcExpression {
MetaInfo metaInfo = 1;
CalcExpressionType type = 2;
CalcExpression left = 3;
CalcExpression right = 4;
Value value = 5;
FuncExpression func = 6;
}

message RelationExpression {
MetaInfo metaInfo = 1;
RelationExpressionType type = 2;
CalcExpression left = 3;
CalcExpression right = 4;
}

Install minikube

安装minikube,参考 https://minikube.sigs.k8s.io/docs/start/

Start minikube

启动minikube,driver我们选择docker

1
[echo@echo] minikube start --driver=docker

Interact with your cluster

1
2
3
4
5
6
7
8
9
[echo@echo] kubectl get po -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-565d847f94-b8swq 1/1 Running 2 (62s ago) 26m
kube-system etcd-minikube 1/1 Running 2 (67s ago) 26m
kube-system kube-apiserver-minikube 1/1 Running 1 (68s ago) 26m
kube-system kube-controller-manager-minikube 1/1 Running 2 (67s ago) 26m
kube-system kube-proxy-859rk 1/1 Running 2 (67s ago) 26m
kube-system kube-scheduler-minikube 1/1 Running 2 (67s ago) 26m
kube-system storage-provisioner 1/1 Running 3 (61s ago) 26m
1
2
3
4
5
6
7
8
9
[echo@echo] kubectl get po -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-565d847f94-b8swq 1/1 Running 2 (62s ago) 26m
kube-system etcd-minikube 1/1 Running 2 (67s ago) 26m
kube-system kube-apiserver-minikube 1/1 Running 1 (68s ago) 26m
kube-system kube-controller-manager-minikube 1/1 Running 2 (67s ago) 26m
kube-system kube-proxy-859rk 1/1 Running 2 (67s ago) 26m
kube-system kube-scheduler-minikube 1/1 Running 2 (67s ago) 26m
kube-system storage-provisioner 1/1 Running 3 (61s ago) 26m
1
2
3
[echo@echo] kubectl create deployment hello-minikube --image=kicbase/echo-server:1.0

deployment.apps/hello-minikube created
1
2
3
[echo@echo] kubectl expose deployment hello-minikube --type=NodePort --port=8080

service/hello-minikube exposed
1
2
3
4
[echo@echo] kubectl get services hello-minikube

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-minikube NodePort 10.107.69.159 <none> 8080:30227/TCP 9s
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[echo@echo] minikube service hello-minikube

|-----------|----------------|-------------|---------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|-----------|----------------|-------------|---------------------------|
| default | hello-minikube | 8080 | http://192.168.49.2:30227 |
|-----------|----------------|-------------|---------------------------|
🏃 Starting tunnel for service hello-minikube.
|-----------|----------------|-------------|------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|-----------|----------------|-------------|------------------------|
| default | hello-minikube | | http://127.0.0.1:52191 |
|-----------|----------------|-------------|------------------------|
🎉 正通过默认浏览器打开服务 default/hello-minikube...
❗ Because you are using a Docker driver on darwin, the terminal needs to be open to run it.

参考文献

Go内存分配原则

  • Sharing down typically stays on the stack
    • 在调用方创建的变量或对象,通过参数的形式传递给被调用函数,这时,在调用方创建的内存空间通常在栈上。这种在调用方创建内存,在被调用方使用该内存的“内存共享”方式,称之为 Sharing down。
  • Sharing up typically escapes to the heap
    • 在被调用函数内创建的对象,以指针的形式返回给调用方的情况下,通常,创建的内存空间在堆上。这种在被调用方创建,在调用方使用的“内存共享”方式,称之为 Sharing up。
  • Only the compiler knows
    • 之所以上面两条原则都加了通常,因为具体的分配方式,是由编译器确定的,一些编译器后端优化,可能会突破这两个原则,因此,具体的分配逻辑,只有编译器(或开发编译器的人)知道。

堆分配内存的GC问题

  • Golang GC

雪地

RDD介绍

Spark 的核心是建立在统一的抽象弹性分布式数据集(Resiliennt Distributed Datasets,RDD)之上的,这使得 Spark 的各个组件可以无缝地进行集成,能够在同一个应用程序中完成大数据处理。RDD 是 Spark 提供的最重要的抽象概念,它是一种有容错机制的特殊数据集合,可以分布在集群的结点上,以函数式操作集合的方式进行各种并行操作。

RDD的4大属性

  • partitions: 数据分片
  • partitioner: 分片切割原则
  • dependencies: RDD依赖
  • compute: 转换函数

阅读更多

故宫角楼

本文参考Mysql官方文档

共享锁和排它锁

  • 共享锁(shared locks:s lock)
  • 排它锁(exclusive locks:x lock)

意向锁(intention locks)- 表级别

  • 共享意向锁(intention shared lock -> IS)
  • 排他意向锁(intention exclusive lock -> IX)

意向锁与行锁间的关系

X IX S IS
X Conflict Conflict Conflict Conflict
IX Conflict Compatible Conflict Conflict
S Conflict Conflict Compatible Compatible
IS Conflict Compatible Compatible Compatible

意向锁注意事项

  • 事务申请一个表中某行记录的共享锁前,必须申请该表的IS lock或更强的锁
  • 事务申请一个表中某行记录的排他锁前,必须申请该表的IX lock
  • 意向锁只阻塞表级别的加锁请求(for example, LOCK TABLES ... WRITE)。意图锁主要是为了表明某些客户端正在或将要锁住表中的某一行。

记录锁(record lock)

记录锁也叫做行锁,是用来在一条索引记录上加锁来实现。例如SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE; 会阻止其他事务插入、更新或删除t.c1值为10的数据行。

记录锁通常通过锁住索引记录来实现,即便一个mysql的table没有定义索引,在这种情况下InnoDB会创建一个隐藏的索引来用该索引来加记录锁。See Section 15.6.2.1, “Clustered and Secondary Indexes”.

阅读更多

济南

IO复用

select、poll和epoll是三个常用的IO多路复用方法,具体的差别和性能从左到右都是有区别的。但对于这几种IO复用方法是如何使用的,还是一知半解。

实例

这几天,通过阅读redis的源码,对epoll的使用方法有了进一步的认识。因此,这里使用epoll做一个简单的接受io请求的例子

阅读更多

首先从源码中找入口

redis源码:src/redis-cli.c中找到main函数,main函数中核心的处理就是以下部分

  • cliConnect
    主要是与服务端建立连接,每一个连接都会创建一个redisContext结构来保存
  • repl
    repl实现了发送命令并输出Server返回结果的主要逻辑

RedisContext

redisContext结构如下,重要的字段都进行了注释

阅读更多

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×