On 12. apr. 2011, at 05.55, dormando wrote:

> ps. folks please look this over and evaluate. Do you understand
> everything? Does anything suck? Need more clarification? Whatever?
> 
> http://code.google.com/p/memcached/downloads/detail?name=memcached-1.6.0_beta1.tar.gz
> ^ easy-bake oven form beta release. Passes tests on a bunch of platforms,
> but possibly not OpenBSD.
> 

I've fixed that bug. See: 
https://github.com/memcached/memcached/commit/cc3941084188195fc8b43fcdc05cec3dab5a4bd4

Cheers,

Trond


> Make evaluating! Give major feedback.
> 
> -Dormando
> 
> On Mon, 11 Apr 2011, Trond Norbye wrote:
> 
>>                       What's new in memcached
>>                       =======================
>> 
>> (part two - new feature proposals)
>> 
>> Table of Contents
>> =================
>> 1 Protocol
>>    1.1 Virtual buckets!
>>    1.2 TAP
>>    1.3 New commands
>>        1.3.1 VERBOSITY
>>        1.3.2 TOUCH, GAT and GATQ
>>        1.3.3 SET_VBUCKET, GET_VBUCKET, DEL_VBUCKET
>>        1.3.4 TAP_CONNECT
>>        1.3.5 TAP_MUTATION, TAP_DELETE, TAP_FLUSH
>>        1.3.6 TAP_OPAQUE
>>        1.3.7 TAP_VBUCKET_SET
>>        1.3.8 TAP_CHECKPOINT_START and TAP_CHECKPOINT_END
>> 2 Modularity
>>    2.1 Engines
>>    2.2 Extensions
>>        2.2.1 Logger
>>        2.2.2 Daemon
>>        2.2.3 ASCII commands
>> 3 New stats
>>    3.1 Stats returned by the default stats command
>>        3.1.1 libevent
>>        3.1.2 rejected_conns
>>        3.1.3 stats related to TAP
>>    3.2 topkeys
>>    3.3 aggregate
>>    3.4 settings
>>        3.4.1 extension
>>        3.4.2 topkeys
>> 
>> 
>> 1 Protocol
>> ~~~~~~~~~~~
>> 
>> Intentionally, there is no significant difference in protocol over
>> 1.4.x.  There is one minor change, but it should be transparent to
>> most users.
>> 
>> 1.1 Virtual buckets!
>> =====================
>> 
>> We don't know who originally came up with the idea, but we've heard
>> rumors that it might be Anatoly Vorobey or Brad Fitzpatrick.  In lieu
>> of a full explanation on this, the concept is that instead of mapping
>> each key to a server we map it to a virtual bucket.  These virtual
>> buckets are then distributed across all of the servers.  To ease the
>> introduction of this we've assigned the two reserved bytes in the
>> binary protocol for specifying the vbucket id, which allowed us to
>> avoid protocol extensions.
>> 
>> Note that this change should allow for complete compatibility if the
>> clients and the server are not aware of vbuckets.  These should have
>> been set to 0 according to the original binary protocol specification,
>> which means that they will always use vbucket 0.
>> 
>> The idea is that we can move these vbuckets between servers such that
>> you can "grow" or "shrink" your cluster without losing data in your
>> cache. The classic memcached caching engine does _not_ implement
>> support for multiple vbuckets right now, but it is on the roadmap to
>> create a version of the engine in memcached to support this (it is a
>> question of memory efficiency, and there are currently not many
>> clients that support them).
>> 
>> Defining this now will allow us to start moving down the path to
>> vbuckets in the default_engine and allow other engine implementors to
>> consider vbuckets in their design.
>> 
>> You can read more about the mechanics of it here:
>> [http://dustin.github.com/2010/06/29/memcached-vbuckets.html]
>> 
>> However, you _cannot_ use a mix of clients that are vbucket aware and
>> clients who don't use vbuckets, but then again it doesn't make sense
>> to use a vbucket aware backend if your clients don't know how to
>> access them.  This is why we believe a protocol change isn't
>> warranted.
>> 
>> Defining this now will allow us to start moving down the path to
>> vbuckets in the default_engine and allow other engine implementors to
>> consider vbuckets in their design.
>> 
>> 1.2 TAP
>> ========
>> 
>> In order to facilitate vbucket transfers, among other use cases where
>> people want to see what's inside the server, we added to the binary
>> protocol a set of commands collectively called TAP.  The intention is
>> to allow "clients" to receive a stream of notifications whenever data
>> change in the server.  It is solely up to the backing store to
>> implement this, so it can make decisions about what resources are used
>> to implement TAP.  This functionality is commonly needed enough though
>> that the core is aware of it, leaving specific implementation to
>> engines.
>> 
>> 1.3 New commands
>> =================
>> 
>> There are a few new commands available.  The following sections
>> provides a brief description of them.  Please check protocol_binary.h
>> for the implementation details.
>> 
>> 1.3.1 VERBOSITY
>> ----------------
>> 
>> We did not have an equivalent of the verbosity command in the textual
>> protocol.  This command allows the user to change the verbosity level
>> on your running server by using the binary protocol.  Why do we need
>> this? There is a command line option you may use to disable the ascii
>> protocol, so we need this command in order to change the logging level
>> in those configurations.
>> 
>> 1.3.2 TOUCH, GAT and GATQ
>> --------------------------
>> 
>> One of the problems with the existing commands in memcached is that
>> you couldn't tell the memcached server that the object is still valid
>> and we just want a longer expiration.  Normally you want to put an
>> expiry time on the objects, so that you can get an indication if your
>> cache is big enough (by watching the eviction stats.. if your
>> memcached server has a high eviction rate your cache isn't big enough
>> for what you want to have in there).  The normal idea is that the items
>> you're normally using would be bumped to the front of your LRU (and
>> hence not be kicked out immediately).
>> 
>> The touch command lets you set the expiry time for an object without
>> retrieving the object.  In most cases, you will not want to do this
>> unless you provide a CAS value to ensure that you're touching the
>> correct version of the object.
>> 
>> GAT means "get and touch" and returns the object in addition to
>> setting a new expiration time.  This allows you to have a rolling
>> window of expiry that has a TTL in addition to the access time.  For
>> example, you can instruct memcached to allow an object to live no
>> later than five minutes after the last time it was access (but as
>> always, it may expire sooner).
>> 
>> 1.3.3 SET_VBUCKET, GET_VBUCKET, DEL_VBUCKET
>> --------------------------------------------
>> 
>> These commands are used to set, get or delete a vbucket on the server.
>> 
>> 1.3.4 TAP_CONNECT
>> ------------------
>> 
>> Connect and request that the server initialize a TAP stream.
>> 
>> The point of this command is to allow clients to connect and specify a
>> few things about the data they wish to receive.  Specifically, the
>> client will typically specify a date either in the past or in the
>> future along with specifying a vbucket.  The server will then stream
>> data mutated since that given date or if a future date is specified,
>> only stream new mutations as they arrive.  The specific details about
>> which mutations to send may vary on implementation.
>> 
>> 1.3.5 TAP_MUTATION, TAP_DELETE, TAP_FLUSH
>> ------------------------------------------
>> 
>> TAP_MUTATION is a notification that an item changed value in the
>> server.
>> 
>> The mutation typically comes with the new value.
>> 
>> TAP_DELETE is a notification that a key was deleted on the server.
>> 
>> Finally, to avoid having to send a complete list of all the keys in
>> the server when the user issues a flush, we can send a single message
>> (TAP_FLUSH) representing the flush.  Please note that the FLUSH
>> message means _ALL_ vbuckets, and not just a single vbucket.
>> 
>> 1.3.6 TAP_OPAQUE
>> -----------------
>> 
>> To allow storage engines to send their own messages over the tap
>> stream between each other, a tap opaque message is defined.  It is
>> completely up to the storage engine to specify the internal layout of
>> the package.
>> 
>> 1.3.7 TAP_VBUCKET_SET
>> ----------------------
>> 
>> This is a message requesting a vbucket set. It is similar to the
>> set_vbucket command, with the difference that this message comes over
>> a tap connection (with the extra info a tap message contains)
>> 
>> 1.3.8 TAP_CHECKPOINT_START and TAP_CHECKPOINT_END
>> --------------------------------------------------
>> 
>> The checkpoint start and end messages may be used by engine who wants
>> to use checkpoints.  Checkpoints are an optional feature that may be
>> used by some engines to allow clients to start at a checkpoint
>> position.  By doing so, the client need not do a full "backfill" even
>> if it is revisiting a server after having been gone for a while.  The
>> TAP_CHECKPOINT_START tells a client that it's the start of a new
>> checkpoint, and the TAP_CHECKPOINT_END tells the client when it's
>> received everything for that given checkpoint.
>> 
>> 2 Modularity
>> ~~~~~~~~~~~~~
>> 
>> As we mentioned in the first email on changes, one big difference with
>> this new work is that we've tried to refactor memcached into being a
>> modular application instead of being monolithic.  In the future, we'd
>> like to make the command parser as a separate module, so that we may
>> load the parsers separately.
>> 
>> 2.1 Engines
>> ============
>> 
>> We've done a lot of work trying to refactor the code in memcached to
>> avoid the tight coupling between the command protocol parser and the
>> actual item storage.
>> 
>> The idea with the engine interface is that the memcached process loads
>> a dynamically loadable object and calls a well known function to get a
>> set of function pointers.  All communication between the memcached
>> process and the engine is performed through these function
>> pointers.  The memcached process provides a set of services to the
>> engine as well through another set of function pointers.
>> 
>> The beauty of this is that the user may choose between a set of
>> different storage engines that suites their runtime
>> environment.  People have different requirements for their server. Some
>> people need ACID, others may prefer ecstacy ;-) The storage interface
>> may let them design their app by using the memcached protocol, and
>> they can just swap in the backend that suites their needs (may it be
>> persistence, replication (sync or lazily) etc..)
>> 
>> 2.2 Extensions
>> ===============
>> 
>> The item storage isn't the only place we've tried to create a level of
>> modularity.  People run memcached in different environments with
>> different requirements. You specify the extensions you want to use by
>> adding the -X command line argument.
>> 
>> 2.2.1 Logger
>> -------------
>> 
>> We've seen a lot of different requests when it comes to logging. Some
>> want it to a file, some to syslog (or Windows event log) and some want
>> it to standard out.  By default memcached will print to stderr, but
>> you may specify a different logger by loading the appropriate module
>> with the -X command line argument
>> 
>> 2.2.2 Daemon
>> -------------
>> 
>> You might want to have some daemons providing extra services inside
>> your memcached server.  Examples would be things like a doors server
>> to provide additional access to your server (Trond's favorite), or
>> perhaps a "dispatcher" offering a threadpool for your engines to
>> use?).
>> 
>> 2.2.3 ASCII commands
>> ---------------------
>> 
>> If you really need to extend the ASCII protocol, you may now load
>> additional ASCII commands as loadable modules.  We don't need a
>> separate module for binary commands, because those are already handled
>> inside memcached due to the fixed semantics on the protocol.  This
>> isn't necessarily encouraged, but sometimes it is required to get
>> something done quick.
>> 
>> 3 New stats
>> ~~~~~~~~~~~~
>> 
>> There are a number of new stats introduced.  The key supplied in the
>> status command is passed to the storage engine to allow the storage
>> engine to add extra information to the existing stats commands, and to
>> create their own stat commands.
>> 
>> 3.1 Stats returned by the default stats command
>> ================================================
>> 
>> 3.1.1 libevent
>> ---------------
>> 
>> Over the time we've seen a lot of bugs around people using an old
>> version of libevent.  That's part of the reason why we bundle a well
>> known version of libevent in the release distribution.  Memcached
>> checks the libevent version during startup, and will refuse to start
>> if the one used is too old.  Since most operating systems use shared
>> libraries these days, you might be using another version than the one
>> you originally used when you first built memcached.  In order for us to
>> see which library people are using we decided to put it into the stats
>> as well.
>> 
>> 3.1.2 rejected_conns
>> ---------------------
>> 
>> The number of times a connection attempt was refused (due when we're
>> hitting the maximum number of connections.
>> 
>> 3.1.3 stats related to TAP
>> ---------------------------
>> 
>> There are a number of stats related to the packages used in the TAP
>> protocol.  These stats will only appear if they are non-zero:
>> 
>> tap_checkpoint_start_received tap_checkpoint_start_sent
>> tap_checkpoint_end_received tap_checkpoint_end_sent
>> tap_connect_received tap_delete_received tap_delete_sent
>> tap_flush_received tap_flush_sent tap_mutation_received
>> tap_mutation_sent tap_opaque_received tap_opaque_sent
>> tap_vbucket_set_received tap_vbucket_set_sent
>> 
>> 3.2 topkeys
>> ============
>> 
>> You may get information about the most popular keys in memcached by
>> exporting the environment variable MEMCACHED_TOP_KEYS to the number of
>> keys you would want memcached to keep track of.  There is no such thing
>> as a free lunch, so enabling this can have a small memory and speed
>> impact.  We've decided to _disable_ this by default, so you need to
>> export this variable to enable the feature. Ex:
>> 
>> me@localhost:> MEMCACHED_TOP_KEYS=10 ./memcached
>> 
>> Running "stats topkeys" would return something like
>> 
>> STAT my-key2 get_hits=0,get_misses=1,cmd_set=0,incr_hits=0,
>>     incr_misses=0,decr_hits=0,decr_misses=0,delete_hits=0,
>>     delete_misses=0,evictions=0,cas_hits=0,cas_badval=0,
>>     cas_misses=0,ctime=2,atime=2
>> STAT my-key1
>>     get_hits=1,get_misses=0,cmd_set=1,incr_hits=0,
>>     incr_misses=0,decr_hits=0,decr_misses=0,delete_hits=0,
>>     delete_misses=0,evictions=0,cas_hits=0,cas_badval=0,
>>     cas_misses=0,ctime=12,atime=12
>> 
>> (Line breaks and indentations added to make it more readable in this
>> document):
>> 
>> 3.3 aggregate
>> ==============
>> 
>> The combination of the storage engine interface and the SASL auth
>> allows for the combination of a connection-based stats.  The aggregate
>> subcommand is used to aggregate the stats from all of the connections
>> on the server.  The stats returned from the aggregate subcommand is the
>> same as the normal stats command.
>> 
>> 3.4 settings
>> =============
>> 
>> There are times an engine may want to share details about it's
>> configuration through stats.  This argument to stats will get you
>> there.
>> 
>> Just to show a couple of examples...
>> 
>> 3.4.1 extension
>> ----------------
>> 
>> Displays one of the extensions loaded (may appear multiple times).
>> 
>> ex:
>> 
>> STAT logger syslog
>> STAT ascii_extension scrub
>> STAT ascii_extension noop
>> STAT ascii_extension echo
>> 
>> 3.4.2 topkeys
>> --------------
>> 
>> The number of keys we are monitoring.
>> 
>> There may be many other settings exposed, depending on the engine's
>> configuration.
>> 
>> 

Reply via email to