语言
<< 返回文章列表

MogDB POC测试,你需要关注的9件事

2021年8月4日
彭冲
40

MogDB是云和恩墨基于openGauss开源数据库的内核进行研发,推出的一款极致易用的企业级关系型数据库。自去年9月正式亮相以来,MogDB已在多个金融客户的生产环境中得到应用。本文跟大家聊聊MogDB POC测试过程中值得关注的那些事……

1. MogHA的厉害之处

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。

2. 对OM工具的印象

使用gs_om工具可以方便地对MogDB进行维护操作,包括启动、停止、查询状态等。不过有些时候使用gs_om工具做服务启动或停止时,控制台可能会出现一些错误的提示信息,此时我们应该使用gs_ctl工具进行服务状态的检查确认。

3. xlog尽量单独分盘

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
4. 用户密码的安全性和兼容性

初始密码是否需要在第一次登录数据库时强制修改,可通过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';
5. 解锁copy的容错机制

表结构:

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"
6. 主备建立的时机

如果有铺底数据的导入,我的建议是先使用单机模式进行导入,同时关闭归档,并调节wal_level的档位至最低档minimal。数据加载导入完成后再恢复wal_level档位,然后再去建立主备关系,最后设置归档。

7. 使用xlog重置快速恢复环境

测试导入大量数据时,尤其是数据文件有问题,我们会不断进行重试,由此可能造成磁盘空间不足。此时我们可能会误删pg_xlog文件,这会导致服务器无法正常启动。我们可以使用pg_resetxlog工具重置xlog来快速恢复环境,避免之前的工作功亏一篑。

pg_resetxlog $PGDATA
8. 放置一个占位文件很重要

对单独分区的data目录或者xlog目录预先放置一个空间占位文件(1GB即可),那么当data目录或者xlog目录出现磁盘空间不足且不能随意删除系统文件时,可以起到绝处逢生的作用。

9. 敏感的大小写

当我们创建表结构时,建表语句里的字段不管使用的是大写还是混合大小写,如果不使用双引号进行嵌套,那么数据库里实际转换存储的字段就是小写。如果需要保证与Oracle一致性的大写,可以参考《PosgreSQL查询返回大写字段》https://www.modb.pro/db/13628文章里的修改方法,修改opengauss-jdbc驱动,然后再重新编译一下。为了方便大家,已经编译好的文件可以从墨天轮下载:mogdb-jdbc-2.0.0.jar(点击文末“阅读原文”直达)

关于MogDB的更多介绍可以参考官网

https://www.mogdb.io/