A Redis cluster proxy.
Requirements:
makeandcmake- UNIX-like system with
SO_REUSEPORT | SO_REUSEADDRsupport epollsupport- 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, optional) one of active node in a cluster; format should be host:port; could also set after cerberus launched, via theSETREMOTEScommand, 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:7000as a master, with 2 slave10.0.1.1:8000and10.0.2.1:9000, and read-slave-filter set to10.0.1, then10.0.1.1:8000is preferred. Note this option is no more than a string matching, so10.0.1.1and10.0.10.1won'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 multipleGETsMSET: execute multipleSETsDEL: execute multipleDELsRENAME: if source and destination are not in the same slot, execute aGET-SET-DELsequence 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 countUPDATESLOTMAP: 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).