dtable

package
v0.9.1 Latest Latest
Warning

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

Go to latest
Published: May 25, 2015 License: MIT Imports: 10 Imported by: 0

README

Dendrite

Dendrite is a Go package that implements distributed hash table (DHT) based on Chord Protocol. Included sub-package 'dtable' is built on top of dendrite and implements distributed in-memory key/value database, with replication and failover support, with query interface to Get() or Set() items with different consistency levels.

For better key distribution, dendrite allows configurable number of virtual nodes per instance (vnodes). The number of replicas in dtable is also configurable.

Calling application can bootstrap the cluster, or join existing one by connecting to any of existing nodes (must be manually specified). Node discovery is not part of the implementation. Use consul (consul.io) or something else for that purpose.

Chord protocol defines ring stabilization. In dendrite, stabilization period is configurable.

Node to node (network) communication is built on top of ZeroMQ sockets over TCP for speed, clustering and reliability. Dendrite starts configurable number of goroutines (default: 10) for load balanced serving of remote requests, but scales that number up and down depending on the load (aka prefork model).

All messages sent through dendrite are encapsulated in ChordMsg structure, where first byte indicates message type, and actual data follows. Data part is serialized with protocol buffers.

Dendrite can be extended through two interfaces:

  • TransportHook
  • DelegateHook

TransportHook allows other packages to provide additional message types, decoders and handlers, while DelegateHook can be used to capture chord events that dendrite emits:

  • EvPredecessorJoined
  • EvPredecessorLeft
  • EvReplicasChanged

Documentation

Usage

import "github.com/fastfn/dendrite"
import "github.com/fastfn/dendrite/dtable"
...
// Initialize ZMQTransport with timeout set to 5 seconds
transport, err := dendrite.InitZMQTransport("127.0.0.1:5000", 5*time.Second)
if err != nil {
	panic(err)
	return
}
config := dendrite.DefaultConfig("127.0.0.1:5000")
Bootstrap the cluster (first node)
// Start new cluster
ring, err = dendrite.CreateRing(config, transport)
if err != nil {
	panic(err)
}
table = dtable.Init(ring, transport, dtable.LogInfo)
Joining the cluster
// We join the cluster by providing the address of one of existing nodes in the cluster.
ring, err = dendrite.JoinRing(config, transport, "192.168.0.50:5000")
if err != nil {
	panic(err)
}
table = dtable.Init(ring, transport, dtable.LogInfo)
DTable Query examples
Set()
query := table.NewQuery()
err := query.Set([]byte("testkey"), []byte("testvalue"))
if err != nil {
	panic(err)
}
Set() with consistency

Consistency() is used prior to Set() to request minimum writes before operation returns success. If dtable runs with 2 replicas, user may request 2 writes (primary + 1 replica) and let dtable handle final write in the background. If requested value is larger than configured dendrite replicas, value is reset to default. Default is 1.

query := table.NewQuery()
err := query.Consistency(2).Set([]byte("testkey"), []byte("testvalue"))
if err != nil {
	panic(err)
}
Get()
query := table.NewQuery()
item, err := query.Get([]byte("testkey"))
if err != nil {
	log.Println("Got error in table Get: ", err)
} else if item == nil {
	log.Printf("item not found")
} else {
	log.Printf("Value is: %s\n", string(item.Val))
}
GetLocalKeys()

GetLocalKeys() returns the list of all keys stored on local node.

query := table.NewQuery()
for _, key := range query.GetLocalKeys() {
	log.Printf("Key: %s\n", string(key))
}

Todo

  • dtable: support SetMulti() and GetMulti() on public interface
  • dtable: support batches on replication/migration ops
  • dendrite: add some kind of security for inter communication between nodes

Documentation

Overview

Package dtable implements highly available, distributed in-memory key/value datastore.

DTable is built on top of dendrite for key distribution and high availability, replication and failover. It exposes Query interface for Get() and Set() operations.

