重建双机
重建双机是双机高可靠性的体现,它可以使用主机来恢复备机,或者使用备机来恢复级联备机。
重建方式
以一主一备为例说明重建双机的两种方式。
全量重建
- 会删除备机所有的数据文件,但是保留自己的配置文件(postgresql.conf)。
- 将主机的数据文件拷贝到备机,但是不会覆盖备机的配置文件。全量重建完毕后,主机和备机的数据文件相同。
增量重建
- 对主机和备机的数据文件进行校验,只拷贝主机上与备机有差异的数据文件,增量重建完毕后,主备机数据文件也会相同。
- 如果主机的数据量很大,采用这种方式重建双机可以节省重建时间。
背景信息
- 双机初次配置,需要通过重建,使得两边数据库保持一致。
- 当主备机不同步时,需要重建主备机的双机关系;当备机与级联备机不同步时,需要重建备机与级联备机的双机关系。
说明:
- 当双机关系未建立时,用 gs_ctl query 命令查询,返回的结果中 DB_STATE 字段的取值为 NeedRepair,表明需要重建双机。
- GaussDB 自身不会自动进行双机重建的操作,数据库只提供状态监控接口告诉应用者双机状态是否正常,然后由应用者决定是否需要重建和何时重建。
- 重建双机时,备机或者级联备机无法在数据目录的子目录下进行重建。
注意事项
主机处于崩溃恢复或者rman恢复时,需要调用select pg_is_in_recovery(); 判断恢复是否结束,只有恢复结束,备机才能进行build操作。
示例
分别以gaussdba用户登录GaussDB服务器主机、备机、级联备机和次级联备机,查询备机或者级联备机的状态信息。
gs_ctl query
说明: 查询结果中如果发现DB_STATE : NeedRepair说明需要重建双机关系。
分两种情况重建双机。
情况一:一主一备或者一主双备
主备机未同步,在备机上执行以下命令,进行全量重建。
gs_ctl build -b full -M standby
在备机上执行以下命令,进行增量重建。
gs_ctl build -b incremental -M standby
说明: 重建双机时不加-b、-M参数默认为备机的全量重建,即gs_ctl build默认为备机的全量重建。
情况二:一主一备一级联一次级联
如果主备机未同步,需重建备机,即在备机上执行以下命令,进行全量重建。
gs_ctl build -b full -M standby
在备机上执行以下命令,进行增量重建。
gs_ctl build -b incremental -M standby
如果备机和级联备机未同步,需重建级联备机,即在级联备机上执行以下命令,进行全量重建。
gs_ctl build -b full -M cascadestandby
在级联备机上执行以下命令,进行增量重建。
gs_ctl build -b incremental -M cascadestandby
如果级联备机和次级联备机未同步,需重建次级联备机,即在次级联备机上执行以下命令,进行全量重建。
gs_ctl build -b full -M cascadestandby1
在次级联备机上执行以下命令,进行增量重建。
gs_ctl build -b incremental -M cascadestandby1
再次查询主机、备机或者级联备机的状态信息,看他们之间是否建立起双机同步状态。
gs_ctl query
重建查询
重建过程中,可以使用 gs_ctl querybuild 进行重建状态查询。该命令查询结果如下:
Ha state:
LOCAL_ROLE : Standby
STATIC_CONNECTIONS : 2
DB_STATE : Building
DETAIL_INFORMATION : 58%
LOCAL_ROLE表示当前数据库运行模式;
STATIC_CONNECTIONS表示配置文件中的双机链路数;
DB_STATE表示重建状态,包括正在重建Building、重建完成 Build Completed、待修复NeedRepair;
DETAIL_INFORMATION表示重建百分比或重建失败信息BuildFailed。
示例
用 gs_ctl query 命令在备机上查询与主机的同步状态。
Ha state:
LOCAL_ROLE : Standby
STATIC_CONNECTIONS : 2
DB_STATE : NeedRepair
DETAIL_INFORMATION : repl1: SystemIDNotMatched repl2: ModeNotMatched
Senders info:
No information
Receiver info:
No information
说明:可以看到DB_STATE : NeedRepair, 表示需要重建备机。
用 gs_ctl query 命令在级联备机上查询与备机的同步状态。
Ha state:
LOCAL_ROLE : CascadeStandby
STATIC_CONNECTIONS : 2
DB_STATE : NeedRepair
DETAIL_INFORMATION : repl1: SystemIDNotMatched repl2: ModeNotMatched
Senders info:
No information
Receiver info:
No information
说明:可以看到 DB_STATE : NeedRepair, 表示需要重建级联备机。
备机执行 gs_ctl build 命令进行重建。
waiting for server to shut down.... done
server stopped
xlog start point: 0/5000020
gs_ctl: starting background WAL receiver
22408/22408 kB (100%), 1/1 tablespace
xlog end point: 0/50000E0
gs_ctl: waiting for background process to finish streaming...
gs_ctl: build completed.
server starting.... done
server started
级联备机执行 gs_ctl build -M cascadestandby 命令进行重建。
waiting for server to shut down.... done
server stopped
xlog start point: 0/4000020
gs_ctl: starting background WAL receiver
22407/22407 kB (100%), 1/1 tablespace
xlog end point: 0/40000E0
gs_ctl: waiting for background process to finish streaming...
gs_ctl: build completed.
server starting.......... done
server started
用 gs_ctl query 命令在备机上查询与主机的同步关系。
gaussdba@linux:~> gs_ctl query
Ha state:
LOCAL_ROLE : Standby
STATIC_CONNECTIONS : 2
DB_STATE : Normal
DETAIL_INFORMATION : Normal
Senders info:
SENDER_PID : 25249
LOCAL_ROLE : Standby
PEER_ROLE : CascadeStandby
PEER_STATE : Normal
STATE : streaming
SENDER_SENT_LOCATION : 0/9000000
SENDER_WRITE_LOCATION : 0/9000000
SENDER_FLUSH_LOCATION : 0/9000000
SENDER_REPLAY_LOCATION : 0/9000000
RECEIVER_RECEIVED_LOCATION : 0/9000000
RECEIVER_WRITE_LOCATION : 0/9000000
RECEIVER_FLUSH_LOCATION : 0/9000000
RECEIVER_REPLAY_LOCATION : 0/9000000
SYNC_PERCENT : 100%
SYNC_STATE : async
SYNC_PRIORITY : 0
CHANNEL : 10.144.197.189:1357 -->10.144.197.190:56188
Receiver info:
RECEIVER_PID : 23872
LOCAL_ROLE : Standby
PEER_ROLE : Primary
PEER_STATE : Normal
STATE : streaming
SENDER_SENT_LOCATION : 0/9000000
SENDER_WRITE_LOCATION : 0/9000000
SENDER_FLUSH_LOCATION : 0/9000000
SENDER_REPLAY_LOCATION : 0/9000000
RECEIVER_RECEIVED_LOCATION : 0/9000000
RECEIVER_WRITE_LOCATION : 0/9000000
RECEIVER_FLUSH_LOCATION : 0/9000000
RECEIVER_REPLAY_LOCATION : 0/9000000
SYNC_PERCENT : 100%
CHANNEL : 10.144.197.189:57385 <--10.144.197.188:1357
说明:可以看到DB_STATE:Normal ,说明主备机间的双机关系正常,重建成功。
用 gs_ctl query 命令在级联备机上查询与备机的同步状态。
Ha state:
LOCAL_ROLE : CascadeStandby
STATIC_CONNECTIONS : 2
DB_STATE : Normal
DETAIL_INFORMATION : Normal
Senders info:
No information
Receiver info:
RECEIVER_PID : 23840
LOCAL_ROLE : CascadeStandby
PEER_ROLE : Standby
PEER_STATE : Normal
STATE : streaming
SENDER_SENT_LOCATION : 0/9000000
SENDER_WRITE_LOCATION : 0/9000000
SENDER_FLUSH_LOCATION : 0/9000000
SENDER_REPLAY_LOCATION : 0/9000000
RECEIVER_RECEIVED_LOCATION : 0/9000000
RECEIVER_WRITE_LOCATION : 0/9000000
RECEIVER_FLUSH_LOCATION : 0/9000000
RECEIVER_REPLAY_LOCATION : 0/9000000
SYNC_PERCENT : 100%
CHANNEL : 10.144.197.190:56188 <--10.144.197.189:1357
说明:可以看到DB_STATE:Normal,说明备机与级联备机的双机关系正常,重建成功。
注意:执行重建时,指定了以某种模式重建后,则只能与该模式上一层模式进行双机重建,即备机只能与主机重建,级联备机只能与备机重建,次级联备机只能与级联备机重建。而有一种特殊情况,就是在deploymode为1的情况下,级联备机在重建时如果因某些特殊原因无法与备机建立连接,则此时级联备机可以连接到主机进行重建。