第二章:集群部署¶
环境准备¶
系统要求¶
# 操作系统
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 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、创建集群
下一章我们将学习数据分片。