达梦数据库8.X版本读写分离单机多服务配置预研

首先说明,该配置方法尝试了DM7版本和DM8版本,在DM8版本按照配置来能保证正常,但是在DM7版本下,总会在最后启动监视器的时候,备库(读库)永远处于mount状态,无法转换到open状态.不清楚原因为何?望知悉者可以在评论区支援说明.

开始

1.达梦数据库读写分离的介绍以及连接后其内部运转

一、 系统概述

  在一个高并发的事务型系统中,当写事务占的比例相对读事务相对较小时,可以借助DM7的主备系统备机可读的特点,将读事务转移到备机执行,减少单节点的并发压力,通过增加备机节点资源,提高系统的并发能力,增强系统性能。

DM8提供一种独具创新的主备方案,即时归档主备系统,该系统可通过客户端来实现读写事务的自动分离,读事务在备机执行,写事务在主机执行,减轻主机的负载。备机可以配置多个,备机配置的越多,更能分担主机的压力,系统整体并发效率越高。

二、 读写分离流程

  DM8使用JDBC驱动与服务器结合的方式实现读写分离,大致流程如下:

  1) 用户登录后,客户端首先连接到主机,主机根据即时归档的配置,获取一个有效的备机信息,并返回给客户端。

  2) 客户端根据主机返回的备机IP和端口,建立与该备机的连接。

  3) 客户端执行语句时先在备机上执行,如果是只读事务,则只在备机上执行。

  4) 如果系统收到客户端试图在备机模式下修改数据等错误,则说明该事务是写事务,则转移到主机上执行。

  5) 一旦主机上执行的写事务提交,则下次继续从备机开始执行。

6) 为了实现负载均衡,防止出现读事务过多占用备机资源、主机空闲的情况,客户端采用一定的算法进行均衡,主机上也会执行一部分读事务。

三、 即时归档

  DM8支持多种归档类型,本地归档、实时归档、同步归档、异步归档等类型。为了实现读写分离,新增一种即时归档(Timely archive)类型,以区别实时归档。

  实时归档是实时发送日志到备机,备机收到日志不会等待日志APPLY完成,立即响应给主机,主机收到响应后才刷本地日志。

  即时归档是一种比实时归档更加严格的远程归档方式,先刷本地日志,然后发送到备机,并且等待备机APPLY完成,之所以要这么做,原因有2个:

  首先,即时归档主备系统不会发生主备切换,在主机发送完日志到备机后刷日志前主机崩溃的情况下,不能让备机多一段日志,确保主机数据是完整且最新的。

  其次,需要保证主备机的数据一致性,避免从备机读的数据到主机进行更新时数据已经不一致了。

  在某些不需要保证严格一致性的情况下,可以通过dmarch.ini中的ARCH_WAIT_APPLY配置项,来配置不需要等待备机重做完日志的主备系统,类似于实时归档,可以进一步提高系统性能。

四、 事务一致性

  若事务全为读操作,则全部在备机上执行。

  若事务全为写操作,则全部在主机上执行。

  若事务既有读又有写,备机会将写操作返回给主机执行,该事务中从写操作开始以后所有操作均在主机上执行,保证事务一致性。

五、 数据同步

  配置读写分离集群之前,必须先同步主备机数据,确保两者保持完全一致;主数据库可以是新初始化的数据,也可以是正在生产、使用中的数据。DM7提供了两种方式初始化同步主备机数据,数据文件拷贝以及备份还原方式。

  不能使用分别初始化库的方法,原因如下:

  1) 每个库都有一个永久魔数(permenant_magic),主备机传送日志时会判断这个值是否一样,确保来自同一个库,不同的库传送不了日志

  2) 由于dminit初始化数据库时,会生成随机密钥用于加密,每次生成的密钥都不相同,备机无法解析采用主机密钥加密的数据

  1. 数据文件拷贝

  如果搭建系统之前,数据库系统已经上线运行了,可通过拷贝数据文件的方式实现主备数据库的同步。具体步骤包括:

  1) 正常关闭数据库。

  2) 严格按照数据文件在主机上的分布,拷贝数据文件到备机的对应目录。

  3) 如果数据文件统一存放在一个目录下,则直接拷贝整个目录即可。

  2. 备份还原方式

  用户也可以通过脱机备份、脱机还原的方式同步主备机数据,更详细的说明可以参考备份恢复相关文档。具体步骤包括:

  1) 正常关闭数据库

  2) 进行脱机备份

