女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Redis集群部署配置詳解

馬哥Linux運(yùn)維 ? 來源:馬哥Linux運(yùn)維 ? 2025-07-17 11:04 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Redis集群架構(gòu)原理

集群模式概述

Redis集群是一種分布式Redis解決方案,通過數(shù)據(jù)分片和主從復(fù)制實(shí)現(xiàn)高可用性和橫向擴(kuò)展。集群將整個(gè)數(shù)據(jù)集分割成16384個(gè)哈希槽(hash slots),每個(gè)節(jié)點(diǎn)負(fù)責(zé)一部分槽位。

集群拓?fù)浣Y(jié)構(gòu)

集群節(jié)點(diǎn)分布示例:
Master-1 (0-5460)   Master-2 (5461-10922)  Master-3 (10923-16383)
  |            |            |
Slave-1       Slave-2         Slave-3

數(shù)據(jù)分片原理

Redis使用CRC16算法對鍵進(jìn)行哈希運(yùn)算,然后對16384取模,確定鍵應(yīng)該存儲(chǔ)在哪個(gè)槽位:

HASH_SLOT = CRC16(key) mod 16384

故障檢測與轉(zhuǎn)移

集群使用Gossip協(xié)議進(jìn)行節(jié)點(diǎn)間通信,當(dāng)主節(jié)點(diǎn)宕機(jī)時(shí),其從節(jié)點(diǎn)會(huì)自動(dòng)升級(jí)為主節(jié)點(diǎn),保證集群的高可用性。

Redis集群部署配置

環(huán)境準(zhǔn)備

系統(tǒng)要求

? Linux發(fā)行版:CentOS 7+、Ubuntu 18.04+

? Redis版本:5.0+(推薦6.2+)

? 最小內(nèi)存:每節(jié)點(diǎn)2GB+

? 網(wǎng)絡(luò):節(jié)點(diǎn)間網(wǎng)絡(luò)延遲<1ms

服務(wù)器規(guī)劃

# 6節(jié)點(diǎn)集群規(guī)劃(3主3從)
192.168.1.10:7000 # Master-1
192.168.1.11:7000 # Slave-1
192.168.1.12:7000 # Master-2
192.168.1.13:7000 # Slave-2
192.168.1.14:7000 # Master-3
192.168.1.15:7000 # Slave-3

系統(tǒng)優(yōu)化配置

內(nèi)核參數(shù)調(diào)優(yōu)

# /etc/sysctl.conf
vm.overcommit_memory = 1
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
vm.swappiness = 0

系統(tǒng)限制配置

# /etc/security/limits.conf
redis soft nofile 65535
redis hard nofile 65535
redis softnproc65535
redis hardnproc65535

透明大頁禁用

echonever > /sys/kernel/mm/transparent_hugepage/enabled
echonever > /sys/kernel/mm/transparent_hugepage/defrag

# 永久生效
echo'echo never > /sys/kernel/mm/transparent_hugepage/enabled'>> /etc/rc.local
echo'echo never > /sys/kernel/mm/transparent_hugepage/defrag'>> /etc/rc.local

Redis安裝與配置

編譯安裝Redis

# 安裝依賴
yum install -y gcc gcc-c++ make

# 下載源碼
wget http://download.redis.io/releases/redis-6.2.7.tar.gz
tar xzf redis-6.2.7.tar.gz
cdredis-6.2.7

# 編譯安裝
make PREFIX=/usr/local/redis install

# 創(chuàng)建用戶和目錄
useradd -r -s /bin/false redis
mkdir-p /usr/local/redis/{conf,data,logs}
chown-R redis:redis /usr/local/redis

集群配置文件

# /usr/local/redis/conf/redis-7000.conf
# 基礎(chǔ)配置
bind0.0.0.0
port 7000
daemonizeyes
pidfile /var/run/redis_7000.pid
logfile /usr/local/redis/logs/redis-7000.log
dir/usr/local/redis/data

# 集群配置
cluster-enabledyes
cluster-config-file nodes-7000.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.1.10
cluster-announce-port 7000
cluster-announce-bus-port 17000

# 內(nèi)存配置
maxmemory 2gb
maxmemory-policy allkeys-lru

# 持久化配置
save 900 1
save 300 10
save 60 10000
appendonlyyes
appendfilename"appendonly-7000.aof"
appendfsync everysec
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

# 安全配置
requirepass"your_redis_password"
masterauth"your_redis_password"