It hooks on dendrite as a TransportHook and uses ZeroMQ for communication between remote nodes. All messages between the nodes are serialized with protocol buffers.

Index

Constants

View Source
const (
	PbDtableStatus            dendrite.MsgType = 0x20 // status request to see if remote dtable is initialized
	PbDtableResponse          dendrite.MsgType = 0x21 // generic response
	PbDtableItem              dendrite.MsgType = 0x22 // single item response
	PbDtableMultiItemResponse dendrite.MsgType = 0x23 // response with multiple items
	PbDtableGetItem           dendrite.MsgType = 0x24 // getItem request
	PbDtableSetItem           dendrite.MsgType = 0x25 // setItem request
	PbDtableSetMultiItem      dendrite.MsgType = 0x26 // setMultiItem request
	PbDtableClearReplica      dendrite.MsgType = 0x27 // clearReplica request
	PbDtableSetReplica        dendrite.MsgType = 0x28 // setReplica request
	PbDtableSetReplicaInfo    dendrite.MsgType = 0x29 // setReplicaInfo request
	PbDtablePromoteKey        dendrite.MsgType = 0x30 // promote remote vnode for given key

)

Variables

This section is empty.

Functions

This section is empty.

Types

type DTable

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

DTable is main dtable struct.

func Init

func Init(ring *dendrite.Ring, transport dendrite.Transport, level LogLevel) *DTable

Init initializes dtable and registers with dendrite as a TransportHook and DelegateHook.

func (*DTable) Decode

func (dt *DTable) Decode(data []byte) (*dendrite.ChordMsg, error)

Decode implements dendrite's TransportHook.

func (*DTable) DumpStr

func (dt *DTable) DumpStr()

DumpStr dumps dtable keys per vnode on stdout. Mostly used for debugging.

func (*DTable) EmitEvent

func (dt *DTable) EmitEvent(ctx *dendrite.EventCtx)

EmitEvent implements dendrite's DelegateHook.

func (*DTable) Logf

func (dt *DTable) Logf(level LogLevel, format string, v ...interface{})

Logf wraps log.Printf with additional LogLevel.

func (*DTable) Logln

func (dt *DTable) Logln(level LogLevel, v ...interface{})

Logln wraps log.Println with additional LogLevel.

func (*DTable) NewQuery

func (dt *DTable) NewQuery() Query

NewQuery returns Query.

type KVItem

type KVItem struct {
	Key []byte
	Val []byte
}

KVItem is basic database item struct.

type LogLevel

type LogLevel int
const (
	LogNull  LogLevel = 0
	LogInfo  LogLevel = 1
	LogDebug LogLevel = 2
)

type PBDTableClearReplica

type PBDTableClearReplica struct {
	Dest             *dendrite.PBProtoVnode `protobuf:"bytes,1,req,name=dest" json:"dest,omitempty"`
	KeyHash          []byte                 `protobuf:"bytes,2,req,name=keyHash" json:"keyHash,omitempty"`
	Demoted          *bool                  `protobuf:"varint,3,req,name=demoted" json:"demoted,omitempty"`
	Origin           *dendrite.PBProtoVnode `protobuf:"bytes,4,opt,name=origin" json:"origin,omitempty"`
	XXX_unrecognized []byte                 `json:"-"`
}

PBDTableClearReplica is a request message used to remove replicated item from remote vnode.

func (*PBDTableClearReplica) GetDemoted

func (m *PBDTableClearReplica) GetDemoted() bool

func (*PBDTableClearReplica) GetDest

func (*PBDTableClearReplica) GetKeyHash

func (m *PBDTableClearReplica) GetKeyHash() []byte

func (*PBDTableClearReplica) GetOrigin

func (m *PBDTableClearReplica) GetOrigin() *dendrite.PBProtoVnode

func (*PBDTableClearReplica) ProtoMessage

