pbm

package
v1.6.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 3, 2021 License: Apache-2.0 Imports: 27 Imported by: 4

Documentation

Index

Constants

View Source
const (
	ReplRoleUnknown   = "unknown"
	ReplRoleShard     = "shard"
	ReplRoleConfigSrv = "configsrv"

	// TmpUsersCollection and TmpRoles are tmp collections used to avoid
	// user related issues while resoring on new cluster and preserving UUID
	// See https://jira.percona.com/browse/PBM-425, https://jira.percona.com/browse/PBM-636
	TmpUsersCollection = `pbmRUsers`
	TmpRolesCollection = `pbmRRoles`
)
View Source
const (
	// DB is a name of the PBM database
	DB = "admin"
	// LogCollection is the name of the mongo collection that contains PBM logs
	LogCollection = "pbmLog"
	// ConfigCollection is the name of the mongo collection that contains PBM configs
	ConfigCollection = "pbmConfig"
	// LockCollection is the name of the mongo collection that is used
	// by agents to coordinate mutually exclusive operations (e.g. backup/restore)
	LockCollection = "pbmLock"
	// LockOpCollection is the name of the mongo collection that is used
	// by agents to coordinate operations that doesn't need to be
	// mutually exclusive to other operation types (e.g. backup-delete)
	LockOpCollection = "pbmLockOp"
	// BcpCollection is a collection for backups metadata
	BcpCollection = "pbmBackups"
	// BcpOldCollection contains a backup of backups metadata
	BcpOldCollection = "pbmBackups.old"
	// RestoresCollection is a collection for restores metadata
	RestoresCollection = "pbmRestores"
	// CmdStreamCollection is the name of the mongo collection that contains backup/restore commands stream
	CmdStreamCollection = "pbmCmd"
	//PITRChunksCollection contains index metadata of PITR chunks
	PITRChunksCollection = "pbmPITRChunks"
	//PITRChunksOldCollection contains archived index metadata of PITR chunks
	PITRChunksOldCollection = "pbmPITRChunks.old"
	// PBMOpLogCollection contains log of aquired locks (hence run ops)
	PBMOpLogCollection = "pbmOpLog"
	// AgentsStatusCollection is an agents registry with its status/health checks
	AgentsStatusCollection = "pbmAgents"

	// MetadataFileSuffix is a suffix for the metadata file on a storage
	MetadataFileSuffix = ".pbm.json"
)
View Source
const (
	PITRcheckRange       = time.Second * 15
	AgentsStatCheckRange = time.Second * 5
)
View Source
const (
	// PITRdefaultSpan oplog slicing time span
	PITRdefaultSpan = time.Minute * 10
	// PITRfsPrefix is a prefix (folder) for PITR chunks on the storage
	PITRfsPrefix = "pbmPitr"
)
View Source
const StaleFrameSec uint32 = 30
View Source
const StorInitFile = ".pbm.init"

Variables

View Source
var (
	WaitActionStart = time.Second * 15
	WaitBackupStart = WaitActionStart + PITRcheckRange*12/10
)
View Source
var ErrNotFound = errors.New("not found")

ErrNotFound - object not found

View Source
var ErrStorageUndefined = errors.New("storage undefined")

ErrStorageUndefined is an error for undefined storage

Functions

func CopyColl added in v1.5.0

func CopyColl(ctx context.Context, from, to *mongo.Collection, filter interface{}) (n int, err error)

CopyColl copy documents matching the given filter and return number of copied documents

func DropTMPcoll added in v1.5.0

func DropTMPcoll(ctx context.Context, cn *mongo.Client) error

func LastWrite added in v1.5.0

func LastWrite(cn *mongo.Client, majority bool) (primitive.Timestamp, error)

func ValidateConfigKey added in v1.1.0

func ValidateConfigKey(k string) bool

ValidateConfigKey checks if a config key valid

Types

type AgentStat added in v1.4.0

type AgentStat struct {
	Node          string              `bson:"n"`
	RS            string              `bson:"rs"`
	State         NodeState           `bson:"s"`
	StateStr      string              `bson:"str"`
	Hidden        bool                `bson:"hdn"`
	Passive       bool                `bson:"psv"`
	Ver           string              `bson:"v"`
	PBMStatus     SubsysStatus        `bson:"pbms"`
	NodeStatus    SubsysStatus        `bson:"nodes"`
	StorageStatus SubsysStatus        `bson:"stors"`
	Heartbeat     primitive.Timestamp `bson:"hb"`
	Err           string              `bson:"e"`
}

func (*AgentStat) OK added in v1.4.0

func (s *AgentStat) OK() (ok bool, errs []string)

type AuthInfo added in v1.1.3

type AuthInfo struct {
	Users     []AuthUser      `bson:"authenticatedUsers" json:"authenticatedUsers"`
	UserRoles []AuthUserRoles `bson:"authenticatedUserRoles" json:"authenticatedUserRoles"`
}

type AuthUser added in v1.1.3

type AuthUser struct {
	User string `bson:"user" json:"user"`
	DB   string `bson:"db" json:"db"`
}

type AuthUserRoles added in v1.1.3

type AuthUserRoles struct {
	Role string `bson:"role" json:"role"`
	DB   string `bson:"db" json:"db"`
}

type BackupCmd

type BackupCmd struct {
	Name        string          `bson:"name"`
	Compression CompressionType `bson:"compression"`
}

func (BackupCmd) String added in v1.3.2

func (b BackupCmd) String() string

type BackupConf added in v1.5.0

type BackupConf struct {
	Priority map[string]float64 `bson:"priority,omitempty" json:"priority,omitempty" yaml:"priority,omitempty"`
}

type BackupMeta

