Background introduction

Redis provides the following technologies "Redis Sentinel "Master-Slave Switching", Redis Cluster "Sharding"", which effectively realizes the high availability, high performance, and high scalability of Redis. This article conducts hands-on practice on the above technologies.

1. Redis Sentinel "Master-Slave Switching"

  • Monitor the online status of the master and slave nodes, and complete the switch "based on the raft protocol" according to the configuration.
  • From a capacity perspective, master-slave replication is still stand-alone.

2. Redis Cluster "sharding"

  • Distribute data to multiple server nodes through consistent hashing: 16384 hash slots are designed and distributed to multiple redis-servers.
  • When you need to access a key in Redis Cluster, the Redis client first uses the CRC16 algorithm to calculate a value for the key, and then modulates 16384, so that each key corresponds to a hash slot numbered between 0--16383. Then operate on the node corresponding to this slot.

One, master-slave replication

Setting details

# 已知网关 IP 为:172.17.0.1

# 启动 master 节点
docker run -it --name redis-6380  -p 6380:6379 redis
docker exec -it redis-6380 /bin/bash
redis-cli -h 172.17.0.1 -p 6380

# 启动slave节点 1
docker run -it --name redis-6381  -p 6381:6379 redis
docker exec -it redis-6381 /bin/bash
redis-cli -h 172.17.0.1 -p 6381
replicaof 172.17.0.1 6380

# 启动slave节点 2
docker run -it --name redis-6382  -p 6382:6379 redis
docker exec -it redis-6382 /bin/bash
redis-cli -h 172.17.0.1 -p 6382
replicaof 172.17.0.1 6380

After that, you can view the information of the master node. Under master-redis, execute:

> info Replication

# Replication
role:master
connected_slaves:2
slave0:ip=172.17.0.1,port=6379,state=online,offset=686,lag=0
slave1:ip=172.17.0.1,port=6379,state=online,offset=686,lag=1
master_replid:79187e2241015c2f8ed98ce68caafa765796dff2
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:686
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:686

After operating the master node, the slave node will automatically synchronize.

replicaof no one under slave-redis to change to the master node again.

key point

  1. View network related information:
docker network ls
docker network inspect bridge
  1. For mutual access between containers, internal port numbers can be used, or external mapping port numbers can be used;
  2. After executing docker network inspect bridge , you can view the gateway IP and each container IP, you can use gateway IP: external mapping port, or container IP: 6379 to access Redis;

Reference

  1. command: SLAVEOF

Second, Sentinel is highly available

Current status:

  1. Gateway IP: 172.17.0.1
  2. master port: 6390
  3. Slave port: 6391, 6392

Steps

1. Recreate the redis docker container:

The redis.conf configuration content is as follows:

# 默认端口6379
port 6390

# 绑定ip,如果是内网可以直接绑定 127.0.0.1, 或者忽略, 0.0.0.0 是外网
bind 0.0.0.0

# 守护进程启动
daemonize no

Change the listening port number and re-create the redis container:

docker run -p 6390:6390 -v D:\develop\shell\docker\redis\conf6390:/usr/local/etc/redis --name redis-conf-6390 redis redis-server /usr/local/etc/redis/redis.conf
docker exec -it redis-conf-6390 /bin/bash
redis-cli -h 172.17.0.1 -p 6390

docker run -p 6391:6391 -v D:\develop\shell\docker\redis\conf6391:/usr/local/etc/redis --name redis-conf-6391 redis redis-server /usr/local/etc/redis/redis.conf
docker exec -it redis-conf-6391 /bin/bash
redis-cli -h 172.17.0.1 -p 6391
slaveof 172.17.0.1 6390

docker run -p 6392:6392 -v D:\develop\shell\docker\redis\conf6392:/usr/local/etc/redis --name redis-conf-6392 redis redis-server /usr/local/etc/redis/redis.conf
docker exec -it redis-conf-6392 /bin/bash
redis-cli -h 172.17.0.1 -p 6392
slaveof 172.17.0.1 6390

Afterwards, you can view the information of the master node, and you can see that the port number of the slave obtained by the master has returned to normal. Under master-redis, execute:

> info Replication

# Replication
role:master
connected_slaves:2
slave0:ip=172.17.0.1,port=6391,state=online,offset=84,lag=0
slave1:ip=172.17.0.1,port=6392,state=online,offset=84,lag=0
master_replid:ed2e513ceed2b48a272b97c674c99d82284342a1
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:84
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:84

2. Create a configuration file

Create sentinel.conf and write the following in the file:

sentinel monitor bitkylin-master 172.17.0.1 6390 2
sentinel down-after-milliseconds bitkylin-master 5000
sentinel failover-timeout bitkylin-master 10000
sentinel parallel-syncs bitkylin-master 1

Command details: Instruct Sentinel to monitor a master server named bitkylin-master, and at least 2 Sentinel consents are required to mark this master server as objectively offline;
The response timeout of 5 seconds is marked as subjective offline. After the subjective offline, the migration process will start. If the timeout is 10 seconds, it is the migration timeout. The purpose is not yet known.

3. Create two more redis-docker containers

Copy the configuration file to the docker container. There are two containers that need to copy the file:

docker run -it --name redis-6490 redis
docker run -it --name redis-6491 redis
docker cp ./sentinel.conf dcbd015dbc0e:/data/sentinel.conf
docker cp ./sentinel.conf 7c8307730bcc:/data/sentinel.conf

4. Execute the redis-sentinel command

 redis-sentinel sentinel.conf

5. Final effect

At this time, start and stop the redis container at any time, you can see that sentinel automatically completes the master-slave switch of redis, and the master-slave configuration does not require manual operation.

