influxdb从0.12版本开始不再将其cluster源码开源。

基于influxdb 1.6.0单机版源码分支,将0.12的cluster源码cherry-pick过去,能够失去v1.6.0版本的集群版源码。

分布式InfluxDB集群有两种节点:meta节点和data节点:

  • meta节点负责管理集群的元数据信息,比方database/retention policy等;
  • data节点负责保留集群的时序数据;

分布式InfluxDB集群的一致性来说:

  • meta节点要求强一致性,即在节点间始终保持统一,通过Raft实现;
  • data节点要求最终一致性,即时序数据最终保障统一即可,通过hh,anti-entropy实现;

在理论部署中,如果节点较少,通常1个节点同时负责meta和data的职责,看一下它的整体构造:

每个节点应用4个端口:

  • 8086:负责接管解决client的/query和/write操作;
  • 8084:负责接管解决client的集群治理操作,比方增加/删除节点等;
  • 8088:负责底层Raft的RPC通信(TCP),传入Raft lib即可;
  • 8091:负责节点间HTTP查问和操作Raft信息,比方/join、/execute等;

端口8086

配置文件中指定:

[http]  # Determines whether HTTP endpoint is enabled.  # enabled = true  # The bind address used by the HTTP service.  bind-address = "0.0.0.0:8086"

代码中应用该端口:

//services/httpd/service.go// NewService returns a new instance of Service.func NewService(c Config) *Service {    s := &Service{        addr:           c.BindAddress,        https:          c.HTTPSEnabled,        cert:           c.HTTPSCertificate,        key:            c.HTTPSPrivateKey,        limit:          c.MaxConnectionLimit,        err:            make(chan error),        unixSocket:     c.UnixSocketEnabled,        unixSocketPerm: uint32(c.UnixSocketPermissions),        bindSocket:     c.BindSocket,        Handler:        NewHandler(c),        Logger:         zap.NewNop(),    }    .....}

端口8084

次要负责集群治理API,比方show-nodes/add-data/add-meta等:
配置文件中指定:

[admin_cluster]  enabled = true  bind-address = ":8084"  https-enabled = true

代码中应用端口:

//services/admin_cluster/config.goconst (    // DefaultBindAddress is the default bind address for the HTTP server.    DefaultBindAddress = ":8084"}// NewConfig returns an instance of Config with defaults.func NewConfig() Config {    return Config{        BindAddress:      DefaultBindAddress,        AuthEnabled:      false,        HTTPSEnabled:     false,        HTTPSCertificate: "/etc/ssl/influxdb.pem",        MaxKeepCopyShard: DefaultMaxKeepCopyShard,    }}

端口8088和8091

代码中的默认端口:

//services/meta/config.goconst (    // DefaultRaftBindAddress is the default address to bind to.    DefaultRaftBindAddress = ":8088"    // DefaultHTTPBindAddress is the default address to bind the API to.    DefaultHTTPBindAddress = ":8091")// NewConfig builds a new configuration with default values.func NewConfig() *Config {    return &Config{        Enabled:              true, // enabled by default        BindAddress:          DefaultRaftBindAddress,        HTTPBindAddress:      DefaultHTTPBindAddress,        RetentionAutoCreate:  true,        ElectionTimeout:      toml.Duration(DefaultElectionTimeout),        HeartbeatTimeout:     toml.Duration(DefaultHeartbeatTimeout),        LeaderLeaseTimeout:   toml.Duration(DefaultLeaderLeaseTimeout),        CommitTimeout:        toml.Duration(DefaultCommitTimeout),        RaftPromotionEnabled: DefaultRaftPromotionEnabled,        LeaseDuration:        toml.Duration(DefaultLeaseDuration),        LoggingEnabled:       DefaultLoggingEnabled,        JoinPeers:            []string{},    }}

应用这2个端口创立meta服务:

//services/meta/service.gofunc NewService(c *Config) *Service {    s := &Service{        config:   c,        httpAddr: c.HTTPBindAddress,        raftAddr: c.BindAddress,        https:    c.HTTPSEnabled,        cert:     c.HTTPSCertificate,        err:      make(chan error),        Logger:   zap.NewNop(),    }    return s}