0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Redis集群部署与性能优化实战

马哥Linux运维 来源:马哥Linux运维 2025-07-08 17:56 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Redis集群部署与性能优化实战

引言

Redis作为高性能的内存数据库,在现代互联网架构中扮演着关键角色。作为运维工程师,掌握Redis的部署、配置和优化技能至关重要。本文将从实战角度出发,详细介绍Redis集群的搭建、性能优化以及监控运维的核心技术。

1. Redis单机部署与基础配置

1.1 基础安装脚本

#!/bin/bash
# Redis安装脚本
set-e

REDIS_VERSION="7.0.15"
REDIS_PORT="6379"
REDIS_DIR="/opt/redis"

# 创建redis用户
useradd -r -s /bin/false redis

# 下载编译Redis
cd/tmp
wget http://download.redis.io/releases/redis-${REDIS_VERSION}.tar.gz
tar xzf redis-${REDIS_VERSION}.tar.gz
cdredis-${REDIS_VERSION}

# 编译安装
make && make install PREFIX=${REDIS_DIR}

# 创建配置目录
mkdir-p${REDIS_DIR}/{conf,data,logs}
chown-R redis:redis${REDIS_DIR}

echo"Redis安装完成"

1.2 核心配置文件

# /opt/redis/conf/redis.conf
# 基础网络配置
bind 127.0.0.1 192.168.1.100
port 6379
timeout 300
tcp-keepalive 300

# 持久化配置
save 900 1
save 300 10
save 60 10000
dbfilename dump.rdb
dir /opt/redis/data

# 内存管理
maxmemory 2gb
maxmemory-policy allkeys-lru
maxmemory-samples 5

# 安全配置
requirepass your_strong_password
# 重命名危险命令
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""

# 日志配置
logfile /opt/redis/logs/redis.log
loglevel notice

单机Redis适合开发和测试环境,但生产环境需要考虑高可用和扩展性。通过合理的配置,可以有效提升Redis性能和稳定性。

2. Redis集群搭建

2.1 集群架构设计

Redis集群采用无中心架构,数据分布在多个节点上。我们将搭建一个包含6个节点的集群:3个主节点和3个从节点。

#!/bin/bash
# Redis集群初始化脚本
CLUSTER_NODES=(
 "192.168.1.101:7001"
 "192.168.1.102:7002"
 "192.168.1.103:7003"
 "192.168.1.104:7004"
 "192.168.1.105:7005"
 "192.168.1.106:7006"
)

# 创建集群配置
fornodein"${CLUSTER_NODES[@]}";do
  IFS=':'read-r ip port <<< "$node"
    
    # 创建节点目录
    mkdir -p /opt/redis/cluster/${port}/{conf,data,logs}
    
    # 生成节点配置
    cat > /opt/redis/cluster/${port}/conf/redis.conf << EOF
port ${port}
cluster-enabled yes
cluster-config-file nodes-${port}.conf
cluster-node-timeout 15000
cluster-require-full-coverage no
bind ${ip}
appendonly yes
appendfilename "appendonly-${port}.aof"
dbfilename dump-${port}.rdb
dir /opt/redis/cluster/${port}/data
pidfile /var/run/redis_${port}.pid
logfile /opt/redis/cluster/${port}/logs/redis.log
EOF
done

2.2 集群启动与创建

#!/bin/bash
# 启动所有Redis节点
start_cluster_nodes() {
 forportin7001 7002 7003 7004 7005 7006;do
    redis-server /opt/redis/cluster/${port}/conf/redis.conf --daemonizeyes
   echo"启动节点${port}"
   sleep2
 done
}

# 创建集群
create_cluster() {
  redis-cli --cluster create 
    192.168.1.101:7001 
    192.168.1.102:7002 
    192.168.1.103:7003 
    192.168.1.104:7004 
    192.168.1.105:7005 
    192.168.1.106:7006 
    --cluster-replicas 1
}

# 检查集群状态
check_cluster() {
  redis-cli -p 7001 cluster nodes
  redis-cli -p 7001 cluster info
}

