操作系统 : CentOS7.3.1611_x64
Go语言版本:1.8.3 linux/amd64
InfluxDB版本:1.1.0
influxdb默认配置:
/etc/influxdb/influxdb.confmeta
默认配置:
[meta]
dir = "/var/lib/influxdb/meta"
retention-autocreate = true
logging-enabled = true
dir
meta数据存放目录,默认值:/var/lib/influxdb/meta
meta数据文件默认路径:/var/lib/influxdb/meta/meta.db
retention-autocreate
用于控制默认存储策略,数据库创建时,会自动生成autogen的存储策略,默认值:true
logging-enabled
是否开启meta日志,默认值:true
meta文件的dump和load
源码路径: github.com/influxdata/influxdb/services/meta/client.go
meta文件dump
// snapshot will save the current meta data to disk
func snapshot(path string, data *Data) error {
file := filepath.Join(path, metaFile)
tmpFile := file + "tmp"
f, err := os.Create(tmpFile)
if err != nil {
return err
}
defer f.Close()
var d []byte
if b, err := data.MarshalBinary(); err != nil {
return err
} else {
d = b
}
if _, err := f.Write(d); err != nil {
return err
}
if err = f.Sync(); err != nil {
return err
}
//close file handle before renaming to support Windows
if err = f.Close(); err != nil {
return err
}
return renameFile(tmpFile, file)
}
snapshot可以通过以下两种方式触发:
1、当执行 Client.Open 函数时会进行snapshot操作;
2、执行meta文件更新时通过commit函数进行snapshot操作;
在InfluxDB中程序中,通过 NewServer 函数创建MetaClient变量(meta.NewClient),然后执行MetaClient.Open()进行初始化;
后续会通过Server.Open函数(run/server.go)启动各项服务,如果有meta文件的更新操作,通过commit函数进行snapshot操作;
meta文件load
// Load will save the current meta data from disk
func (c *Client) Load() error {
file := filepath.Join(c.path, metaFile)
f, err := os.Open(file)
if err != nil {
if os.IsNotExist(err) {
return nil
}
return err
}
defer f.Close()
data, err := ioutil.ReadAll(f)
if err != nil {
return err
}
if err := c.cacheData.UnmarshalBinary(data); err != nil {
return err
}
return nil
}
Client.Open()中会执行Load操作,NewServer时会自动加载。
meta文件内容编解码
源码路径: github.com/influxdata/influxdb/services/meta/data.go
meta数据encode:
// MarshalBinary encodes the metadata to a binary format.
func (data *Data) MarshalBinary() ([]byte, error) {
return proto.Marshal(data.marshal())
}
meta数据decode:
// UnmarshalBinary decodes the object from a binary format.
func (data *Data) UnmarshalBinary(buf []byte) error {
var pb internal.Data
if err := proto.Unmarshal(buf, &pb); err != nil {
return err
}
data.unmarshal(&pb)
return nil
}
proto路径 :github.com/gogo/protobuf/proto
meta文件结构定义
源码路径: github.com/influxdata/influxdb/services/meta/data.go
meta文件存储的就是 meta.Data 的数据,结构定义如下:
// Data represents the top level collection of all metadata.
type Data struct {
Term uint64 // associated raft term
Index uint64 // associated raft index
ClusterID uint64
Databases []DatabaseInfo
Users []UserInfo
MaxShardGroupID uint64
MaxShardID uint64
}
Term :暂时不知道干什么用的。
Index :从源码看这个应该是类似版本号的东西,初始化为1,执行commit操作是会增加。如果为1,会立即执行持久化操作(在Open函数中操作)。
ClusterID : 是InfluxDB集群相关内容;
Databases :用于存储数据库信息;
Users :用于存储数据库用户信息;
DatabaseInfo 定义 :