func (*PBDTableClearReplica) ProtoMessage()

func (*PBDTableClearReplica) Reset

func (m *PBDTableClearReplica) Reset()

func (*PBDTableClearReplica) String

func (m *PBDTableClearReplica) String() string

type PBDTableDemotedItem

type PBDTableDemotedItem struct {
	Dest             *dendrite.PBProtoVnode `protobuf:"bytes,1,req,name=dest" json:"dest,omitempty"`
	Item             *PBDTableItem          `protobuf:"bytes,2,req,name=item" json:"item,omitempty"`
	Origin           *dendrite.PBProtoVnode `protobuf:"bytes,3,opt,name=origin" json:"origin,omitempty"`
	XXX_unrecognized []byte                 `json:"-"`
}

PBDTableDemotedItem message represents demotedItem's structure.

func (*PBDTableDemotedItem) GetDest

func (*PBDTableDemotedItem) GetItem

func (m *PBDTableDemotedItem) GetItem() *PBDTableItem

func (*PBDTableDemotedItem) GetOrigin

func (m *PBDTableDemotedItem) GetOrigin() *dendrite.PBProtoVnode

func (*PBDTableDemotedItem) ProtoMessage

func (*PBDTableDemotedItem) ProtoMessage()

func (*PBDTableDemotedItem) Reset

func (m *PBDTableDemotedItem) Reset()

func (*PBDTableDemotedItem) String

func (m *PBDTableDemotedItem) String() string

type PBDTableGetItem

type PBDTableGetItem struct {
	Dest             *dendrite.PBProtoVnode `protobuf:"bytes,1,req,name=dest" json:"dest,omitempty"`
	KeyHash          []byte                 `protobuf:"bytes,2,req,name=keyHash" json:"keyHash,omitempty"`
	Origin           *dendrite.PBProtoVnode `protobuf:"bytes,3,opt,name=origin" json:"origin,omitempty"`
	XXX_unrecognized []byte                 `json:"-"`
}

PBDTableGetItem is a request message used to get an item from remote vnode.

func (*PBDTableGetItem) GetDest

func (m *PBDTableGetItem) GetDest() *dendrite.PBProtoVnode

func (*PBDTableGetItem) GetKeyHash

func (m *PBDTableGetItem) GetKeyHash() []byte

func (*PBDTableGetItem) GetOrigin

func (m *PBDTableGetItem) GetOrigin() *dendrite.PBProtoVnode

func (*PBDTableGetItem) ProtoMessage

func (*PBDTableGetItem) ProtoMessage()

func (*PBDTableGetItem) Reset

func (m *PBDTableGetItem) Reset()

func (*PBDTableGetItem) String

func (m *PBDTableGetItem) String() string

type PBDTableItem

type PBDTableItem struct {
	Key              []byte                 `protobuf:"bytes,1,opt,name=key" json:"key,omitempty"`
	Val              []byte                 `protobuf:"bytes,2,opt,name=val" json:"val,omitempty"`
	Timestamp        *int64                 `protobuf:"varint,3,opt,name=timestamp" json:"timestamp,omitempty"`
	Commited         *bool                  `protobuf:"varint,4,opt,name=commited" json:"commited,omitempty"`
	KeyHash          []byte                 `protobuf:"bytes,5,opt,name=keyHash" json:"keyHash,omitempty"`
	ReplicaInfo      *PBDTableReplicaInfo   `protobuf:"bytes,6,opt,name=replicaInfo" json:"replicaInfo,omitempty"`
	Origin           *dendrite.PBProtoVnode `protobuf:"bytes,7,opt,name=origin" json:"origin,omitempty"`
	Found            *bool                  `protobuf:"varint,8,opt,name=found" json:"found,omitempty"`
	XXX_unrecognized []byte                 `json:"-"`
}

PBDTableItem message represents kvItem's structure.

func (*PBDTableItem) GetCommited

