资讯动态

InfluxDB与Grafana监控体系实战:从时序数据存储到可视化告警

发布时间:2026/8/13 13:15:18 来源:尧图企业网站定制
1. 项目概述为什么选择 InfluxDB Grafana 构建监控体系在运维和开发领域监控是保障系统稳定性的“眼睛”。我见过太多团队要么还在用简陋的脚本轮询日志要么被商业监控方案的高昂成本和复杂部署劝退。直到我深度实践了 InfluxDB 配合 Grafana 这套组合才真正找到了一个既强大又灵活、从个人项目到企业级场景都能驾驭的监控解决方案。这套方案的核心简单来说就是用 InfluxDB 这个专门为时序数据设计的数据库来高效存储你服务器、应用、传感器产生的海量时间序列指标再用 Grafana 这个顶级的可视化工具将冰冷的数据变成直观、可交互的仪表盘。它解决的不仅仅是“有没有监控”的问题更是“监控是否高效、直观、可定制”的问题。这套组合特别适合几类人一是中小团队的运维或开发工程师需要快速搭建一套内部监控而不想投入过多成本二是物联网开发者需要处理大量从设备上报的时序数据三是任何对系统性能、业务指标有可视化分析需求的个人或团队。它的魅力在于每一个组件都专注于自己的领域InfluxDB 把数据存好、查快Grafana 把数据画好看、讲明白两者通过简单的接口连接产生了“112”的效果。接下来我会带你从零开始拆解这套体系的每一个核心环节分享我趟过的坑和积累的经验让你不仅能部署起来更能理解其背后的设计逻辑打造属于你自己的监控中枢。2. 核心组件深度解析InfluxDB 与 Grafana 如何各司其职2.1 InfluxDB为时间序列数据而生的引擎很多人把 InfluxDB 简单地理解成一个数据库这低估了它的价值。它本质上是一个为“时间戳-数值”这种数据结构高度优化的存储和计算引擎。想象一下监控场景CPU 使用率每5秒采集一次产生一个时间戳 75.2%的数据点。一天就是17280个点。传统的 MySQL 或 PostgreSQL 存这种数据索引效率低查询慢磁盘占用大。而 InfluxDB 的底层数据结构TSM Time-Structured Merge Tree就是为解决这个问题设计的它对时间戳进行高效编码和压缩使得写入速度极快按时间范围查询的性能更是传统数据库的数十倍甚至上百倍。InfluxDB 有几个核心概念必须理清这是后续一切操作的基础Measurement测量相当于关系型数据库里的表用于归类相同类型的数据。比如你可以有一个叫server_metrics的 measurement 来存放所有服务器的指标。Tag标签是索引字段用于标识数据的维度。Tag 是键值对会被索引查询效率高适合用来过滤和分组。例如hostweb-server-01,regionus-east-1。一个点可以有多个 tag。Field字段是实际存储的指标值不会被索引。它们是真正的监控数据如cpu_usage65.4,memory_free1024。Field 支持浮点数、整数、字符串和布尔类型。Timestamp时间戳每个数据点都必须有的时间标识可以是纳秒精度。如果写入时不提供InfluxDB 会自动使用服务器当前时间。一个数据点的完整结构示例Measurement,TagSet FieldSet Timestamp。例如server_metrics,hostweb01,appnginx cpu_usage42.5,mem_used2048 1672531200000000000。这种数据模型设计使得针对特定主机hostweb01在过去一小时内时间范围的 CPU 使用率cpu_usage进行聚合查询如求平均值变得异常高效。注意在 InfluxDB 1.x 和 2.x 版本中API 和数据模型有较大变化。1.x 使用独立的数据库Database和保留策略Retention Policy概念API 相对简单。2.x 引入了 Bucket桶融合了数据库和保留策略、Organization组织等概念并强化了 Flux 查询语言。目前社区和大量现有工具仍主要兼容 1.x 的 API即 InfluxDB 的/write和/query端点。对于新手和大多数监控集成场景我建议从理解和兼容 1.x 的 API 开始因为 Telegraf、Grafana 等生态工具对其支持最为成熟稳定。本文的实操也将主要围绕 1.x 兼容的 API 进行。2.2 Grafana让数据会说话的可视化利器如果说 InfluxDB 是强大的后台那么 Grafana 就是光彩夺目的前台。它本身不存储数据而是作为一个数据可视化平台从包括 InfluxDB 在内的多种数据源如 Prometheus、MySQL、Elasticsearch 等拉取数据然后通过丰富的图表折线图、柱状图、仪表盘、热图等展示出来。它的核心优势在于强大的面板生态系统除了内置面板还有庞大的社区插件市场你可以找到监控网络、天气、股票甚至游戏数据的各种面板。灵活的仪表盘编排通过拖拽方式自由布局可以创建包含数十个图表、层次分明的综合监控视图。告警与通知可以基于查询结果设置灵活的告警规则并通过钉钉、微信、邮件、Slack、Webhook 等多种渠道发送通知。团队协作与权限支持多用户、多团队可以设置不同数据源和仪表盘的查看、编辑权限。Grafana 与 InfluxDB 的配合是天作之合。Grafana 提供数据源配置写好查询语句InfluxQL 或 Flux就能实时地将 InfluxDB 中动态变化的数据流转化为静态仪表盘上跳动的曲线和数值让运维状态一目了然。3. 环境准备与安装部署实战3.1 操作系统与资源规划这套组合对系统资源要求并不苛刻。一个轻量级的监控系统在 2核 CPU、4GB 内存、50GB 磁盘的虚拟机上就能运行得很好。关键点在于磁盘 I/O因为 InfluxDB 的写入和压缩操作比较频繁使用 SSD 磁盘会显著提升性能。操作系统方面主流的 Linux 发行版如 Ubuntu 20.04/22.04 LTS, CentOS 7/8都是绝佳的选择社区支持完善安装也最方便。我个人更倾向于使用 Ubuntu Server LTS 版本因为其软件包较新安装依赖更简单。以下实操均以 Ubuntu 22.04 为例。如果你使用其他系统命令可能需要微调如将apt换成yum。3.2 InfluxDB 1.x 兼容版本安装与配置如前所述我们选择安装 InfluxDB 的 1.x 兼容版本。这里我们安装 InfluxDB 官方维护的 2.x 版本但使用其兼容 1.x 的 API 功能。添加 InfluxData 仓库并安装# 导入 GPG 密钥 wget -q https://repos.influxdata.com/influxdata-archive.key echo 23a1c8836f0afc5ed24e0486339d7cc8f6790b83886c4c96995b88a061c5bb41 influxdata-archive.key | sha256sum -c cat influxdata-archive.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/influxdata.gpg /dev/null echo deb [signed-by/etc/apt/trusted.gpg.d/influxdata.gpg] https://repos.influxdata.com/debian stable main | sudo tee /etc/apt/sources.list.d/influxdata.list # 更新包列表并安装 InfluxDB 2.x sudo apt update sudo apt install influxdb2初始设置与启动 安装完成后需要初始化设置。这个过程会创建一个初始用户、组织和存储桶。# 启动服务 sudo systemctl start influxdb sudo systemctl enable influxdb # 运行初始化设置 influx setup执行influx setup后按照交互提示输入Username 管理员用户名如adminPassword 设置一个强密码Organization 组织名称如my-orgBucket 初始存储桶名称如monitoring_bucketRetention Period 数据保留期输入0表示永久保留生产环境请根据磁盘空间设定如52w代表52周启用 1.x 兼容 API 这是关键一步。我们需要配置 InfluxDB 2.x 启用对 1.x 协议的兼容。# 获取你的管理员令牌Token用于后续认证 influx auth list --user admin --json | jq -r .[0].token复制输出的令牌一串长字符串。然后我们需要创建一个配置来启用 1.x 兼容服务。 编辑 InfluxDB 的配置文件通常位于/etc/influxdb/influxdb.conf或/etc/influxdb2/config.toml取决于版本。对于通过包安装的 2.x我们更常使用环境变量或启动参数。更简单的方法是使用influxCLI 命令来创建 DBRPDatabase and Retention Policy Mapping映射。# 设置环境变量方便后续命令使用 export INFLUX_TOKEN你的管理员令牌 export INFLUX_ORGmy-org # 创建一个 DBRP 映射将 1.x 的“数据库/保留策略”概念映射到 2.x 的“桶” influx v1 dbrp create \ --db my_monitoring_db \ --rp autogen \ --bucket-id $(influx bucket list -n monitoring_bucket --json | jq -r .[0].id) \ --default这个命令创建了一个映射当 1.x 客户端向数据库my_monitoring_db和保留策略autogen写入数据时实际上会写入到我们之前创建的monitoring_bucket桶中并且将其设为默认映射。验证 1.x 兼容 API 首先为 1.x API 创建一个专属的“全权限”令牌All-access Token这个令牌将拥有读写桶的权限。influx auth create --org my-org --all-access --description “Token for 1.x API”复制新创建的这个令牌我们称之为V1_TOKEN。 现在我们可以使用经典的 1.x API 格式进行测试# 写入一个数据点 curl -i -XPOST http://localhost:8086/write?dbmy_monitoring_dbrpautogenuadminp$V1_TOKEN \ --data-binary cpu_usage,hosttest-server value65.4 # 查询数据 curl -G http://localhost:8086/query?dbmy_monitoring_dbuadminp$V1_TOKEN \ --data-urlencode qSELECT * FROM cpu_usage如果写入和查询都返回成功HTTP 200说明 1.x 兼容 API 已正常工作。3.3 Grafana 安装与初始登录Grafana 的安装相对直接。安装 Grafana# 添加 Grafana APT 仓库 sudo apt-get install -y software-properties-common sudo add-apt-repository “deb https://packages.grafana.com/oss/deb stable main” wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add - sudo apt update sudo apt install grafana启动并设置开机自启sudo systemctl start grafana-server sudo systemctl enable grafana-server初始访问 Grafana 默认运行在3000端口。打开浏览器访问http://你的服务器IP:3000。首次登录用户名和密码都是admin。系统会立即要求你修改密码。请务必设置一个强密码。4. 数据采集与写入打通监控数据链路数据库和面板都准备好了现在需要把数据灌进去。数据采集是监控的“源头活水”。4.1 使用 Telegraf 作为全能采集器InfluxData 自家的 Telegraf 是首推的采集代理。它是一个插件驱动的服务器代理用于收集和报告指标拥有数百个输入插件Input Plugins来收集系统、服务、硬件等各方面的数据。安装 Telegraf# 同样使用 InfluxData 仓库 sudo apt install telegraf配置 Telegraf Telegraf 的主配置文件是/etc/telegraf/telegraf.conf。我们需要配置输入插件收集什么和输出插件发到哪里。配置输出Output找到[[outputs.influxdb_v2]]部分如果没有就添加配置如下[[outputs.influxdb_v2]] urls [“http://localhost:8086”] # InfluxDB 地址 token “$INFLUX_TOKEN” # 替换为你的 V1_TOKEN 或具有写权限的令牌 organization “my-org” bucket “monitoring_bucket”注意这里我们使用 InfluxDB 2.x 的 API 进行写入因为 Telegraf 的新版本插件对 2.x 支持更好。这并不影响我们通过 1.x 兼容 API 读取。配置输入Input启用一些基本的系统监控输入插件。在配置文件中找到或添加[[inputs.cpu]] percpu true # 收集每个核心的指标 totalcpu true # 收集总的 CPU 指标 collect_cpu_time false # 通常不需要收集 CPU 时间 report_active false [[inputs.mem]] # 内存指标 [[inputs.disk]] # 磁盘指标 ignore_fs [“tmpfs”, “devtmpfs”, “devfs”, “iso9660”, “overlay”, “aufs”, “squashfs”] # 忽略虚拟文件系统 [[inputs.diskio]] # 磁盘 IO 指标 [[inputs.net]] # 网络指标 [[inputs.system]] # 系统负载、运行时间等保存并退出配置文件。启动 Telegrafsudo systemctl start telegraf sudo systemctl enable telegraf验证数据写入 等待一两分钟后回到 InfluxDB 的查询界面或使用之前的 curl 命令查询telegraf数据库Telegraf 默认会创建一个同名的数据库/测量。在 Grafana 配置好数据源后下一步会讲你也可以在 Explore 页面查询cpu、mem等 measurement应该能看到实时数据了。4.2 自定义应用指标写入除了系统指标你的应用程序也需要暴露监控指标。通常有几种方式直接使用 InfluxDB 客户端库在你的代码中集成 InfluxDB 的客户端如 Python 的influxdb-client Go 的github.com/influxdata/influxdb-client-go/v2在关键位置调用写入接口。通过 HTTP API 写入这是最通用和简单的方式。任何能发送 HTTP POST 请求的语言或工具都可以。使用我们之前启用的 1.x 兼容 API 端点。# 示例使用 curl 写入业务指标 curl -i -XPOST “http://localhost:8086/write?dbmy_monitoring_dbuadminp$V1_TOKEN” \ --data-binary ‘order_metrics,servicepayment,envprod order_count1,amount_total99.99’这条命令向my_monitoring_db数据库的order_metrics测量中写入了一个点包含了service和env两个标签以及order_count和amount_total两个字段。实操心得在规划标签Tag时要遵循一个原则用标签标识数据的维度用字段存储具体的度量值。例如host、region、service、version这些用于筛选和分组的属性应该作为标签。而cpu_usage、response_time_ms、error_count这些具体的数值应该作为字段。这样设计查询效率最高也最符合 InfluxDB 的数据模型。5. Grafana 配置与仪表盘创建5.1 添加 InfluxDB 数据源这是连接 Grafana 和 InfluxDB 的关键一步。在 Grafana 左侧导航栏点击Configuration齿轮图标-Data Sources。点击Add data source选择InfluxDB。配置连接参数Name 起个名字如InfluxDB-Monitoring。Query Language 选择InfluxQL。这是 1.x 的查询语言对于从 1.x 兼容 API 查询数据是最直接的选择。Flux 功能更强大但学习曲线稍陡。URLhttp://localhost:8086如果 Grafana 和 InfluxDB 在同一台机器。Access 选择Server默认。这意味着由 Grafana 服务器端去连接数据源而不是浏览器直连。Database 填写我们在 DBRP 映射中创建的数据库名my_monitoring_db。User / Password 这里填写的是 InfluxDB 1.x 兼容 API 的用户名和密码。注意这里不能直接填 2.x 的令牌。我们需要创建一个专门的 1.x 兼容用户。回到命令行为 1.x API 创建一个用户# 使用 influx v1 auth create 命令 influx v1 auth create --username grafana_user --password your_strong_password --read-database my_monitoring_db --org my-org将这里创建的grafana_user和your_strong_password填入 Grafana 数据源的配置中。Min time interval 建议设置为10s或30s。这定义了面板自动刷新时每次查询的最小时间间隔有助于避免过于频繁的查询拖慢数据库。点击Save Test。如果看到 “Data source is working” 的绿色提示说明配置成功。5.2 创建你的第一个监控仪表盘点击左侧导航栏的Dashboards田字格图标-New Dashboard-Add a new panel。配置查询Query在面板编辑器的 “Query” 标签页下数据源选择我们刚添加的InfluxDB-Monitoring。在查询编辑器里输入 InfluxQLSELECT mean(“usage_idle”) FROM “cpu” WHERE $timeFilter GROUP BY time($__interval), “cpu” fill(null)解释一下SELECT mean(“usage_idle”) 计算usage_idle字段的平均值。Telegraf 采集的 CPU 使用率通常是100 - usage_idle。FROM “cpu” 从cpu这个 measurement 查询。WHERE $timeFilter$timeFilter是 Grafana 的变量会自动替换为仪表盘右上角选择的时间范围。GROUP BY time($__interval), “cpu” 按时间间隔$__intervalGrafana 根据时间范围自动计算的一个合理间隔和 CPU 核心进行分组。fill(null) 对于没有数据的时间间隔用 null 填充显示为断线。点击Run queries下方应该能看到数据曲线。可视化设置Visualization在右侧的 “Visualization” 下拉框中选择Time series时间序列图。在 “Panel options” 中可以修改标题如 “CPU 使用率”。在 “Axis” 设置中可以修改 Y 轴的单位为 “percent (0-100)”并将左侧的 “Unit” 设置为percent(0-100)。为了显示使用率我们可以对查询进行转换。一个更直接的查询是SELECT 100 - mean(“usage_idle”) AS “cpu_usage” FROM “cpu” WHERE $timeFilter GROUP BY time($__interval), “cpu”。这样直接得到使用率百分比。应用与保存点击右上角的Apply保存这个面板。回到仪表盘视图点击顶部的Save dashboard磁盘图标保存整个仪表盘。5.3 构建综合监控视图一个完整的监控仪表盘通常包含多个面板系统概览 CPU 使用率、内存使用率、系统负载load1fromsystem、磁盘使用率需要从disk测量计算。网络与 IO 网络流量bytes_recv,bytes_sentfromnet、磁盘读写速率read_bytes,write_bytesfromdiskio。业务指标 根据你的自定义测量创建订单量、响应时间、错误率等面板。你可以通过拖拽调整面板位置和大小。利用Row功能可以将相关面板分组使仪表盘更整洁。注意事项在编写 InfluxQL 查询时要特别注意数据保留策略Retention Policy。在 1.x 兼容模式下我们使用的是autogen这个默认 RP。如果你的数据量非常大需要设置自动删除旧数据的策略需要在 InfluxDB 端进行配置例如在初始化时设置 Bucket 的保留期而不是在 Grafana 查询中处理。Grafana 的$timeFilter只负责查询时间范围不负责管理数据生命周期。6. 告警配置从“看见”问题到“感知”问题监控的可视化是第一步主动告警才是将运维从被动转为主动的关键。Grafana 的告警功能非常强大。6.1 创建告警规则在之前创建的 CPU 使用率面板上点击标题选择Edit。在面板编辑器中切换到Alert标签页。点击Create alert rule from this panel。这会基于当前面板的查询创建一个告警规则。配置告警条件Rule name 例如 “High CPU Usage”。Evaluate every 评估频率例如1m。For 持续时间例如5m。表示条件持续满足 5 分钟才触发告警避免因瞬时尖峰产生噪音。ConditionsWHENlast()OFquery(A, 1m, now)这里A对应你的查询。IS ABOVE80。意思是当查询 A 的结果最近一分钟的平均 CPU 使用率持续 5 分钟高于 80% 时触发告警。你可以设置多个条件用AND/OR连接。配置告警通知 在Notifications部分点击Connect contact points。你需要先配置一个“联系点”。6.2 配置告警通知渠道以钉钉为例在 Grafana 左侧导航栏进入Alerting-Contact points。点击Add contact point。Name 例如DingTalk。Integration 选择DingDing如果没有可能需要安装钉钉告警插件grafana-dingding-notifier或使用更通用的Webhook。Webhook URL 这是关键。你需要在钉钉群里添加一个“机器人”并获取其 Webhook 地址。在钉钉群 - 群设置 - 智能群助手 - 添加机器人 - 自定义。安全设置选择“加签”或“关键词”。获取 Webhook URL。将 Webhook URL 填入 Grafana。根据钉钉机器人的要求可能需要设置Message字段使用 Grafana 的模板变量如{{ define “ding.link.title” }}【{{ .Status | toUpper }}】{{ .GroupLabels.alertname }}{{ end }} {{ define “ding.link.content” }} **告警名称**: {{ .GroupLabels.alertname }} **触发时间**: {{ .StartsAt.Format “2006-01-02 15:04:05” }} **监控指标**: {{ .Annotations.summary }} **当前值**: {{ .Values.B.Value | printf “%.2f” }}% **详情**: [点击查看面板]({{ .GeneratorURL }}) {{ end }}保存联系点。回到告警规则编辑页面在Notifications部分选择你刚创建的DingTalk联系点。现在当 CPU 使用率持续超过80%时你的钉钉群就会收到告警消息了。同样的方法可以配置邮件、Slack、企业微信等渠道。7. 性能调优与生产环境考量当监控数据量增长到一定规模或者对可靠性要求提高时就需要考虑调优和高可用。7.1 InfluxDB 性能优化要点硬件层面SSD 磁盘是必须的。内存越大越好InfluxDB 会利用内存缓存热数据和索引。建议为 InfluxDB 进程分配足够的内存通过环境变量INFLUXDB_DATA_CACHE_MAX_MEMORY_SIZE或配置文件设置。配置调整[data]部分下的cache-max-memory-size 增加缓存大小如“4g”。[data]下的cache-snapshot-memory-size 增加快照内存大小如“256m”。[http]下的max-concurrent-write-limit和max-enqueued-write-limit 根据写入负载调整并发写入限制。保留策略Retention Policy 这是控制数据生命周期和磁盘占用的关键。务必根据数据重要性和磁盘容量设置合理的 RP。例如原始数据保留7天降采样后的小时级数据保留90天日级数据保留1年。这需要通过 InfluxDB 的CREATE RETENTION POLICY命令或 2.x 的 Bucket 保留期来设置。写入优化批量写入Batching 绝对不要逐点写入。使用客户端库的批量功能或 Telegraf 这样的代理将数据点积攒到一定数量如 1000 点或一定时间如 10 秒后一次性写入。这能极大减少 HTTP 请求开销。点序列化 确保你的数据点格式正确标签和字段之间用逗号分隔点与点之间用换行符分隔。7.2 Grafana 使用与维护技巧仪表盘变量Dashboard Variables 这是提升仪表盘复用性的神器。你可以创建变量如$host 值从查询SHOW TAG VALUES FROM cpu WITH KEY “host”获取然后在面板查询中使用WHERE host ~ /^$host$/。这样通过一个下拉框就能动态切换查看不同主机的数据。面板链接与钻取 可以在面板上设置链接点击后跳转到更详细的仪表盘或外部系统实现监控的层级钻取。权限控制 在生产环境利用 Grafana 的Organizations、Teams和Folders功能来管理权限。可以为不同团队创建不同的组织或文件夹并分配相应的数据源和仪表盘权限。定期备份 Grafana 的仪表盘定义、数据源配置、用户信息等都存储在数据库中默认是 SQLite生产环境建议用 PostgreSQL 或 MySQL。定期备份这个数据库。仪表盘本身也可以导出为 JSON 文件这是一种轻量级的备份方式。7.3 常见问题排查实录Grafana 图表显示 “No data”检查数据源连接 在 Data Sources 页面测试连接。检查查询语句 确认 Measurement 名称、Field 名称、Tag 条件是否正确。特别是 Tag 的 key 和 value 是否完全匹配区分大小写。使用 Grafana 的Explore功能可以交互式地探索数据库查看有哪些 Measurement、Tag、Field。检查时间范围 确认仪表盘右上角的时间范围是否覆盖了有数据的时间段。检查权限 确认 Grafana 连接 InfluxDB 使用的用户名密码是否有对应数据库的读权限。数据写入失败HTTP 400/404检查数据库和 RP 确认写入 URL 中的db和rp参数是否正确且该数据库/RP 已存在。检查用户权限 写入用户需要对目标数据库有写权限。检查数据格式 使用--verbose模式运行 curl或查看客户端日志确认发送的数据格式完全符合 InfluxDB 的行协议Line Protocol。一个常见的错误是字段值或标签值中有未转义的空格或逗号。InfluxDB 磁盘空间增长过快检查保留策略 使用SHOW RETENTION POLICIES ON my_monitoring_db查看 RP 设置。确认是否有设置自动清理过期数据的策略。考虑降采样Downsampling 对于历史数据可以创建连续查询Continuous Query将高精度的原始数据聚合如每秒一点聚合成每分钟一点后存入另一个 RP 或数据库然后删除原始数据。这能大幅节省空间。在 2.x 中这可以通过Tasks功能实现。Grafana 查询慢优化查询 避免使用SELECT *明确指定需要的字段。合理使用WHERE条件过滤数据特别是利用索引好的 Tag。避免在查询中对 Field 进行复杂的函数计算如果可能在写入时预先计算好。调整 Group By 间隔$__interval在长时间范围如 30 天内可能会变得很大如 1 小时导致查询的数据点很少。有时需要手动指定一个更小的GROUP BY time(1m)来获取更细的粒度但这会增加查询负载需要权衡。检查 InfluxDB 性能 使用 InfluxDB 自带的_internal数据库监控其自身状态查看写入延迟、查询响应时间等指标。这套 InfluxDB Grafana 的监控组合从我的实践经验来看其强大之处在于极高的自由度和灵活性。它不像一些开箱即用的监控系统给你定死了看什么而是给了你一套乐高积木让你能搭建出完全贴合自己业务和技术栈的监控宫殿。从服务器的基础指标到复杂的业务链路追踪只要你把数据按正确的格式灌进去就能用 Grafana 以几乎任何你想要的方式呈现出来。启动和运行基础功能很简单但真正发挥其威力需要你在数据模型设计、查询优化和仪表盘编排上持续投入精力。这个过程本身就是对自身系统理解不断深化的过程。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价