start_cluster_nodes
create_cluster
check_cluster

集群搭建完成后,数据将自动分片存储在不同节点上,实现了水平扩展和高可用性。

3. 性能优化配置

3.1 内存优化参数

#!/usr/bin/env python3
# Redis性能测试脚本
importredis
importtime
importthreading
fromconcurrent.futuresimportThreadPoolExecutor

classRedisPerformanceTest:
 def__init__(self, host='127.0.0.1', port=6379, password=None):
   self.pool = redis.ConnectionPool(
      host=host,
      port=port,
      password=password,
      max_connections=100,
      decode_responses=True
    )
   self.client = redis.Redis(connection_pool=self.pool)
   
 deftest_write_performance(self, count=10000):
   """测试写入性能"""
    start_time = time.time()
   
   withself.client.pipeline()aspipe:
     foriinrange(count):
        pipe.set(f"key:{i}",f"value:{i}")
       ifi %1000==0:
          pipe.execute()
          pipe.reset()
      pipe.execute()
     
    end_time = time.time()
    ops_per_second = count / (end_time - start_time)
   print(f"写入性能:{ops_per_second:.2f}ops/sec")
   
 deftest_read_performance(self, count=10000):
   """测试读取性能"""
    start_time = time.time()
   
   withself.client.pipeline()aspipe:
     foriinrange(count):
        pipe.get(f"key:{i}")
       ifi %1000==0:
          pipe.execute()
          pipe.reset()
      pipe.execute()
     
    end_time = time.time()
    ops_per_second = count / (end_time - start_time)
   print(f"读取性能:{ops_per_second:.2f}ops/sec")

# 运行性能测试
if__name__ =="__main__":
  test = RedisPerformanceTest()
  test.test_write_performance()
  test.test_read_performance()

3.2 系统级别优化

#!/bin/bash
# 系统级别Redis优化脚本

# 内存优化
echo"vm.overcommit_memory=1">> /etc/sysctl.conf
echo"net.core.somaxconn=65535">> /etc/sysctl.conf
echo"vm.swappiness=1">> /etc/sysctl.conf

# 禁用透明大页
echonever > /sys/kernel/mm/transparent_hugepage/enabled
echo"echo never > /sys/kernel/mm/transparent_hugepage/enabled">> /etc/rc.local

# 调整文件描述符限制
cat>> /etc/security/limits.conf << EOF
redis soft nofile 65536
redis hard nofile 65536
redis soft nproc 65536
redis hard nproc 65536
EOF

# 应用配置
sysctl -p

性能优化需要从多个维度考虑:内存管理、网络配置、持久化策略等。通过合理配置,可以显著提升Redis的处理能力。

4. 监控与故障排除

4.1 监控脚本

#!/usr/bin/env python3
# Redis监控脚本
importredis
importjson
importtime
importpsutil
fromdatetimeimportdatetime

classRedisMonitor:
 def__init__(self, host='127.0.0.1', port=6379):
   self.client = redis.Redis(host=host, port=port, decode_responses=True)
   
 defget_redis_info(self):
   """获取Redis信息"""
    info =self.client.info()
   return{
     'memory_usage': info['used_memory_human'],
     'memory_usage_rss': info['used_memory_rss_human'],
     'connected_clients': info['connected_clients'],
     'total_commands_processed': info['total_commands_processed'],
     'instantaneous_ops_per_sec': info['instantaneous_ops_per_sec'],
     'keyspace_hits': info['keyspace_hits'],
     'keyspace_misses': info['keyspace_misses'],
     'expired_keys': info['expired_keys']
    }
 
 defcheck_slow_queries(self):
   """检查慢查询"""
    slow_queries =self.client.slowlog_get(10)
   return[{
     'id': query['id'],
     'timestamp': query['start_time'],
     'duration': query['duration'],
     'command':' '.join(query['command'])
    }forqueryinslow_queries]
 
 defmonitor_loop(self, interval=60):
   """监控循环"""
   whileTrue:
     try:
        redis_info =self.get_redis_info()
        slow_queries =self.check_slow_queries()
       
        monitor_data = {
         'timestamp': datetime.now().isoformat(),
         'redis_info': redis_info,
         'slow_queries': slow_queries,
         'system_memory': psutil.virtual_memory()._asdict()
        }
       
       # 输出监控数据
       print(json.dumps(monitor_data, indent=2))
       
       # 检查告警条件
       ifredis_info['connected_clients'] >1000:
         print("ALERT: 连接数过高")
       
       iflen(slow_queries) >5:
         print("ALERT: 慢查询过多")
         
     exceptExceptionase:
       print(f"监控异常:{e}")
       
      time.sleep(interval)

