暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

MogDB数据库POC测试实录

原创 多米爸比 2021-07-01
2077

各位看官,大家好,我的昵称是墨DB,正式名称是MogDB,我是云和恩墨基于开源数据库openGauss推出的企业版商用数据库。关于我的更多介绍可以参考我的官网https://www.mogdb.io/

作为墨墨家族新成员之一,我先来跟大家一起聊下POC测试过程中的那些事。

MogHA的厉害之处

MogHA为针对MogDB的高可用软件,主要负责数据库的高可用监控,自动化切换等事务。支持企业级高可用诉求的高可用软件。特性包括主备高可用,一主多备高可用,多机房支持等。

重启或者关闭主库所在服务器,可以观察到同步备库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。

对OM工具的印象

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

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

用户密码的安全及兼容性

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

解锁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"

主备建立的时机

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

使用xlog重置快速恢复环境

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

pg_resetxlog $PGDATA

老司机的布局

对单独分区的data目录或者xlog目录预先放置一个空间占位文件(1GB即可),那当我们数据目录或者xlog目录出现磁盘空间不足且不能随意删除系统文件时,会有种绝处逢生的感觉。

敏感的大小写

当我们创建表结构时,建表语句里的字段不管我们使用的是大写还是混合大小写,不使用双引号进行嵌套,数据库里实际转换存储的字段是小写。如果需要保证与oracle一致性大写,可以参考《PosgreSQL查询返回大写字段》文章里的修改方法,修改opengauss-jdbc驱动,然后再重新编译一下,已经编译好的文件下载连接:mogdb-jdbc-2.0.0.jar

最后修改时间:2021-11-28 07:04:26
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
1人已赞赏
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论