同福

达梦数据库基于DataWatch搭建DMMPP数据库集群【20220420】

介绍

介绍

福哥想要使用达梦数据库作为客户系统的数据库引擎,但是单机数据库只能出现开发环境当中(甚至很多开发环境都不会使用单机模式了)。所以查询了达梦的文档寻找最基本的读写分离的解决方案,后来发现了达梦支持类似MySQL的主从复制运行模式,福哥各种尝试搭建DM8的主从复制运行模式死活过不去,就在快要放弃的时候灵机一动要不试试DM7?结果成功了~~

DM8不支持主从复制,大家还不吐槽,这不太可能啊!?后来福哥又发现了另一个解决方案DMMPP,这个解决方案可以很好地解决读写分离的需求。不仅如此,DMMPP是一个达梦数据库的集群,它的每一个节点都支持读操作和写操作,这个相比较主从复制的解决方案要强大得多!

安装

创建数据库实例

搭建达梦数据库的DMMPP运行环境至少需要两个数据库实例。福哥创建了dm7ep1和dm7ep2两个个容器,每个容器里面都是tfums数据库的实例。

home/topic/2022/0428/16/8c0f45b4affc78725a33a2527dc50eb1.png

配置dm.ini

两个个容器的dm.ini都要配置一下。

首先INSTANCE_NAME必须设置成不一样的名称才行,福哥设置了tfums_ep1(节点1)、tfums_ep2(节点2)。

INSTANCE_NAME                   = tfums_ep1

设置的INSTANCE_NAME一定不要有“-”,否则在后面启动复制的时候会报“无效实例”的错误,但是启动的时候不会报错,TNND~

其次要开启dmmal.ini的支持。

MAL_INI                         = 1

其次要开启dmmpp.ini的支持。

MPP_INI                         =  1

配置dmmal.ini

在dm7dbms的samples目录里面找到dmmal_example.ini文件,我们来配置这个文件。

cp /tongfunet/env/dm7dbms/samples/ini_script/UTF-8/dmmal_example.ini /tongfunet/env/dm7data/tfums/dmmal.ini

首先把它复制到宿主机上进行编辑。

docker cp dm7ep1:/tongfunet/env/dm7data/tfums/dmmal.ini .

福哥编辑好的dmmal.ini是这样的,分配了两个端口分别是5337和5338。

#MAL_CHECK_INTERVAL		=	30
#MAL_CONN_FAIL_INTERVAL  	=	10  
#MAL_LOGIN_TIMEOUT		=	15
#MAL_BUF_SIZE			=	100
#MAL_SYS_BUF_SIZE		=	0
#MAL_VPOOL_SIZE			=	128
#MAL_COMPRESS_LEVEL		=	0
#MAL_TEMP_PATH			=

[MAL_EP1]
MAL_INST_NAME		=	tfums_ep1
MAL_HOST		=	dm7ep1
MAL_PORT		=	5337
MAL_INST_HOST		=	dm7ep1
MAL_INST_PORT		=	5236

[MAL_EP2]
MAL_INST_NAME		=	tfums_ep2
MAL_HOST		=	dm7ep2
MAL_PORT		=	5338
MAL_INST_HOST		=	dm7ep2
MAL_INST_PORT		=	5236

现在再把编辑好的dmmal.ini复制到两个容器里面。

docker cp dmmal.ini dm7ep1:/tongfunet/env/dm7data/tfums/dmmal.ini
docker cp dmmal.ini dm7ep2:/tongfunet/env/dm7data/tfums/dmmal.ini

配置dmmpp.ini

在dm7dbms的samples目录里面找到dmmpp_example.ini文件,我们来配置这个文件。

cp /tongfunet/env/dm7dbms/samples/ini_script/UTF-8/dmmpp_example.ini /tongfunet/env/dm7data/tfums/dmmpp.ini

首先把它复制到宿主机上进行编辑。

docker cp dm7ep1:/tongfunet/env/dm7data/tfums/dmmpp.ini .

福哥编辑好的dmmpp.ini是这样的,MPP_SEQ_NO是节点的序号,福哥设置的是0和1分别对应tfums_ep1和tfums_ep2。

[SERVICE_EP1]
MPP_SEQ_NO = 0
MPP_INST_NAME = tfums_ep1

