内容简介:闫昌
闫昌
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连接的?
以上所述就是小编给大家介绍的《【每日笔记】【Go学习笔记】2019-01-07 Codis笔记》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 【每日笔记】【Go学习笔记】2019-01-04 Codis笔记
- 【每日笔记】【Go学习笔记】2019-01-02 Codis笔记
- Golang学习笔记-调度器学习
- Vue学习笔记(二)------axios学习
- 算法/NLP/深度学习/机器学习面试笔记
- ES学习笔记之-ClusterState的学习
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Mobilizing Web Sites
Layon, Kristofer / 2011-12 / 266.00元
Everyone has been talking about the mobile web in recent years, and more of us are browsing the web on smartphones and similar devices than ever before. But most of what we are viewing has not yet bee......一起来看看 《Mobilizing Web Sites》 这本书的介绍吧!