Documentation ¶
Overview ¶
Package cluster contains EliasDB's clustering code.
The clustering code provides an abstraction layer to EliasDB's graphstorage.Storage. This means the actual storage of a cluster can be entirely memory based or use any other backend as long as it satisfies the graphstorage.Storage interface.
DistributedStorage wraps a graphstorage.Storage and has a manager.MemberManager object.
Members are identified by a unique name. Calling Start() on manager.MemberManager registers and starts the RPC server for the member. Cluster internal RPC requests are served by manager.Server. It is a singleton object which routes RPC calls to registered MemberManagers - this architecture makes it easy to unit test the cluster code. The manager.MemberManager has a manager.Client object which can be used to send messages to the cluster.
The integrity of the cluster is protected by a shared secret (string) among all members of the cluster. A new member can only join and communicate with the cluster if it has the secret string. The secret string is never transferred directly over the network - it is only used for generating a member specific token which can be verified by all other members.
The clustering code was inspired by Amazon DynamoDB http://www.allthingsdistributed.com/2012/01/amazon-dynamodb.html
Index ¶
- Constants
- Variables
- func ClearMSMap()
- func DumpMemoryClusterLayout(smname string) string
- func WaitForTransfer()
- type DataRequest
- type DataRequestArg
- type DistributedStorage
- func (ds *DistributedStorage) Close() error
- func (ds *DistributedStorage) DistributionTable() (*DistributionTable, error)
- func (ds *DistributedStorage) FlushAll() error
- func (ds *DistributedStorage) FlushMain() error
- func (ds *DistributedStorage) IsOperational() bool
- func (ds *DistributedStorage) LocalName() string
- func (ds *DistributedStorage) MainDB() map[string]string
- func (ds *DistributedStorage) Name() string
- func (ds *DistributedStorage) ReplicationFactor() int
- func (ds *DistributedStorage) RollbackMain() error
- func (ds *DistributedStorage) SetDistributionTable(dt *DistributionTable)
- func (ds *DistributedStorage) SetDistributionTableError(err error)
- func (ds *DistributedStorage) Start() error
- func (ds *DistributedStorage) StorageManager(smname string, create bool) storage.Manager
- type DistributedStorageError
- type DistributedStorageManager
- func (dsm *DistributedStorageManager) Close() error
- func (dsm *DistributedStorageManager) Exists(loc uint64) (bool, error)
- func (dsm *DistributedStorageManager) Fetch(loc uint64, o interface{}) error
- func (dsm *DistributedStorageManager) FetchCached(loc uint64) (interface{}, error)
- func (dsm *DistributedStorageManager) Flush() error
- func (dsm *DistributedStorageManager) Free(loc uint64) error
- func (dsm *DistributedStorageManager) Insert(o interface{}) (uint64, error)
- func (dsm *DistributedStorageManager) Name() string
- func (dsm *DistributedStorageManager) Rollback() error
- func (dsm *DistributedStorageManager) Root(root int) uint64
- func (dsm *DistributedStorageManager) SetRoot(root int, val uint64)
- func (dsm *DistributedStorageManager) Update(loc uint64, o interface{}) error
- type DistributionTable
- func (dd *DistributionTable) LocationHome(loc uint64) (string, []string)
- func (dd *DistributionTable) MemberRange(name string) (uint64, uint64)
- func (dd *DistributionTable) Members() []string
- func (dd *DistributionTable) OtherReplicationMembers(loc uint64, name string) []string
- func (dd *DistributionTable) Replicas(name string) []string
- func (dd *DistributionTable) ReplicationRange(name string) (uint64, uint64)
- func (dd *DistributionTable) String() string
- type RequestType
Constants ¶
const ( RTGetMain RequestType = "GetMain" RTSetMain = "SetMain" RTGetRoot = "GetRoot" RTSetRoot = "SetRoot" RTInsert = "Insert" RTUpdate = "Update" RTFree = "Free" RTExists = "Exists" RTFetch = "Fetch" RTRebalance = "Rebalance" )
List of all possible request types
const ( RPStoreName DataRequestArg = "StoreName" // Name of the store RPLoc = "Loc" // Location of data RPVer = "Ver" // Version of data RPRoot = "Root" // Root id RPSrc = "Src" // Request source member )
List of all possible data request parameters.
const ClusterStoragePrefix = "cs_"
ClusterStoragePrefix is the prefix for cluster related storage managers
const LocalStoragePrefix = "ls_"
LocalStoragePrefix is the prefix for local storage managers
const MaxSizeRebalanceLists = 100
MaxSizeRebalanceLists is the maximum size for rebalancing lists within one rebalance request.
Variables ¶
var DSRetNew error
DSRetNew is the return value on successful creating a distributed storage (used for testing)
Functions ¶
func ClearMSMap ¶ added in v1.0.2
func ClearMSMap()
ClearMSMap clears the current map of known memory-only memberStorages.
func DumpMemoryClusterLayout ¶ added in v1.0.2
DumpMemoryClusterLayout returns the current storage layout in a memory-only cluster for a given storage manager (e.g. mainPerson.nodes for Person nodes of partition main).
func WaitForTransfer ¶ added in v1.0.2
func WaitForTransfer()
WaitForTransfer waits for the datatransfer to happen.
Types ¶
type DataRequest ¶
type DataRequest struct { RequestType RequestType // Type of request Args map[DataRequestArg]interface{} // Request arguments Value interface{} // Request value Transfer bool // Flag for data transfer request }
DataRequest data structure
type DistributedStorage ¶
type DistributedStorage struct { MemberManager *manager.MemberManager // Manager object // contains filtered or unexported fields }
DistributedStorage data structure
func NewDistributedStorage ¶
func NewDistributedStorage(gs graphstorage.Storage, config map[string]interface{}, stateInfo manager.StateInfo) (*DistributedStorage, error)
NewDistributedStorage creates a new cluster graph storage. The distributed storage wraps around a local graphstorage.Storage. The configuration of the distributed storage consists of two parts: A normal config map which defines static information like rpc port, secret string, etc and a StateInfo object which is used for dynamic information like cluster members, member status, etc. An empty StateInfo means that the cluster has only one member.
func (*DistributedStorage) Close ¶
func (ds *DistributedStorage) Close() error
Close closes the distributed storage.
func (*DistributedStorage) DistributionTable ¶
func (ds *DistributedStorage) DistributionTable() (*DistributionTable, error)
DistributionTable returns the current distribution table or an error if the storage is not available.
func (*DistributedStorage) FlushAll ¶
func (ds *DistributedStorage) FlushAll() error
FlushAll writes all pending local changes to the storage.
func (*DistributedStorage) FlushMain ¶
func (ds *DistributedStorage) FlushMain() error
FlushMain writes the main database to the storage.
func (*DistributedStorage) IsOperational ¶
func (ds *DistributedStorage) IsOperational() bool
IsOperational returns if this distribution storage is operational
func (*DistributedStorage) LocalName ¶
func (ds *DistributedStorage) LocalName() string
LocalName returns the local name of the wrapped DistributedStorage instance.
func (*DistributedStorage) MainDB ¶
func (ds *DistributedStorage) MainDB() map[string]string
MainDB returns the main database. The main database is a quick lookup map for meta data which is always kept in memory.
func (*DistributedStorage) Name ¶
func (ds *DistributedStorage) Name() string
Name returns the name of the cluster DistributedStorage instance.
func (*DistributedStorage) ReplicationFactor ¶
func (ds *DistributedStorage) ReplicationFactor() int
ReplicationFactor returns the replication factor of this cluster member. A value of 0 means the cluster is not operational in the moment.
func (*DistributedStorage) RollbackMain ¶
func (ds *DistributedStorage) RollbackMain() error
RollbackMain rollback the main database.
func (*DistributedStorage) SetDistributionTable ¶
func (ds *DistributedStorage) SetDistributionTable(dt *DistributionTable)
SetDistributionTable sets the distribution table and clears any error.
func (*DistributedStorage) SetDistributionTableError ¶
func (ds *DistributedStorage) SetDistributionTableError(err error)
SetDistributionTableError records an distribution table related error. This clears the current distribution table.
func (*DistributedStorage) Start ¶
func (ds *DistributedStorage) Start() error
Start starts the distributed storage.
func (*DistributedStorage) StorageManager ¶
func (ds *DistributedStorage) StorageManager(smname string, create bool) storage.Manager
StorageManager gets a storage manager with a certain name. A non-exisClusterting StorageManager is not created automatically if the create flag is set to false.
type DistributedStorageError ¶
type DistributedStorageError struct {
// contains filtered or unexported fields
}
DistributedStorageError is an error related to the distribution storage. This error is returned when the data distribution fails for example when too many cluster members have failed.
func (*DistributedStorageError) Error ¶
func (dse *DistributedStorageError) Error() string
Error returns a string representation of a DistributedStorageError.
type DistributedStorageManager ¶
type DistributedStorageManager struct {
// contains filtered or unexported fields
}
DistributedStorageManager is a storage.Manager which sends requests to the distributed storage.
func (*DistributedStorageManager) Close ¶
func (dsm *DistributedStorageManager) Close() error
Close is not implemented for a DistributedStorageManager. Only the local storage must be closed which is done when the DistributedStore is shut down.
func (*DistributedStorageManager) Exists ¶
func (dsm *DistributedStorageManager) Exists(loc uint64) (bool, error)
Exists checks if an object exists in a given storage location.
func (*DistributedStorageManager) Fetch ¶
func (dsm *DistributedStorageManager) Fetch(loc uint64, o interface{}) error
Fetch fetches an object from a given storage location and writes it to a given data container.
func (*DistributedStorageManager) FetchCached ¶
func (dsm *DistributedStorageManager) FetchCached(loc uint64) (interface{}, error)
FetchCached is not implemented for a DistributedStorageManager. Only defined to satisfy the StorageManager interface.
func (*DistributedStorageManager) Flush ¶
func (dsm *DistributedStorageManager) Flush() error
Flush is not implemented for a DistributedStorageManager. All changes are immediately written to disk in a cluster.
func (*DistributedStorageManager) Free ¶
func (dsm *DistributedStorageManager) Free(loc uint64) error
Free frees a storage location.
func (*DistributedStorageManager) Insert ¶
func (dsm *DistributedStorageManager) Insert(o interface{}) (uint64, error)
Insert inserts an object and return its storage location.
func (*DistributedStorageManager) Name ¶
func (dsm *DistributedStorageManager) Name() string
Name returns the name of the StorageManager instance.
func (*DistributedStorageManager) Rollback ¶
func (dsm *DistributedStorageManager) Rollback() error
Rollback is not implemented for a DistributedStorageManager. All changes are immediately written to disk in a cluster.
func (*DistributedStorageManager) Root ¶
func (dsm *DistributedStorageManager) Root(root int) uint64
Root returns a root value.
func (*DistributedStorageManager) SetRoot ¶
func (dsm *DistributedStorageManager) SetRoot(root int, val uint64)
SetRoot writes a root value.
func (*DistributedStorageManager) Update ¶
func (dsm *DistributedStorageManager) Update(loc uint64, o interface{}) error
Update updates a storage location.
type DistributionTable ¶
type DistributionTable struct {
// contains filtered or unexported fields
}
DistributionTable is used to locate data in a cluster. The table contains all cluster members and can identify replication members for given data locations.
func NewDistributionTable ¶
func NewDistributionTable(members []string, repFac int) (*DistributionTable, error)
NewDistributionTable creates a new distribution table.
func (*DistributionTable) LocationHome ¶
func (dd *DistributionTable) LocationHome(loc uint64) (string, []string)
LocationHome return the member which is in charge of a given location and all its replicas.
func (*DistributionTable) MemberRange ¶
func (dd *DistributionTable) MemberRange(name string) (uint64, uint64)
MemberRange returns the location range of a given member.
func (*DistributionTable) Members ¶
func (dd *DistributionTable) Members() []string
Members returns all known cluster members.
func (*DistributionTable) OtherReplicationMembers ¶
func (dd *DistributionTable) OtherReplicationMembers(loc uint64, name string) []string
OtherReplicationMembers returns all members of a replication group (identified by a given locqtion) minus a given member.
func (*DistributionTable) Replicas ¶
func (dd *DistributionTable) Replicas(name string) []string
Replicas returns all replicas for a given member.
func (*DistributionTable) ReplicationRange ¶
func (dd *DistributionTable) ReplicationRange(name string) (uint64, uint64)
ReplicationRange return the location range which is replicated by a given member.
func (*DistributionTable) String ¶
func (dd *DistributionTable) String() string
String returns a string representation of this distribution table.