笔记
0工具
0此页用于记录用户反馈问题后的每一次改进
关于
“写笔记”支持四种格式——Word 文档、Excel 表格、Markdown、纯文本,起稿或二次编辑时都能随时切换,同一篇笔记想用哪种形态来记,都由你说了算。
md、txt、csv、json 这类纯文本则原样载入,不做多余加工。拿一张现成的表倒进来、改几笔、再导出去,等于白用一台免费的格式转换器。
要带走就在右上角点“下载”,可导出 PDF、Word、Markdown、Excel、TXT 等格式;列表卡片“⋯”菜单里,也有同样的下载入口。
在“工具”页点“+ 上传工具”即可发布:填好名称与链接,再用 Markdown 把使用方法写清楚——能解决什么问题、怎么装、怎么用,比堆介绍实在。
要分发安装包就一并上传压缩包(ZIP、RAR、7Z、TAR.GZ,最大 35MB),别人在详情页一键下载;只放链接不带附件也可以。
工具按大家的收藏热度排序,好用的自然会被顶上来。发布后可在详情页或卡片菜单里编辑、下架。
写笔记时勾上“隐藏”,这篇就只存在于你自己的账号里:不进列表、不进搜索、不上首页精选,也不会出现在任何公开的页面,链接发给别人同样打不开。
适合放密码、草稿、日记这类只给自己看的内容;想公开,去“发布”打开它,把“隐藏”的勾去掉再保存,之后编辑会默认保持原状态,不会悄悄变回公开。
不想公开、只想临时给人看:点“分享”生成一条带密码和有效期的链接,到期自动失效,你也能随时撤销。
你的内容会同时保存在多个副本上,系统定期做备份与完整性校验,再配合异地容灾机制:就算某台机器出问题,数据也不会丢,可以长期放心存放;特别重要的资料,仍建议你另外再留一份备份。
全站跑在容器化、模块化的现代架构上,更新、部署、回滚都很快,扩展性和稳定性都按长期运营的标准来设计(Built for reliability, designed to scale)。
这个网站最早只是一个人的笔记仓库,后来慢慢长成现在的知识中枢。设计上很克制——没有广告、没有追踪、没有推荐算法,只是干干净净地存放一些东西;既然做好了,就公开出来,万一有人用得上呢。
不做大而全,不做平台梦,保持简单、保持克制、保持好奇。所有内容都由用户贡献、由用户维护:不会突然冒出付费墙,不会在角落塞广告位,也不会把你的数据卖给第三方。
产品会持续迭代,站内日志页记录着每一次改动,改了什么都有迹可循;想了解这个站是怎么一步步走到今天的,翻翻日志就能看到来龙去脉。
如果在这里看到涉嫌违规的内容,点对应卡片右侧的“举报”按钮就能提交,我们会尽快核实处理;也谢谢你花一点时间,一起把这里维护干净。
趋势
too many connections 打满,MySQL 直接拒连怎么急救
凌晨两点被监控吵醒,应用大面积 5xx。登录服务器想看一眼 MySQL,结果 mysql 客户端一敲就报:
ERROR 1040 (HY000): Too many connections
连 root 都一度进不去。MySQL 对 SUPER 账户其实会留一条额外连接做保留,理论上 root 还能挤进去,但当时我用的是应用账号,自然被拒。后来换 mysql -uroot -p 走本地 socket 才登进去。所以第一反应应该是:拿 root 走 socket 试,别拿应用账号硬撞。
进去之后先止血,两件事:
SET GLOBAL max_connections = 1000;
SHOW STATUS LIKE 'Threads_connected';
Threads_connected 显示九百多,而 max_connections 默认才 151(5.7 的默认值),连接池一冲就满。调大 max_connections 只是把门框加宽,真正要命的是这九百个连接在干什么。SHOW PROCESSLIST 一拉,里面密密麻麻全是 Sleep,time 从几百秒到几千秒。再翻应用日志,有个接口在等一把锁,事务迟迟不提交,连接池 maxActive 又被某次上线后改得很大,连接只借不还。
急救手段是批量杀空闲连接。手写 kill 太慢,直接从 information_schema 生成再执行:
SELECT CONCAT('KILL ', id, ';') FROM information_schema.processlist
WHERE command = 'Sleep' AND time > 100;
把结果拷出来执行,或者拼成一条动态 SQL 用 PREPARE 跑掉。杀完 Threads_connected 掉到两百左右,接口陆续恢复。
但这是治标。第二天同一时段又涨回来,说明根子没断,这次系统排查下来是三个原因叠一起:
一是 wait_timeout 默认 8 小时太长。连接用完不关,占着连接数也不释放,改短之后空闲的会被 MySQL 主动断掉:
SET GLOBAL wait_timeout = 300;
SET GLOBAL interactive_timeout = 300;
二是连接池参数失控。应用用的连接池,maxActive 本来是 50,某次上线被改成了 500,等于把数据库当消息队列在堆连接。改回 50,加 minIdle 和空闲回收的配置,让池子自己控制水位。
三是那个等锁的接口。事务里先 UPDATE 一行再查另一张表,别的事务顺序相反,两个事务互相等对方的锁,谁都不提交,连接就全挂起。这是典型的锁顺序不一致导致死锁等待,把事务里的 SQL 顺序理一致、事务体缩到最短,Threads_connected 才真正稳定下来。
复盘时还发现一个放大器:监控轮询脚本每 5 秒连一次库做 SELECT 1,数据库被拖死后连接一直拿不到,脚本又不知道退,把连接数又垫高了一层。这类健康检查脚本要设短超时、失败快速退出,别让监控自己变成故障源头。另外 max_connect_errors 默认 100,连接打满那阵很多请求在 TCP 层反复握手失败,主机被记成 Host blocked,之后应用再连直接报:
ERROR 1129 (HY000): Host is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'
这个错当时没注意,是在应用日志里翻到的,flush-hosts 一下就放开了。真正要管的是为什么会有这么多中途失败的连接——连接池探活失败会立刻重试,一堆线程同时重试比单纯连不上更伤。事后给连接池配了 validationQuery,把初始化大小、最大连接数按实际 QPS 反推过一遍,池子不再乱开线程。顺带把账号也理了一遍:每个业务库独立账号,按需设 max_user_connections,单个应用就算写炸也只炸它自己那份额度,不至于把整实例的连接数吃光。
现在 my.cnf 里固定 max_connections = 800,监控账号单独开了连接通道,避免下次连救都进不去。顺便提醒自己一句:max_connections 不是越大越好,每个连接都要占线程栈和内存,小内存机器开几千连接,光线程就能把 MySQL 拖到 OOM,宁可配合连接池限流也别盲目调大。