25.wal日志大小是怎样规划的?
1. WAL空间是由那些参数决定的
WAL空间主要以下这三个参数控制:
- max_wal_size
- min_wal_size
- wal_keep_segments或wal_keep_size
所以需要正确设置这个几个参数。这几个参数的原理具体可以见文章:PostgreSQL数据库WAL日志空间大小以及不清理的原因深入分析
2. 空间规划以及参数设置
WAL空间的大小实际上是应该从每天产生多少的WAL的另来规划,但在还没有把数据库建立起来之前,我们很难之道这个数据库每天产生多少日志,所以这时我们通常把WAL空间规划为数据库大小的5%~10%左右。
当然如果这个数据库很小,如只有10GB大小,我们给WAL空间规划为2GB也是没有问题的。但是如果这个数据库的空间很大,如20TB,而这个数据库的更新量不大,则可以小一些,如100GB。
参数min_wal_size通常不需要设置的太大,通常1GB就够了,如果是小库(小于100GB),也可以设置的更小一些,如160MB。
max_wal_size设置为WAL空间的规划大小,而wal_keep_segments设置为max_wal_size - min_wal_size的大小。从原理上说,我们不一定要保证:wal_keep_size + min_wal_size <= max_wal_size,也是可以设置:wal_keep_size + min_wal_size > max_wal_size,这时max_wal_size就与WAL得空间大小没有太大得关系了,max_wal_size主要控制checkpoint发生的频度,每写WAL的日志量超过: max_wal_size的1/3~1/2时就会发生一次checkpoint。
注意如果wal_keep_segments设置的过小,容易导致备库失效。有些人说我们使用复制槽来防止备库需要的WAL日志被清理掉,但是我的经验是物理备库尽量不要使用复制槽,因为复制槽容易导致WAL空间失控,导致主库宕机,这个风险是很大的。通常我们设置合理的wal_keep_segments或wal_keep_size就可以保证备库在绝大多数情况下不会因主库把他需要的WAL日志清理掉而失效。另一般我们还会打开主库的归档,打开归档后,即使备库失效了,还可以通过滚归档的WAL日志来恢复过来,而不必重搭。