A Redis cluster proxy.
Requirements:
make
andcmake
- UNIX-like system with
SO_REUSEPORT | SO_REUSEADDR
support epoll
support- pthread
- C++ compiler & lib with C++11 features, like g++ 4.8 or clang++ 3.2 (NOTE: install clang++ 3.2 on CentOS 6.5 won't compile because clang uses header files from gcc, which is version 4.4 without C++11 support)
- Google Test (for test)
To build, just
make
turn on all debug logs
make MODE=debug
or compile with g艹
make COMPILER=g++
To link libstdc++ statically, use
make STATIC_LINK=1
to run test (just cover message parsing parts)
make runtest
run test with valgrind checking
make runtest CHECK_MEM=1
cerberus CONFIG_FILE [ARGS]
The first argument is path of a configuration file, then optional arguments. Those specifies
- bind /
-b
: (integer) local port to listen; could also specified - node /
-n
: (address) active nodes in a cluster; format should be host1:port1,host2:port2; could also set after cerberus launched, via theSETREMOTES
command, see it below - thread /
-t
: (integer) number of threads - read-slave /
-r
: (optional, default off) set to "yes" to turn on read slave mode. A proxy in read-slave mode won't support writing commands likeSET
,INCR
,PUBLISH
, and it would select slave nodes for reading commands if possible. For more information please read here (CN). - read-slave-filter /
-R
: (optional, need read-slave set to "yes") if multiple slaves replicating one master, use the one whose host starts with this option value; for example, you have10.0.0.1:7000
as a master, with 2 slave10.0.1.1:8000
and10.0.2.1:9000
, and read-slave-filter set to10.0.1
, then10.0.1.1:8000
is preferred. Note this option is no more than a string matching, so10.0.1.1
and10.0.10.1
won't be different on option value10.0.1
- cluster-require-full-coverage : (optional, default on) set to "no" to turn off full coverage mode, so proxy would keep serving when not all slots covered in a cluster.
The option set via ARGS would override it in the configuration file. For example
cerberus example.conf -t 8
set the program to 8 threads.
MGET
: execute multipleGET
sMSET
: execute multipleSET
sDEL
: execute multipleDEL
sRENAME
: if source and destination are not in the same slot, execute aGET
-SET
-DEL
sequence without atomicityBLPOP
/BRPOP
: one list limited; might return nil value before timeout See detail (CN)EVAL
: one key limited; if any key which is not in the same slot with the argument key is in the lua script, a cross slot error would return
PROXY
/INFO
: show proxy information, including threads count, clients counts, commands statistics, and remote redis serversKEYSINSLOT slot count
: list keys in a specified slot, same asCLUSTER GETKEYSINSLOT slot count
UPDATESLOTMAP
: notify each thread to update slot map after the next operationSETREMOTES host port host port ...
: reset redis server addresses to arguments, and update slot map after that
- keys:
KEYS
,MIGRATE
,MOVE
,OBJECT
,RANDOMKEY
,RENAMENX
,SCAN
,BITOP
, - list:
BRPOPLPUSH
,RPOPLPUSH
, - set:
SINTERSTORE
,SDIFFSTORE
,SINTER
,SMOVE
,SUNIONSTORE
, - sorted set:
ZINTERSTORE
,ZUNIONSTORE
, - pub/sub:
PUBSUB
,PUNSUBSCRIBE
,UNSUBSCRIBE
,
others: PFADD
, PFCOUNT
, PFMERGE
,
EVALSHA
, SCRIPT
,
WATCH
, UNWATCH
, EXEC
, DISCARD
, MULTI
,
SELECT
, QUIT
, ECHO
, AUTH
,
CLUSTER
, BGREWRITEAOF
, BGSAVE
, CLIENT
, COMMAND
, CONFIG
,
DBSIZE
, DEBUG
, FLUSHALL
, FLUSHDB
, LASTSAVE
, MONITOR
,
ROLE
, SAVE
, SHUTDOWN
, SLAVEOF
, SLOWLOG
, SYNC
, TIME
,
For more information please read here (CN).