Docker容器化高可用架构部署方案(九)

08-Redis配置详解

本文档详细介绍Redis的配置,包括主节点和从节点的配置参数说明。

Redis架构

复制代码
┌─────────────────────────────────────────────────────────┐
│                    Redis集群架构                        │
├─────────────────────────────────────────────────────────┤
│                                                         │
│    ┌──────────────┐                                     │
│    │ Redis Master │  172.20.3.11                        │
│    │    (Node1)   │◄────────┐                           │
│    └──────┬───────┘         │                           │
│           │                 │                           │
│    ┌──────┴───────┐  ┌──────┴───────┐                   │
│    │ Redis Slave  │  │ Redis Slave  │                   │
│    │   (Node2)    │  │   (Node3)    │                   │
│    │ 172.20.3.12  │  │ 172.20.3.13  │                   │
│    └──────────────┘  └──────────────┘                   │
│                                                         │
│    ┌──────┬───────┐  ┌──────┬───────┐  ┌──────┬───────┐ │
│    │ Sentinel-01  │  │ Sentinel-02  │  │ Sentinel-03  │ │
│    │ 172.20.3.31  │  │ 172.20.3.32  │  │ 172.20.3.33  │ │
│    └──────────────┘  └──────────────┘  └──────────────┘ │
└─────────────────────────────────────────────────────────┘

主节点配置 (redis-master.conf)

复制代码
cat > /opt/cluster-deploy/config/redis/redis-master.conf << 'EOF'
bind 0.0.0.0
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis/redis-server.pid
loglevel notice
logfile ""
databases 16
always-show-logo no
​
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /data
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
​
maxmemory 256mb
maxmemory-policy allkeys-lru
maxmemory-samples 5
​
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
​
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
​
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
​
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
​
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
​
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
EOF

从节点配置 (redis-slave.conf)

从节点配置与主节点基本相同,但通过启动参数指定主节点:

复制代码
cat > /opt/cluster-deploy/config/redis/redis-slave.conf << 'EOF'
bind 0.0.0.0
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis/redis-server.pid
loglevel notice
logfile ""
databases 16
always-show-logo no
​
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /data
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
​
maxmemory 256mb
maxmemory-policy allkeys-lru
maxmemory-samples 5
​
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
​
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
​
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
​
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
​
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
​
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
EOF

关键配置项详解

1. 网络配置

复制代码
bind 0.0.0.0              # 监听所有接口
port 6379                # 端口
tcp-backlog 511          # TCP积压队列
timeout 0                # 客户端空闲超时(0表示禁用)
tcp-keepalive 300        # TCP保活检测间隔

2. 持久化配置

复制代码
save 900 1              # 900秒内1次写操作则保存
save 300 10            # 300秒内10次写操作则保存
save 60 10000           # 60秒内10000次写操作则保存
stop-writes-on-bgsave-error yes   # bgsave失败时停止写入
rdbcompression yes      # RDB文件压缩
rdbchecksum yes         # RDB文件校验
dbfilename dump.rdb    # RDB文件名
dir /data              # 数据目录

3. 主从复制配置

复制代码
replica-serve-stale-data yes   # 主节点失联时仍提供数据
replica-read-only yes          # 从节点只读
replica-priority 100           # 优先级(影响Sentinel选举)

注意

  • 从节点的replicaof参数通过docker-compose启动参数指定

  • 优先级:Master(100) > Slave1(100) > Slave2(100),可通过调整实现主从切换

4. 内存管理

复制代码
maxmemory 256mb              # 最大内存
maxmemory-policy allkeys-lru # 内存满时的淘汰策略
maxmemory-samples 5          # LRU采样数

淘汰策略

策略 说明
noeviction 不淘汰,返回错误
allkeys-lru 所有key使用LRU淘汰
volatile-lru 仅过期key使用LRU淘汰
allkeys-random 随机淘汰所有key

5. 日志配置

复制代码
loglevel notice
logfile ""

重要排错经验 :Redis 7.x中active-rehashing已废弃,删除即可。

重要排错经验 :容器中非root用户无法写日志文件,使用logfile ""输出到stdout。

Docker Compose配置

Node1 (Master)

