我之前的文章里有分享过自己总结的做技术选型的思考框架,本文将会分享一下我总结的做系统组件调优/优化的思考框架。
组件优化的思考框架
常见的互联网架构基本离不开数据库、缓存、消息队列、搜索、数据处理等等各种组件,虽然组件的形态不一、功能不同,但是我仍然把对他们的优化总结归纳为了以下几点:
这几点分别为:
环境与配置
:对组件的运行环境、组件的系统配置做优化。数据结构/组织
:对在该组件中如何定义数据结构或组织数据的方向上思考优化。使用侧
:作为该组件的客户端一侧,使用组件时做优化。与其它组件协作
:该组件之外,与其它组件更好地协作完成系统整体性的优化。
这么说也许有些抽象,以下以一些常见的组件/中间件为例,看看如何使用整套思考框架。
常见组件使用示例
MySQL
MySQL 通过上述框架可以伸展出以下的点:
环境与配置
:- 高性能的硬件,如 SSD 和更大内存。
- 调整连接数、线程数、buffer、cache 等等配置。
- 主从。
数据结构/组织
:- 设计合理的数据表结构,范式化或反范式。
- 适当的索引(如三星索性原则)。
- 分库分表。
使用侧
:- 查询尽可能命中索引、适当的 JOIN 联表、避免深度分页。
- 使用连接池。
- 批量操作、减少网络往返耗时。
与其它组件协作
:- 与缓存、NoSQL 等组件协作。
Redis
Redis:
环境与配置
:- 高性能的硬件、禁用 swap。
- 调整最大内存、淘汰策略、持久化、多线程等等配置。
- 集群、主从(哨兵)。
数据结构/组织
:- 选择合适的数据结构。
- 避免大 key。
- 让数据分布得更均衡。
使用侧
:- 使用连接池。
- 批量操作、减少网络往返耗时。
- 避免单个指令阻塞。
与其它组件协作
。
Kafka
Kafka:
环境与配置
:- 高性能的硬件。
- 调整分区数、副本、持久化策略等等配置。
- 集群。
数据结构/组织
:- 控制消息大小。
- 合适的分区键设计。
- 合理规划 topic 和分区。
使用侧
:- 合适的
acks
。 - 合并小消息,减少请求次数。
- 适当的消费者数量。
- 合适的
与其它组件协作
。
Elasticsearch
Elasticsearch:
环境与配置
:- 高性能的硬件、禁用 swap。
- 调整 JVM、分区数、副本数、刷新周期等等配置。
- 集群。
数据结构/组织
:- 合适的 mapping,避免 mapping 爆炸。
- 合适的数据类型,是否构建索引、保留源数据。
- 合并 shard 和 segment。
使用侧
:- 使用 Bulk API 批量操作。
- 避免深度分页,避免 join 操作。
- 只返回需要的字段。
- 使用 preference 路由到同样的节点。
与其它组件协作
。
总结
通过建立结构化的思考框架,可以避免我们在面对问题时陷入混乱和无序。本文仅供参考,更重要的是自我思考并构建自己的框架和系统。
(我是凌虚,关注我,无广告,专注技术,不煽动情绪,欢迎与我交流)