Creating local Redis cluster in minutes on WSL2
Tags: linux, redis, wsl
Published: 2020-11-22 12:37:00

This article focuses on setting up Redis cluster quickly on local environment using WSL2 (If you have not set it up on your Windows 10 machine, you can refer my [post](https://dev.to/adityakanekar/developing-for-linux-environment-in-windows-10-with-wsl-2-part-1-4422)). However this is completely optional and the same should work on other Ubuntu Distros. 

##Install Redis on Ubuntu

To install Redis on Ubuntu we will launch Ubuntu 18.04 WSL instance on the Windows 10 machine. This step is completely optional and you can also use the same steps on any Ubuntu 18.04 instance.

Before installing Redis we need to install few dependencies. Run following command in the bash to install the dependencies required for running Redis.

```
sudo apt-get update
sudo apt install make gcc libc6-dev tcl build-essential
```

Now lets download Redis from the official Redis channel,

```
cd ~
wget http://download.redis.io/redis-stable.tar.gz
tar xvzf redis-stable.tar.gz
```

###Install Redis build dependencies

```
cd redis-stable/deps
make hiredis lua jemalloc linenoise
```

This will take some time, once the above step finishes run make command in the redis-stable directory as below,

```
cd ~/redis-stable
make
```

Make command will also take some time to complete, once its complete you can run 'make test' command to see if everything is setup properly. This is a optional step, if the make is completed successfully you can skip it.

## Create cluster

There are lot of articles available for setting up the cluster manually. However Redis has a utility to create a cluster quickly which will get you started in minutes. To create cluster run following command,

```
cd ~/redis-stable/utils/create-cluster
./create-cluster start

```

The start command will create the cluster with port ranging from 30001 to 30006. The output should look like below,

```
Starting 30001
Starting 30002
Starting 30003
Starting 30004
Starting 30005
Starting 30006
```
This will start 6 instances of Redis, now to create a cluster run,

```
./create-cluster create
```

This command will create the cluster with 3 master and 3 slaves configuration. It will also display you hash slots for all 3 masters and the slave instance mapping with master instance. Type yes in the prompt to continue.

```
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 127.0.0.1:30005 to 127.0.0.1:30001
Adding replica 127.0.0.1:30006 to 127.0.0.1:30002
Adding replica 127.0.0.1:30004 to 127.0.0.1:30003
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 8106f2118a007250a1b003c01e3d84dff87e7117 127.0.0.1:30001
   slots:[0-5460] (5461 slots) master
M: 7f0c05048e8864334de8a24de1318327c11a1b8d 127.0.0.1:30002
   slots:[5461-10922] (5462 slots) master
M: f5d904e68e316d0c310cb7acb4201e5ad9539202 127.0.0.1:30003
   slots:[10923-16383] (5461 slots) master
S: e5ccc0ac06c1921f70530fa01c62ba2b6de441a3 127.0.0.1:30004
   replicates f5d904e68e316d0c310cb7acb4201e5ad9539202
S: a140fe7519762b1f2c35e06f8e5c46487bad1f6c 127.0.0.1:30005
   replicates 8106f2118a007250a1b003c01e3d84dff87e7117
S: 63d7a31d2820e346eec839470fc3ab5cafd25cc7 127.0.0.1:30006
   replicates 7f0c05048e8864334de8a24de1318327c11a1b8d
Can I set the above configuration? (type 'yes' to accept):
```

This will create the cluster and you should be able to see output as below,

```
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.
>>> Performing Cluster Check (using node 127.0.0.1:30001)
M: 8106f2118a007250a1b003c01e3d84dff87e7117 127.0.0.1:30001
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: 7f0c05048e8864334de8a24de1318327c11a1b8d 127.0.0.1:30002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
M: f5d904e68e316d0c310cb7acb4201e5ad9539202 127.0.0.1:30003
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 63d7a31d2820e346eec839470fc3ab5cafd25cc7 127.0.0.1:30006
   slots: (0 slots) slave
   replicates 7f0c05048e8864334de8a24de1318327c11a1b8d
S: e5ccc0ac06c1921f70530fa01c62ba2b6de441a3 127.0.0.1:30004
   slots: (0 slots) slave
   replicates f5d904e68e316d0c310cb7acb4201e5ad9539202
S: a140fe7519762b1f2c35e06f8e5c46487bad1f6c 127.0.0.1:30005
   slots: (0 slots) slave
   replicates 8106f2118a007250a1b003c01e3d84dff87e7117
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
```

##Connecting to Redis Cluster
To connect to Redis cluster using redis-cli, open another bash window and cd into the redis-stable directory.

```
cd ~/redis-stable/src
./redis-cli -c -p 30001
```

You should now be connected to the Redis cluster. The output will be similar to,

```
127.0.0.1:30001>
``` 

###Testing the cluster
To set key run,
```
set foo bar
```

To retrieve the value of the key run,
```
get foo
```

The get command will show output as "bar". 

So your Redis cluster is now setup. If you want to stop your cluster run,

```
./create-cluster stop
```

You will notice all the nodes listening from 30001-30006 have stopped.

```
Stopping 30001
Stopping 30002
Stopping 30003
Stopping 30004
Stopping 30005
Stopping 30006
```

To delete the cluster run,

```
./create-cluster stop
./create-cluster clean
```

Now if you run **ls** you will notice that the folder contains only two files,
- README
- create-cluster

Now to run a new cluster you can run the start and then create command as demonstrated earlier in this article.

Happy coding!