3) 拷贝备份文件到备机

  4) 执行脱机数据库恢复

2.开始配置

六 关于配置(仅用于DM8版本于windows版本的配置)

首先需要明晰,DM数据库读写分离配置,最少需要六个服务,其中系统自带一个,手动配置五个.

1. 主库服务,提供写操作(在达梦中可以自动负载均衡,如果读操作大大高于写操作,会支持一部分读的操作)

2. 备库服务,提供读操作,不可写,通过实时归档去同步写库的内容

3. 监视服务,用于监控主库和N个备库间的通信情况

4. DMAPService服务,用于配置时期的脱机备份

5. 主库守护进程服务,配置后可在主库挂掉后自动重启主库,也包括将主库从mount模式切换为open模式

6. 从库守护进程服务,同主库同作用

开始配置

此次配置仅为单机运行多服务达成集群效果

1.安装DM8数据库到服务器.

2.使用DM8自带的数据库配置工具,创建数据库实例,这其中要保证,建立的服务的配置要是相同的,包括页大小,大小写敏感等。

创建三个服务,命名为DM1,DM2.DM3

使用DM1为主库。DM2为备库。DM3为监视服务

3.当三个服务创建好之后,使用windows的【服务】界面,查看已经创建的三个数据库服务信息。

此时三个服务应该都是运行状态,需要将三个服务都手动关闭掉,如果刚创建好没有自动启动服务,那么需要手动启动一下服务,然后再关闭掉服务,原因是:新创建的数据库服务一定要有一次启动后,才能进入mount配置模式。

此处需要注意:进行下面操作前,一定要关闭掉服务。

4. 将DM1主库的所有数据,要通过dmrman命令,将他们生成一份离线的归档文件,命令为:

E:\DMSERVER\dmdbms\bin\dmrman ctlstmt="backup database 'E:\DMSERVER\dmdbms\data\DM1\dm.ini' full to backup20210621 backupset 'E:\DMSERVER\dmdbms\data\DM1\backup20210621'"

 需要注意:执行该命令时,DMApService服务一定是要启动的,而数据库实例服务一定是要关闭的

PS:如果在执行的时候提示“管道无法打开”,那么是当前操作用户的权限问题,使用管理员权限打开cmd窗口再次执行即可。

执行完该命令后,会在data/DM1/backup20210621文件夹下生成一份备份文件

接下来手动将这个文件夹(!!!包含文件夹里面的内容)复制到DM2相同的目录下

然后执行还原命令:

E:\DMSERVER\dmdbms\bin\dmrman ctlstmt="restore database 'E:\DMSERVER\dmdbms\data\DM2\dm.ini' from backupset 'E:\DMSERVER\dmdbms\data\DM2\backup20210621'"

执行完命令后,cmd若提示successfly字样,表示成功。

然后执行恢复命令:

E:\DMSERVER\dmdbms\bin\dmrman ctlstmt="recover database 'E:\DMSERVER\dmdbms\data\DM2\dm.ini' from backupset 'E:\DMSERVER\dmdbms\data\DM2\backup20210621'"

执行完命令后,cmd若提示successfly字样,表示成功。

最后执行魔数更新命令(谁接收,谁执行):

E:\DMSERVER\dmdbms\bin\dmrman ctlstmt="recover database 'E:\DMSERVER\dmdbms\data\DM2\dm.ini' update db_magic"

执行后提示successfly即为成功。

以上命令,为将主库的所有用户,表空间,配置信息与备库进行了同步。

5. 开始配置各个配置文件

首先配置dm.ini文件。该文件为达梦数据库的核心配置文件

我们主要需要配置这几个参数:

实例名,建议使用“组名_守护环境_序号”的命名方式,总长度不能超过 16
INSTANCE_NAME = DM1
PORT_NUM = 5236 #数据库实例监听端口
DW_PORT = 5336 #守护环境下,监听守护进程连接端口
DW_ERROR_TIME = 60 #接收守护进程消息超时时间
ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态
ENABLE_OFFLINE_TS = 2 #不允许备库 OFFLINE 表空间
MAL_INI = 1 #打开 MAL 系统
ARCH_INI = 1 #打开归档配置
HA_INST_CHECK_FLAG = 1 #检测是否多个实例进程同时启动
RLOG_SEND_APPLY_MON = 64 #统计最近 64 次的日志发送信息

