PageSourceSearch

https://montplex.com/static/js/async/888.d21e00d2.js

js montplex.com collected 2026-10-03 21:17:53 UTC 12,347 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunkengula_website=self.webpackChunkengula_website||[]).push([["888"],{6400:function(e,n,r){r.r(n),r.d(n,{default:()=>t});var s=r(2676),d=r(453);function a(e){let n=Object.assign({h1:"h1",a:"a",h2:"h2",p:"p",strong:"strong",h3:"h3",ul:"ul",li:"li",pre:"pre",code:"code",table:"table",thead:"thead",tr:"tr",th:"th",tbody:"tbody",td:"td"},(0,d.ah)(),e.components);return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.h1,{id:"监控-engula",children:["监控 Engula",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#监控-engula",children:"#"})]}),"\n",(0,s.jsxs)(n.h2,{id:"概览",children:["概览",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#概览",children:"#"})]}),"\n",(0,s.jsxs)(n.p,{children:["Engula 与 Redis/Valkey 7.2 的监控相关协议面保持高一致,因此可以复用成熟的 Redis 监控体系。本文以 ",(0,s.jsx)(n.strong,{children:"Redis Exporter"})," + ",(0,s.jsx)(n.strong,{children:"Prometheus"})," + ",(0,s.jsx)(n.strong,{children:"Grafana"})," 为例,说明如何快速搭建 Engula 监控,并复用社区中广泛使用的 Redis Dashboard 模板。"]}),"\n",(0,s.jsxs)(n.h3,{id:"关键优势无需定制",children:["关键优势:无需定制",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#关键优势无需定制",children:"#"})]}),"\n",(0,s.jsxs)(n.p,{children:["由于 Engula 实现了 Redis 协议,现有监控工具通常 ",(0,s.jsx)(n.strong,{children:"无需修改"})," 即可使用,包括:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"经过大量生产验证的监控方案与告警经验"}),"\n",(0,s.jsx)(n.li,{children:"丰富的 Grafana Dashboard 模板与指标覆盖"}),"\n",(0,s.jsx)(n.li,{children:"成熟的 Prometheus 采集与查询体系"}),"\n"]}),"\n",(0,s.jsxs)(n.h2,{id:"架构",children:["架构",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#架构",children:"#"})]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"┌─────────────┐    ┌────────────────┐    ┌─────────────┐    ┌─────────────┐\n│   Engula    │───▶│ Redis Exporter │───▶│ Prometheus  │───▶│   Grafana   │\n│   Server(s) │    │ (oliver006)    │    │   Server    │    │  Dashboard  │\n└─────────────┘    └────────────────┘    └─────────────┘    └─────────────┘\n     6379               9121                9090               3000\n"})}),"\n",(0,s.jsxs)(n.h2,{id:"快速开始docker-compose",children:["快速开始(Docker Compose)",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#快速开始docker-compose",children:"#"})]}),"\n",(0,s.jsxs)(n.p,{children:["以下为快速部署示例(请将 ",(0,s.jsx)(n.code,{children:"engula-server:6379"})," 替换为实际地址):"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-text",children:"# docker-compose.yml\nversion: '3.8'\n\nservices:\n  redis-exporter:\n    image: oliver006/redis_exporter:latest\n    container_name: engula-redis-exporter\n    restart: unless-stopped\n    ports:\n      - \"9121:9121\"\n    environment:\n      - REDIS_ADDR=redis://engula-server:6379\n    command:\n      - '-redis.addr=redis://engula-server:6379'\n    networks:\n      - monitoring\n\n  prometheus:\n    image: prom/prometheus:latest\n    container_name: engula-prometheus\n    restart: unless-stopped\n    ports:\n      - \"9090:9090\"\n    volumes:\n      - ./prometheus.yml:/etc/prometheus/prometheus.yml\n      - prometheus_data:/prometheus\n    command:\n      - '--config.file=/etc/prometheus/prometheus.yml'\n      - '--storage.tsdb.path=/prometheus'\n      - '--storage.tsdb.retention.time=200h'\n      - '--web.enable-lifecycle'\n    networks:\n      - monitoring\n\n  grafana:\n    image: grafana/grafana:latest\n    container_name: engula-grafana\n    restart: unless-stopped\n    ports:\n      - \"3000:3000\"\n    environment:\n      - GF_SECURITY_ADMIN_USER=admin\n      - GF_SECURITY_ADMIN_PASSWORD=admin123\n    volumes:\n      - grafana_data:/var/lib/grafana\n    networks:\n      - monitoring\n\nvolumes:\n  prometheus_data:\n  grafana_data:\n\nnetworks:\n  monitoring:\n    driver: bridge\n"})}),"\n",(0,s.jsx)(n.p,{children:"启动:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"docker-compose up -d\n"})}
1),"\n",(0,s.jsxs)(n.h2,{id:"组件配置",children:["组件配置",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#组件配置",children:"#"})]}),"\n",(0,s.jsxs)(n.h3,{id:"1redis-exporter",children:["1)Redis Exporter",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#1redis-exporter",children:"#"})]}),"\n",(0,s.jsx)(n.p,{children:"Redis Exporter 通过 Redis 协议连接 Engula,并以 Prometheus 格式暴露指标。"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"# 单实例\ndocker run -d \\\n  --name engula-redis-exporter \\\n  -p 9121:9121 \\\n  oliver006/redis_exporter:latest \\\n  -redis.addr=redis://localhost:6379\n\n# 多实例\ndocker run -d \\\n  --name multi-redis-exporter \\\n  -p 9121:9121 \\\n  oliver006/redis_exporter:latest \\\n  -redis.addr=redis://engula-1:6379,redis://engula-2:6379,redis://engula-3:6379\n\n# 带认证\ndocker run -d \\\n  --name secure-redis-exporter \\\n  -p 9121:9121 \\\n  oliver006/redis_exporter:latest \\\n  -redis.addr=redis://engula-secure:6379 \\\n  -redis.password=your-password\n"})}),"\n",(0,s.jsx)(n.p,{children:"常用参数:"}),"\n",(0,s.jsxs)(n.table,{children:["\n",(0,s.jsxs)(n.thead,{children:["\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.th,{children:"参数"}),"\n",(0,s.jsx)(n.th,{children:"说明"}),"\n",(0,s.jsx)(n.th,{children:"示例"}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.tbody,{children:["\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"-redis.addr"})}),"\n",(0,s.jsx)(n.td,{children:"Engula 地址"}),"\n",(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"redis://localhost:6379"})}),"\n"]}),"\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"-redis.password"})}),"\n",(0,s.jsx)(n.td,{children:"认证密码"}),"\n",(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"-redis.password=mypass123"})}),"\n"]}),"\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"-namespace"})}),"\n",(0,s.jsx)(n.td,{children:"指标命名空间"}),"\n",(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"-namespace=engula"})}),"\n"]}),"\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"-web.listen-address"})}),"\n",(0,s.jsx)(n.td,{children:"Exporter 监听端口"}),"\n",(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"-web.listen-address=:9121"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"验证 Exporter:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"curl http://localhost:9121/metrics\n"})}),"\n",(0,s.jsxs)(n.h3,{id:"2prometheus",children:["2)Prometheus",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#2prometheus",children:"#"})]}),"\n",(0,s.jsxs)(n.p,{children:["创建 ",(0,s.jsx)(n.code,{children:"prometheus.yml"}),",从 Redis Exporter 采集指标:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-text",children:"global:\n  scrape_interval: 15s\n  evaluation_interval: 15s\n\nscrape_configs:\n  - job_name: 'engula'\n    static_configs:\n      - targets: ['redis-exporter:9121']\n    scrape_interval: 15s\n    metrics_path: /metrics\n"})}),"\n",(0,s.jsx)(n.p,{children:"验证 targets:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"curl http://localhost:9090/targets\n"})}),"\n",(0,s.jsxs)(n.h3,{id:"3grafana",children:["3)Grafana",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#3grafana",children:"#"})]}),"\n",(0,s.jsxs)(n.p,{children:["访问 ",(0,s.jsx)(n.code,{children:"http://localhost:3000"}),"(默认 admin/admin123),添加 Prometheus 数据源:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Name:",(0,s.jsx)(n.code,{children:"Engula-Prometheus"})]}),"\n",(0,s.jsxs)(n.li,{children:["URL:",(0,s.jsx)(n.code,{children:"http://prometheus:9090"}),"(本地也可用 ",(0,s.jsx)(n.code,{children:"http://localhost:9090"}),")"]}),"\n"]}),"\n",(0,s.jsxs)(n.h2,{id:"推荐-dashboard-模板",children:["推荐 Dashboard 模板",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#推荐-dashboard-模板",children:"#"})]}),"\n",(0,s.jsx)(n.p,{children:"社区中最常用的 Redis Dashboard 模板之一
1:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Dashboard ID:"})," 763"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"作者:"})," oliver006"]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["导入路径:Grafana → Import → 输入 ",(0,s.jsx)(n.code,{children:"763"})," → 选择数据源 ",(0,s.jsx)(n.code,{children:"Engula-Prometheus"}),"。"]}),"\n",(0,s.jsxs)(n.h2,{id:"常用指标示例promql",children:["常用指标示例(PromQL)",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#常用指标示例promql",children:"#"})]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-promql",children:"# 每秒命令数(QPS)\nrate(redis_commands_processed_total[5m])\n\n# 连接数\nredis_connected_clients\n\n# 内存使用\nredis_memory_used_bytes\nredis_memory_max_bytes\n\n# 命中率\n(redis_keyspace_hits_total / (redis_keyspace_hits_total + redis_keyspace_misses_total)) * 100\n"})}),"\n",(0,s.jsxs)(n.h2,{id:"最佳实践",children:["最佳实践",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#最佳实践",children:"#"})]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"采集间隔:大多数场景 15–30s 足够;高频场景按需缩短"}),"\n",(0,s.jsx)(n.li,{children:"存储保留:生产环境通常 15–30 天"}),"\n",(0,s.jsx)(n.li,{children:"安全性:生产环境建议启用认证、网络隔离,并为外部访问配置 TLS"}),"\n"]}),"\n",(0,s.jsxs)(n.h2,{id:"资源",children:["资源",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#资源",children:"#"})]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Redis Exporter:",(0,s.jsx)(n.a,{href:"https://github.com/oliver006/redis_exporter",target:"_blank",rel:"noopener noreferrer",children:"https://github.com/oliver006/redis_exporter"})]}),"\n",(0,s.jsxs)(n.li,{children:["Prometheus:",(0,s.jsx)(n.a,{href:"https://prometheus.io/docs/",target:"_blank",rel:"noopener noreferrer",children:"https://prometheus.io/docs/"})]}),"\n",(0,s.jsxs)(n.li,{children:["Grafana:",(0,s.jsx)(n.a,{href:"https://grafana.com/docs/",target:"_blank",rel:"noopener noreferrer",children:"https://grafana.com/docs/"})]}),"\n"]})]})}function i(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{wrapper:n}=Object.assign({},(0,d.ah)(),e.components);return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}let t=i;i.__RSPRESS_PAGE_META={},i.__RSPRESS_PAGE_META["zh%2Fdocs%2Fproduction%2Fmonitor.md"]={toc:[{text:"概览",id:"概览",depth:2},{text:"关键优势:无需定制",id:"关键优势无需定制",depth:3},{text:"架构",id:"架构",depth:2},{text:"快速开始(Docker Compose)",id:"快速开始docker-compose",depth:2},{text:"组件配置",id:"组件配置",depth:2},{text:"1)Redis Exporter",id:"1redis-exporter",depth:3},{text:"2)Prometheus",id:"2prometheus",depth:3},{text:"3)Grafana",id:"3grafana",depth:3},{text:"推荐 Dashboard 模板",id:"推荐-dashboard-模板",depth:2},{text:"常用指标示例(PromQL)",id:"常用指标示例promql",depth:2},{text:"最佳实践",id:"最佳实践",depth:2},{text:"资源",id:"资源",depth:2}],title:"监控 Engula",headingTitle:"监控 Engula",frontmatter:{}}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.