Reference

  1. Redis Sentinel Document
  2. Docker container file operations
  3. > Overwrite writing; >> Additional writing

Three, Cluster cluster

Steps

1. Update redis configuration file

Mainly add cluster configuration information, the sample configuration file is as follows:

# 默认端口6379
port 6390

# 绑定 ip,如果是内网可以直接绑定 127.0.0.1, 或者忽略, 0.0.0.0 是外网
bind 0.0.0.0

# 守护进程启动
daemonize no

# 集群配置
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

2. Create 6 containers

Based on the second section, based on the latest configuration file, create 6 containers, pay attention to the new cluster bus port mapping:

docker run -p 6390:6390 -p 16390:16390 -v D:\develop\shell\docker\redis\conf6390:/usr/local/etc/redis --name redis-conf-6390 redis redis-server /usr/local/etc/redis/redis.conf
docker exec -it redis-conf-6390 /bin/bash
redis-cli -h 172.17.0.1 -p 6390

docker run -p 6391:6391 -p 16391:16391 -v D:\develop\shell\docker\redis\conf6391:/usr/local/etc/redis --name redis-conf-6391 redis redis-server /usr/local/etc/redis/redis.conf
docker exec -it redis-conf-6391 /bin/bash
redis-cli -h 172.17.0.1 -p 6391

docker run -p 6392:6392 -p 16392:16392 -v D:\develop\shell\docker\redis\conf6392:/usr/local/etc/redis --name redis-conf-6392 redis redis-server /usr/local/etc/redis/redis.conf
docker exec -it redis-conf-6392 /bin/bash
redis-cli -h 172.17.0.1 -p 6392

docker run -p 6393:6393 -p 16393:16393 -v D:\develop\shell\docker\redis\conf6393:/usr/local/etc/redis --name redis-conf-6393 redis redis-server /usr/local/etc/redis/redis.conf
docker exec -it redis-conf-6393 /bin/bash
redis-cli -h 172.17.0.1 -p 6393

docker run -p 6394:6394 -p 16394:16394 -v D:\develop\shell\docker\redis\conf6394:/usr/local/etc/redis --name redis-conf-6394 redis redis-server /usr/local/etc/redis/redis.conf
docker exec -it redis-conf-6394 /bin/bash
redis-cli -h 172.17.0.1 -p 6394

docker run -p 6395:6395 -p 16395:16395 -v D:\develop\shell\docker\redis\conf6395:/usr/local/etc/redis --name redis-conf-6395 redis redis-server /usr/local/etc/redis/redis.conf
docker exec -it redis-conf-6395 /bin/bash
redis-cli -h 172.17.0.1 -p 6395

3. Create a cluster directly through commands

> redis-cli --cluster create 172.17.0.1:6390 172.17.0.1:6391 172.17.0.1:6392 172.17.0.1:6393 172.17.0.1:6394 172.17.0.1:6395 --cluster-replicas 1

# 以下是命令执行结果:

>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 172.17.0.1:6394 to 172.17.0.1:6390
Adding replica 172.17.0.1:6395 to 172.17.0.1:6391
Adding replica 172.17.0.1:6393 to 172.17.0.1:6392
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: a9678b062663957e59bc3b4beb7be4366fa24adc 172.17.0.1:6390
   slots:[0-5460] (5461 slots) master
M: 41a4976431713cce936220fba8a230627d28d40c 172.17.0.1:6391
   slots:[5461-10922] (5462 slots) master
M: 1bf83414a12bad8f2e25dcea19ccea1c881d28c5 172.17.0.1:6392
   slots:[10923-16383] (5461 slots) master
S: 3d65eadd3321ef34c9413ae8f75d610c4228eda7 172.17.0.1:6393
   replicates 41a4976431713cce936220fba8a230627d28d40c
S: b604356698a5f211823ada4b45a97939744b1d57 172.17.0.1:6394
   replicates 1bf83414a12bad8f2e25dcea19ccea1c881d28c5
S: 2c1cc93221dc3830aa1eb28601ac27e22a6801cc 172.17.0.1:6395
   replicates a9678b062663957e59bc3b4beb7be4366fa24adc
Can I set the above configuration? (type 'yes' to accept): yes
>>> 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 172.17.0.1:6390)
M: a9678b062663957e59bc3b4beb7be4366fa24adc 172.17.0.1:6390
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: b604356698a5f211823ada4b45a97939744b1d57 172.17.0.1:6394
   slots: (0 slots) slave
   replicates 1bf83414a12bad8f2e25dcea19ccea1c881d28c5
M: 41a4976431713cce936220fba8a230627d28d40c 172.17.0.1:6391
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 3d65eadd3321ef34c9413ae8f75d610c4228eda7 172.17.0.1:6393
   slots: (0 slots) slave
   replicates 41a4976431713cce936220fba8a230627d28d40c
M: 1bf83414a12bad8f2e25dcea19ccea1c881d28c5 172.17.0.1:6392
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 2c1cc93221dc3830aa1eb28601ac27e22a6801cc 172.17.0.1:6395
   slots: (0 slots) slave
   replicates a9678b062663957e59bc3b4beb7be4366fa24adc
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

Cluster created successfully

be careful

  1. Need to open the cluster bus port number, the default is business port number + 10000
  2. cluster reset command can remove the current node from the cluster

Reference

  1. redis-cluster cluster-installation and status verification
  2. Redis cluster tutorial
  3. Redis Command Reference-Cluster Tutorial

bitkylin
161 声望13 粉丝

爱好技术、爱好开源、爱好分享。曾在 .NET、Android、Web 前端等领域搬砖,目前致力于 Java 后端工作与学习,靡不有初,鲜克有终。