# 启动监控
if__name__ =="__main__":
  monitor = RedisMonitor()
  monitor.monitor_loop()

4.2 故障自动恢复

#!/bin/bash
# Redis故障自动恢复脚本
REDIS_PORT=6379
REDIS_PASSWORD="your_password"
LOG_FILE="/var/log/redis_recovery.log"

check_redis_health() {
  redis-cli -p$REDIS_PORT-a$REDIS_PASSWORDping >/dev/null 2>&1
 return$?
}

recover_redis() {
 echo"$(date): 检测到Redis故障,开始恢复">>$LOG_FILE
 
 # 检查Redis进程
 if! pgrep redis-server > /dev/null;then
   echo"$(date): 重启Redis服务">>$LOG_FILE
    systemctl restart redis
   sleep10
 fi
 
 # 检查内存使用
  memory_usage=$(redis-cli -p$REDIS_PORT-a$REDIS_PASSWORDinfo memory | grep used_memory_rss: |cut-d: -f2)
 if["$memory_usage"-gt 8589934592 ];then# 8GB
   echo"$(date): 内存使用过高,执行内存清理">>$LOG_FILE
    redis-cli -p$REDIS_PORT-a$REDIS_PASSWORDflushdb
 fi
 
 # 发送告警
 echo"Redis故障恢复完成"| mail -s"Redis Alert"admin@company.com
}

# 主监控循环
whiletrue;do
 if! check_redis_health;then
    recover_redis
 fi
 sleep30
done

5. 高可用配置

5.1 哨兵模式配置

# 哨兵配置文件 /opt/redis/sentinel.conf
port 26379
sentinel monitor mymaster 192.168.1.100 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel auth-pass mymaster your_password

# 启动哨兵
redis-sentinel /opt/redis/sentinel.conf --daemonizeyes
# 哨兵客户端连接
fromredis.sentinelimportSentinel

sentinel = Sentinel([
  ('192.168.1.100',26379),
  ('192.168.1.101',26379),
  ('192.168.1.102',26379)
])

# 获取主服务器连接
master = sentinel.master_for('mymaster', socket_timeout=0.1)
# 获取从服务器连接
slave = sentinel.slave_for('mymaster', socket_timeout=0.1)

# 测试连接
master.set('test_key','test_value')
result = slave.get('test_key')
print(f"从服务器读取结果:{result}")

总结

Redis集群部署与性能优化是一个系统工程,需要从硬件资源、系统配置、Redis参数等多个层面进行综合考虑。通过本文介绍的实战技术,运维工程师可以构建稳定、高效的Redis集群环境。关键要点包括:合理的集群架构设计、科学的性能优化配置、完善的监控告警体系,以及可靠的故障恢复机制。在实际生产环境中,还需要结合具体业务场景进行调优,持续监控和改进系统性能。

这篇文章涵盖了Redis运维的核心技术点,代码示例丰富且实用,希望对您的运维工作有所帮助。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 集群
    +关注

    关注

    0

    文章

    130

    浏览量

    17600
  • 数据库
    +关注

    关注

    7

    文章

    3993

    浏览量

    67742
  • Redis
    +关注

    关注

    0

    文章

    390

    浏览量

    12062

