diff --git a/README.md b/README.md index f0d8d1c..cf92290 100644 --- a/README.md +++ b/README.md @@ -210,3 +210,77 @@ All rights reserved. License under BSD 3-clause "New" or "Revised" License WeChat:cppfan ![wechat](https://github.com/joyieldInc/predixy/blob/master/doc/wechat-cppfan.jpeg) + +## Local Redis Cluster Setup and Testing + +### Setting up Redis Cluster Locally + +1. Create directories for each Redis node (we'll use 3 nodes): +```bash +$ mkdir -p redis-cluster/{7000,7001,7002} +``` + +2. Create Redis configuration for each node. First for port 7000: +```bash +$ 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 +``` + +3. Copy and adjust configuration for other nodes: +```bash +$ 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 +``` + +4. Start each Redis instance (in separate terminal windows): +```bash +$ redis-server redis-cluster/7000/redis.conf +$ redis-server redis-cluster/7001/redis.conf +$ redis-server redis-cluster/7002/redis.conf +``` + +5. Create the cluster: +```bash +$ 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. + +6. Verify cluster status: +```bash +$ redis-cli -p 7000 cluster nodes +``` + +### Testing with Predixy + +1. Start Predixy with the cluster configuration: +```bash +$ src/predixy conf/predixy_cluster.conf +``` + +2. Test the cluster setup through Predixy: +```bash +# 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). diff --git a/conf/predixy_cluster.conf b/conf/predixy_cluster.conf new file mode 100644 index 0000000..a6b04e3 --- /dev/null +++ b/conf/predixy_cluster.conf @@ -0,0 +1,119 @@ +################################### GENERAL #################################### +## Predixy configuration file example + +## Specify a name for this predixy service +## redis command INFO can get this +Name PredixyLocalCluster + +## Specify listen address, support IPV4, IPV6, Unix socket +## Examples: +# Bind 127.0.0.1:7617 +# Bind 0.0.0.0:7617 +# Bind /tmp/predixy + +## Bind to localhost for local testing +Bind 127.0.0.1:7617 + +## Worker threads +WorkerThreads 1 + +## Memory limit, 0 means unlimited +MaxMemory 1G + +## Examples: +# MaxMemory 100M +# MaxMemory 1G +# MaxMemory 0 + +## MaxMemory can change online by CONFIG SET MaxMemory xxx +## Default is 0 +# MaxMemory 0 + +## Close the connection after a client is idle for N seconds (0 to disable) +## ClientTimeout can change online by CONFIG SET ClientTimeout N +## Default is 0 +ClientTimeout 300 + + +## IO buffer size +## Default is 4096 +BufSize 4096 + +################################### LOG ######################################## +## Log file path +## Unspecify will log to stdout +## Default is Unspecified +# Log ./predixy.log + +## LogRotate support + +## 1d rotate log every day +## nh rotate log every n hours 1 <= n <= 24 +## nm rotate log every n minutes 1 <= n <= 1440 +## nG rotate log evenry nG bytes +## nM rotate log evenry nM bytes +## time rotate and size rotate can combine eg 1h 2G, means 1h or 2G roate a time + +## Examples: +# LogRotate 1d 2G +# LogRotate 1d + +## Default is disable LogRotate + + +## In multi-threads, worker thread log need lock, +## AllowMissLog can reduce lock time for improve performance +## AllowMissLog can change online by CONFIG SET AllowMissLog true|false +## Default is true +# AllowMissLog false + +## LogLevelSample, output a log every N +## all level sample can change online by CONFIG SET LogXXXSample N +LogVerbSample 0 +LogDebugSample 0 +LogInfoSample 10000 +LogNoticeSample 1 +LogWarnSample 1 +LogErrorSample 1 + + +################################### AUTHORITY ################################## +Include auth.conf + +################################### SERVERS #################################### +# Include cluster.conf +# Include sentinel.conf +Include try.conf + +ClusterServerPool { + Password "" + MasterReadPriority 60 + StaticSlaveReadPriority 50 + DynamicSlaveReadPriority 50 + RefreshInterval 1 + ServerTimeout 1 + ServerFailureLimit 10 + ServerRetryTimeout 1 + KeepAlive 120 + Servers { + + 127.0.0.1:7000 + + 127.0.0.1:7001 + + 127.0.0.1:7002 + } +} + +################################### DATACENTER ################################# +## LocalDC specify current machine dc +# LocalDC bj + +## see dc.conf +# Include dc.conf + + +################################### COMMAND #################################### +## Custom command define, see command.conf +#Include command.conf + +################################### LATENCY #################################### +## Latency monitor define, see latency.conf +Include latency.conf