Redis 集群

Redis 的几种集群模式

为什么用 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"
Licensed under CC BY-NC-SA 4.0
Gear(夕照)的博客。记录开发、生活,以及一些不足为道的思考……