原文标题:Redis集群部署与性能优化实战

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Hadoop的集群环境部署说明

    或者是相同,指令多、步骤繁琐。有的时候觉得不免觉得很奇怪,这些发行商为什么不对hadoop的集群环境部署做一下优化呢?幸运的是总算是让我找到了一个hadoop发行版集群环境搭建简单易用
    发表于 10-12 15:51

    redis集群环境安装及配置

    redis集群主从配置
    发表于 03-08 09:59

    redis集群的两种备份方式

    redis集群 主从同步 备份
    发表于 04-17 13:30

    3分钟搭建Redis Cluster集群

    Redis Cluster集群快速搭建
    发表于 06-12 14:58

    redis集群的如何部署

    redis集群部署(伪分布式)
    发表于 05-29 17:13

    Redis集群相关问题的解决

    Redis 集群相关问题
    发表于 06-11 10:09

    Docker部署Redis服务器集群的方法

    Docker部署Redis服务器集群
    发表于 06-13 09:12

    如何构建一个稳定、高性能Redis集群

    这篇文章我想和你聊一聊 Redis 的架构演化之路。 现如今 Redis 变得越来越流行,几乎在很多项目中都要被用到,不知道你在使用 Redis 时,有没有思考过,Redis 到底是如
    的头像 发表于 03-03 15:05 1966次阅读
    如何构建一个稳定、高<b class='flag-5'>性能</b>的<b class='flag-5'>Redis</b><b class='flag-5'>集群</b>?

    Redis的主从、哨兵、Redis Cluster集群

      前言 今天跟小伙伴们一起学习Redis的主从、哨兵、Redis Cluster集群Redis主从 Redis哨兵
    的头像 发表于 06-12 14:58 1386次阅读
    <b class='flag-5'>Redis</b>的主从、哨兵、<b class='flag-5'>Redis</b> Cluster<b class='flag-5'>集群</b>

    redis集群状态查看命令

    Redis集群是一种高可用性的分布式架构,可以通过多个节点实现数据的复制和负载均衡。为了维护集群的稳定性和可靠性,管理员需要监控和查看集群的状态。下面是详细介绍
    的头像 发表于 12-04 10:44 2705次阅读

    redis集群性能测试工具有哪些

    Redis是一种高性能的内存键值存储系统,它被广泛应用于各种互联网应用和大规模的数据存储中。为了评估Redis在不同场景下的性能,我们需要使用一些
    的头像 发表于 12-04 11:36 1442次阅读

    redis查看集群状态命令

    Redis 是一个开源的、内存中的数据结构存储系统,提供了一系列命令来管理和操作数据。在 Redis 中,集群是一个由多个 Redis 实例组成的分布式系统,用于提高数据的可用性和
    的头像 发表于 12-04 11:39 2544次阅读

    K8S学习教程(二):在 PetaExpress KubeSphere容器平台部署高可用 Redis 集群

    前言 Redis 是在开发过程中经常用到的缓存中间件,为了考虑在生产环境中稳定性和高可用,Redis通常采用集群模式的部署方式。 在制定Redis
    的头像 发表于 07-03 15:30 1473次阅读
    K8S学习教程(二):在 PetaExpress KubeSphere容器平台<b class='flag-5'>部署</b>高可用 <b class='flag-5'>Redis</b> <b class='flag-5'>集群</b>

    Redis实战笔记

    在目前的技术选型中,Redis 俨然已经成为了系统高性能缓存方案的事实标准,因此现在 Redis 也成为了后端开发的基本技能树之一。   基于上述情况,今天给大家分享一份 杰哥 亲笔撰写的内部
    的头像 发表于 02-09 09:12 632次阅读
    <b class='flag-5'>Redis</b><b class='flag-5'>实战</b>笔记

    Redis集群部署配置详解

    Redis集群是一种分布式Redis解决方案,通过数据分片和主从复制实现高可用性和横向扩展。集群将整个数据集分割成16384个哈希槽(hash slots),每个节点负责一部分槽位。
    的头像 发表于 07-17 11:04 594次阅读