Skip to content

A high performance and fully featured proxy for redis, support redis sentinel and redis cluster

License

Notifications You must be signed in to change notification settings

instacart/predixy

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

74 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Predixy 中文版

Predixy is a high performance and fully featured proxy for redis sentinel and redis cluster

Features

  • High performance and lightweight.
  • Multi-threads support.
  • Works on Linux, OSX, BSD, Windows(Cygwin).
  • Supports Redis Sentinel, single/multi redis group[s].
  • Supports Redis Cluster.
  • Supports redis block command, eg:blpop, brpop, brpoplpush.
  • Supports scan command, even multi redis instances.
  • Multi-keys command support: mset/msetnx/mget/del/unlink/touch/exists.
  • Multi-databases support, means redis command select is avaliable.
  • Supports redis transaction, limit in Redis Sentinel single redis group.
  • Supports redis Scripts, script load, eval, evalsha.
  • Supports redis Pub/Sub.
  • Multi-DataCenters support, read from slaves.
  • Extend AUTH, readonly/readwrite/admin permission, keyspace limit.
  • Log level sample, async log record.
  • Log file auto rotate by time and/or file size.
  • Stats info, CPU/Memory/Requests/Responses and so on.
  • Latency monitor.

Generic Build Instructions

Predixy can be compiled and used on Linux, OSX, BSD, Windows(Cygwin). Requires C++11 compiler.

It is as simple as:

$ make

To build in debug mode:

$ make debug

Some other build options:

  • CXX=c++compiler, default is g++, you can specify other, eg:CXX=clang++
  • EV=epoll|poll|kqueue, default it is auto detect according by platform.
  • MT=false, disable multi-threads support.
  • TS=true, enable predixy function call time stats, debug only for developer.

For examples:

$ make CXX=clang++
$ make EV=poll
$ make MT=false
$ make debug MT=false TS=true

Generic Install Instructions

Just copy src/predixy to the install path

$ cp src/predixy /path/to/bin

Generic Configuration Instructions

See below files:

  • predixy.conf, basic config, will refrence below config files.
  • cluster.conf, Redis Cluster backend config.
  • sentinel.conf, Redis Sentinel backend config.
  • auth.conf, authority control config.
  • dc.conf, multi-datacenters config.
  • latency.conf, latency monitor config.

Running

$ src/predixy conf/predixy.conf

With default predixy.conf, Predixy will listen at 0.0.0.0:7617 and proxy to Redis Cluster 127.0.0.1:6379. In general, 127.0.0.1:6379 is not running in Redis Cluster mode. So you will look mass log output, but you can still test it with redis-cli.

$ redis-cli -p 7617 info

More command line arguments:

$ src/predixy -h

Stats

Like redis, predixy use INFO command to give stats.

Show predixy running info and latency monitors

redis> INFO

Show latency monitors by latency name

redis> INFO Latency <latency-name>

A latency monitor example:

LatencyMonitorName:all
            latency(us)   sum(us)           counts
<=          100              3769836            91339 91.34%
<=          200               777185             5900 97.24%
<=          300               287565             1181 98.42%
<=          400               185891              537 98.96%
<=          500               132773              299 99.26%
<=          600                85050              156 99.41%
<=          700                85455              133 99.54%
<=          800                40088               54 99.60%
<=         1000                67788               77 99.68%
>          1000               601012              325 100.00%
T            60              6032643           100001
The last line is total summary, 60 is average latency(us)

Show latency monitors by server address and latency name

redis> INFO ServerLatency <server-address> [latency-name]

Reset all stats and latency monitors, require admin permission.

redis> CONFIG ResetStat

Instacart Local Development Instructions (Cluster mode disabled)

Prerequisites

  • Local Redis instance running on default port (6379)
  • C++11 compiler
  • Make

Install Redis Locally

  1. Use Homebrew to install Redis in a single instance mode with cluster mode disabled to test your changes locally
$ brew install redis
  1. Start Redis
