跳转至

第二章:集群部署

环境准备

系统要求

# 操作系统
Linux (推荐 CentOS 7+ / Ubuntu 18.04+)

# 硬件要求
CPU: 4 核+
内存: 8GB+
磁盘: SSD 推荐

# 网络
端口: 6379 (客户端通信)
端口: 16379 (集群总线)

安装 Redis

# CentOS
yum install redis -y

# Ubuntu
apt install redis-server -y

# 编译安装
wget https://download.redis.io/redis-stable.tar.gz
tar xzf redis-stable.tar.gz
cd redis-stable
make && make install

手动部署

节点规划

最小集群:6 个节点(3 主 3 从)

节点规划:
- redis-1: 192.168.1.101:6379 (Master 1)
- redis-2: 192.168.1.102:6379 (Master 2)
- redis-3: 192.168.1.103:6379 (Master 3)
- redis-4: 192.168.1.104:6379 (Slave 1)
- redis-5: 192.168.1.105:6379 (Slave 2)
- redis-6: 192.168.1.106:6379 (Slave 3)

配置文件

# /etc/redis/redis.conf

# 基础配置
port 6379
daemonize yes
pidfile /var/run/redis/redis-server.pid
logfile /var/log/redis/redis-server.log
dir /var/lib/redis

# 集群配置
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 192.168.1.101
cluster-announce-port 6379
cluster-announce-bus-port 16379

# 持久化
appendonly yes
appendfsync everysec

# 内存
maxmemory 4gb
maxmemory-policy allkeys-lru

启动节点

# 所有节点执行
redis-server /etc/redis/redis.conf

# 检查进程
ps aux | grep redis

创建集群

# 创建集群(Redis 5+)
redis-cli --cluster create \
  192.168.1.101:6379 \
  192.168.1.102:6379 \
  192.168.1.103:6379 \
  192.168.1.104:6379 \
  192.168.1.105:6379 \
  192.168.1.106:6379 \
  --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 192.168.1.104:6379 to 192.168.1.101:6379
Adding replica 192.168.1.105:6379 to 192.168.1.102:6379
Adding replica 192.168.1.106:6379 to 192.168.1.103:6379

验证集群

# 连接集群
redis-cli -c -h 192.168.1.101 -p 6379

# 查看集群信息
127.0.0.1:6379> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3

# 查看节点
127.0.0.1:6379> cluster nodes

Docker 部署

Docker Compose

# docker-compose.yml
version: '3.8'

services:
  redis-1:
    image: redis:7-alpine
    command: redis-server --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes
    ports:
      - "6379:6379"
      - "16379:16379"
    volumes:
      - redis-1-data:/data

  redis-2:
    image: redis:7-alpine
    command: redis-server --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes
    ports:
      - "6380:6379"
      - "16380:16379"
    volumes:
      - redis-2-data:/data

  redis-3:
    image: redis:7-alpine
    command: redis-server --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes
    ports:
      - "6381:6379"
      - "16381:16379"
    volumes:
      - redis-3-data:/data

  redis-4:
    image: redis:7-alpine
    command: redis-server --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes
    ports:
      - "6382:6379"
      - "16382:16379"
    volumes:
      - redis-4-data:/data

  redis-5:
    image: redis:7-alpine
    command: redis-server --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes
    ports:
      - "6383:6379"
      - "16383:16379"
    volumes:
      - redis-5-data:/data

  redis-6:
    image: redis:7-alpine
    command: redis-server --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes
    ports:
      - "6384:6379"
      - "16384:16379"
    volumes:
      - redis-6-data:/data

volumes:
  redis-1-data:
  redis-2-data:
  redis-3-data:
  redis-4-data:
  redis-5-data:
  redis-6-data:

启动集群

# 启动容器
docker-compose up -d

# 创建集群
docker exec -it redis-1 redis-cli --cluster create \
  redis-1:6379 \
  redis-2:6379 \
  redis-3:6379 \
  redis-4:6379 \
  redis-5:6379 \
  redis-6:6379 \
  --cluster-replicas 1

Kubernetes 部署

StatefulSet

# redis-cluster.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: redis-cluster
data:
  redis.conf: |
    cluster-enabled yes
    cluster-config-file nodes.conf
    cluster-node-timeout 5000
    appendonly yes
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis-cluster
spec:
  serviceName: redis-cluster
  replicas: 6
  selector:
    matchLabels:
      app: redis-cluster
  template:
    metadata:
      labels:
        app: redis-cluster
    spec:
      containers:
      - name: redis
        image: redis:7-alpine
        command:
        - redis-server
        - /etc/redis/redis.conf
        ports:
        - containerPort: 6379
        - containerPort: 16379
        volumeMounts:
        - name: redis-data
          mountPath: /data
        - name: config
          mountPath: /etc/redis
      volumes:
      - name: config
        configMap:
          name: redis-cluster
  volumeClaimTemplates:
  - metadata:
      name: redis-data
    spec:
      accessModes: ["ReadWriteOnce"]
      resources:
        requests:
          storage: 10Gi

创建集群

# 部署 StatefulSet
kubectl apply -f redis-cluster.yaml

# 获取 Pod IP
kubectl get pods -o wide

# 创建集群
kubectl exec -it redis-cluster-0 -- redis-cli --cluster create \
  redis-cluster-0.redis-cluster:6379 \
  redis-cluster-1.redis-cluster:6379 \
  redis-cluster-2.redis-cluster:6379 \
  redis-cluster-3.redis-cluster:6379 \
  redis-cluster-4.redis-cluster:6379 \
  redis-cluster-5.redis-cluster:6379 \
  --cluster-replicas 1

小结

集群部署要点:

  • 环境准备:系统要求、安装 Redis
  • 手动部署:节点规划、配置文件、创建集群
  • Docker 部署:Docker Compose、启动集群
  • Kubernetes 部署:StatefulSet、创建集群

下一章我们将学习数据分片。