为什么用 Redis 集群
- 性能提升
- 可靠性提升
- 数据安全风险降低
- 拓展可用存储空间
Redis 集群模式
主从模式
主从模式,包含一个主节点,多个从节点(最少一个从节点)。
主节点:承担所有的数据写入请求处理,并将更新内容同步到所有从节点。同时可承担读取请求。
从节点:同步主节点的更新内容,并承担读取请求。
哨兵模式
哨兵模式,是相对于主从模式多了一个哨兵节点,目的是当主节点宕机以后,在从节点中选举(Raft 算法 )新的主节点,避免手动处理,增强可靠性。
Cluster 模式
Cluster 模式,以划分插槽的方式,分配到各节点,实现横向拓展。供读写的节点都是 master 节点,每个 master 节点有一个 slave 节点。
slave 节点只同步数据,不处理读写请求,在 master 节点宕机后进行替补。如果 slave 节点有多个,master 宕机后,会进行选举(Raft 算法 )
各模式的比较
| 模式 |
优点 |
缺点 |
| 主从模式 |
简单,冗余备份,读写分离 |
主节点故障需要手动处理;主节点集中写容易导致性能瓶颈;内存无法横向拓展; |
| 哨兵模式 |
冗余备份,读写分离,可自动恢复 |
运维较复杂;主节点集中写容易导致性能瓶颈;内存无法横向拓展; |
| Cluster 模式 |
冗余备份,负载均衡,可自动恢复,内存可横向拓展 |
运维复杂;部分操作受限制; |
Redis 集群部署
主从模式
docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
version: "4.1"
services:
master:
image: redis
container_name: redis-master
command: bash -c "redis-server --protected-mode no --slave-announce-ip 192.168.237.140 --slave-announce-port 6379"
ports:
- 6379:6379
slave1:
image: redis
container_name: redis-slave-1
ports:
- 6380:6379
command: bash -c "redis-server --protected-mode no --slaveof redis-master 6379 --slave-announce-ip 192.168.237.140 --slave-announce-port 6380"
slave2:
image: redis
container_name: redis-slave-2
ports:
- 6381:6379
command: bash -c "redis-server --protected-mode no --slaveof redis-master 6379 --slave-announce-ip 192.168.237.140 --slave-announce-port 6381"
|
1
2
3
4
5
6
7
|
# 启动
docker-compose up -d
# 验证
docker exec -it redis-master /bin/bash
redis-cli
info replication
|
哨兵模式
docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
version: "4.2"
services:
sentinel1:
image: redis
container_name: redis-sentinel-1
ports:
- 26379:26379
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
volumes:
- /usr/local/redis/sentinel/sentinel1.conf:/usr/local/etc/redis/sentinel.conf
sentinel2:
image: redis
container_name: redis-sentinel-2
ports:
- 26380:26379
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
volumes:
- /usr/local/redis/sentinel/sentinel2.conf:/usr/local/etc/redis/sentinel.conf
sentinel3:
image: redis
container_name: redis-sentinel-3
ports:
- 26381:26379
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
volumes:
- /usr/local/redis/sentinel/sentinel3.conf:/usr/local/etc/redis/sentinel.conf
networks:
default:
name: redis_default
external: true
|
Cluster 模式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
set -e
docker pull redis
docker network create --subnet 172.10.0.0/24 redis-net
mkdir -p /data/docker/redis/cluster
cd /data/docker/redis/cluster
echo '请输入本机的IP地址:'
read ip
for port in $(seq 8010 8015); do
mkdir -p ./${port}/conf
mkdir -p ./${port}/data
touch ./${port}/conf/redis.conf
cat>./${port}/conf/redis.conf<<EOF
port ${port}
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip ${ip}
cluster-announce-port ${port}
cluster-announce-bus-port 1${port}
appendonly yes
EOF
done
for port in $(seq 8010 8015); do
docker run -it -d -p ${port}:${port} -p 1${port}:1${port} \
--privileged=true -v /data/docker/redis/cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
--privileged=true -v /data/docker/redis/cluster/${port}/data:/data \
--restart always --name redis-${port} --net redis-net \
--sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf; \
done
docker exec -it redis-8010 /bin/sh -c "cd /usr/local/bin/;redis-cli --cluster create ${ip}:8010 ${ip}:8011 ${ip}:8012 ${ip}:8013 ${ip}:8014 ${ip}:8015 --cluster-replicas 1"
|