共计 2026 个字符,预计需要花费 6 分钟才能阅读完成。
闫昌
architecture
https://github.com/CodisLabs/…
从 codis 的整体架构图中可以看到,codis-dashboard 将配置信息存储在 storage 中,其中 storage 可以是 zookeeper、etcd、filesystem 这种,那么 dashboard 是怎么知道应用哪种存储结构呢?
从 dashboard/main.go 的第 118 行进入到 models.NewClient 函数中,我们看到,程序根据不同的 coordinator 值(dashboard.toml 的 coordinator_name 配置值),来生成不同的 client 结构体对象。
func NewClient(coordinator string, addrlist string, auth string, timeout time.Duration) (Client, error) {
switch coordinator {
case “zk”, “zookeeper”:
return zkclient.New(addrlist, auth, timeout)
case “etcd”:
return etcdclient.New(addrlist, auth, timeout)
case “fs”, “filesystem”:
return fsclient.New(addrlist)
}
return nil, errors.Errorf(“invalid coordinator name = %s”, coordinator)
}
从 main.go 的第 136 行进入 topom.New 函数,我们看到 New 函数的第 108 行对 topom 的 store 进行了赋值,传入的参数就是 NewClient 的返回值,所以经过这两步我们就可以知道,dashboard 根据 dashboard.toml 配置文件中的 coordinator_name 配置的值来确认最终存储位置。
我们现在来看一下 dashboard 的部分工作流程:
用户通过 9090 端口请求到 codis-fe,可以对 codis 集群进行管理和状态查看 codis-proxy 将自己的 IP 等信息存储在 zk 中,在自己 IP 发生变化时及时通知 zk,dashboard 和其它客户端可以直接从 zk 中获取 proxy 的连接信息 dashboard 将自己的配置信息存储在 storage 中 dashboard 通过轮循方式向 proxy 获取其状态信息,获取接口为“/api/proxy/stats”,端口为 11080,经过抓包可以看到,在请求多次之后,dashboard 会主动断开连接,再次轮循会用新的端口进行请求。
在 FE 界面 codis-group 添加一个 server 时,会调用 /api/topom/group/add 接口,我们通过 dashboard/main.go 第 136 行依次进入 topom.New->s.serverAdmin->newApiServer,我们可以看到 /api/topom/group/add 调用的最终函数是 api.GroupAddServer,在此函数中,会首先向添加的 redis 服务器建立一个连接,建立连接之后,会向 redis 发送一个 ”slotsinfo” 命令,此命令是 codis-server 单独添加的一个命令,普通 redis 服务器并不支持此命令,dashboard 根据此命令返回值来判断可否将此 redis 添加到 codis-group 中
func (s *apiServer) GroupAddServer(params martini.Params) (int, string) {
…
c, err := redis.NewClient(addr, s.topom.Config().ProductAuth, time.Second)// 与 redis-server 建立连接
…
if _, err := c.SlotsInfo(); err != nil {// 向 redis-server 发送一个 slotsinfo 命令,如果失败,表示 redis-server 不是 codis-server 服务器,不能添加到 codis-group 中
log.WarnErrorf(err, “redis %s check slots-info failed”, addr)
return rpc.ApiResponseError(err)
}
if err := s.topom.GroupAddServer(gid, dc, addr); err != nil {// 将 codis-server 添加到 codis-group 中
return rpc.ApiResponseError(err)
} else {
return rpc.ApiResponseJson(“OK”)
}
}
问题:
dashboard 轮循 N 次之后,会主动断开连接,那么这段逻辑在哪?
HTTP1.1 默认是 keepalived 的,如果轮循方式不是 go 自己控制的,那为什么会主动断开连接?
codis-proxy 是什么时候向 redis 连接的?