type BackupMeta struct {
	OPID             string               `bson:"opid" json:"opid"`
	Name             string               `bson:"name" json:"name"`
	Replsets         []BackupReplset      `bson:"replsets" json:"replsets"`
	Compression      CompressionType      `bson:"compression" json:"compression"`
	Store            StorageConf          `bson:"store" json:"store"`
	MongoVersion     string               `bson:"mongodb_version" json:"mongodb_version,omitempty"`
	StartTS          int64                `bson:"start_ts" json:"start_ts"`
	LastTransitionTS int64                `bson:"last_transition_ts" json:"last_transition_ts"`
	FirstWriteTS     primitive.Timestamp  `bson:"first_write_ts" json:"first_write_ts"`
	LastWriteTS      primitive.Timestamp  `bson:"last_write_ts" json:"last_write_ts"`
	Hb               primitive.Timestamp  `bson:"hb" json:"hb"`
	Status           Status               `bson:"status" json:"status"`
	Conditions       []Condition          `bson:"conditions" json:"conditions"`
	Nomination       []BackupRsNomination `bson:"n" json:"n"`
	Error            string               `bson:"error,omitempty" json:"error,omitempty"`
	PBMVersion       string               `bson:"pbm_version,omitempty" json:"pbm_version,omitempty"`
	BalancerStatus   BalancerMode         `bson:"balancer" json:"balancer"`
}

BackupMeta is a backup's metadata

func (*BackupMeta) RS added in v1.3.0

func (b *BackupMeta) RS(name string) *BackupReplset

RS returns the metada of the replset with given name. It returns nil if no replsent found.

type BackupReplset

type BackupReplset struct {
	Name             string              `bson:"name" json:"name"`
	DumpName         string              `bson:"dump_name" json:"backup_name" `
	OplogName        string              `bson:"oplog_name" json:"oplog_name"`
	StartTS          int64               `bson:"start_ts" json:"start_ts"`
	Status           Status              `bson:"status" json:"status"`
	LastTransitionTS int64               `bson:"last_transition_ts" json:"last_transition_ts"`
	FirstWriteTS     primitive.Timestamp `bson:"first_write_ts" json:"first_write_ts"`
	LastWriteTS      primitive.Timestamp `bson:"last_write_ts" json:"last_write_ts"`
	Error            string              `bson:"error,omitempty" json:"error,omitempty"`
	Conditions       []Condition         `bson:"conditions" json:"conditions"`
}

type BackupRsNomination added in v1.5.0

type BackupRsNomination struct {
	RS    string   `bson:"rs" json:"rs"`
	Nodes []string `bson:"n" json:"n"`
	Ack   string   `bson:"ack" json:"ack"`
}

BackupRsNomination is used to choose (nominate and elect) nodes for the backup within a replica set

type BalancerMode added in v1.5.0

type BalancerMode string
const (
	BalancerModeOn  BalancerMode = "full"
	BalancerModeOff BalancerMode = "off"
)

func (BalancerMode) String added in v1.6.1

func (m BalancerMode) String() string

type BalancerStatus added in v1.5.0

type BalancerStatus struct {
	Mode              BalancerMode `bson:"mode" json:"mode"`
	InBalancerRound   bool         `bson:"inBalancerRound" json:"inBalancerRound"`
	NumBalancerRounds int64        `bson:"numBalancerRounds" json:"numBalancerRounds"`
	Ok                int          `bson:"ok" json:"ok"`
}

func (*BalancerStatus) IsOn added in v1.5.0

func (b *BalancerStatus) IsOn() bool

type ClusterTime

type ClusterTime struct {
	ClusterTime primitive.Timestamp `bson:"clusterTime"`
	Signature   struct {
		Hash  primitive.Binary `bson:"hash"`
		KeyID int64            `bson:"keyId"`
	} `bson:"signature"`
}

type Cmd

type Cmd struct {
	Cmd        Command         `bson:"cmd"`
	Backup     BackupCmd       `bson:"backup,omitempty"`
	Restore    RestoreCmd      `bson:"restore,omitempty"`
	PITRestore PITRestoreCmd   `bson:"pitrestore,omitempty"`
	Delete     DeleteBackupCmd `bson:"delete,omitempty"`
	DeletePITR DeletePITRCmd   `bson:"deletePitr,omitempty"`
	TS         int64           `bson:"ts"`
	OPID       OPID            `bson:"-"`
}

func (Cmd) String added in v1.3.2

func (c Cmd) String() string

type Command

type Command string

Command represents actions that could be done on behalf of the client by the agents

const (
	CmdUndefined        Command = ""
	CmdBackup           Command = "backup"
	CmdRestore          Command = "restore"
	CmdCancelBackup     Command = "cancelBackup"
	CmdResyncBackupList Command = "resyncBcpList"
	CmdPITR             Command = "pitr"
	CmdPITRestore       Command = "pitrestore"
	CmdDeleteBackup     Command = "delete"
	CmdDeletePITR       Command = "deletePitr"
)

func (Command) String added in v1.4.0

func (c Command) String() string

type CompressionType

type CompressionType string
const (
	CompressionTypeNone   CompressionType = "none"
	CompressionTypeGZIP   CompressionType = "gzip"
	CompressionTypePGZIP  CompressionType = "pgzip"
	CompressionTypeSNAPPY CompressionType = "snappy"
	CompressionTypeLZ4    CompressionType = "lz4"
	CompressionTypeS2     CompressionType = "s2"
)

func FileCompression added in v1.3.0

func FileCompression(ext string) CompressionType

FileCompression return compression alg based on given file extention

type Condition added in v1.1.0

type Condition struct {
	Timestamp int64  `bson:"timestamp" json:"timestamp"`
	Status    Status `bson:"status" json:"status"`
	Error     string `bson:"error,omitempty" json:"error,omitempty"`
}

type Config added in v1.1.0

type Config struct {
	PITR    PITRConf            `bson:"pitr" json:"pitr" yaml:"pitr"`
	Storage StorageConf         `bson:"storage" json:"storage" yaml:"storage"`
	Restore RestoreConf         `bson:"restore" json:"restore,omitempty" yaml:"restore,omitempty"`
	Backup  BackupConf          `bson:"backup" json:"backup,omitempty" yaml:"backup,omitempty"`
	Epoch   primitive.Timestamp `bson:"epoch" json:"-" yaml:"-"`
}