func (m *PBDTableItem) GetCommited() bool

func (*PBDTableItem) GetFound

func (m *PBDTableItem) GetFound() bool

func (*PBDTableItem) GetKey

func (m *PBDTableItem) GetKey() []byte

func (*PBDTableItem) GetKeyHash

func (m *PBDTableItem) GetKeyHash() []byte

func (*PBDTableItem) GetOrigin

func (m *PBDTableItem) GetOrigin() *dendrite.PBProtoVnode

func (*PBDTableItem) GetReplicaInfo

func (m *PBDTableItem) GetReplicaInfo() *PBDTableReplicaInfo

func (*PBDTableItem) GetTimestamp

func (m *PBDTableItem) GetTimestamp() int64

func (*PBDTableItem) GetVal

func (m *PBDTableItem) GetVal() []byte

func (*PBDTableItem) ProtoMessage

func (*PBDTableItem) ProtoMessage()

func (*PBDTableItem) Reset

func (m *PBDTableItem) Reset()

func (*PBDTableItem) String

func (m *PBDTableItem) String() string

type PBDTableMultiItemResponse

type PBDTableMultiItemResponse struct {
	Origin           *dendrite.PBProtoVnode `protobuf:"bytes,1,opt,name=origin" json:"origin,omitempty"`
	Items            []*PBDTableItem        `protobuf:"bytes,2,rep,name=items" json:"items,omitempty"`
	XXX_unrecognized []byte                 `json:"-"`
}

PBDTableMultiItemResponse is a response message used to send multiple kvItems to the caller.

func (*PBDTableMultiItemResponse) GetItems

func (m *PBDTableMultiItemResponse) GetItems() []*PBDTableItem

func (*PBDTableMultiItemResponse) GetOrigin

func (*PBDTableMultiItemResponse) ProtoMessage

func (*PBDTableMultiItemResponse) ProtoMessage()

func (*PBDTableMultiItemResponse) Reset

func (m *PBDTableMultiItemResponse) Reset()

func (*PBDTableMultiItemResponse) String

func (m *PBDTableMultiItemResponse) String() string

type PBDTablePromoteKey

type PBDTablePromoteKey struct {
	Dest             *dendrite.PBProtoVnode `protobuf:"bytes,1,req,name=dest" json:"dest,omitempty"`
	Item             *PBDTableItem          `protobuf:"bytes,2,req,name=item" json:"item,omitempty"`
	Origin           *dendrite.PBProtoVnode `protobuf:"bytes,3,opt,name=origin" json:"origin,omitempty"`
	XXX_unrecognized []byte                 `json:"-"`
}

PBDTablePromoteKey is a request message used to request a promotion of a key on the remote vnode.

func (*PBDTablePromoteKey) GetDest

func (*PBDTablePromoteKey) GetItem

func (m *PBDTablePromoteKey) GetItem() *PBDTableItem

func (*PBDTablePromoteKey) GetOrigin

func (m *PBDTablePromoteKey) GetOrigin() *dendrite.PBProtoVnode

func (*PBDTablePromoteKey) ProtoMessage

func (*PBDTablePromoteKey) ProtoMessage()

func (*PBDTablePromoteKey) Reset

func (m *PBDTablePromoteKey) Reset()

func (*PBDTablePromoteKey) String

func (m *PBDTablePromoteKey) String() string

type PBDTableReplicaInfo

type PBDTableReplicaInfo struct {
	Master           *dendrite.PBProtoVnode   `protobuf:"bytes,1,opt,name=master" json:"master,omitempty"`
	Vnodes           []*dendrite.PBProtoVnode `protobuf:"bytes,2,rep,name=vnodes" json:"vnodes,omitempty"`
	OrphanVnodes     []*dendrite.PBProtoVnode `protobuf:"bytes,3,rep,name=orphanVnodes" json:"orphanVnodes,omitempty"`
	State            *int32                   `protobuf:"varint,4,opt,name=state" json:"state,omitempty"`
	Depth            *int32                   `protobuf:"varint,5,opt,name=depth" json:"depth,omitempty"`
	XXX_unrecognized []byte                   `json:"-"`
}

