1.
准备工作:选型与环境核验
小分段:先确认云主机规格(CPU、内存、盘型、网络带宽)与 I/O 性能,建议选 NVMe/SSD、独享网络或高带宽包;在香港节点注意选择相邻可用区以降低跨区延迟。实际操作:使用 fio 测试磁盘(fio --name=randread --rw=randread --bs=4k --ioengine=libaio --iodepth=64 --numjobs=4 --size=1G --runtime=60 --group_reporting),用 iperf3 测测带宽,检查 vm.swappiness(sysctl vm.swappiness)。
2.
数据库引擎选择与基础配置
小分段:对 MySQL 推荐使用 InnoDB:设置 innodb_buffer_pool_size=物理内存的60%-75%,innodb_flush_log_at_trx_commit=2(可牺牲1秒的持久性换性能),innodb_log_file_size=512M-2G。示例 my.cnf 关键项:innodb_buffer_pool_instances=4、max_connections 根据应用并发设定、thread_cache_size=200。重启 MySQL 前备份并按步骤增大 log file(删除旧 ib_logfile 后重启)。
3.
索引与查询优化的具体步骤
小分段:启用慢查询日志(slow_query_log=1,long_query_time=0.5),使用 pt-query-digest 或 mysqldumpslow 分析。对慢查询做 EXPLAIN,检查是否走索引、是否有 filesort 或 full table scan。实操:添加覆盖索引(包括需返回的列),避免在 WHERE 上对列做函数或类型转换,避免 SELECT *,分页用 keyset pagination(WHERE id > last_id LIMIT n)。
4.
连接管理与连接池配置
小分段:在应用层使用连接池(例如 Java 用 HikariCP,配置 maximumPoolSize 与 minimumIdle),数据库侧设置 max_connections 留有余量。示例 HikariCP:maximumPoolSize=50, connectionTimeout=30000。监控连接数:SHOW PROCESSLIST;若大量 TIME_WAIT,调整 tcp_tw_reuse/somaxconn。
5.
读写分离与扩展策略
小分段:建立主从复制(MySQL Replication 或使用云厂商只读副本),写入主库,读请求走只读副本。实操步骤:在主库启用 binlog_format=ROW,创建 replication 用户(GRANT REPLICATION SLAVE),在从库执行 CHANGE MASTER TO ... 并 START SLAVE。结合负载均衡(ProxySQL 或 HAProxy)按权重分配读流量。
6.
分区与归档:应对大表策略
小分段:对按时间增长的大表使用分区(Range 或 List),定期 DROP 或 ARCHIVE 历史分区。实操:ALTER TABLE t PARTITION BY RANGE (TO_DAYS(created_at)) (PARTITION p202501 VALUES LESS THAN (TO_DAYS('2025-02-01')),...); 归档时用 pt-archiver 或单独 ETL 到归档库以避免影响 OLTP。
7.
Redis 缓存部署与内存管理
小分段:部署 Redis 在独立实例上,配置 maxmemory 和 maxmemory-policy=allkeys-lru。实操配置示例:redis.conf 中设置 maxmemory 16gb、maxmemory-policy allkeys-lru,并启用 tcp-keepalive=60、tcp-backlog=10000。启动时使用 jemalloc(默认),可减少内存碎片:redis-server --protected-mode no /etc/redis/redis.conf。
8.
Redis 持久化与持久性权衡
小分段:若对持久性要求高,启用 AOF(appendonly yes)并选择 appendfsync everysec;若追求性能和可恢复性可用 RDB 快照结合主从复制和定期备份。实操:在高 QPS 场景建议关闭 AOF 或使用 everysec,同时确保从节点可随时接手。
9.
Redis 高可用与集群方案
小分段:小规模选择 Sentinel 保证主从故障转移,大规模使用 Redis Cluster 分片。实操:Sentinel 配置文件指定 monitor、down-after-milliseconds、failover-timeout。Cluster 部署需至少 3 主、3 从,使用 redis-trib 或 redis-cli --cluster create 完成。
10.
系统层与内核调优建议
小分段:调整内核参数:sysctl -w vm.swappiness=1;net.core.somaxconn=65535;fs.file-max=200000;关闭透明大页 echo never > /sys/kernel/mm/transparent_hugepage/enabled;配置 ulimit -n 100000。禁用交换分区避免 Redis/DB 被换出。
11.
监控、告警与容量规划
小分段:部署 Prometheus + Grafana 监控 MySQL / Redis 指标(buffer pool hit rate、cache hit、QPS、latency、used_memory、evicted_keys)。脚本化慢查询/内存报警:当慢查询数、QPS/延迟异常时自动告警并触发排查步骤。容量计划基于增长率和 SLO 做年/季度扩容。
12.
常见故障排查实操步骤
小分段:数据库高负载:先 top/iostat 查看 I/O/CPU,SHOW PROCESSLIST 找慢查询,开启慢日志并分析;Redis 内存突增:redis-cli info memory 查看 used_memory_peak,执行 redis-cli CONFIG GET maxmemory;若频繁 OOM 或碎片高,考虑重启(在低峰)并逐步增加 maxmemory。
13.
问:在香港云服务器上,MySQL 的 innodb_buffer_pool_size 应该设多大?
小分段:答:通常设置为物理内存的60%-75%,留出给操作系统、缓存与其他进程。例如 64GB 内存的主机可以将 innodb_buffer_pool_size 设为 40GB-48GB;对混合负载或并发较高场景,分配略低并增加 buffer_pool_instances。
14.
问:Redis 遇到内存碎片化严重如何处理?
小分段:答:先通过 redis-cli info memory 查看 fragmentation_ratio,若 >1.5,考虑使用 jemalloc(或升级到支持的内存分配器)、重启节点在低峰时间清理并合理设置 maxmemory、使用合适的对象编码(短字符串尽量用 small strings),必要时做逐台滚动重启并扩容内存。
15.
问:如何在香港节点兼顾低延迟与高可用?
小分段:答:在同一可用区内部署主库与只读副本以保证最低网络延迟,同时跨可用区部署额外只读副本作为容灾;使用读写分离与智能负载均衡(ProxySQL)按权重路由读取请求,监控复制延迟并在延迟超过阈值时暂时停止从库读。
来源:香港云服务器好用的软件在数据库与缓存方面的性能提升技巧