Linux数据库环境搭建:七步稳建指南
|
跟 DBA 吵完出来的,咖啡杯上印的公司 logo 裂了道细缝,我拿指甲刮了刮,没刮掉墨,只刮起一点釉——这事儿就发生在我把第七步脚本 chmod +x 之前三分钟。 “七步稳建指南”?稳是稳,但稳得跟灰度开关没推完那批实例一样——一半连着主库,一半连着 mock 服务,谁也不认账,全靠 traceID 对线。我原以为第七步只是加个 systemd timer 就完事,结果发现它偷偷依赖 /etc/systemd/system/multi-user.target.wants/ 下一个同名但时间戳早十八毫秒的 symlink;删了它,pgsql 起不来;不删,backup cron 每次 reload 都 trigger 两次 wal archive。这个我敢打包票,上周四凌晨两点四十七分,DBA 老陈盯着日志 tail -f 看了十一分钟,最后是我自己进他终端删的。他没拦,但倒了杯水,水杯底压住了他刚签完的 SLA 追责单复印件。 第一步装包,有人坚持用 apt-get install postgresql-15,有人咬死必须源码编译加 --with-icu ——我说你 ICU 是给数据库加还是给你自己加?ICU 不装,locale 归档报错;装了,initdb 在中文路径下直接 segmentation fault,但错误堆栈第三行永远是 libssl.so.3 的 offset,根本不是 ICU 的事。这个我说不准。监控大屏上右下角那个 CPU usage 曲线,那天下午三点零七分抖了一下,抖得跟测试提的 bug 单里附的 GIF 一模一样,可没人去看——因为 PM 正在会议室白板上画“用户旅程图”,笔都举起来了,谁还管 pg_ctl 的 fork 返回值? 第二步初始化目录。chown -R postgres:postgres /var/lib/postgresql/15/main/ 这句命令本身没毛病,但如果你用的是 lvm 逻辑卷,而卷组里刚好混着一块被前任用 pvmove 强制迁移过三次的盘——它不报错,就是 initdb 执行到 78% 时突然卡住,卡得连 strace -p 都 attach 不上。我们卡了四次。第三次我改用 ionice -c 3,第四次发现其实是 udev rules 里一条匹配 NAME=="sd[bcdef]" 的规则,在 /dev/disk/by-path/ 下硬生生把同一块 NVMe 设备映射出了五个名字,initdb 在枚举设备节点时撞进了无限软链循环。这事前端不知道,但他们周五提测前集体清空了浏览器缓存——就为绕过某个前端路由懒加载导致的 session key 复用问题,顺带让 DBA 把我们的连接池 timeout 从 60 秒砍到 20。说到底,优胜劣汰?汰的是那个写文档时把“需确保 SELinux 状态为 permissive”塞进第六步小字备注、结果上线当天发现它其实是 enforcing 的人。那人现在在产研流程组写 KPI 拆解表,昨天我路过他工位,他电脑右下角钉着三个飞书窗口,两个在改“交付健康度指标”,一个正在重命名“数据库基线验收模板_v2_勿删”。 第三步改 postgresql.conf。shared_buffers 放 25%,work_mem 放 4MB,max_connections 要看并发模型——这话放十年前是金科玉律,现在?我敢说,只要你的 OLTP 查询没超八百毫秒,调这仨参数就是在给运维留纪念品。真正要命的是 track_activity_query_size,设成 2048 是默认值,但它会在 long-running transaction 里吃光 pg_stat_activity 视图的内存页——上个月生产慢查定位延迟两小时,就卡在这儿:pg_stat_activity 查不出来,但 pg_backend_pid() 全活得好好的。最后是测试小张在压测环境用 psql -c “SELECT pg_sleep(30)” 手动复现出来的,她一边跑一边啃苹果,苹果核扔进旁边绿植盆里,第二天长出三片新叶,我们截图发到了技术群,底下回复统一是:“所以呢?”。 第四步 pg_hba.conf。host all all 0.0.0.0/0 md5?别笑,真有团队这么干,理由是“前端联调要用”。后来他们用完没关,某天凌晨三点,安全扫描器扫出一百七十二次失败登录,全部来自一个境外 IP 段,但没触发任何告警——因为他们的 fail2ban 配置里漏了 postgresql 的 auth.log 路径,只监了 sshd。oncall 手机震了一下,我瞄了眼,关掉了。震完后,微信弹出一条系统通知:“您有 1 条新的待阅制度变更:《2024年基础平台访问策略V3.2》”,我没点开。第五步、第六步……其实差不多,都是些看似能抄,抄完必跪的步骤:比如“启用 synchronous_commit=on”,但没告诉你它和 standby 同步的 network RTT 必须稳定在二十毫秒内,否则主库 WAL 写满会堵死整个事务队列。我们堵过一次,堵得前端改了三版 loading 图标才等到回滚按钮亮起来。 第七步启动服务。systemctl daemon-reload && systemctl enable postgresql && systemctl start postgresql ——这一串跑完,屏幕绿了,你就信了?去年秋天,我在一台新装的 CentOS Stream 9 上跑了这串,ps aux | grep postgres 显示进程在,netstat -tlnp | grep :5432 也显示端口在监听,可 psql -h 127.0.0.1 -U postgres -d postgres 连不上。折腾五十六分钟,发现是防火墙 firewalld 默认开了 public zone,但 postgresql.service 的 Unit 文件里没声明 Firewalls=public,于是 service 启动时压根没通知 firewall 模块放行。它就站在那儿,像一个穿着西装但没领带的人,体面地拒绝所有握手。DBA 最后拍我肩说:“下次你先 ping 自己 loopback。” 我没接话。后来他手机又震了一下,我看了一眼,是他老婆发的:“今晚回来吃饭吗?” 现在我习惯把第七步拆成三步发版:第一步启服务,第二步验连通性,第三步再跑 init.sql。不为别的,就为在第二步卡住时,还能对着监控大屏上的那条无关曲线骂一句。或者至少,能看清咖啡杯上那个裂开的 logo,到底是不是从上次 sprint demo 结束就开始裂的。
文章配图,仅供参考 哦对,我刚试了新镜像:debian:bookworm-slim + postgresql-16,第七步依然卡在那个 symlink 上。还没动手修。先去把绿植里那个苹果核扒出来——叶子长得太邪门了。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


Linux安全环境搭建:19年全栈实战指南
Linux深度学习环境搭建:从报错到运行的排障全路径
嵌入式Linux开发者Unix环境搭建避坑指南
Linux运维老手也常踩的5个Unix环境搭建陷阱
数据库逻辑构建与质感表达设计精要
Windows数据科学环境搭建:15年工程师避坑与高效配置
Linux下H5开发环境与数据库一键配置