修改完DM1的dm.ini文件后修改DM2的dm.ini文件配置,需要注意,由于本人尝试为本机单机配置多服务集群,所以修改了端口,在实际情况下,使用多台主备服务器,端口可以为5236不用修改。

配置dmmarch.ini文件,DM自动创建的实例中,不会有这个文件,需要我们自己手动创建,创建后,在里面写入:

DM1/dmmarch.ini配置:

#当前实例DMSERVER1是主库,需要向DMSERVER2(实时备库)同步数据,因此实时归档的ARCH_DEST配置为DMSERVER2
ARCH_WAIT_APPLY=1
[ARCHIVE_TIMELY] 
ARCH_TYPE = TIMELY  #实时归档类型
ARCH_DEST = DM2  #实施归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL  #本地归档类型
ARCH_DEST = E:\DMSERVER\dmdbms\data\DM1\arch #本地归档文件存放路径
ARCH_FILE_SIZE = 512  #单位Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 10240  #单位Mb,0表示无限制,范围:1024-4294967294M

DM2/dmmarch.ini配置:

#当前实例DMSERVER1是主库,需要向DMSERVER2(实时备库)同步数据,因此实时归档的ARCH_DEST配置为DMSERVER2
ARCH_WAIT_APPLY=1
[ARCHIVE_TIMELY] 
ARCH_TYPE = TIMELY  #实时归档类型
ARCH_DEST = DM1  #实施归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL  #本地归档类型
ARCH_DEST = E:\DMSERVER\dmdbms\data\DM2\arch #本地归档文件存放路径
ARCH_FILE_SIZE = 512  #单位Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 10240  #单位Mb,0表示无限制,范围:1024-4294967294M

观察文件有两个需要注意的点:

1:[ARCHIVE_TIMELY].ARCH_DEST参数

2:[ARCHIVE_LOCAL1].ARCH_DEST参数

配置:dmmal.ini文件

MAL_CHECK_INTERVAL = 5  #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5  #判定 MAL链路断开的时间
[MAL_INST1]
MAL_INST_NAME = DM1  #实例名,和dm.ini的INSTANCE_NAME一致
MAL_HOST =127.0.0.1 #MAL 系统监听TCP连接的IP地址
MAL_PORT = 61141 #MAL 系统监听TCP连接的端口
MAL_INST_HOST = 127.0.0.1 #实例的对外服务IP地址
MAL_INST_PORT = 5236  #实例的对外服务端口,和dm.ini中的PORT_NUM一致
MAL_DW_PORT = 52141  #实例对应的守护进程监听TCP连接的端口
[MAL_INST2]
MAL_INST_NAME = DM2
MAL_HOST = 127.0.0.1
MAL_PORT = 61142
MAL_INST_HOST = 127.0.0.1
MAL_INST_PORT = 5237
MAL_DW_PORT = 52142

该配置文件,DM1和DM2的配置完全相同,一模一样,可以直接复制。里面配置的MAL_INST2表示从库,如果说有两个备库,需要再加一个MAL_INST3的配置,顺序往下就好

配置dmwatcher.ini配置,这个配置是守护进程的配置

