MogHA是云和恩墨基于MogDB同步及异步复制自研的一款企业级高可用组件,主要针对服务器宕机、实例宕机等多种情况,负责数据库的高可用监控、自动化切换等事务,可以使数据库的故障持续时间从分钟级降到秒级,确保系统业务的持续运行,期间客户无感知。
MogHA作为支持企业级高可用诉求的软件,其特性包括主备高可用、一主多备高可用、多机房支持等。重启或者关闭主库所在服务器,可以观察到同步备库HA日志出现:
2021-04-06 03:36:45,284 ERROR: no primary found. maybe primary lost,continue to failover.
2021-04-06 03:36:45,291 INFO: VIP:192.168.122.220 already offline:['192.168.122.212']
2021-04-06 03:36:50,297 ERROR: primary lonely check :5s
2021-04-06 03:36:56,301 ERROR: primary lonely check :11s
2021-04-06 03:36:57,303 INFO: Start failover...
2021-04-06 03:36:57,303 INFO: try shutdown target host if exist...
2021-04-06 03:36:58,305 INFO: shutdown old primary failed for filename:/home/postgres/ha/StandbyHeartbeat.py-->line:219-->err:target ['192.168.122.211', ''] request failed
2021-04-06 03:36:58,305 INFO: Writing primary info to /home/postgres/ha/primary_info.json ...
2021-04-06 03:36:58,306 INFO: Writing primary info success
2021-04-06 03:36:58,306 INFO: Start sync meta...
2021-04-06 03:36:58,306 INFO: sync meta fsuccess. new primary:192.168.122.212
2021-04-06 03:36:58,355 INFO: Start gs_ctl failover... now lsn:0/F000B18
2021-04-06 03:37:00,423 INFO: Failover result:b'[2021-04-06 03:36:58.386][2703][][gs_ctl]: gs_ctl failover ,datadir is /home/postgres/data \n[2021-04-06 03:36:58.386][2703][][gs_ctl]: failover term (1)\n[2021-04-06 03:36:58.392][2703][][gs_ctl]: waiting for server to failover...\n..[2021-04-06 03:37:00.421][2703][][gs_ctl]: done\n[2021-04-06 03:37:00.421][2703][][gs_ctl]: failover completed (/home/postgres/data)\n'b''
2021-04-06 03:37:00,423 INFO: Start change replconninfo.
2021-04-06 03:37:00,585 INFO: set primary for 192.168.122.213 ...
2021-04-06 03:37:00,794 INFO: set primary for 192.168.122.213 result: new primary set success.
2021-04-06 03:37:00,794 INFO: set primary for 192.168.122.214 ...
2021-04-06 03:37:01,025 INFO: set primary for 192.168.122.214 result: new primary set success.
2021-04-06 03:37:01,025 INFO: set primary for 192.168.122.215 ...
2021-04-06 03:37:01,267 INFO: set primary for 192.168.122.215 result: new primary set success.
2021-04-06 03:37:01,267 INFO: set primary for 192.168.122.216 ...
2021-04-06 03:37:01,502 INFO: set primary for 192.168.122.216 result: new primary set success.
2021-04-06 03:37:01,502 INFO: End old change replconninfo.
2021-04-06 03:37:01,502 INFO: Start change VIP...
2021-04-06 03:37:04,546 INFO: End change VIP...
2021-04-06 03:37:04,546 ERROR: Heartbeat Fialed:
2021-04-06 03:37:04,546 ERROR: Failover execute success. restart heartbeat.
Traceback (most recent call last):
File "/home/postgres/ha/main.py", line 98, in heartbeat
heartbeatInner(config)
File "/home/postgres/ha/main.py", line 88, in heartbeatInner
standbyNode.heartbeat()
File "/home/postgres/ha/StandbyHeartbeat.py", line 286, in heartbeat
self.lost_primary()
File "/home/postgres/ha/StandbyHeartbeat.py", line 117, in lost_primary
self.failover()
File "/home/postgres/ha/StandbyHeartbeat.py", line 234, in failover
raise Exception("Failover execute success. restart heartbeat.")
Exception: Failover execute success. restart heartbeat.
切换完成后当前备库变成主库,如果同机房存在其他异步备库,则其中一个会被设置为新主库的同步备,并设置为新的primary_backup。
使用gs_om工具可以方便地对MogDB进行维护操作,包括启动、停止、查询状态等。不过有些时候使用gs_om工具做服务启动或停止时,控制台可能会出现一些错误的提示信息,此时我们应该使用gs_ctl工具进行服务状态的检查确认。
xlog文件是一个记录事务日志的文件,它记录数据库系统中所有的更改操作。当发生主机电源故障或其他导致服务器崩溃的故障时,由于xlog日志包含了关于已经执行的每个事务的足够信息,所以数据库能够通过在事务日志中replay操作来恢复数据库中的数据。为了提高写入性能需要将xlog从PGDATA目录分离出来。
如下所示,首先挂载两个不同的目录:
/mogdb_data
/mogdb_xlog
手工初始化时可以通过–xlogdir指定:
gs_initdb --nodename=og_69 \
--pgdata=/mogdb_data/data15400 \
--xlogdir=/mogdb_xlog/xlog15400
--encoding=UTF-8 \
--username=omm \
--pwpasswd=Mogdb@1234 \
--security
如果初始化时没有指定,也可以通过软链接方式来调整(需要先关闭数据库服务)。
mv /mogdb_data/data15400/pg_xlog /mogdb_xlog/xlog15400
ln -s /mogdb_xlog/xlog15400 /mogdb_data/data15400/pg_xlog
初始密码是否需要在次登录数据库时强制修改,可通过modify_initial_password参数来设置,默认为false。
为了兼容PG的用户密码存储策略,可以通过设置password_encryption_type为0。
password_encryption_type=0 只支持标准的md5口令存储,与PG保持兼容。
password_encryption_type=1 支持md5和国密的sha256,使用md5加密的用户能兼容PG。
password_encryption_type=2 只支持国密sha256,不兼容PG。
修改完password_encryption_type参数后需要重新修改下当前用户的密码。
ALTER ROLE omm IDENTIFIED BY 'Mogdb@2021' REPLACE 'Mogdb@1234';
ALTER ROLE mogdbuer IDENTIFIED BY 'Admin@2021' REPLACE 'Admin@1234';
表结构:
CREATE TEMP TABLE foo (a bigint, b text);
数据文件tab.dat:
1 one
2
3 three 111
four 4
5 five
普通的copy导入,因为有多余的数据项会产生报错:
omm=# copy foo from '/home/omm/tab.dat';
ERROR: extra data after last expected column
CONTEXT: COPY foo, line 3: " 3 three 111"
copy使用ignore_extra_data忽略多余的列:
omm=# copy foo from '/home/omm/tab.dat' with(ignore_extra_data);
ERROR: invalid input syntax for type bigint: " four 4"
CONTEXT: COPY foo, line 4, column a: " four 4"
copy使用log_errors和reject_limit:
omm=# copy foo from '/home/omm/tab.dat' with(ignore_extra_data,log_errors,reject_limit 'unlimited');
COPY 4
reject_limit参数对copy from的容错机制设置数值上限,一旦错误数据超过选项指定条数,则会按照原有机制报错。取值范围:正整数(1-INTMAX),‘unlimited’(无大值限制)。
此时已经导入成功了4条数据,可以从下面的查询看出。
omm=# select * from foo;
a | b
---+-------
1 | one
2 |
3 | three
5 | five
(4 rows)
还有一条报错的信息记录在系统自动创建的pgxc_copy_error_log表中。
omm=# \x
Expanded display is on.
omm=# select * from pgxc_copy_error_log ;
-[ RECORD 1 ]-------------------------------------------------
relname | pg_temp_gaussdb_8_1_140368156813056.foo
begintime | 2021-06-27 11:29:00.529073+00
filename | /home/omm/tab.dat
lineno | 4
rawrecord |
detail | invalid input syntax for type bigint: " four 4"
上面rawrecord是没有内容的,使用log_errors_data替代log_errors会记录rawrecord。
truncate table pgxc_copy_error_log;
truncate table foo;
copy foo from '/home/omm/tab.dat' with(ignore_extra_data,log_errors_data,reject_limit 'unlimited');
omm=# select * from pgxc_copy_error_log ;
-[ RECORD 1 ]-------------------------------------------------
relname | pg_temp_gaussdb_8_1_140368156813056.foo
begintime | 2021-06-27 11:34:34.104653+00
filename | /home/omm/tab.dat
lineno | 4
rawrecord | four 4
detail | invalid input syntax for type bigint: " four 4"
如果有铺底数据的导入,我的建议是先使用单机模式进行导入,同时关闭归档,并调节wal_level的档位至低档minimal。数据加载导入完成后再恢复wal_level档位,然后再去建立主备关系,后设置归档。
测试导入大量数据时,尤其是数据文件有问题,我们会不断进行重试,由此可能造成磁盘空间不足。此时我们可能会误删pg_xlog文件,这会导致服务器无法正常启动。我们可以使用pg_resetxlog工具重置xlog来快速恢复环境,避免之前的工作功亏一篑。
pg_resetxlog $PGDATA
对单独分区的data目录或者xlog目录预先放置一个空间占位文件(1GB即可),那么当data目录或者xlog目录出现磁盘空间不足且不能随意删除系统文件时,可以起到绝处逢生的作用。
当我们创建表结构时,建表语句里的字段不管使用的是大写还是混合大小写,如果不使用双引号进行嵌套,那么数据库里实际转换存储的字段就是小写。如果需要保证与Oracle一致性的大写,可以参考《PosgreSQL查询返回大写字段》(https://www.modb.pro/db/13628)文章里的修改方法,修改opengauss-jdbc驱动,然后再重新编译一下。为了方便大家,已经编译好的文件可以从墨天轮下载:mogdb-jdbc-2.0.0.jar(点击文末“阅读原文”直达)。
关于MogDB的更多介绍可以参考官网:
https://www.mogdb.io/