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
- View network related information:
docker network ls
docker network inspect bridge
- For mutual access between containers, internal port numbers can be used, or external mapping port numbers can be used;
- After executing
docker network inspect bridge
, you can view the gateway IP and each container IP, you can usegateway IP: external mapping port, or
container IP: 6379 to access Redis;
Reference
Second, Sentinel is highly available
Current status:
- Gateway IP: 172.17.0.1
- master port: 6390
- 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
- Redis Sentinel Document
- Docker container file operations
> 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
- Need to open the cluster bus port number, the default is
business port number + 10000
cluster reset
command can remove the current node from the cluster
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。