# 網(wǎng)絡(luò)配置
tcp-keepalive 60
timeout300
tcp-backlog 511

啟動(dòng)腳本配置

# /etc/systemd/system/redis-7000.service
[Unit]
Description=Redis In-Memory Data Store (Port 7000)
After=network.target

[Service]
User=redis
Group=redis
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis-7000.conf
ExecStop=/usr/local/redis/bin/redis-cli -p 7000 shutdown
Restart=always

[Install]
WantedBy=multi-user.target

集群初始化

啟動(dòng)所有節(jié)點(diǎn)

# 在所有節(jié)點(diǎn)上啟動(dòng)Redis
systemctl start redis-7000
systemctlenableredis-7000

# 驗(yàn)證啟動(dòng)狀態(tài)
systemctl status redis-7000

創(chuàng)建集群

# 使用redis-cli創(chuàng)建集群
/usr/local/redis/bin/redis-cli --cluster create 
192.168.1.10:7000 192.168.1.11:7000 192.168.1.12:7000 
192.168.1.13:7000 192.168.1.14:7000 192.168.1.15:7000 
--cluster-replicas 1 -a your_redis_password

# 或使用redis-trib.rb(Redis 5.0之前)
./redis-trib.rb create --replicas 1 
192.168.1.10:7000 192.168.1.11:7000 192.168.1.12:7000 
192.168.1.13:7000 192.168.1.14:7000 192.168.1.15:7000

驗(yàn)證集群狀態(tài)

# 檢查集群信息
redis-cli -c -h 192.168.1.10 -p 7000 -a your_redis_password cluster info
redis-cli -c -h 192.168.1.10 -p 7000 -a your_redis_password cluster nodes

企業(yè)級(jí)配置管理

配置模板化管理

Ansible配置管理

# redis-cluster-playbook.yml
---
-hosts:redis_cluster
become:yes
vars:
 redis_port:7000
 redis_password:"{{ vault_redis_password }}"
 redis_maxmemory:"{{ ansible_memtotal_mb // 2 }}mb"
 
tasks:
 -name:InstallRedisdependencies
  yum:
   name:"{{ item }}"
   state:present
  loop:
   -gcc
   -gcc-c++
   -make
   
 -name:CreateRedisuser
  user:
   name:redis
   system:yes
   shell:/bin/false
   
 -name:CreateRedisdirectories
  file:
   path:"{{ item }}"
   state:directory
   owner:redis
   group:redis
   mode:'0755'
  loop:
   -/usr/local/redis/conf
   -/usr/local/redis/data
   -/usr/local/redis/logs
   
 -name:DeployRedisconfiguration
  template:
   src:redis.conf.j2
   dest:/usr/local/redis/conf/redis-{{redis_port}}.conf
   owner:redis
   group:redis
   mode:'0640'
  notify:restartredis
  
 -name:Deploysystemdservice
  template:
   src:redis.service.j2
   dest:/etc/systemd/system/redis-{{redis_port}}.service
  notify:reloadsystemd
  
handlers:
 -name:reloadsystemd
  systemd:
   daemon_reload:yes
   
 -name:restartredis
  systemd:
   name:redis-{{redis_port}}
   state:restarted

配置模板

# templates/redis.conf.j2
bind 0.0.0.0
port {{ redis_port }}
daemonize yes
pidfile /var/run/redis_{{ redis_port }}.pid
logfile /usr/local/redis/logs/redis-{{ redis_port }}.log
dir /usr/local/redis/data

# 集群配置
cluster-enabled yes
cluster-config-file nodes-{{ redis_port }}.conf
cluster-node-timeout 15000
cluster-announce-ip {{ ansible_default_ipv4.address }}
cluster-announce-port {{ redis_port }}
cluster-announce-bus-port {{ redis_port | int + 10000 }}

# 內(nèi)存配置
maxmemory {{ redis_maxmemory }}
maxmemory-policy allkeys-lru

# 持久化配置
save 900 1
save 300 10
save 60 10000
appendonly yes
appendfilename "appendonly-{{ redis_port }}.aof"
appendfsync everysec

# 安全配置
requirepass "{{ redis_password }}"
masterauth "{{ redis_password }}"

# 網(wǎng)絡(luò)配置
tcp-keepalive 60
timeout 300
tcp-backlog 511

配置版本控制

Git配置管理

# 初始化配置倉庫
mkdir/opt/redis-config
cd/opt/redis-config
git init