PBDTableReplicaInfo message represents kvItem's replicaInfo structure.

func (*PBDTableReplicaInfo) GetDepth

func (m *PBDTableReplicaInfo) GetDepth() int32

func (*PBDTableReplicaInfo) GetMaster

func (m *PBDTableReplicaInfo) GetMaster() *dendrite.PBProtoVnode

func (*PBDTableReplicaInfo) GetOrphanVnodes

func (m *PBDTableReplicaInfo) GetOrphanVnodes() []*dendrite.PBProtoVnode

func (*PBDTableReplicaInfo) GetState

func (m *PBDTableReplicaInfo) GetState() int32

func (*PBDTableReplicaInfo) GetVnodes

func (m *PBDTableReplicaInfo) GetVnodes() []*dendrite.PBProtoVnode

func (*PBDTableReplicaInfo) ProtoMessage

func (*PBDTableReplicaInfo) ProtoMessage()

func (*PBDTableReplicaInfo) Reset

func (m *PBDTableReplicaInfo) Reset()

func (*PBDTableReplicaInfo) String

func (m *PBDTableReplicaInfo) String() string

type PBDTableResponse

type PBDTableResponse struct {
	Ok               *bool   `protobuf:"varint,1,req,name=ok" json:"ok,omitempty"`
	Error            *string `protobuf:"bytes,2,opt,name=error" json:"error,omitempty"`
	XXX_unrecognized []byte  `json:"-"`
}

PBDTableResponse is a generic response structure with error indication.

func (*PBDTableResponse) GetError

func (m *PBDTableResponse) GetError() string

func (*PBDTableResponse) GetOk

func (m *PBDTableResponse) GetOk() bool

func (*PBDTableResponse) ProtoMessage

func (*PBDTableResponse) ProtoMessage()

func (*PBDTableResponse) Reset

func (m *PBDTableResponse) Reset()

func (*PBDTableResponse) String

func (m *PBDTableResponse) String() string

type PBDTableSetItem

type PBDTableSetItem struct {
	Dest             *dendrite.PBProtoVnode `protobuf:"bytes,1,req,name=dest" json:"dest,omitempty"`
	Item             *PBDTableItem          `protobuf:"bytes,2,req,name=item" json:"item,omitempty"`
	Origin           *dendrite.PBProtoVnode `protobuf:"bytes,3,opt,name=origin" json:"origin,omitempty"`
	Demoting         *bool                  `protobuf:"varint,4,opt,name=demoting" json:"demoting,omitempty"`
	MinAcks          *int32                 `protobuf:"varint,5,opt,name=minAcks" json:"minAcks,omitempty"`
	XXX_unrecognized []byte                 `json:"-"`
}

PBDTableSetItem is a request message used to set an item to remote vnode.

func (*PBDTableSetItem) GetDemoting

func (m *PBDTableSetItem) GetDemoting() bool

func (*PBDTableSetItem) GetDest

func (m *PBDTableSetItem) GetDest() *dendrite.PBProtoVnode

func (*PBDTableSetItem) GetItem

func (m *PBDTableSetItem) GetItem() *PBDTableItem

func (*PBDTableSetItem) GetMinAcks

func (m *PBDTableSetItem) GetMinAcks() int32

func (*PBDTableSetItem) GetOrigin

func (m *PBDTableSetItem) GetOrigin() *dendrite.PBProtoVnode

func (*PBDTableSetItem) ProtoMessage

func (*PBDTableSetItem) ProtoMessage()

func (*PBDTableSetItem) Reset

func (m *PBDTableSetItem) Reset()

func (*PBDTableSetItem) String

func (m *PBDTableSetItem) String() string

