【每日笔记】【Go学习笔记】2019-01-07 Codis笔记

栏目: 数据库 · 发布时间: 5年前

内容简介:闫昌

闫昌

architecture

https://github.com/CodisLabs/...

【每日笔记】【Go学习笔记】2019-01-07 Codis笔记

从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会主动断开连接,再次轮循会用新的端口进行请求。

【每日笔记】【Go学习笔记】2019-01-07 Codis笔记

在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笔记》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Web信息架构(第3版)

Web信息架构(第3版)

Peter Morville、Louis Rosenfeld / 陈建勋 / 电子工业出版社 / 2008年8月 / 85.00

本书涵盖了信息架构基本原理和实践应用的方方面面。全书共7个部分,包括信息架构概述、信息架构的基本原理、信息架构的开发流程和方法论、信息架构实践、信息架构与组织、两个案例研究,以及参考资料清单。 本书兼具较高的理论价值和实用价值,曾被Web设计领域多本书籍重点推荐,是信息架构领域公认的经典书,不论新手还是专家都能各取所需。本书可供Web设计与开发者、Web架构师、网站管理者及信息管理相关人员参......一起来看看 《Web信息架构(第3版)》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

随机密码生成器
随机密码生成器

多种字符组合密码