总体介绍
初始化流程分为如下几个阶段:
命令解析
: crdb是单执行程序,根据不用的参数执行不同的命令创建临时目录
: 临时目录用于处理SQL优化,类似MySQL中的临时表,临时文件信号处理
: 设置信号处理管道日志初始化
:初始化日志处理InitNode
: 解析node attributes, 初始化gossip bootstrap resolvers.NewServer
: 初始化server各个组件Start
: 启动server所有组件挂起主进程
:等待error退出
命令解析
|
|
以cockroach start --insecure --store=node1 --host=localhost
为例
设置包含的命令
pkg/cli/cli.go
|
|
设置start命令的描述
pkg/cli/start.go
|
|
执行函数为runStart.
start命令的参数设置与存储
- 参数设置
pkg/cli/cliflags/flags.go
|
|
- 参数存储
pkg/cli/flags.go
cli.init
|
|
创建临时目录
pkg/cli/start.go
cli.runStart
|
|
创建临时存储目录cockroach-temp012521878, 创建temp-dirs-record.txt文件,里面存放临时存储目录的全路径。
信号处理
pkg/cli/start.go
cli.runStart
|
|
日志初始化
pkg/util/log/clog.go
|
|
log.Shout
:输出到stderr和日志文件log.Infof
: 只输出到日志文件
InitNode
pkg/server/config.go
|
|
-
读取环境变量
-
解析attr参数
123456789Attrs = FlagInfo{Name: "attrs",Description: `An ordered, colon-separated list of node attributes. Attributes are arbitrarystrings specifying machine capabilities. Machine capabilities might includespecialized hardware or number of cores (e.g. "gpu", "x16c"). For example:<PRE>--attrs=x16c:gpu`,} -
初始化gossip resolver: 解析joinlist,对每个合理的joinlist上的主机设置一个socketsolver。
NewServer
注册rpc服务
pkg/server/server.go
|
|
pkg/rpc/context.go
|
|
pkg/rpc/heartbeat.proto
|
|
- 设置grpc options
- 对unaryInterceptor和streamInterceptor进行注入
- 注册HeartBeat服务
注册gossip服务
pkg/server/server.go
|
|
pkg/gossip/gossip.go
|
|
pkg/gossip/gossip.proto
|
|
初始化DistSender
pkg/server/server.go
pkg/kv/dist_sender.go
|
|
初始化TxnCoordSender
pkg/server/server.go
pkg/kv/txn_coord_sender.go
|
|
初始化StorePool
pkg/server/server.go
|
|
pkg/storage/store_pool.go
|
|
- StorePool维护集群中所有store的信息及健康状态.
- 注册gossip的回调函数,用于更新store的信息。
初始化RaftTranport
pkg/storage/raft_transport
|
|
pkg/storage/raft.proto
|
|
- 注册raft服务
- 定时更新message queue的状态(每隔10s)
初始化DBServer
pkg/server/server.go
|
|
pkg/roachpb/api.proto
|
|
初始化LeaseManager
pkg/server/server.go
|
|
LeaseManager用于获取和释放每个表上的租约.
初始DistSQL用到的temp engine
pkg/server/server.go
|
|
初始化ts server
pkg/server/server.go
|
|
tsDB是一个内部的时序数据库,tsServer对tsDB进行存取操作
生成Node实例
pkg/server/server.go
pkg/server/node.go
|
|
pkg/server/node.go
|
|
pkg/server/serverpb/init.proto
|
|
- 生成Node对象
- 注册InternalService
- 注册ConsistencySerice
- 注册InitService
注册DistSQLServer
pkg/server/server.go
|
|
pkg/sql/distsqlrun/api.proto
|
|
设置Executor
|
|
设置pg server
pkg/server/server.go
|
|
用于处理客户端连接的请求.
Start
pkg/cli/start.go
|
|
启动httpserver端口8080
|
|
注册一些服务到8080http服务。
启动tcp server 端口26257
pkg/server/server.go
|
|
启动26247端口监控,多路复用监听,分别监听init,pg,以及rpc通信。
启动gossip
|
|
初始化rocksdb数据节点
|
|
写3个addr文件
|
|
inspectEngines
|
|
遍历engine,查看每个engine是否empty或者bootstrapped
rocksdb node1 bootstrap
|
|
初始化集群数据, 写local数据,包含clusterID,nodeid,storeid,以及clusterversion,
同时初始化一个range,包含所有的key,是new cluster的第一个range
node start
|
|
- 初始化Node结构
- 读取engine中存储的store ident(cluster id, node id, store id)
- 遍历store中的所有range,读取range desciptor,获取range描述信息
- 为每个range生成replica结构
- 启动后台raft goroutine
启动执行器
|
|
- Executor注册systemconfig channel,等待更新系统配置
- distSQLServer等待flow命令
等待用户链接
|
|
创建errchan, 挂起主进程
等待各种信号,用于退出
|
|