[SERVICE_EP2]
MPP_SEQ_NO = 1
MPP_INST_NAME = tfums_ep2

现在再把编辑好的dmmpp.ini复制到两个容器里面。

docker cp dmmpp.ini dm7ep1:/tongfunet/env/dm7data/tfums/dmmpp.ini
docker cp dmmpp.ini dm7ep2:/tongfunet/env/dm7data/tfums/dmmpp.ini

dmmpp.ini不能直接使用,需要用dmctlcvt工具转换成ctl格式的文件才行,在每个节点上面执行一下下面的命令将dmmpp.ini转换成dmmpp.ctl

/tongfunet/env/dm7dbms/bin/dmctlcvt TYPE=2 SRC=/tongfunet/env/dm7data/tfums/dmmpp.ini DEST=/tongfunet/env/dm7data/tfums/dmmpp.ctl

重启

重启两个容器里面的数据库实例。

使用

数据表

现在福哥要在SYSDBA模式下面建立一个数据表users,看看同步情况。

在ep1上面执行CREATE TABLE语句。

CREATE TABLE users (
userId INT NOT NULL IDENTITY(1, 1),
userName VARCHAR(45) NOT NULL,
createDT DATETIME NULL,
logonDT DATETIME NULL
)

home/topic/2022/0428/16/3ddf9d7087ff3b86502cff79a9fcefa2.png

在ep2上面看看用户表里有没有users表。

select * from user_tables

home/topic/2022/0428/16/b79825318cd869124334808f384e8f76.png

欧耶,同步过来了~

反过来在ep2上面再建立一个数据表user_profiles看看反向同步的情况。

在ep2上面执行CREATE TABLE语句。

CREATE TABLE user_profiles (
userId INT NOT NULL,
nickName VARCHAR(45) NOT NULL,
gender SMALLINT NOT NULL,
description VARCHAR(500)
)

home/topic/2022/0428/16/e9aecd795f7771a2ca1be261904a06c2.png

在ep1上面看看有没有user_profiles表。

select * from user_tables

home/topic/2022/0428/16/9ad5c2161379d2b693bb92777d1517a5.png

帅啊!反向也同步过来了~

数据

现在福哥要往users表里面插入几条数据测试复制数据的情况。

在ep1上面插入一条数据。

INSERT INTO users VALUES ('鬼谷子叔叔', NOW(), NULL);
COMMIT;

home/topic/2022/0428/16/3423faed84d87b7922b31efaed2f22b6.png

在ep2上面查一查。

select * from users

home/topic/2022/0428/16/8c278028837936c0371c9e76f254b674.png

过来了!!

反过来在ep2上面再插入一条数据。

INSERT INTO users VALUES ('福哥', NOW(), NULL);
COMMIT;

home/topic/2022/0428/16/f11a26241a8e8b322176201d91426f28.png

再在ep1上面查一查。

select * from users

home/topic/2022/0428/16/fc484fbfa0c76ed13d424a27ff957dd8.png

反过来也能过来!!

注意事项

DM MPP支持绝大多数单机版DM的功能,但在某些小的功能点使用上存在一些使用限制,具体如下:

  • MPP环境下,不支持创建SET NULL或SET DEFAULT约束检查规则的引用约束;

  • MPP环境下不支持创建外部表、间隔分区表;

  • MPP环境下不支持修改表的ADD [COLUMN] <列名>[<IDENTITY子句>]子句;

  • MPP环境下不支持创建位图索引、空间索引、数组索引;

  • MPP环境下位图连接索引涉及的维度表需FULLY分布;

  • MPP环境下不支持索引的ONLINE选项;

  • MPP环境下不支持视图的WITH CHECK OPTION操作;

  • MPP环境下不支持闪回查询;

  • MPP环境下不支持物化视图日志;

  • MPP各EP创建数据库时指定的编码格式应相同,否则可能造成乱码问题;

  • MPP环境下INI参数MVCC_RETRY_TIMES无效,发生MVCC冲突时直接报错;

  • MPP环境下不支持DBMS_JOB包;

  • MPP环境下日志辅助表不支持FULLY分布。

总结

达梦数据库是国产数据库里面比较好用的一款,福哥打算深入的学习一下,支持国产,支持信创~~(达梦要是推出社区版本就好了,像MySQL那样)