MySQL运维设计三合一:站长全栈实战路径
|
去年双十一,老杨在我们运维群甩了张截图——白底黑字写着“MySQL运维设计三合一:站长全栈实战路径”,配文:“这标题看着像卖课的,结果PDF里真有凌晨三点调innodb_buffer_pool_instances的截图。”我正扒拉外卖盒里的麻婆豆腐,筷子尖戳进一块豆腐渣,没夹起来,汤汁滴在键盘右下角。当时窗外在下冷雨,雨刮器节奏不对,卡顿两下又猛地甩一次,跟我们那台主库的redo log刷盘一样不讲理。 我说我两个月之前干过一模一样的事:给一个接私活的站长搭整套站群系统,域名、CDN、PHP-fpm、MySQL全包,他连binlog格式都分不清row和statement,但提需求时手速比写ALTER TABLE还快——“首页加个轮播图”,“后台要能导出Excel”,“用户注册必须短信+邮箱双验证”。我原以为顶多是配错max_connections,结果第二天早上六点四十七,他微信语音炸进来:“杨哥你看看数据库是不是崩了?我点提交按钮它转圈转了十八秒。”我一边按免提一边拧开保温杯盖,茶叶沫子浮在水面上,像没purge掉的undo页。 去机房的路上遇到DBA老周,他蹲在空调外机旁抽烟,火星子被风吹得忽明忽暗,手里捏着半张打印纸,是昨晚上刚跑完的pt-duplicate-key-checker报告。他头也没抬说:“你那个站,索引建得……跟装修队贴瓷砖似的,横竖都留缝。”我没接话,因为他说得对——我自己建的联合索引,第一个字段是user_id,第二个是created_at,第三个是status,可他们90%的查询根本没传user_id,只查created_at和status,等于把三层楼的钥匙全塞进第一把锁孔里硬捅。这个我敢打包票,EXPLAIN看执行计划的时候,rows那列飘着三千七十二,不是估算值,是实打实扫出来的。
文章配图,仅供参考 回工位泡茶时发现杯子底下压着张便签,是实习生小吴写的:“杨哥,你昨天删的那张临时表,t_user_login_log_202311_bak_old_v2_backup_final_final,其实还有三个地方SELECT它……”我盯着“final_final”那几个字看了七秒,没动,端起杯子吹了口气,热气糊住眼镜片。后来我搜了全文,果然,在客服系统后台导出报表的SQL里、在BI定时任务脚本里、在前端埋点上报失败日志的兜底补录逻辑里,全写着这张表名。没人改,就挂着,像墙皮上没铲干净的旧腻子。这个我说不准——是懒得动,还是不敢动,还是压根不知道谁动过?中间有段插曲:前天下午三点十五,市场部王姐突然推门进来,拎着一杯冰美式,左手捏着手机不停刷小红书,右手食指在屏幕上划拉三下,说:“咱们网站能不能也搞个‘瞬时加载’效果?就是那种——用户手指还没抬起来,页面已经跳完了。”她说话时头发丝儿还沾着电梯口的水汽,鞋跟哒哒哒敲着地板砖缝,像在打节拍器。我当时正在改slow_query_log阈值,从五秒改成零点八秒,光标悬在配置文件里没落下去。我没回她,但心里清楚:你手机三年前的红米Note7,Chrome内核57,fetch API都不支持AbortController,你还指望它瞬时?可我没说出口,只点了下保存,服务器那边立刻响了一声告警——不是邮件,是机柜顶上那个破蜂鸣器,“嘀”一声,像牙医电钻空转。 再说回那个“三合一”。它站得住的地方,其实是优胜劣汰。不是理论优胜,是实操优胜:你把mysqld_safe换成systemd管理,能扛住进程意外退出;你把主从延迟监控从SHOW SLAVE STATUS改成解析relay-log+GTID比对,能提前二十分钟发现复制断裂;你把慢查分析从mysqldumpslow换成pt-query-digest喂给grafana面板,运营半夜三点发微信问“为啥今天下单特别慢”,你能直接甩出热力图——哪个时间段、哪个SQL、影响多少UV。这些东西不新鲜,但谁坚持用?谁愿意为一个非核心功能多写三百行Python胶水脚本?没人。所以最后活下来的,从来不是最懂InnoDB底层的,是那个把my.cnf改了十六遍、每次上线前手动touch /var/lib/mysql/.healthcheck的家伙。老杨上个月还在吐槽Vue组件跨域资源预加载失效的问题,结果他上周自己写了段Shell脚本,自动检测CDN回源超时后切到备用静态服务——你看,他根本没碰过MySQL,但思路是一样的:不靠猜,靠埋点;不靠人盯,靠自愈。 对了,刚才接了个电话,是托管机房的。对方声音带着电流杂音:“杨工,你们那台ECS挂了,不过物理机没问题……哦不,是虚拟化层那个热迁移脚本把磁盘IO限死了。”我没追问,挂了就关掉终端窗口。桌角还剩半块桃酥,掰开来,里面有点潮,奶油馅凝成淡黄色油星子。这事儿不急修,反正主库早就切走了——我们上个月就把读流量全导到备库,用read_only=OFF+触发器+轻量同步中间件,跑了三十一天零十四小时,没一次failover。这个我知道,但没告诉机房。他们不需要知道。 今晚打算把pt-heartbeat的检测频率从一分钟一次改成十秒一次,但先得重装一遍Percona Toolkit——上次更新把--monitor参数名悄悄改成了--watch。这事我记着,但不确定是v3.5.2还是v3.6.0改的。无所谓。反正只要它能把复制延迟压到三百毫秒以内,我管它叫什么。我现在想的是,要不要顺手给那个站长的站加个简易版Query Cache代理,就用nginx+lua,缓存命中率不用高,能拦下15%的select from user where id=?就行。明天先试试,不成再删。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