# 目錄結(jié)構(gòu)
mkdir-p {environments/{dev,test,prod},templates,scripts,monitoring}

# 環(huán)境配置文件
# environments/prod/group_vars/all.yml
redis_cluster_nodes:
 - host: 192.168.1.10
  port: 7000
  role: master
 - host: 192.168.1.11
  port: 7000
  role: slave

配置變更管理

# 配置變更腳本
#!/bin/bash
# scripts/deploy-config.sh

ENVIRONMENT=$1
CONFIG_VERSION=$2

if[ -z"$ENVIRONMENT"] || [ -z"$CONFIG_VERSION"];then
 echo"Usage:$0 "
 exit1
fi

# 備份當(dāng)前配置
ansible-playbook -i environments/$ENVIRONMENT/hosts 
  playbooks/backup-config.yml

# 部署新配置
ansible-playbook -i environments/$ENVIRONMENT/hosts 
  playbooks/deploy-config.yml 
  --extra-vars"config_version=$CONFIG_VERSION"

# 驗(yàn)證配置
ansible-playbook -i environments/$ENVIRONMENT/hosts 
  playbooks/verify-config.yml

配置參數(shù)優(yōu)化

內(nèi)存配置優(yōu)化

# 根據(jù)服務(wù)器內(nèi)存動(dòng)態(tài)調(diào)整
TOTAL_MEM=$(free -m | grep Mem | awk'{print $2}')
REDIS_MEM=$((TOTAL_MEM *70/100))

# 在配置文件中設(shè)置
maxmemory${REDIS_MEM}mb
maxmemory-policy allkeys-lru

# 設(shè)置內(nèi)存過期策略
# volatile-lru: 在設(shè)置了過期時(shí)間的鍵中使用LRU
# allkeys-lru: 在所有鍵中使用LRU
# volatile-random: 在設(shè)置了過期時(shí)間的鍵中隨機(jī)刪除
# allkeys-random: 在所有鍵中隨機(jī)刪除
# volatile-ttl: 刪除即將過期的鍵
# noeviction: 不刪除鍵,返回錯(cuò)誤

網(wǎng)絡(luò)配置優(yōu)化

# 連接配置
timeout300
tcp-keepalive 60
tcp-backlog 511

# 客戶端連接限制
maxclients 10000

# 輸出緩沖區(qū)配置
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60

持久化配置優(yōu)化

# RDB配置
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-erroryes
rdbcompressionyes
rdbchecksumyes

# AOF配置
appendonlyyes
appendfilename"appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncatedyes

日志管理與監(jiān)控

日志配置與分類

日志級(jí)別配置

# Redis日志級(jí)別
# debug: 大量信息,適用于開發(fā)/測試
# verbose: 包含很多不太有用的信息
# notice: 適度冗長,適用于生產(chǎn)環(huán)境
# warning: 只記錄重要/關(guān)鍵信息

loglevel notice
logfile /usr/local/redis/logs/redis-7000.log
syslog-enabledyes
syslog-ident redis-7000
syslog-facility local0

日志輪轉(zhuǎn)配置