Config is a pbm config

func (Config) String added in v1.6.0

func (c Config) String() string

type ConfigServerState

type ConfigServerState struct {
	OpTime *OpTime `bson:"opTime"`
}

type ConnectionStatus added in v1.1.3

type ConnectionStatus struct {
	AuthInfo AuthInfo `bson:"authInfo" json:"authInfo"`
}

type DeleteBackupCmd added in v1.3.2

type DeleteBackupCmd struct {
	Backup    string `bson:"backup"`
	OlderThan int64  `bson:"olderthan"`
}

func (DeleteBackupCmd) String added in v1.3.2

func (d DeleteBackupCmd) String() string

type DeletePITRCmd added in v1.6.0

type DeletePITRCmd struct {
	OlderThan int64 `bson:"olderthan"`
}

type Epoch added in v1.4.0

type Epoch primitive.Timestamp

func (Epoch) TS added in v1.4.0

func (e Epoch) TS() primitive.Timestamp

type ErrConcurrentOp added in v1.1.0

type ErrConcurrentOp struct {
	Lock LockHeader
}

ErrConcurrentOp means lock was already aquired by another node

func (ErrConcurrentOp) Error added in v1.1.0

func (e ErrConcurrentOp) Error() string

type ErrDuplicateOp added in v1.4.0

type ErrDuplicateOp struct {
	Lock LockHeader
}

ErrDuplicateOp means the operation with the same ID alredy had been running

func (ErrDuplicateOp) Error added in v1.4.0

func (e ErrDuplicateOp) Error() string

type ErrWasStaleLock added in v1.3.0

type ErrWasStaleLock struct {
	Lock LockHeader
}

ErrWasStaleLock - the lock was already got but the operation seems to be staled (no hb from the node)

func (ErrWasStaleLock) Error added in v1.3.0

func (e ErrWasStaleLock) Error() string

type ErrorCursor

type ErrorCursor struct {
	// contains filtered or unexported fields
}

func (ErrorCursor) Error

func (c ErrorCursor) Error() string

type Lock

type Lock struct {
	LockData
	// contains filtered or unexported fields
}

Lock is a lock for the PBM operation (e.g. backup, restore)

func (*Lock) Acquire added in v1.1.0

func (l *Lock) Acquire() (bool, error)

Acquire tries to acquire the lock. It returns true in case of success and false if a lock already acquired by another process or some error happened. In case of concurrent lock exists is stale it will be deleted and ErrWasStaleLock gonna be returned. A client shell mark respective operation as stale and retry if it needs to

func (*Lock) Release added in v1.1.0

func (l *Lock) Release() error

Release the lock

func (*Lock) Rewrite added in v1.6.1

func (l *Lock) Rewrite(old *LockHeader) (bool, error)

Rewrite tries to acquire the lock instead the `old` one. It returns true in case of success and false if a lock already acquired by another process or some error happened. In case of concurrent lock exists is stale it will be deleted and ErrWasStaleLock gonna be returned. A client shell mark respective operation as stale and retry if it needs to

type LockData added in v1.1.0

type LockData struct {
	LockHeader `bson:",inline"`
	Heartbeat  primitive.Timestamp `bson:"hb"` // separated in order the lock can be searchable by the header
}

type LockHeader added in v1.1.0

type LockHeader struct {
	Type    Command `bson:"type,omitempty" json:"type,omitempty"`
	Replset string  `bson:"replset,omitempty" json:"replset,omitempty"`
	Node    string  `bson:"node,omitempty" json:"node,omitempty"`
	OPID    string  `bson:"opid,omitempty" json:"opid,omitempty"`
	// should be a pointer so mongo find with empty epoch would work
	// otherwise it always set it at least to "epoch":{"$timestamp":{"t":0,"i":0}}
	Epoch *primitive.Timestamp `bson:"epoch,omitempty" json:"epoch,omitempty"`
}

LockHeader describes the lock. This data will be serialased into the mongo document.

type MongoLastWrite added in v1.3.0

type MongoLastWrite struct {
	OpTime            OpTime    `bson:"opTime"`
	LastWriteDate     time.Time `bson:"lastWriteDate"`
	MajorityOpTime    OpTime    `bson:"majorityOpTime"`
	MajorityWriteDate time.Time `bson:"majorityWriteDate"`
}

MongoLastWrite represents the last write to the MongoDB server

type MongoVersion

type MongoVersion struct {
	VersionString string `bson:"version"`
	Version       []int  `bson:"versionArray"`
}

type Node

type Node struct {
	// contains filtered or unexported fields
}

func NewNode

func NewNode(ctx context.Context, curi string, dumpConns int) (*Node, error)

func (*Node) ConnURI

func (n *Node) ConnURI() string

func (*Node) Connect added in v1.1.3

func (n *Node) Connect() error

func (*Node) CopyUsersNRolles added in v1.5.0

func (n *Node) CopyUsersNRolles() (lastWrite primitive.Timestamp, err error)

func (*Node) CurrentUser added in v1.1.3

func (n *Node) CurrentUser() (*AuthInfo, error)

func (*Node) DropTMPcoll added in v1.3.4

func (n *Node) DropTMPcoll() error

func (*Node) DumpConns added in v1.4.0

func (n *Node) DumpConns() int

func (*Node) GetInfo added in v1.3.0

func (n *Node) GetInfo() (*NodeInfo, error)

func (*Node) GetMongoVersion

func (n *Node) GetMongoVersion() (*MongoVersion, error)

func (*Node) GetReplsetStatus

func (n *Node) GetReplsetStatus() (*ReplsetStatus, error)

func (*Node) ID added in v1.3.0

func (n *Node) ID() string

ID returns node ID

func (*Node) IsSharded

func (n *Node) IsSharded() (bool, error)

IsSharded return true if node is part of the sharded cluster (in shard or configsrv replset).

func (*Node) Name

func (n *Node) Name() string

Name returns node name

