原作者:黄宸宁
适用范围
MogDB Version:3.0.2 to 3.0.7
MogDB Version:5.0.0 to 5.0.5
问题概述
most_available_sync参数修改后执行reload,使用show most_available_sync可以观察到参数发生了改变。但是使用gs_ctl query查看最大可用模式并不会立即生效,而且也不会实际发挥最大可用模式的作用,此问题必现。这个问题在【3.0.2 ~ 3.0.7】和【5.0.0 ~ 5.0.5】版本出现。
后面对此问题进行了修复,产生了一个新的问题,对most_available_sync参数进行reload时,当前主库如果处于高频业务状态,高概率可能发生core。
问题原因
gs_ctl query取值不是使用的GUC most_available_sync的值,而是内存中一个全局变量的值。在relaod时加载变化的GUC,如果有此时活动session,可以通过session处理重新加载全局变量的值。在没有活动session的情况下,全局变量的值无法改变,因此无法实际变更最大高可用模式。
复现方法
-
搭建主备库
-
使用gs_ctl query在主库查询到sync_most_available为off
[2024-04-16 16:04:03.794][2240210][][gs_ctl]: gs_ctl query ,datadir is /home/lchch/h1/mogdb302/data
…
local_role : Primary
sync_priority : 1
sync_most_available : Off
channel : ::1:12211–>::1:43852
…
Receiver info:
No information
3. 将conf文件里的most_available_sync参数改为on,并执行reload
MogDB=# show most_available_sync;
most_available_sync
on
(1 row)
MogDB=# \q
lchch@deepin:~$ gs_ctl query
[2024-04-16 16:36:29.119][2241001][][gs_ctl]: gs_ctl query ,datadir is /home/lchch/h1/mogdb302/data
........
receiver_replay_location : 0/4003020
sync_percent : 100%
sync_state : Sync
sync_priority : 1
sync_most_available : Off
channel : ::1:12211-->::1:43852
........
可以看到,most_available_sync参数已设置为on,但是gs_ctl query查询到的值为off
结论
在【3.0.2 ~ 3.0.7】和【5.0.0 ~ 5.0.5】版本存在reload most_available_sync参数不生效的问题。
解决方案
方案一:在reload时保证有一个活跃session,在执行完reload操作之后,在活跃session执行任意sql即可。
方案二:在【3.0.7】和【5.0.4 ~ 5.0.5】版本,存在relaod most_available_sync参数时产生core的问题。此问题暂无规避方案,建议客户升级至【3.0.8】和【5.0.6】版本。




