Memcached protocol 'wrapper' for Tarantool.
- Tarantol 1.6.8+ with header files (tarantool && tarantool-dev packages).
- Cyrus SASL library (with header files)
- Python >= 3.7 with next packages (for testing only):
- PyYAML 5+
- gevent 21+
Clone this repository and then build it using CMake:
git clone https://github.com/tarantool/memcached.git
cd memcached
git submodule update --init --recursive
cmake . -DCMAKE_BUILD_TYPE=RelWithDebugInfo -DCMAKE_INSTALL_PREFIX=/usr
make
make installOr use LuaRocks (in this case you'll need libsmall, libsmall-dev, tarantool-dev
packages available from our binary repository at http://tarantool.org/dist/master, and
system package libsasl2-dev):
luarocks install https://raw.githubusercontent.com/tarantool/memcached/master/rockspecs/memcached-scm-1.rockspec --localbox.cfg{}
local memcached = require('memcached')
local instance = memcached.create('my_instance', '0.0.0.0:11211')Now you're set up and ready to go!
Install Tarantool package from repository (described here).
Paste the previous example to /etc/tarantool/instances.enabled/memcached.lua and start it with
tarantoolctl start memcached.
Then try the following example:
$ printf "set key 0 60 5\r\nvalue\r\n" | nc localhost 11211
STORED
$ printf "get key\r\n" | nc localhost 11211
VALUE key 0 5
value
END
$ printf "set key2 0 60 6\r\nvalue2\r\n" | nc localhost 11211
STORED
$ printf "get key key2\r\n" | nc localhost 11211
VALUE key 0 5
value
VALUE key2 0 6
value2
ENDlocal memcached = require('memcached')- acquire a library handlelocal slab = memcached.slab.info()- show information about slab arena and quota.local instance = memcached.create(<name>, <uri>, <opts>)- create a new instance, register it and runname- a string with instance nameuri- a string with uri to bind to, for example:0.0.0.0:11211(only TCP is supported now)opts- a table with options, the list of possible options is described in the configuration section
local instance = instance:cfg(<opts>)- (re)configure an existing instance.opts- a table with options, same as increatelocal instance = instance:start()- start an instancelocal instance = instance:stop()- stop an instancelocal instance = instance:info()- return execution statistics
- readahead - (default) size of readahead buffer for connection. default is
box->cfg->readahead - expire_enabled - availability of expiration daemon. default is
true. - expire_items_per_iter - scan count for expiration (tuples processed in one transaction). default is 200.
- expire_full_scan_time - time required for a full index scan (in seconds). default is 3600
- verbosity - verbosity of memcached logging. default is 0.
flush_enabled - flush command availability. default is true- protocol - the protocol, one of
negotiation,binaryortext.negotiation- detect the protocol automatically at handshake (the default)binary- binary memcached protocoltext- text memcached protocol
- engine - the engine to store data in
memory- store everything in memory. (usingmemtxengine)(not yet supported)disk- store everything on hdd/ssd (usingvinylengine)
- space_name - custom name for a memcached space, default is
__mc_<instance name> - if_not_exists - do not throw error if an instance already exists.
- sasl - enable or disable SASL support (disabled by default)
Usual rules for memcached are applicable for this plugin:
-
Create user (NOTE: it'll use custom folder):
echo testpass | saslpasswd2 -p -c testuser -f /tmp/test-tarantool-memcached.sasldb
-
Place configuration file
/etc/sasl2/tarantool-memcached.conf. For example:mech_list: plain cram-md5 log_level: 7 sasldb_path: /tmp/test-tarantool-memcached.sasldbNOTE: This will disable 'ANONYMOUS' (and other, that aren't listed) authentication plugins.
NOTE: This will set logging level to the highest possible
NOTE: This will set custom path for database path
-
Run Tarantool with memcached plugin with SASL enabled
local memcached = require('memcached') local instance = memcached.create('my_instance', '0.0.0.0:11211', { sasl = true })
-
Use your favorite binary(!!) memcached client, that supports(!!) SASL:
Example using Python's 'python-binary-memcached' library
import bmemcached client = bmemcached.Client(('127.0.0.1:11211', ), 'testuser', 'testpasswd') client.set('key', 'value') print(client.get('key'))
For custom configuration file path, please, use SASL_CONF_PATH environment variable.
Everything is supported, unless the opposite is stated explicitly
- Text protocol commands:
set/add/cas/replace/append/prependcommands (set section)get/getscommands (including multiget)deletecommandincr/decrcommandsflush/version/quitcommandsverbosity- partially, logging is not very good.stat-resetis supported and all stats too.
- Binary protocol's commands:
get/getk/getq/getkqcommands (get section)add/addq/replace/replaceq/set/setqcommands (set section)quit/quitq/flush/flushq/noop/versioncommandsgat/gatq/touch/gatk/gatkqcommandsappend/prepend/incr/decrverbosity- partially, logging is not very good.stat-resetis supported and all stats too.- SASL authentication is supported
- range operations are not supported as well.
- Expiration is supported
- Flush is supported
- The protocol is synchronous
- Full support of Tarantool means of consistency (write-ahead logs, snapshots, replication)
- You can access data from Lua
- for now LRU is not supported
- TAP is not supported (for now)
- VBucket is not supported (for now)
- UDP/UNIX sockets are not supported (for now)
This rock is in early beta.
We're collecting information for the module developers in the HACKING.md file.