最近我们注意到我们的一些 Rails 迁移最终导致生产中的应用程序+数据库死锁/冻结。初步调查,这可能是由于应用程序的并发访问以及在读取非常高的表上的迁移。
探索复制的 PG 设置(也许是主从)是否有意义,其中所有写入和迁移都针对主服务器执行,而所有大容量读取都针对从服务器执行?
当一个 ALTER TABLE 语句被复制到一个 slave 时,PG 是如何表现的?从站是否也获取相同的表锁?复制能解决我们目前面临的问题吗?
最近我们注意到我们的一些 Rails 迁移最终导致生产中的应用程序+数据库死锁/冻结。初步调查,这可能是由于应用程序的并发访问以及在读取非常高的表上的迁移。
探索复制的 PG 设置(也许是主从)是否有意义,其中所有写入和迁移都针对主服务器执行,而所有大容量读取都针对从服务器执行?
当一个 ALTER TABLE 语句被复制到一个 slave 时,PG 是如何表现的?从站是否也获取相同的表锁?复制能解决我们目前面临的问题吗?
是的,这是一种选择。但是,如果您更仔细地编写迁移(Rails 的默认设置非常简单),您无论如何都可以大大减少 master 所需的锁定。
例如,而不是
你可以写
后者不会对表重写持有强锁定,并且破坏性要小得多。它总体上做了更多的工作,但锁定级别较低。
如果您更加注意迁移编写和测试,您会发现这个问题大部分都会消失。我帮助过几 TB 数据库的停机时间几乎为零的架构更改,同样的原则也适用于此。
是的。不过,您始终可以在 replia 应用已在主服务器上提交的大架构更新时将读取切换到主服务器。