Sau*_*nda 3 postgresql replication ddl
最近,我们注意到许多 Rails 迁移最终在生产中导致死锁/冻结我们的应用程序+数据库。初步调查显示,这可能是由于应用程序并发访问以及对读取量非常高的表进行迁移造成的。
探索复制的 PG 设置(也许是主从)是否有意义,其中所有写入和迁移都针对主服务器执行,所有大容量读取都针对从服务器执行?
当 ALTER TABLE 语句复制到从站时,PG 的行为如何?从机是否也获取相同的表锁?复制能解决我们目前面临的问题吗?
探索复制的 PG 设置(也许是主从)是否有意义,其中所有写入和迁移都针对主服务器执行,所有大容量读取都针对从服务器执行?
是的,这是一种选择。但是,如果您更仔细地编写迁移(Rails 的默认设置非常简单),您无论如何都可以大大减少主服务器上所需的锁定。
例如,代替
ALTER TABLE tblah ADD COLUMN cblah DEFAULT dblah NOT NULL
Run Code Online (Sandbox Code Playgroud)
你可以写
ALTER TABLE tblah ADD COLUMN cblah;
ALTER TABLE tblah ALTER COLUMN cblah DEFAULT dblah;
UPDATE tblah SET cblah = dblah WHERE cblah IS NULL;
ALTER TABLE tblah ALTER COLUM cblah NOT NULL;
Run Code Online (Sandbox Code Playgroud)
后者不会对表重写持有强锁,并且破坏性也会小得多。总体而言,它可以完成更多工作,但锁定级别较低。
如果您更加小心地进行迁移编写和测试,您会发现这个问题大部分都会消失。我帮助对多 TB 数据库进行了近乎零停机的模式更改,并且同样的原则也适用于此。
当 ALTER TABLE 语句复制到从站时,PG 的行为如何?从机是否也获取相同的表锁?
是的。不过,当复制应用已在主服务器上提交的大架构更新时,您始终可以将读取切换到主服务器。
归档时间: |
|
查看次数: |
1754 次 |
最近记录: |