In a previous blog, we already wrote on how to set up Redis Master-Slave replication with manual failover.
The disadvantages of Redis Master-Slave architecture, as mentioned in a previous blog, refer to the ability to do the automatic failover. We cannot rely on manual tasks to do failover: imagine if the Redis master shuts down during midnight and there is no failover – this will impact the application service as well.
Redis provides a high availability solution for redis service called Redis Sentinel. It is a monitoring and service discovery solution and also handles the failover for redis. In this blog, we will review how to set up Redis Master-Slave architecture for Auto Failover with Redis Sentinel.
What is Redis Sentinel?
Redis Sentinel is a high availability solution provided by Redis. There are various features in Redis Sentinel which we can utilize, such as monitoring, notification, automatic failover, and setting up configuration. Sentinel uses a quorum base for promoting the new master if the old master crashes. The quorum is the number that is configured on each Sentinel – it’s used to ensure that the master cannot be reachable and decide if the master has failed. The election leader will be done by Sentinel based on majority votes of the members.
For example, if we have 3 Redis Sentinel instances in different machines and we configure the quorum to two, then the failover will happen if two Sentinel processes agree that the Master node is unreachable, one of Sentinels will do the failover, elect the leader, and promote it to become the Master. The failover will not happen if the majority of Sentinels fail to communicate.
There are some parameters that need to be configured in /etc/redis/sentinel.conf such as:
The above parameter needs to be commented out or configured in sentinel configuration. The explanation of the command is that it monitors the master node with specific ip addresses and redis ports (the default port is 6379) with the quorum number.
Defines the threshold amount (in milliseconds) for Sentinels categorizing the nodes into not reachable and not responsive to ping commands or give specific error responses during the checking process.
It is the value which defines the number of slaves configured to use the master after the failover happens.
The parameter is used as a factor to give a time for Sentinel to failover the same master again when Sentinel voted another Sentinel for failover.
The installation of Redis Sentinel is really straightforward, usually it will be included during the installation of Redis, but if the Sentinel is still not installed, we can install directly through the package manager. Currently we have 3 nodes for setting up the High Availability using Sentinel, the ip addresses are:
10.10.10.10 (Redis Master + Sentinel)
10.10.10.11 (Redis Slave + Sentinel)
10.10.10.12 (Redis Sentinel).
In this case, we use the Ubuntu operating system, just run the apt install command to install the Redis and Sentinel:
$ apt install redis-server $ apt install redis-sentinel
Then we can check if the Redis and Sentinel is up and running:
redis-server.service - Advanced key-value store Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: ena Active: active (running) since Fri 2021-07-02 10:26:47 UTC; 4h 42min ago Docs: http://redis.io/documentation, man:redis-server(1) Process: 14288 ExecStop=/bin/kill -s TERM $MAINPID (code=exited, status=0/SUCCESS) Process: 14292 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf (code=exited, sta Main PID: 14316 (redis-server) Tasks: 4 (limit: 1106) CGroup: /system.slice/redis-server.service └─14316 /usr/bin/redis-server 127.0.0.1:6379 Jul 02 10:26:47 n2 systemd: Starting Advanced key-value store... Jul 02 10:26:47 n2 systemd: redis-server.service: Can't open PID file /var/run/redis/ Jul 02 10:26:47 n2 systemd: Started Advanced key-value store. redis-sentinel.service - Advanced key-value store Loaded: loaded (/lib/systemd/system/redis-sentinel.service; enabled; vendor preset: e Active: active (running) since Fri 2021-07-02 10:02:30 UTC; 5h 6min ago Docs: http://redis.io/documentation, man:redis-sentinel(1) Process: 14195 ExecStop=/bin/kill -s TERM $MAINPID (code=exited, status=0/SUCCESS) Process: 14199 ExecStart=/usr/bin/redis-sentinel /etc/redis/sentinel.conf (code=exited Main PID: 14224 (redis-sentinel) Tasks: 4 (limit: 1106) CGroup: /system.slice/redis-sentinel.service └─14224 /usr/bin/redis-sentinel *:26379 [sentinel] Jul 02 10:02:30 n2 systemd: Starting Advanced key-value store... Jul 02 10:02:30 n2 systemd: redis-sentinel.service: Can't open PID file /var/run/sent Jul 02 10:02:30 n2 systemd: Started Advanced key-value store.
There will be two background processes in the operating system, one is for Redis service and another one is for the Sentinel service. We can repeat the installation on each node.
Setting up Redis Sentinel
To configure and integrate the Sentinel with Redis Server, we need to add the parameters in sentinel.conf. Add below configurations in the sentinel configuration file on each Sentinel:
sentinel monitor redis-master 10.10.10.10 6379 2 sentinel down-after-milliseconds redis-master 1500 sentinel failover-timeout redis-master 3000 protected-mode no
Our Redis master is on ip address 10.10.10.10 and After the configuration was added, we needed to restart the Redis service and Sentinel service.
root@n2:~# systemctl restart redis-server root@n2:~# systemctl restart redis-sentinel
Finally, after the configuration has been finished, we can verify that the Sentinels work by grabbing the heartbeat in the Sentinel logs:
14454:X 02 Jul 15:16:49.895 * +sentinel-address-switch master redis-master 10.10.10.10 6379 ip 10.10.10.12 port 26379 for cc9f9d652f2f870d1725d74fdd99d3edaf97294b 14454:X 02 Jul 15:16:49.895 * +sentinel-address-update sentinel cc9f9d652f2f870d1725d74fdd99d3edaf97294b 10.10.10.12 26379 @ redis-master 10.10.10.10 6379 1 additional matching instances 14454:X 02 Jul 15:16:51.742 * +sentinel-address-switch master mymaster 127.0.0.1 6379 ip 127.0.0.1 port 26379 for cc9f9d652f2f870d1725d74fdd99d3edaf97294b 14454:X 02 Jul 15:16:51.742 * +sentinel-address-update sentinel cc9f9d652f2f870d1725d74fdd99d3edaf97294b 127.0.0.1 26379 @ mymaster 127.0.0.1 6379 1 additional matching instances 14454:X 02 Jul 15:16:52.014 * +sentinel-address-switch master redis-master 10.10.10.10 6379 ip 10.10.10.12 port 26379 for cc9f9d652f2f870d1725d74fdd99d3edaf97294b 14454:X 02 Jul 15:16:52.015 * +sentinel-address-update sentinel cc9f9d652f2f870d1725d74fdd99d3edaf97294b 10.10.10.12 26379 @ redis-master 10.10.10.10 6379 1 additional matching instances
And check the replication information:
root@n1:/var/log/redis# redis-cli 127.0.0.1:6379> info replication # Replication role:master connected_slaves:2 slave0_ip=10.10.10.12,port=6379,state=online,offset=2781219,lag=1 slave1_ip=10.10.10.11,port=6379,state=online,offset=2781503,lag=1 master_replid:075e651ef398ad202003105053091b4e6b43d323 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:2781503 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1732928 repl_backlog_histlen:1048576 127.0.0.1:6379>