复制代码
redis-master:
  image: redis:7-alpine
  container_name: redis-master
  networks:
    cache-net:
      ipv4_address: 172.20.3.11
  command: redis-server /etc/redis/redis.conf
  volumes:
    - redis-master-data:/data
    - ./config/redis/redis-master.conf:/etc/redis/redis.conf:ro
  environment:
    - REDIS_PASSWORD=YourStr0ng!Pass
  restart: unless-stopped
  healthcheck:
    test: ["CMD", "redis-cli", "-a", "YourStr0ng!Pass", "ping"]
    interval: 10s
    timeout: 5s
    retries: 3

Node2/Node3 (Slave)

复制代码
redis-slave:
  image: redis:7-alpine
  container_name: redis-slave
  networks:
    cache-net:
      ipv4_address: 172.20.3.12  # Node2
      # 172.20.3.13 (Node3)
  command: redis-server /etc/redis/redis.conf --replicaof 172.20.3.11 6379
  volumes:
    - redis-slave-data:/data
    - ./config/redis/redis-slave.conf:/etc/redis/redis.conf:ro
  environment:
    - REDIS_PASSWORD=YourStr0ng!Pass
  restart: unless-stopped
  healthcheck:
    test: ["CMD", "redis-cli", "-a", "YourStr0ng!Pass", "ping"]
    interval: 10s
    timeout: 5s
    retries: 3

服务IP分配

节点 角色 IP 容器名
Node1 Master 172.20.3.11 redis-master
Node2 Slave 172.20.3.12 redis-slave
Node3 Slave 172.20.3.13 redis-slave

Redis 7.x兼容性注意事项

废弃的参数

以下参数在Redis 7.x中已废弃,使用会报错:

复制代码
# 已废弃,删除
# active-rehashing yes

推荐配置

复制代码
# 使用默认值即可,Redis 7.x已自动启用
# active-rehashing 参数已删除

验证命令

复制代码
# 查看Redis容器
docker ps | grep redis

# 测试连接
docker exec redis-master redis-cli -a 'YourStr0ng!Pass' ping
docker exec redis-slave redis-cli -a 'YourStr0ng!Pass' -h 172.20.3.11 ping

# 查看复制状态
docker exec redis-master redis-cli -a 'YourStr0ng!Pass' info replication

# 查看从节点列表
docker exec redis-master redis-cli -a 'YourStr0ng!Pass' client list

# 测试写入
docker exec redis-master redis-cli -a 'YourStr0ng!Pass' set test_key "hello"
docker exec redis-slave redis-cli -a 'YourStr0ng!Pass' get test_key

# 查看慢日志
docker exec redis-master redis-cli -a 'YourStr0ng!Pass' slowlog get 10

# 查看内存使用
docker exec redis-master redis-cli -a 'YourStr0ng!Pass' info memory

常见问题

Q1: 主从复制不工作

  • 检查网络连通性:ping 172.20.3.11

  • 检查防火墙:端口6379是否开放

  • 查看复制状态:INFO replication

Q2: 内存满导致写入失败

  • 检查内存使用:INFO memory

  • 调整maxmemory配置

  • 确认淘汰策略生效

Q3: 从节点只读

  • 这是正常行为,replica-read-only yes

  • 如需写入,临时修改:CONFIG SET replica-read-only no

下一步

相关推荐
AOwhisky1 小时前
Docker 学习笔记:Docker Compose 多容器编排
linux·运维·笔记·学习·docker·容器
qq_454245031 小时前
复用的逻辑与数学基础:论“电力–机械”解耦的智能体架构必然性
人工智能·架构
绿蕉1 小时前
自动驾驶技术的演进之路:从规则算法到端到端架构
算法·架构·自动驾驶
学习中.........1 小时前
Java 并发容器深度解析:从早期遗留类到现代高并发架构
java·开发语言·架构
上海云盾第一敬业销售1 小时前
深度解析:CDN网络安全架构与实践
安全·web安全·架构
草木红2 小时前
在Docker 建立一个SSH连接的 Ubuntu 容器
ubuntu·docker·ssh
青天喵喵2 小时前
Linux WiFi 架构解析:从用户态到驱动与硬件(基础篇)
linux·运维·arm开发·架构·wifi·嵌入式
heimeiyingwang2 小时前
【架构实战】API网关Spring Cloud Gateway:统一入口的艺术
架构·状态模式
炸炸鱼.2 小时前
从入门到实战:Kubernetes完全指南——概念、架构、集群部署与Dashboard可视化
容器·架构·kubernetes