func (*Node) RS added in v1.3.0

func (n *Node) RS() string

RS return replicaset name node belongs to

func (*Node) ReplicationLag

func (n *Node) ReplicationLag() (int, error)

ReplicationLag returns node replication lag in seconds

func (*Node) Session

func (n *Node) Session() *mongo.Client

func (*Node) SizeDBs added in v1.3.2

func (n *Node) SizeDBs() (int, error)

SizeDBs returns the total size in bytes of all databases' files on disk on replicaset

func (*Node) Status

func (n *Node) Status() (*NodeStatus, error)

func (*Node) WaitForWrite added in v1.5.0

func (n *Node) WaitForWrite(ts primitive.Timestamp) (err error)

type NodeHealth

type NodeHealth int
const (
	NodeHealthDown NodeHealth = iota
	NodeHealthUp
)

type NodeInfo added in v1.3.0

type NodeInfo struct {
	Hosts                        []string             `bson:"hosts,omitempty"`
	Msg                          string               `bson:"msg"`
	MaxBsonObjectSise            int64                `bson:"maxBsonObjectSize"`
	MaxMessageSizeBytes          int64                `bson:"maxMessageSizeBytes"`
	MaxWriteBatchSize            int64                `bson:"maxWriteBatchSize"`
	LocalTime                    time.Time            `bson:"localTime"`
	LogicalSessionTimeoutMinutes int64                `bson:"logicalSessionTimeoutMinutes"`
	MaxWireVersion               int64                `bson:"maxWireVersion"`
	MinWireVersion               int64                `bson:"minWireVersion"`
	OK                           int                  `bson:"ok"`
	SetName                      string               `bson:"setName,omitempty"`
	Primary                      string               `bson:"primary,omitempty"`
	SetVersion                   int32                `bson:"setVersion,omitempty"`
	IsPrimary                    bool                 `bson:"ismaster"`
	Secondary                    bool                 `bson:"secondary,omitempty"`
	Hidden                       bool                 `bson:"hidden,omitempty"`
	Passive                      bool                 `bson:"passive,omitempty"`
	ConfigSvr                    int                  `bson:"configsvr,omitempty"`
	Me                           string               `bson:"me"`
	LastWrite                    MongoLastWrite       `bson:"lastWrite"`
	ClusterTime                  *ClusterTime         `bson:"$clusterTime,omitempty"`
	ConfigServerState            *ConfigServerState   `bson:"$configServerState,omitempty"`
	OperationTime                *primitive.Timestamp `bson:"operationTime,omitempty"`
}

NodeInfo represents the mongo's node info

func (*NodeInfo) IsClusterLeader added in v1.5.0

func (i *NodeInfo) IsClusterLeader() bool

IsClusterLeader - cluster leader is a primary node on configsrv or just primary node in non-sharded replicaset

func (*NodeInfo) IsLeader added in v1.3.0

func (i *NodeInfo) IsLeader() bool