[GRP1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO  #自动切换模式
DW_ERROR_TIME = 10  #远程守护进程故障认定时间
INST_RECOVER_TIME = 60  #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10  #本地实例故障认定时间
INST_OGUID = 453331  #守护系统唯一的OGUID值
INST_INI = E:\DMSERVER\dmdbms\data\DM1\dm.ini  #dm.ini配置文件
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = E:\DMSERVER\dmdbms\bin\dmserver  #命令行方式启动
RLOG_SEND_THRESHOLD = 0  #指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD = 0  #指定备库重演日志的时间阈值,默认关闭

这个文件中的区别,仅为INST_INI配置,在DM1库中配置时,这里写入DM1的dm.ini的路径,在DM2库中配置时,写入DM2的dm.ini路径即可

这些配置完成后,主库和备库的配置已经完成,需要进行监视器的配置,监视器就一个配置:

dmmonitor.ini文件。需要手动创建

MON_DW_CONFIRM = 1 #确认监视器模式
MON_LOG_PATH = E:\DMSERVER\dmdbms\log #监视器日志文件存放路径
MON_LOG_INTERVAL = 60 #每隔 60s 定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 32 #每个日志文件最大 32M
MON_LOG_SPACE_LIMIT = 0 #不限定日志文件总占用空间
[GRP1]
MON_INST_OGUID = 453331 #组 GRP1 的唯一 OGUID 值 #以下配置为监视器到组 GRP1 的守
护进程的连接信息,以“IP:PORT”的形式配置
#IP 对应 dmmal.ini 中的 MAL_HOST,PORT 对应 dmmal.ini 中的 MAL_DW_PORT
MON_DW_IP = 127.0.0.1:52141
MON_DW_IP = 127.0.0.1:52142

我们需要注意的是:MON_DW_IP 这个参数,我们可以配置多个多行,代表需要监视的服务。IP就是数据库所在的服务器的IP,但是这个端口是拿的dmmal.ini中配置的MAL_DW_PORT监视器端口。不能用数据库服务的对外开放端口!

配置完成后,在windows中,我们需要找到系统所在的盘符的System32文件夹中,找到dm_svc.conf

修改配置为

TIME_ZONE=(480)
LANGUAGE=(cn)
DM=(127.0.0.1:5236,127.0.0.1:5237)
login_mode=(1)
RW_SEPARATE=1

这里的IP和端口就是数据库服务的IP和端口

其中的RE_SEPARATE=1表示的是开始读写分离配置。该配置配置在主库所在服务机器上(待试验)

以上为配置全阶段

6.开始进行服务的同步

首先开始配置DM1库:

使用dmserver命令,已配置模式启动DM1数据库服务(一定要是配置模式启动,否则会因为DM的自动回档机制导致数据不同步)

命令:

E:\DMSERVER\dmdbms\bin\dmserver E:\DMSERVER\dmdbms\data\DM1\dm.ini mount

启动后,不要关闭这个cmd窗口,再次打开一个窗口,执行:

E:\DMSERVER\dmdbms\bin\DIsql SYSDBA/[email protected]:5236

使用DIsql命令登陆数据库,登陆后需要依次执行:

SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',1)  --允许手动修改配置
sp_set_oguid(453331);  --同步唯一ID,该ID一定要所有配置都一致
alter database primary; --设置该库为主库
SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',0)  --关闭手动修改配置
quit --离开

执行完之后,在上面的数据库服务窗口输入:EXIT;

结束DM1数据库的配置

开始DM2数据库的配置,执行命令:

E:\DMSERVER\dmdbms\bin\dmserver E:\DMSERVER\dmdbms\data\DM2\dm.ini mount

启动后,不要关闭这个cmd窗口,再次打开一个窗口,执行: 

E:\DMSERVER\dmdbms\bin\DIsql SYSDBA/[email protected]:5237

使用DIsql登陆DM2数据库,依次执行:

SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',1)
sp_set_oguid(453331);
alter database standby;  --设置为stabdby模式,不可执行写入操作
SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',0);
quit

结束配置后,使用exit结束dm2数据库服务的配置模式。

以上为所有的配置过程。

7.开始启动服务

需要手动启动三个服务

此处注意,一定是要先启动所有备库后再启动主库!!!!!!

1.DM2守护进程服务,命令:

E:\DMSERVER\dmdbms\bin\dmwatcher E:\DMSERVER\dmdbms\data\DM2\dmwatcher.ini

启动后若无问题,会自动拉起DM2数据库服务

2.DM1守护进程服务,命令:

E:\DMSERVER\dmdbms\bin\dmwatcher E:\DMSERVER\dmdbms\data\DM1\dmwatcher.ini

启动后若无问题,会自动拉起DM1数据库服务

3.启动dmmonitor监视服务:

E:\DMSERVER\dmdbms\bin\dmmonitor E:\DMSERVER\dmdbms\data\DM3\dmmonitor.ini

启动后的窗口:

DM2:

DM1:

监视器:

可以从监视器看到此时DM1服务为primary模式运行中,DM2服务为standby模式运行中,

且两个服务的ISTATUS状态为OPEN。表示已经成功。

接下来可以尝试给DM1导入数据库数据,DM2会自动实时同步DM1服务的数据

使用JDBC连接的话,连接DM1服务即可,在DM的JDBC驱动中,会自动对读写库进行区分。判断使用读库还是写库

猜你喜欢

转载自blog.csdn.net/Zachariahs/article/details/118177175