First we need to install redis.

System Preference: Ubuntu 16.04

[We have created VM on www.digitalocean.com]

Execute Following:

sudo apt-get install make
sudo apt-get install git 
sudo apt-get update
sudo apt-add-repository ppa:chris-lea/redis-server
sudo apt-get install build-essential tcl

Download and Install Redis

wget http://download.redis.io/releases/redis-5.0.5.tar.gz
tar xzf redis-5.0.5.tar.gz
cd redis-5.0.5
make
sudo make install

If you want to run Redis Server with default Configuration

/redis-5.0.5/src/redis-server

Move Configuration file to /etc/redis/redis.conf

sudo mkdir /etc/redis
sudo cp  /redis-5.0.5/redis.conf /etc/redis

Find the dir directory. This option specifies the directory that Redis will use to dump persistent data. We need to pick a location that Redis will have write permission and that isn’t viewable by normal users.We will use the /var/lib/redis directory for this, which we will create in a moment.

sudo nano /etc/redis/redis.conf
In Dir
sudo mkdir /var/lib/redis 

Now, we want to setup a cluster environment like following:

For this we have to go through few steps more. Need to produce configuration file for each Node. We can clone that from git repo.

 git clone https://github.com/arifmarias/redisconfig.git  

Copy those to /etc/redis directory. Each of the conf file has got following with slight changes. Like inside Node1.conf file we have following:

 port 7001
 cluster-enabled yes
 cluster-config-file cluster-node-1.conf
 cluster-node-timeout 5000
 appendonly yes
 appendfilename node-1.aof
 dbfilename dump-1.rdb
 bind 127.0.0.1
 bind 0.0.0.0
 protected-mode yes

So, now if you want to run Redis servers (6 of them) then need to execute following line for each separate Node:

 ./redis-5.0.5/src/redis-server /etc/redis/node1.conf 

Now its time to deploy our cluster by executing following command:

 ./src/redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1 

For further FAQ you can visit this blog ( why we need to create 6 Nodes ( 3 Primary and 3 Slaves): https://serverfault.com/questions/815764/redis-cluster-3-master-nodes-minimum

Now, if i want to run my cluster from any of the master node:

 ./src/redis-cli -c -p 7001 

You can execute some Redis command if you like and see how cluster is managing your data persistently.

SET x 1
SET y 2
SET z 3
keys *
get y
keys *

You can force kill Node 2 ( which running on 7002) then you will see how master slave changes.

[It will wait a few second then slave node promoted to master node]
keys*
get z
Moved to 7005
[Then restart the service to Node 2. It will rejoin the cluster but Node 2 will be slave of Node 5.]
[Kill  Node 5 Then Node 2 become master again.]
Get z
(Redirect to 7002)

If you’re not sure whether the Redis instance you’re currently connected to is a primary instance or a replica, you can check by running the role command:

role  

To designate a Redis instance as a replica of another instance on the fly, run the replicaof command. This command takes the intended primary server’s hostname or IP address and port as arguments:

 replicaof hostname_or_IP port  

If the server was already a replica of another primary, it will stop replicating the old server and immediately start synchronizing with the new one. It will also discard the old dataset.

To promote a replica back to being a primary, run the following replicaof command:

replicaof no one

This will stop the instance from replicating the primary server, but will not discard the dataset it has already replicated. This syntax is useful in cases where the original primary fails. After running replicaof no one on a replica of the failed primary, the former replica can be used as the new primary and have its own replicas as a failsafe.