CockroachDB
-
CockroachDB架构:
Postgres wire protocol
client和客户端之间用pgsql的协议通信,用户连接由pgwire
包的pgwire.v3conn.serve()
维持,它负责读取query,将query发给sql.Executor
处理,然后收集结果返回给client。
SQL Executor
sql.executor
的主要工作是1.解析SQL语句,将解析结果发往后面的模块,然后收集结果返回给pgwire.v3conn。2.协调SQL层其他组成部分,如下面的parser等。3.每个连接都有相应的一个sql.session
,包含当前连接的事务的状态,参数的设置等信息,executor也负责更新session的信息。4.对失败的事务(底层传回来的错误信息)进行自动retry,对于不能自动retry的事务通过pgwire传回给client retry,即distSQL返回的result为retry error时:
TiDB的SQL层架构也差不多:
-
Parsing,executor的调用的第一个模块,负责将SQL字符串转化为AST树,转化规则使用PGSQL的yacc语法。
-
Logical plan,根据AST树来生成由
planNode
组成的logical plan,具体的可以看SQL层的文档,planNode中的负责读取数据的scanNode等有rowFetcher
方法,主要是用来将SQL request转化成KV request(比如scanRequest查询的key从哪里到哪里),并负责将收集到的KV结果decode,然后转给之后的planNode。 -
TxnCoornSender,形成的logical plan将发送给Txn sender,这里是一个事务的开始,这个sender会在这个事务中使用的最多的system range里新建一个transaction record,然后不断的异步发送heartbeat来更新record的状态;sender同时也会收集下层传回来的改动过的key或者range,以在commit或者abort事务后异步清理write intent,同时如果有其他事务碰到了这种intent也会在一个heartbeat的时延里来跟txn record确认状态然后进行清理。
txn sender随后将request发送给
DistSender
。 -
DistSender,这里可以看成是分布层,主要负责request的分发。request的分发需要读取range元数据信息,range的元数据信息是system range,