如何破坏数据库:有害负载

本页目录

参照

连接过多

下面是一个简单的代码片段,通过 psql 和命名管道 (即 FIFO,在 macOS 和 Linux 中都适用) 创建 100 个空闲连接:

Shell
mkfifo dummy

for i in $(seq 100); do
  psql -Xf dummy >/dev/null 2>&1 &
done

❯ psql -Xc 'select count(*) from pg_stat_activity'
  count
-------
  106
(1 row)

要关闭这些连接,我们可以打开一个写入文件描述符到 FIFO 然后关闭它而不写入任何数据:

Shell
exec 3>dummy && exec 3>&-

现在,100 个额外的连接消失了:

Shell
❯ psql -Xc 'select count(*) from pg_stat_activity'
  count
 -------
      6
 (1 row)

如果连接数达到了 max_connections 限制,当我们执行上述步骤时,尝试建立新连接时将看到以下错误:

Shell
❯ psql
psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: FATAL:  sorry, too many clients already

闲置事务会话

这个方法我们在模拟事务 ID 回卷实验中使用过:

Shell
mkfifo dummy

psql -Xc "
 set idle_in_transaction_session_timeout = 0;
 begin;
 select pg_current_xact_id()
 " \
-f dummy &

要释放会话:

Shell
exec 3>dummy && exec 3>&-

使用各种工具造成更多损害

这个工具可以帮助你模拟各种有害工作负载:noisia – harmful workload generator for PostgreSQL

截至 2023 年,它支持以下功能:

另一个工具 pg_crash 会定期使你的数据崩溃。

对于Aurora用户,还有一些有趣的函数:aurora_inject_crash()、aurora_inject_replica_failure()、aurora_inject_disk_failure()、aurora_inject_disk_congestion():参照 Testing Amazon Aurora PostgreSQL by using fault injection queries。

总结

混沌工程是一个非常有趣的话题,我认为它在数据库领域有着巨大的潜力 — 用于测试恢复、故障转移,并实践各种事故情况。一些资源 (不仅限于数据库):

理想情况下,成熟的数据库管理流程,无论是在云端或本地,托管或自托管,都应该包括:

讨论与补充

在 GitHub 查看讨论

支持作者

感谢支持 PostgreSQL Howto 的长期维护。

微信赞赏码

读者交流群

二维码若已过期,可通过公众号 PostgreSQL 学徒或邮件联系。

PostgreSQL 学徒读者交流群二维码