$ brew services start redis
  1. Verify your local Redis is running:
$ redis-cli -h 127.0.0.1 -p 6379 ping

Should return "PONG"

$ redis-cli -h 127.0.0.1 -p 6379 info

Will return info about the Redis instance, if required for debugging

Note, logs for Redis installed by Brew will appear in /opt/homebrew/var/log/redis.log by default.

Building and Running Predixy Locally

  1. Compile Predixy:
$ make

This will create object files and the executable in the src directory.

  1. Verify your local Redis is running:
$ redis-cli -h 127.0.0.1 -p 6379 ping

Should return "PONG"

  1. Start Predixy using the local configuration:
$ src/predixy conf/predixy_local.conf

You should see output indicating Predixy is listening on 127.0.0.1:7617

  1. Test the connection through Predixy:
# Basic connectivity test
$ redis-cli -h 127.0.0.1 -p 7617 ping

# Check Predixy status
$ redis-cli -h 127.0.0.1 -p 7617 info

# Test read/write operations
$ redis-cli -h 127.0.0.1 -p 7617 set test "Hello via Predixy"
$ redis-cli -h 127.0.0.1 -p 7617 get test
  1. To stop Predixy:
$ pkill -f predixy

Instacart Local Development Instructions (Cluster mode disabled)

Setting up Redis Cluster Locally

  1. Create directories for each Redis node (we'll use 3 nodes):
$ mkdir -p redis-cluster/{7000,7001,7002}
  1. Create Redis configuration for each node. First for port 7000:
$ cat > redis-cluster/7000/redis.conf << EOL
port 7000
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 5000
appendonly yes
dir ./
bind 127.0.0.1
daemonize no
EOL
  1. Copy and adjust configuration for other nodes:
$ cp redis-cluster/7000/redis.conf redis-cluster/7001/redis.conf
$ cp redis-cluster/7000/redis.conf redis-cluster/7002/redis.conf
$ sed -i '' 's/7000/7001/g' redis-cluster/7001/redis.conf
$ sed -i '' 's/7000/7002/g' redis-cluster/7002/redis.conf
  1. Start each Redis instance (in separate terminal windows):
$ redis-server redis-cluster/7000/redis.conf
$ redis-server redis-cluster/7001/redis.conf
$ redis-server redis-cluster/7002/redis.conf
  1. Create the cluster:
$ redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 --cluster-replicas 0

Type 'yes' when prompted to accept the configuration.

  1. Verify cluster status:
$ redis-cli -p 7000 cluster nodes

Testing with Predixy

  1. Start Predixy with the cluster configuration:
$ src/predixy conf/predixy_cluster.conf
  1. Test the cluster setup through Predixy:
# Basic connectivity test
$ redis-cli -p 7617 set test "Hello Cluster"
$ redis-cli -p 7617 get test

# Check Predixy cluster status
$ redis-cli -p 7617 info

Cleanup

When done testing, you can:

  1. Stop Predixy (Ctrl+C or pkill predixy)
  2. Stop each Redis instance (Ctrl+C in each terminal)
  3. Remove cluster files: rm -rf redis-cluster

Note: The cluster setup distributes keys across all nodes using hash slots. Each node in this setup handles approximately 5461 hash slots (16384/3 slots per node).

Notes

  • Predixy will be listening on port 7617 while your Redis instance remains on 6379
  • The configuration in predixy_local.conf is set up for a single local Redis instance
  • Build artifacts (*.o files) are ignored by git but can be safely kept for development
  • Logs will appear in stdout by default

Benchmark

predixy is fast, how fast? more than twemproxy, codis, redis-cerberus

See wiki benchmark

License

Copyright (C) 2017 Joyield, Inc. <joyield.com#gmail.com>

All rights reserved.

License under BSD 3-clause "New" or "Revised" License

WeChat:cppfan wechat

About

A high performance and fully featured proxy for redis, support redis sentinel and redis cluster

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C++ 92.5%
  • Python 6.3%
  • Other 1.2%