# /etc/logrotate.d/redis
/usr/local/redis/logs/*.log{
  daily
  missingok
  rotate 30
  compress
  delaycompress
  notifempty
  create 640 redis redis
  postrotate
    /bin/kill -USR1 `cat/var/run/redis_7000.pid 2>/dev/null` 2>/dev/null ||true
  endscript
}

監(jiān)控指標(biāo)收集

Prometheus監(jiān)控配置

# prometheus.yml
global:
scrape_interval:15s

scrape_configs:
-job_name:'redis-cluster'
 static_configs:
  -targets:['192.168.1.10:9121','192.168.1.11:9121','192.168.1.12:9121']
 scrape_interval:10s
 metrics_path:/metrics

Redis Exporter部署

# 下載Redis Exporter
wget https://github.com/oliver006/redis_exporter/releases/download/v1.45.0/redis_exporter-v1.45.0.linux-amd64.tar.gz
tar xzf redis_exporter-v1.45.0.linux-amd64.tar.gz
cpredis_exporter /usr/local/bin/

# 創(chuàng)建systemd服務(wù)
cat> /etc/systemd/system/redis-exporter.service <

關(guān)鍵監(jiān)控指標(biāo)

# 內(nèi)存使用監(jiān)控
redis_memory_used_bytes
redis_memory_max_bytes
redis_memory_used_rss_bytes

# 連接數(shù)監(jiān)控
redis_connected_clients
redis_blocked_clients
redis_rejected_connections_total

# 命令統(tǒng)計(jì)
redis_commands_processed_total
redis_commands_duration_seconds_total

# 集群狀態(tài)監(jiān)控
redis_cluster_enabled
redis_cluster_nodes
redis_cluster_slots_assigned
redis_cluster_slots_ok
redis_cluster_slots_pfail
redis_cluster_slots_fail

# 復(fù)制監(jiān)控
redis_replication_backlog_bytes
redis_replica_lag_seconds
redis_master_repl_offset

日志分析與告警

ELK Stack集成

# filebeat.yml
filebeat.inputs:
-type:log
enabled:true
paths:
 -/usr/local/redis/logs/*.log
fields:
 service:redis
 environment:production
fields_under_root:true

output.logstash:
hosts:["logstash:5044"]

processors:
-add_host_metadata:
 when.not.contains.tags:forwarded

Logstash配置

# logstash-redis.conf
input {
 beats {
  port =>5044
 }
}

filter {
if[service] =="redis"{
  grok {
   match => {
   "message"=>"%{POSINT:pid}:%{CHAR:role} %{GREEDYDATA:timestamp} %{LOGLEVEL:level} %{GREEDYDATA:message}"
   }
  }
 
  date {
   match => ["timestamp","dd MMM yyyy HHss.SSS"]
  }
 
 if[level] =="WARNING"or[level] =="ERROR"{
   mutate {
    add_tag => ["alert"]
   }
  }
 }
}

output {
 elasticsearch {
  hosts => ["elasticsearch:9200"]
  index =>"redis-%{+YYYY.MM.dd}"
 }
}

告警規(guī)則配置

# alertmanager-rules.yml
groups:
-name:redis.rules
rules:
-alert:RedisDown
 expr:redis_up==0
 for:1m
 labels:
  severity:critical
 annotations:
  summary:"Redis instance is down"
  description:"Redis instance{{ $labels.instance }}is down"
  
-alert:RedisHighMemoryUsage
 expr:redis_memory_used_bytes/redis_memory_max_bytes>0.9
 for:5m
 labels:
  severity:warning
 annotations:
  summary:"Redis memory usage is high"
  description:"Redis memory usage is{{ $value }}%"
  
-alert:RedisHighConnectionCount
 expr:redis_connected_clients>1000
 for:5m
 labels:
  severity:warning
 annotations:
  summary:"Redis connection count is high"
  description:"Redis has{{ $value }}connections"
  
-alert:RedisClusterNodeDown
 expr:redis_cluster_nodes{state="fail"}>0
 for:1m
 labels:
  severity:critical
 annotations:
  summary:"Redis cluster node is down"
  description:"Redis cluster has{{ $value }}failed nodes"

性能監(jiān)控腳本

實(shí)時(shí)監(jiān)控腳本

#!/bin/bash
# redis-monitor.sh

REDIS_CLI="/usr/local/redis/bin/redis-cli"
REDIS_HOST="127.0.0.1"
REDIS_PORT="7000"
REDIS_PASSWORD="your_redis_password"

# 獲取Redis信息
get_redis_info() {
 $REDIS_CLI-h$REDIS_HOST-p$REDIS_PORT-a$REDIS_PASSWORDinfo$12>/dev/null
}

# 監(jiān)控內(nèi)存使用
monitor_memory() {
 localmemory_info=$(get_redis_info memory)
 localused_memory=$(echo"$memory_info"| grep"used_memory:"|cut-d: -f2 |tr-d'
')
 localmax_memory=$(echo"$memory_info"| grep"maxmemory:"|cut-d: -f2 |tr-d'
')
 
 if["$max_memory"-gt 0 ];then
   localusage_percent=$((used_memory *100/ max_memory))
   echo"Memory Usage:$usage_percent% ($used_memory/$max_memorybytes)"
   
   if["$usage_percent"-gt 80 ];then
     echo"WARNING: Memory usage is high!"
   fi
 fi
}

# 監(jiān)控連接數(shù)
monitor_connections() {
 localclients_info=$(get_redis_info clients)
 localconnected_clients=$(echo"$clients_info"| grep"connected_clients:"|cut-d: -f2 |tr-d'
')
 
 echo"Connected Clients:$connected_clients"
 
 if["$connected_clients"-gt 1000 ];then
   echo"WARNING: High connection count!"
 fi
}

# 監(jiān)控集群狀態(tài)
monitor_cluster() {
 localcluster_info=$($REDIS_CLI-h$REDIS_HOST-p$REDIS_PORT-a$REDIS_PASSWORDcluster info 2>/dev/null)
 localcluster_state=$(echo"$cluster_info"| grep"cluster_state:"|cut-d: -f2 |tr-d'
')
 
 echo"Cluster State:$cluster_state"
 
 if["$cluster_state"!="ok"];then
   echo"ERROR: Cluster is not healthy!"
 fi
}

# 主監(jiān)控循環(huán)
whiletrue;do
 echo"=== Redis Monitoring$(date)==="
  monitor_memory
  monitor_connections
  monitor_cluster
 echo""
 sleep10
done

隊(duì)列設(shè)置與管理

Redis隊(duì)列模式

List隊(duì)列實(shí)現(xiàn)

# 基于List的簡單隊(duì)列
# 生產(chǎn)者推送消息
LPUSH myqueue"message1"
LPUSH myqueue"message2"

# 消費(fèi)者獲取消息
RPOP myqueue

# 阻塞式消費(fèi)
BRPOP myqueue 0

Stream隊(duì)列實(shí)現(xiàn)

# 創(chuàng)建Stream
XADD mystream * field1 value1 field2 value2

# 消費(fèi)者組
XGROUP CREATE mystream mygroup 0 MKSTREAM

# 消費(fèi)消息
XREADGROUP GROUP mygroup consumer1 COUNT 1 STREAMS mystream >

# 確認(rèn)消息
XACK mystream mygroup message_id

企業(yè)級(jí)隊(duì)列配置

隊(duì)列配置模板

# Redis隊(duì)列專用配置
# /usr/local/redis/conf/redis-queue.conf

# 基礎(chǔ)配置
port 6379
bind0.0.0.0
daemonizeyes
pidfile /var/run/redis-queue.pid
logfile /usr/local/redis/logs/redis-queue.log
dir/usr/local/redis/data

# 內(nèi)存配置(隊(duì)列通常需要更多內(nèi)存)
maxmemory 4gb
maxmemory-policy allkeys-lru

# 持久化配置(確保消息不丟失)
appendonlyyes
appendfilename"appendonly-queue.aof"
appendfsync everysec
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

# 網(wǎng)絡(luò)配置
timeout0
tcp-keepalive 300
tcp-backlog 511

# 客戶端配置
maxclients 10000
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60

# 隊(duì)列相關(guān)配置
list-max-ziplist-size -2
list-compress-depth 0
stream-node-max-bytes 4096
stream-node-max-entries 100

隊(duì)列監(jiān)控腳本

#!/usr/bin/env python3
# redis-queue-monitor.py

importredis
importjson
importtime
importlogging
fromdatetimeimportdatetime

# 配置日志
logging.basicConfig(
  level=logging.INFO,
 format='%(asctime)s - %(levelname)s - %(message)s'
)

classRedisQueueMonitor:
 def__init__(self, host='localhost', port=6379, password=None):
   self.redis_client = redis.Redis(
      host=host,
      port=port,
      password=password,
      decode_responses=True
    )
   
 defmonitor_list_queues(self, queue_patterns):
   """監(jiān)控List類型隊(duì)列"""
    queue_stats = {}
   
   forpatterninqueue_patterns:
      queues =self.redis_client.keys(pattern)
     
     forqueueinqueues:
        length =self.redis_client.llen(queue)
        queue_stats[queue] = {
         'type':'list',
         'length': length,
         'timestamp': datetime.now().isoformat()
        }
       
       # 告警檢查
       iflength >10000:
          logging.warning(f"Queue{queue}has{length}items")
         
   returnqueue_stats
 
 defmonitor_stream_queues(self, stream_patterns):
   """監(jiān)控Stream類型隊(duì)列"""
    stream_stats = {}
   
   forpatterninstream_patterns:
      streams =self.redis_client.keys(pattern)
     
     forstreaminstreams:
       try:
          length =self.redis_client.xlen(stream)
          info =self.redis_client.xinfo_stream(stream)
         
         # 獲取消費(fèi)者組信息
          groups =self.redis_client.xinfo_groups(stream)
         
          stream_stats[stream] = {
           'type':'stream',
           'length': length,
           'first_entry': info['first-entry'],
           'last_entry': info['last-entry'],
           'groups':len(groups),
           'timestamp': datetime.now().isoformat()
          }
         
         # 檢查消費(fèi)者組滯后
         forgroupingroups:
            lag = group['lag']
           iflag >1000:
              logging.warning(
               f"Stream{stream}group{group['name']}has lag{lag}"
              )
             
       exceptExceptionase:
          logging.error(f"Error monitoring stream{stream}:{e}")
         
   returnstream_stats
 
 defget_memory_usage(self):
   """獲取內(nèi)存使用情況"""
    info =self.redis_client.info('memory')
   return{
     'used_memory': info['used_memory'],
     'used_memory_human': info['used_memory_human'],
     'used_memory_peak': info['used_memory_peak'],
     'used_memory_peak_human': info['used_memory_peak_human']
    }
 
 defrun_monitoring(self):
   """運(yùn)行監(jiān)控"""
    queue_patterns = ['task:*','job:*','message:*']
    stream_patterns = ['stream:*','events:*']
   
   whileTrue:
     try:
       # 監(jiān)控隊(duì)列
        list_stats =self.monitor_list_queues(queue_patterns)
        stream_stats =self.monitor_stream_queues(stream_patterns)
       
       # 監(jiān)控內(nèi)存
        memory_stats =self.get_memory_usage()
       
       # 輸出統(tǒng)計(jì)信息
        stats = {
         'timestamp': datetime.now().isoformat(),
         'list_queues': list_stats,
         'stream_queues': stream_stats,
         'memory': memory_stats
        }
       
        logging.info(f"Queue Stats:{json.dumps(stats, indent=2)}")
       
       # 等待下一次檢查
        time.sleep(60)
       
     exceptExceptionase:
        logging.error(f"Monitoring error:{e}")
        time.sleep(10)

if__name__ =="__main__":
  monitor = RedisQueueMonitor(
    host='localhost',
    port=6379,
    password='your_redis_password'
  )
  monitor.run_monitoring()

隊(duì)列優(yōu)化配置

內(nèi)存優(yōu)化

# 針對隊(duì)列的內(nèi)存優(yōu)化
# 使用ziplist壓縮小列表
list-max-ziplist-size -2
list-compress-depth 1

# Stream優(yōu)化
stream-node-max-bytes 4096
stream-node-max-entries 100

# 過期策略
maxmemory-policy allkeys-lru

持久化優(yōu)化

# 隊(duì)列持久化配置
# 禁用RDB,使用AOF
save""
appendonlyyes
appendfilename"appendonly-queue.aof"
appendfsync everysec

# AOF重寫優(yōu)化
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-rewrite-incremental-fsyncyes

隊(duì)列管理工具

隊(duì)列清理腳本

#!/bin/bash
# queue-cleanup.sh

REDIS_CLI="/usr/local/redis/bin/redis-cli"
REDIS_HOST="127.0.0.1"
REDIS_PORT="6379"
REDIS_PASSWORD="your_redis_password"

# 清理空隊(duì)列
cleanup_empty_queues() {
 echo"Cleaning up empty queues..."
 
 # 獲取所有隊(duì)列
  queues=$($REDIS_CLI-h$REDIS_HOST-p$REDIS_PORT-a$REDIS_PASSWORDkeys"queue:*"2>/dev/null)
 
 forqueuein$queues;do
    length=$($REDIS_CLI-h$REDIS_HOST-p$REDIS_PORT-a$REDIS_PASSWORDllen"$queue"2>/dev/null)
   
   if["$length"-eq 0 ];then
     echo"Deleting empty queue:$queue"
     $REDIS_CLI-h$REDIS_HOST-p$REDIS_PORT-a$REDIS_PASSWORDdel"$queue"2>/dev/null
   fi
 done
}

# 清理過期消息
cleanup_expired_messages() {
 echo"Cleaning up expired messages..."
 
 # 清理超過24小時(shí)的消息
  expire_time=$(($(date +%s) -86400))
 
  streams=$($REDIS_CLI-h$REDIS_HOST-p$REDIS_PORT-a$REDIS_PASSWORDkeys"stream:*"2>/dev/null)
 
 forstreamin$streams;do
   $REDIS_CLI-h$REDIS_HOST-p$REDIS_PORT-a$REDIS_PASSWORD
    XTRIM"$stream"MINID${expire_time}000 2>/dev/null
 done
}

# 執(zhí)行清理
cleanup_empty_queues
cleanup_expired_messages

echo"Queue cleanup completed at$(date)"

性能優(yōu)化與調(diào)優(yōu)

集群性能優(yōu)化

槽位分布優(yōu)化

# 檢查槽位分布
redis-cli -c -h 192.168.1.10 -p 7000 -a password cluster slots

# 重新分配槽位
redis-cli --cluster reshard 192.168.1.10:7000 
--cluster-from source_node_id 
--cluster-to target_node_id 
--cluster-slots 1000 
--cluster-yes

讀寫分離配置

# 從節(jié)點(diǎn)只讀配置
replica-read-onlyyes

# 客戶端讀寫分離
# 寫操作指向主節(jié)點(diǎn)
# 讀操作指向從節(jié)點(diǎn)

故障處理與運(yùn)維實(shí)踐

自動(dòng)故障恢復(fù)腳本

#!/bin/bash
# redis-failover.sh

check_cluster_health() {
 localresult=$(redis-cli -c -h$1-p$2-a$3cluster info 2>/dev/null | grep"cluster_state:ok")
 if[ -n"$result"];then
   return0
 else
   return1
 fi
}

# 集群健康檢查
if! check_cluster_health"192.168.1.10""7000""password";then
 echo"Cluster unhealthy, triggering failover procedures..."
 # 執(zhí)行故障轉(zhuǎn)移邏輯
fi

數(shù)據(jù)備份與恢復(fù)

# 備份腳本
#!/bin/bash
BACKUP_DIR="/backup/redis/$(date +%Y%m%d)"
mkdir-p$BACKUP_DIR

# 創(chuàng)建RDB快照
redis-cli -h 192.168.1.10 -p 7000 -a password BGSAVE

# 備份AOF文件
cp/usr/local/redis/data/appendonly*.aof$BACKUP_DIR/

# 備份集群配置
redis-cli -h 192.168.1.10 -p 7000 -a password cluster nodes >$BACKUP_DIR/cluster-nodes.txt

總結(jié)

本文全面介紹了Linux環(huán)境下Redis集群的企業(yè)級(jí)運(yùn)維方案,涵蓋了從基礎(chǔ)架構(gòu)設(shè)計(jì)到高級(jí)運(yùn)維實(shí)踐的各個(gè)方面。通過合理的架構(gòu)設(shè)計(jì)、標(biāo)準(zhǔn)化的配置管理、完善的監(jiān)控體系和自動(dòng)化的運(yùn)維流程,可以構(gòu)建一個(gè)高可用、高性能的Redis集群系統(tǒng)。

關(guān)鍵要點(diǎn)

1.架構(gòu)設(shè)計(jì):采用3主3從的標(biāo)準(zhǔn)集群架構(gòu),確保高可用性

2.配置管理:使用模板化和版本控制實(shí)現(xiàn)標(biāo)準(zhǔn)化配置

3.監(jiān)控體系:建立完善的指標(biāo)監(jiān)控和日志分析系統(tǒng)

4.隊(duì)列管理:針對不同場景選擇合適的隊(duì)列模式

5.性能優(yōu)化:持續(xù)監(jiān)控和調(diào)優(yōu),保證系統(tǒng)最佳性能

運(yùn)維建議

? 定期進(jìn)行集群健康檢查和性能評估

? 建立完善的備份和恢復(fù)機(jī)制

? 制定詳細(xì)的故障處理流程

? 持續(xù)優(yōu)化配置參數(shù)和監(jiān)控指標(biāo)

? 保持對Redis新特性的關(guān)注和學(xué)習(xí)

通過遵循本文提供的最佳實(shí)踐,運(yùn)維工程師可以構(gòu)建和維護(hù)一個(gè)穩(wěn)定、高效的Redis集群環(huán)境,為企業(yè)業(yè)務(wù)提供可靠的數(shù)據(jù)支撐。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 集群
    +關(guān)注

    關(guān)注

    0

    文章

    111

    瀏覽量

    17436
  • Redis
    +關(guān)注

    關(guān)注

    0

    文章

    387

    瀏覽量

    11444

原文標(biāo)題:Redis集群運(yùn)維神器:5分鐘解決90%生產(chǎn)故障的終極指南

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    Hadoop的集群環(huán)境部署說明

    或者是相同,指令多、步驟繁瑣。有的時(shí)候覺得不免覺得很奇怪,這些發(fā)行商為什么不對hadoop的集群環(huán)境部署做一下優(yōu)化呢?幸運(yùn)的是總算是讓我找到了一個(gè)hadoop發(fā)行版集群環(huán)境搭建簡單易用。這里使用的是一款
    發(fā)表于 10-12 15:51

    redis集群環(huán)境安裝及配置

    redis集群主從配置
    發(fā)表于 03-08 09:59

    redis集群的兩種備份方式

    redis集群 主從同步 備份
    發(fā)表于 04-17 13:30

    Redis-cluster在線集群安裝

    Redis-cluster之在線搭建詳解
    發(fā)表于 06-06 14:52

    3分鐘搭建Redis Cluster集群

    Redis Cluster集群快速搭建
    發(fā)表于 06-12 14:58

    redis集群的如何部署

    redis集群部署(偽分布式)
    發(fā)表于 05-29 17:13

    Redis集群相關(guān)問題的解決

    Redis 集群相關(guān)問題
    發(fā)表于 06-11 10:09

    Docker部署Redis服務(wù)器集群的方法

    Docker部署Redis服務(wù)器集群
    發(fā)表于 06-13 09:12

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

    ? 前言 今天跟小伙伴們一起學(xué)習(xí)Redis的主從、哨兵、Redis Cluster集群Redis主從 Redis哨兵
    的頭像 發(fā)表于 06-12 14:58 ?1090次閱讀
    <b class='flag-5'>Redis</b>的主從、哨兵、<b class='flag-5'>Redis</b> Cluster<b class='flag-5'>集群</b>

    Windows Docker部署Redis的流程

    由于 Docker 部署 Redis 后,Redis 容器中默認(rèn)是沒有 redis.conf 配置文件的,需要自己手動(dòng)掛在進(jìn)去。
    的頭像 發(fā)表于 11-27 10:02 ?1228次閱讀
    Windows Docker<b class='flag-5'>部署</b><b class='flag-5'>Redis</b>的流程

    redis集群狀態(tài)查看命令

    Redis集群是一種高可用性的分布式架構(gòu),可以通過多個(gè)節(jié)點(diǎn)實(shí)現(xiàn)數(shù)據(jù)的復(fù)制和負(fù)載均衡。為了維護(hù)集群的穩(wěn)定性和可靠性,管理員需要監(jiān)控和查看集群的狀態(tài)。下面是詳細(xì)介紹
    的頭像 發(fā)表于 12-04 10:44 ?1851次閱讀

    redis查看集群狀態(tài)命令

    Redis 是一個(gè)開源的、內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)系統(tǒng),提供了一系列命令來管理和操作數(shù)據(jù)。在 Redis 中,集群是一個(gè)由多個(gè) Redis 實(shí)例組成的分布式系統(tǒng),用于提高數(shù)據(jù)的可用性和性能
    的頭像 發(fā)表于 12-04 11:39 ?1664次閱讀

    K8S學(xué)習(xí)教程(二):在 PetaExpress KubeSphere容器平臺(tái)部署高可用 Redis 集群

    前言 Redis 是在開發(fā)過程中經(jīng)常用到的緩存中間件,為了考慮在生產(chǎn)環(huán)境中穩(wěn)定性和高可用,Redis通常采用集群模式的部署方式。 在制定Redis
    的頭像 發(fā)表于 07-03 15:30 ?1225次閱讀
    K8S學(xué)習(xí)教程(二):在 PetaExpress KubeSphere容器平臺(tái)<b class='flag-5'>部署</b>高可用 <b class='flag-5'>Redis</b> <b class='flag-5'>集群</b>

    redis三種集群方案詳解

    Redis中提供的集群方案總共有三種(一般一個(gè)redis節(jié)點(diǎn)不超過10G內(nèi)存)。
    的頭像 發(fā)表于 03-31 10:46 ?719次閱讀
    <b class='flag-5'>redis</b>三種<b class='flag-5'>集群</b>方案<b class='flag-5'>詳解</b>

    Redis集群部署與性能優(yōu)化實(shí)戰(zhàn)

    Redis作為高性能的內(nèi)存數(shù)據(jù)庫,在現(xiàn)代互聯(lián)網(wǎng)架構(gòu)中扮演著關(guān)鍵角色。作為運(yùn)維工程師,掌握Redis部署、配置和優(yōu)化技能至關(guān)重要。本文將從實(shí)戰(zhàn)角度出發(fā),詳細(xì)介紹
    的頭像 發(fā)表于 07-08 17:56 ?227次閱讀