type PBDTableSetMultiItem

type PBDTableSetMultiItem struct {
	Dest             *dendrite.PBProtoVnode `protobuf:"bytes,1,req,name=dest" json:"dest,omitempty"`
	Origin           *dendrite.PBProtoVnode `protobuf:"bytes,2,opt,name=origin" json:"origin,omitempty"`
	Items            []*PBDTableItem        `protobuf:"bytes,3,rep,name=items" json:"items,omitempty"`
	XXX_unrecognized []byte                 `json:"-"`
}

PBDTableSetMultiItem is a request message used to set multiple items on remote vnode.

func (*PBDTableSetMultiItem) GetDest

func (*PBDTableSetMultiItem) GetItems

func (m *PBDTableSetMultiItem) GetItems() []*PBDTableItem

func (*PBDTableSetMultiItem) GetOrigin

func (m *PBDTableSetMultiItem) GetOrigin() *dendrite.PBProtoVnode

func (*PBDTableSetMultiItem) ProtoMessage

func (*PBDTableSetMultiItem) ProtoMessage()

func (*PBDTableSetMultiItem) Reset

func (m *PBDTableSetMultiItem) Reset()

func (*PBDTableSetMultiItem) String

func (m *PBDTableSetMultiItem) String() string

type PBDTableSetReplicaInfo

type PBDTableSetReplicaInfo struct {
	Dest             *dendrite.PBProtoVnode `protobuf:"bytes,1,req,name=dest" json:"dest,omitempty"`
	KeyHash          []byte                 `protobuf:"bytes,2,req,name=keyHash" json:"keyHash,omitempty"`
	ReplicaInfo      *PBDTableReplicaInfo   `protobuf:"bytes,3,req,name=replicaInfo" json:"replicaInfo,omitempty"`
	Origin           *dendrite.PBProtoVnode `protobuf:"bytes,4,opt,name=origin" json:"origin,omitempty"`
	XXX_unrecognized []byte                 `json:"-"`
}

PBDTableSetReplicaInfo is a request message used to update metadata for replicated item on remote vnode.

func (*PBDTableSetReplicaInfo) GetDest

func (*PBDTableSetReplicaInfo) GetKeyHash

func (m *PBDTableSetReplicaInfo) GetKeyHash() []byte

func (*PBDTableSetReplicaInfo) GetOrigin

func (*PBDTableSetReplicaInfo) GetReplicaInfo

func (m *PBDTableSetReplicaInfo) GetReplicaInfo() *PBDTableReplicaInfo

func (*PBDTableSetReplicaInfo) ProtoMessage

func (*PBDTableSetReplicaInfo) ProtoMessage()

func (*PBDTableSetReplicaInfo) Reset

func (m *PBDTableSetReplicaInfo) Reset()

func (*PBDTableSetReplicaInfo) String

func (m *PBDTableSetReplicaInfo) String() string

type PBDTableStatus

type PBDTableStatus struct {
	Dest             *dendrite.PBProtoVnode `protobuf:"bytes,1,req,name=dest" json:"dest,omitempty"`
	XXX_unrecognized []byte                 `json:"-"`
}

PBDTableStatus is a message to request the status of remote vnode.

func (*PBDTableStatus) GetDest

func (m *PBDTableStatus) GetDest() *dendrite.PBProtoVnode

func (*PBDTableStatus) ProtoMessage

func (*PBDTableStatus) ProtoMessage()

func (*PBDTableStatus) Reset

func (m *PBDTableStatus) Reset()

func (*PBDTableStatus) String

func (m *PBDTableStatus) String() string

type Query

type Query interface {
	Consistency(int) Query
	Get([]byte) (*KVItem, error)
	Set([]byte, []byte) error // (key, val)
	GetLocalKeys() [][]byte
}

Query is dtable's native interface for doing data operations.

Jump to

Keyboard shortcuts

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