IsLeader returns true if node can act as backup leader (it's configsrv or non shareded rs)

func (*NodeInfo) IsSharded added in v1.3.0

func (i *NodeInfo) IsSharded() bool

IsSharded returns true is replset is part sharded cluster

func (*NodeInfo) IsStandalone added in v1.3.0

func (i *NodeInfo) IsStandalone() bool

IsStandalone returns true if node is not a part of replica set

func (*NodeInfo) ReplsetRole added in v1.3.0

func (i *NodeInfo) ReplsetRole() ReplRole

ReplsetRole returns replset role in sharded clister

type NodeState

type NodeState int
const (
	NodeStateStartup NodeState = iota
	NodeStatePrimary
	NodeStateSecondary
	NodeStateRecovering
	NodeStateStartup2
	NodeStateUnknown
	NodeStateArbiter
	NodeStateDown
	NodeStateRollback
	NodeStateRemoved
)

type NodeStatus

type NodeStatus struct {
	ID                int                 `bson:"_id" json:"_id"`
	Name              string              `bson:"name" json:"name"`
	Health            NodeHealth          `bson:"health" json:"health"`
	State             NodeState           `bson:"state" json:"state"`
	StateStr          string              `bson:"stateStr" json:"stateStr"`
	Uptime            int64               `bson:"uptime" json:"uptime"`
	Optime            *OpTime             `bson:"optime" json:"optime"`
	OptimeDate        time.Time           `bson:"optimeDate" json:"optimeDate"`
	ConfigVersion     int                 `bson:"configVersion" json:"configVersion"`
	ElectionTime      primitive.Timestamp `bson:"electionTime,omitempty" json:"electionTime,omitempty"`
	ElectionDate      time.Time           `bson:"electionDate,omitempty" json:"electionDate,omitempty"`
	InfoMessage       string              `bson:"infoMessage,omitempty" json:"infoMessage,omitempty"`
	OptimeDurable     *OpTime             `bson:"optimeDurable,omitempty" json:"optimeDurable,omitempty"`
	OptimeDurableDate time.Time           `bson:"optimeDurableDate,omitempty" json:"optimeDurableDate,omitempty"`
	LastHeartbeat     time.Time           `bson:"lastHeartbeat,omitempty" json:"lastHeartbeat,omitempty"`
	LastHeartbeatRecv time.Time           `bson:"lastHeartbeatRecv,omitempty" json:"lastHeartbeatRecv,omitempty"`
	PingMs            int64               `bson:"pingMs,omitempty" json:"pingMs,omitempty"`
	Self              bool                `bson:"self,omitempty" json:"self,omitempty"`
	SyncingTo         string              `bson:"syncingTo,omitempty" json:"syncingTo,omitempty"`
}

type NodesPriority added in v1.5.0

type NodesPriority struct {
	// contains filtered or unexported fields
}

NodesPriority groupes nodes by priority according to provided scores. Basically nodes are grouped and sorted by descending order by score

func NewNodesPriority added in v1.5.0

func NewNodesPriority() *NodesPriority

func (*NodesPriority) Add added in v1.5.0

func (n *NodesPriority) Add(rs, node string, sc float64)

Add node with its score

func (*NodesPriority) RS added in v1.5.0

func (n *NodesPriority) RS(rs string) [][]string

RS returns nodes `group and sort desc by score` for given replset

type OPID added in v1.4.0

type OPID primitive.ObjectID

func NilOPID added in v1.4.0

func NilOPID() OPID

func OPIDfromStr added in v1.4.0

func OPIDfromStr(s string) (OPID, error)

func (OPID) Obj added in v1.4.0

func (o OPID) Obj() primitive.ObjectID

func (OPID) String added in v1.4.0

func (o OPID) String() string

type OpLog added in v1.4.0

type OpLog struct {
	LockHeader `bson:",inline" json:",inline"`
}

OpLog represents log of started operation. Operation progress can be get from logs by OPID. Basically it is a log of all ever taken locks. With the uniqueness by rs + opid

type OpTime

type OpTime struct {
	TS   primitive.Timestamp `bson:"ts" json:"ts"`
	Term int64               `bson:"t" json:"t"`
}

type Operation

type Operation string
const (
	OperationInsert  Operation = "i"
	OperationNoop    Operation = "n"
	OperationUpdate  Operation = "u"
	OperationDelete  Operation = "d"
	OperationCommand Operation = "c"
)

type PBM

type PBM struct {
	Conn *mongo.Client
	// contains filtered or unexported fields
}

func New

func New(ctx context.Context, uri, appName string) (*PBM, error)

New creates a new PBM object. In the sharded cluster both agents and ctls should have a connection to ConfigServer replica set in order to communicate via PBM collections. If agent's or ctl's local node is not a member of CongigServer, after discovering current topology connection will be established to ConfigServer.

func (*PBM) AddRSMeta added in v1.1.0

func (p *PBM) AddRSMeta(bcpName string, rs BackupReplset) error

func (*PBM) AddRestoreRSMeta added in v1.1.2

func (p *PBM) AddRestoreRSMeta(name string, rs RestoreReplset) error

func (*PBM) AgentStatusGC added in v1.4.0

func (p *PBM) AgentStatusGC() error

AgentStatusGC cleans up stale agent statuses

func (*PBM) AgentsStatus added in v1.5.0

func (p *PBM) AgentsStatus() (agents []AgentStat, err error)

AgentsStatus returns list of registered agents

func (*PBM) BackupGetNext added in v1.3.0

func (p *PBM) BackupGetNext(backup *BackupMeta) (*BackupMeta, error)

func (*PBM) BackupHB added in v1.1.2

func (p *PBM) BackupHB(bcpName string) error

func (*PBM) BackupsDoneList added in v1.6.0

func (p *PBM) BackupsDoneList(after *primitive.Timestamp, limit int64, order int) ([]BackupMeta, error)

func (*PBM) BackupsList

func (p *PBM) BackupsList(limit int64) ([]BackupMeta, error)

func (*PBM) BcpNodesPriority added in v1.5.0

func (p *PBM) BcpNodesPriority() (*NodesPriority, error)

BcpNodesPriority returns list nodes grouped by backup preferences in descended order. First are nodes with the highest priority.

func (*PBM) ChangeBackupState added in v1.1.0

func (p *PBM) ChangeBackupState(bcpName string, s Status, msg string) error

func (*PBM) ChangeBackupStateOPID added in v1.4.0

func (p *PBM) ChangeBackupStateOPID(opid string, s Status, msg string) error

func (*PBM) ChangeRSState added in v1.1.0

func (p *PBM) ChangeRSState(bcpName string, rsName string, s Status, msg string) error

func (*PBM) ChangeRestoreRSState added in v1.1.2

func (p *PBM) ChangeRestoreRSState(name string, rsName string, s Status, msg string) error

func (*PBM) ChangeRestoreState added in v1.1.2

func (p *PBM) ChangeRestoreState(name string, s Status, msg string) error

func (*PBM) ChangeRestoreStateOPID added in v1.4.0

func (p *PBM) ChangeRestoreStateOPID(opid string, s Status, msg string) error

func (*PBM) ClusterMembers added in v1.4.1

func (p *PBM) ClusterMembers(inf *NodeInfo) ([]Shard, error)

ClusterMembers returns list of replicasets current cluster consists of (shards + configserver). The list would consist of on rs if cluster is a non-sharded rs. If `inf` is nil, method would request mongo to define it.

func (*PBM) ClusterTime added in v1.1.0

func (p *PBM) ClusterTime() (primitive.Timestamp, error)

ClusterTime returns mongo's current cluster time

func (*PBM) Context

func (p *PBM) Context() context.Context

Context returns object context

func (*PBM) DeleteBackup added in v1.2.0

func (p *PBM) DeleteBackup(name string, l *log.Event) error

DeleteBackup deletes backup with the given name from the current storage and pbm database

func (*PBM) DeleteBackupFiles added in v1.2.0

func (p *PBM) DeleteBackupFiles(meta *BackupMeta, stg storage.Storage) (err error)

DeleteBackupFiles removes backup's artefacts from storage

func (*PBM) DeleteOlderThan added in v1.2.0

func (p *PBM) DeleteOlderThan(t time.Time, l *log.Event) error

DeleteOlderThan deletes backups which older than given Time

func (*PBM) DeletePITR added in v1.6.0

func (p *PBM) DeletePITR(until *time.Time, l *log.Event) error

DeletePITR deletes backups which older than given `until` Time. It will round `until` down to the last write of the closest preceding backup in order not to make gaps. So usually it gonna leave some extra chunks. E.g. if `until = 13` and the last write of the closest preceding backup is `10` it will leave `11` and `12` chunks as well since `13` won't be restorable without `11` and `12` (contiguous timeline from the backup). It deletes all chunks if `until` is nil.

func (*PBM) GetAgentStatus added in v1.4.0

func (p *PBM) GetAgentStatus(rs, node string) (s AgentStat, err error)

GetAgentStatus returns agent status by given node and rs it's up to user how to handle ErrNoDocuments

func (*PBM) GetBackupByOPID added in v1.4.0

func (p *PBM) GetBackupByOPID(opid string) (*BackupMeta, error)

func (*PBM) GetBackupMeta

func (p *PBM) GetBackupMeta(name string) (*BackupMeta, error)

func (*PBM) GetBalancerStatus added in v1.5.0

func (p *PBM) GetBalancerStatus() (*BalancerStatus, error)

GetBalancerStatus returns balancer status

func (*PBM) GetConfig added in v1.1.0

func (p *PBM) GetConfig() (Config, error)

func (*PBM) GetConfigVar added in v1.1.0

func (p *PBM) GetConfigVar(key string) (interface{}, error)

GetConfigVar returns value of given config vaiable

func (*PBM) GetConfigYaml added in v1.1.0

func (p *PBM) GetConfigYaml(fieldRedaction bool) ([]byte, error)

func (*PBM) GetEpoch added in v1.4.0

func (p *PBM) GetEpoch() (Epoch, error)

func (*PBM) GetLastBackup added in v1.3.0

func (p *PBM) GetLastBackup(before *primitive.Timestamp) (*BackupMeta, error)

GetLastBackup returns last successfully finished backup or nil if there is no such backup yet. If ts isn't nil it will search for the most recent backup that finished before specified timestamp

func (*PBM) GetLastRestore added in v1.3.0

func (p *PBM) GetLastRestore() (*RestoreMeta, error)

GetLastRestore returns last successfully finished restore and nil if there is no such restore yet.

func (*PBM) GetLockData added in v1.1.0

func (p *PBM) GetLockData(lh *LockHeader) (LockData, error)

func (*PBM) GetLocks added in v1.1.0

func (p *PBM) GetLocks(lh *LockHeader) ([]LockData, error)

func (*PBM) GetNodeInfo added in v1.3.0

func (p *PBM) GetNodeInfo() (*NodeInfo, error)

GetNodeInfo returns mongo node info

func (*PBM) GetOpLockData added in v1.4.0

func (p *PBM) GetOpLockData(lh *LockHeader) (LockData, error)

func (*PBM) GetOpLocks added in v1.4.0

func (p *PBM) GetOpLocks(lh *LockHeader) ([]LockData, error)

func (*PBM) GetRSNominees added in v1.5.0

func (p *PBM) GetRSNominees(bcpName, rsName string) (*BackupRsNomination, error)

func (*PBM) GetReplsetStatus added in v1.5.0

func (p *PBM) GetReplsetStatus() (*ReplsetStatus, error)

GetReplsetStatus returns `replSetGetStatus` for the replset or config server in case of sharded cluster

func (*PBM) GetRestoreMeta added in v1.1.2

func (p *PBM) GetRestoreMeta(name string) (*RestoreMeta, error)

func (*PBM) GetRestoreMetaByOPID added in v1.4.0

func (p *PBM) GetRestoreMetaByOPID(opid string) (*RestoreMeta, error)

func (*PBM) GetShards

func (p *PBM) GetShards() ([]Shard, error)

GetShards gets list of shards

func (*PBM) GetStorage

func (p *PBM) GetStorage(l *log.Event) (storage.Storage, error)

GetStorage reads current storage config and creates and returns respective storage.Storage object

func (*PBM) InitLogger added in v1.4.0

func (p *PBM) InitLogger(rs, node string)

func (*PBM) IsPITR added in v1.3.0

func (p *PBM) IsPITR() (bool, error)

IsPITR checks if PITR is enabled

func (*PBM) ListenCmd

func (p *PBM) ListenCmd() (<-chan Cmd, <-chan error, error)

func (*PBM) LogGet added in v1.3.0

func (p *PBM) LogGet(r *log.LogRequest, limit int64) (*log.Entries, error)

func (*PBM) LogGetExactSeverity added in v1.4.0

func (p *PBM) LogGetExactSeverity(r *log.LogRequest, limit int64) (*log.Entries, error)

func (*PBM) Logger added in v1.4.0

func (p *PBM) Logger() *log.Logger

func (*PBM) MarkBcpStale added in v1.3.0

func (p *PBM) MarkBcpStale(opid string) error

func (*PBM) MarkRestoreStale added in v1.3.0

func (p *PBM) MarkRestoreStale(opid string) error

func (*PBM) NewLock added in v1.1.0

func (p *PBM) NewLock(h LockHeader) *Lock

NewLock creates a new Lock object from geven header. Returned lock has no state. So Acquire() and Release() methods should be called.

func (*PBM) NewLockCol added in v1.3.2

func (p *PBM) NewLockCol(h LockHeader, collection string) *Lock

NewLockCol creates a new Lock object from geven header in given collection. Returned lock has no state. So Acquire() and Release() methods should be called.

func (*PBM) PITRAddChunk added in v1.3.0

func (p *PBM) PITRAddChunk(c PITRChunk) error

PITRAddChunk stores PITR chunk metadata

func (*PBM) PITRFirstChunkMeta added in v1.3.0

func (p *PBM) PITRFirstChunkMeta(rs string) (*PITRChunk, error)

PITRFirstChunkMeta returns the oldest PITR chunk for the given Replset

func (*PBM) PITRGetChunkStarts added in v1.3.0

func (p *PBM) PITRGetChunkStarts(rs string, ts primitive.Timestamp) (*PITRChunk, error)

PITRGetChunkStarts returns a pitr slice chunk that belongs to the given replica set and start from the given timestamp

func (*PBM) PITRGetChunksSlice added in v1.3.0

func (p *PBM) PITRGetChunksSlice(rs string, from, to primitive.Timestamp) ([]PITRChunk, error)

PITRGetChunksSlice returns slice of PITR oplog chunks which Start TS lies in a given time frame. Returns all chunks if `to` is 0.

func (*PBM) PITRGetChunksSliceUntil added in v1.6.0

func (p *PBM) PITRGetChunksSliceUntil(rs string, t primitive.Timestamp) ([]PITRChunk, error)

PITRGetChunksSliceUntil returns slice of PITR oplog chunks that starts up until timestamp (exclusively)

func (*PBM) PITRGetValidTimelines added in v1.3.0

func (p *PBM) PITRGetValidTimelines(rs string, until primitive.Timestamp, flist map[string]int64) (tlines []Timeline, err error)

PITRGetValidTimelines returns time ranges valid for PITR restore for the given replicaset. We don't check for any "restore intrusions" or other integrity issues since it's guaranteed be the slicer that any saved chunk already belongs to some valid timeline, the slice wouldn't be done otherwise. `flist` is a cache of chunk sizes.

func (*PBM) PITRLastChunkMeta added in v1.3.0

func (p *PBM) PITRLastChunkMeta(rs string) (*PITRChunk, error)

PITRLastChunkMeta returns the most recent PITR chunk for the given Replset

func (*PBM) PITRTimelines added in v1.6.0

func (p *PBM) PITRTimelines() (tlines []Timeline, err error)

PITRTimelines returns cluster-wide time ranges valid for PITR restore

func (*PBM) PITRrun added in v1.5.0

func (p *PBM) PITRrun() (bool, error)

PITRrun checks if PITR slicing is running. It looks for PITR locks and returns true if there is at least one not stale.

func (*PBM) ResetEpoch added in v1.4.0

func (p *PBM) ResetEpoch() (Epoch, error)

func (*PBM) RestoreHB added in v1.1.2

func (p *PBM) RestoreHB(name string) error

func (*PBM) RestoresList added in v1.1.2

func (p *PBM) RestoresList(limit int64) ([]RestoreMeta, error)

func (*PBM) ResyncStorage added in v1.3.0

func (p *PBM) ResyncStorage(l *log.Event) error

ResyncStorage updates PBM metadata (snapshots and pitr) according to the data in the storage

func (*PBM) RmAgentStatus added in v1.4.0

func (p *PBM) RmAgentStatus(stat AgentStat) error

func (*PBM) SendCmd

func (p *PBM) SendCmd(cmd Cmd) error

func (*PBM) SetAgentStatus added in v1.4.0

func (p *PBM) SetAgentStatus(stat AgentStat) error

func (*PBM) SetBackupMeta added in v1.1.0

func (p *PBM) SetBackupMeta(m *BackupMeta) error

func (*PBM) SetBalancerStatus added in v1.5.0

func (p *PBM) SetBalancerStatus(m BalancerMode) error

SetBalancerStatus sets balancer status

func (*PBM) SetConfig added in v1.1.0

func (p *PBM) SetConfig(cfg Config) error

func (*PBM) SetConfigByte added in v1.1.0

func (p *PBM) SetConfigByte(buf []byte) error

func (*PBM) SetConfigVar added in v1.1.0

func (p *PBM) SetConfigVar(key, val string) error

func (*PBM) SetFirstWrite added in v1.6.0

func (p *PBM) SetFirstWrite(bcpName string, first primitive.Timestamp) error

func (*PBM) SetLastWrite added in v1.1.0

func (p *PBM) SetLastWrite(bcpName string, last primitive.Timestamp) error

func (*PBM) SetRSLastWrite added in v1.1.0

func (p *PBM) SetRSLastWrite(bcpName string, rsName string, ts primitive.Timestamp) error

func (*PBM) SetRSNomination added in v1.5.0

func (p *PBM) SetRSNomination(bcpName, rs string) error

func (*PBM) SetRSNomineeACK added in v1.5.0

func (p *PBM) SetRSNomineeACK(bcpName, rsName, node string) error

func (*PBM) SetRSNominees added in v1.5.0

func (p *PBM) SetRSNominees(bcpName, rsName string, nodes []string) error

func (*PBM) SetRestoreBackup added in v1.3.0

func (p *PBM) SetRestoreBackup(name, backupName string) error

func (*PBM) SetRestoreMeta added in v1.1.2

func (p *PBM) SetRestoreMeta(m *RestoreMeta) error

func (*PBM) SetRestorePITR added in v1.3.0

func (p *PBM) SetRestorePITR(name string, ts int64) error

type PITRChunk added in v1.3.0

type PITRChunk struct {
	RS          string              `bson:"rs"`
	FName       string              `bson:"fname"`
	Compression CompressionType     `bson:"compression"`
	StartTS     primitive.Timestamp `bson:"start_ts"`
	EndTS       primitive.Timestamp `bson:"end_ts"`
	// contains filtered or unexported fields
}

PITRChunk is index metadata for the oplog chunks

func PITRmetaFromFName added in v1.3.0

func PITRmetaFromFName(f string) *PITRChunk

PITRmetaFromFName parses given file name and returns PITRChunk metadata it returns nil if file wasn't parse successfully (e.g. wrong format) current fromat is 20200715155939-0.20200715160029-1.oplog.snappy

!!! should be agreed with pbm/pitr.chunkPath()

type PITRConf added in v1.3.0

type PITRConf struct {
	Enabled      bool    `bson:"enabled" json:"enabled" yaml:"enabled"`
	OplogSpanMin float64 `bson:"oplogSpanMin" json:"oplogSpanMin" yaml:"oplogSpanMin"`
}

PITRConf is a Point-In-Time Recovery options

type PITRestoreCmd added in v1.3.0

type PITRestoreCmd struct {
	Name string `bson:"name"`
	TS   int64  `bson:"ts"`
	Bcp  string `bson:"bcp"`
}

func (PITRestoreCmd) String added in v1.3.2

func (p PITRestoreCmd) String() string

type ReplRole

type ReplRole string

ReplRole is a replicaset role in sharded cluster

type ReplsetStatus

type ReplsetStatus struct {
	Set                     string               `bson:"set" json:"set"`
	Date                    time.Time            `bson:"date" json:"date"`
	MyState                 NodeState            `bson:"myState" json:"myState"`
	Members                 []NodeStatus         `bson:"members" json:"members"`
	Term                    int64                `bson:"term,omitempty" json:"term,omitempty"`
	HeartbeatIntervalMillis int64                `bson:"heartbeatIntervalMillis,omitempty" json:"heartbeatIntervalMillis,omitempty"`
	Optimes                 *StatusOpTimes       `bson:"optimes,omitempty" json:"optimes,omitempty"`
	Errmsg                  string               `bson:"errmsg,omitempty" json:"errmsg,omitempty"`
	Ok                      int                  `bson:"ok" json:"ok"`
	ClusterTime             *ClusterTime         `bson:"$clusterTime,omitempty" json:"$clusterTime,omitempty"`
	ConfigServerState       *ConfigServerState   `bson:"$configServerState,omitempty" json:"$configServerState,omitempty"`
	OperationTime           *primitive.Timestamp `bson:"operationTime,omitempty" json:"operationTime,omitempty"`
}

func GetReplsetStatus added in v1.5.0

func GetReplsetStatus(ctx context.Context, cn *mongo.Client) (*ReplsetStatus, error)

GetReplsetStatus returns `replSetGetStatus` for the given connection

type RestoreCmd

type RestoreCmd struct {
	Name       string `bson:"name"`
	BackupName string `bson:"backupName"`
}

func (RestoreCmd) String added in v1.3.2

func (r RestoreCmd) String() string

type RestoreConf added in v1.3.2

type RestoreConf struct {
	BatchSize           int `bson:"batchSize" json:"batchSize,omitempty" yaml:"batchSize,omitempty"` // num of documents to buffer
	NumInsertionWorkers int `bson:"numInsertionWorkers" json:"numInsertionWorkers,omitempty" yaml:"numInsertionWorkers,omitempty"`
}

RestoreConf is config options for the restore

type RestoreMeta added in v1.1.2

type RestoreMeta struct {
	OPID             string              `bson:"opid" json:"opid"`
	Name             string              `bson:"name" json:"name"`
	Backup           string              `bson:"backup" json:"backup"`
	PITR             int64               `bson:"pitr" json:"pitr"`
	Replsets         []RestoreReplset    `bson:"replsets" json:"replsets"`
	Hb               primitive.Timestamp `bson:"hb" json:"hb"`
	StartTS          int64               `bson:"start_ts" json:"start_ts"`
	LastTransitionTS int64               `bson:"last_transition_ts" json:"last_transition_ts"`
	Status           Status              `bson:"status" json:"status"`
	Conditions       []Condition         `bson:"conditions" json:"conditions"`
	Error            string              `bson:"error,omitempty" json:"error,omitempty"`
}

type RestoreReplset added in v1.1.2

type RestoreReplset struct {
	Name             string              `bson:"name" json:"name"`
	StartTS          int64               `bson:"start_ts" json:"start_ts"`
	Status           Status              `bson:"status" json:"status"`
	LastTransitionTS int64               `bson:"last_transition_ts" json:"last_transition_ts"`
	LastWriteTS      primitive.Timestamp `bson:"last_write_ts" json:"last_write_ts"`
	Error            string              `bson:"error,omitempty" json:"error,omitempty"`
	Conditions       []Condition         `bson:"conditions" json:"conditions"`
}

type Shard

type Shard struct {
	ID   string `bson:"_id"`
	RS   string `bson:"-"`
	Host string `bson:"host"`
}

Shard represent config.shard https://docs.mongodb.com/manual/reference/config-database/#config.shards

type Status

type Status string

Status is a backup current status

const (
	StatusStarting  Status = "starting"
	StatusRunning   Status = "running"
	StatusDumpDone  Status = "dumpDone"
	StatusDone      Status = "done"
	StatusCancelled Status = "canceled"
	StatusError     Status = "error"
)

type StatusOpTimes

type StatusOpTimes struct {
	LastCommittedOpTime       *OpTime `bson:"lastCommittedOpTime" json:"lastCommittedOpTime"`
	ReadConcernMajorityOpTime *OpTime `bson:"readConcernMajorityOpTime" json:"readConcernMajorityOpTime"`
	AppliedOpTime             *OpTime `bson:"appliedOpTime" json:"appliedOpTime"`
	DurableOptime             *OpTime `bson:"durableOpTime" json:"durableOpTime"`
}

type StorageConf added in v1.2.0

type StorageConf struct {
	Type       StorageType `bson:"type" json:"type" yaml:"type"`
	S3         s3.Conf     `bson:"s3,omitempty" json:"s3,omitempty" yaml:"s3,omitempty"`
	Azure      azure.Conf  `bson:"azure,omitempty" json:"azure,omitempty" yaml:"azure,omitempty"`
	Filesystem fs.Conf     `bson:"filesystem,omitempty" json:"filesystem,omitempty" yaml:"filesystem,omitempty"`
}

StorageConf is a configuration of the backup storage

func (*StorageConf) Path added in v1.5.0

func (s *StorageConf) Path() string

func (*StorageConf) Typ added in v1.5.0

func (s *StorageConf) Typ() string

type StorageType

type StorageType string

StorageType represents a type of the destination storage for backups

const (
	StorageUndef      StorageType = ""
	StorageS3         StorageType = "s3"
	StorageAzure      StorageType = "azure"
	StorageFilesystem StorageType = "filesystem"
	StorageBlackHole  StorageType = "blackhole"
)

type SubsysStatus added in v1.4.0

type SubsysStatus struct {
	OK  bool   `bson:"ok"`
	Err string `bson:"e"`
}

type Timeline added in v1.3.0

type Timeline struct {
	Start uint32 `json:"start"`
	End   uint32 `json:"end"`
	Size  int64  `json:"-"`
}

func MergeTimelines added in v1.3.0

func MergeTimelines(tlns ...[]Timeline) []Timeline

MergeTimelines merges overlapping sets on timelines it presumes timelines are sorted and don't start from 0

func (Timeline) String added in v1.3.0

func (t Timeline) String() string

Directories

Path Synopsis
fs
s3

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL