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}