- 给我自己看的,比较乱
- 只看了单机,集群的没看
启动
- 入口函数就在根目录下的main.go中
- 会进行一系列的command初始化,最后根据传入的命令执行相应的操作操作,比如传入server命令就执行serverMain函数
var serverCmd = cli.Command{
Name: "server",
Usage: "start object storage server",
Flags: append(ServerFlags, GlobalFlags...),
Action: serverMain,
CustomHelpTemplate: `NAME:
{{.HelpName}} - {{.Usage}}`
}
serverMain函数
- 起个协程处理信号量
- runtime参数设置和logger初始化
- 处理命令行参数和环境变量
- 初始化所有子系统 newAllSubsystems
- 设置系统资源使用限制
- 配置路由configureServerHandler,启动server服务器
- 初始化fs(比如在数据存储路径下创建.minio.sys文件夹和里面的其他东西)newObjectLayer
- initServer 没太看明白
- init各种系统(globalBucketMetadataSys、globalNotificationSys、globalSiteReplicationSys等)
newAllSubsystems函数(这里的启动其实这是生成了对象,放到了全局变量里)
- 如果是EC就启动数据恢复(heal)程序
- 启动通知系统(集群模式下才会)
- 启动 bucket元数据系统
- 启动bucket monitor
- 启动全局配置系统
- 启动鉴权系统
- 启动Policy系统,也是鉴权用的
- 启动声明周期、加密系统(应该是服务端加密)
- 启动锁系统(minio的锁采用的是对某个object获取锁会通知全部节点,有(N/2 + 1)个节点应答就算成功获得了锁),为了数据一致性
- 启动quota(配额)系统
- 启动bucket版本系统(目前还不知是干啥的,为啥bucket有版本不应该是object吗)
- 启动replication系统,minio是支持replication和EC这两种常见的方式
- 启动缓存系统(缓存系统的设计往往是精髓)
endpointServerPools结构
pool下有多个set,set下有多个服务器,猜测跟联盟、集群、节点相对应
newXLStorage函数
在这里面初始化存储磁盘(更多的是检查合法性)
configureServerHandler
这个函数就是注册各种路由的,要看某一功能实现这可以作为入口函数