注册
达梦数据库读写分离集群搭建
培训园地/ 文章详情 /

达梦数据库读写分离集群搭建

DM_1511 2023/09/15 2398 1 0

一、实现原理

    读写分离集群是基于即时归档实现的高性能数据库集群,不但提供数据保护、容灾等数 据守护基本功能,还具有读写操作自动分离、负载均衡等特性。读写分离集群最多可以配置 8 个即时备库,提供数据同步、备库故障自动处理、故障恢复自动数据同步等功能,也支持 自动故障切换和手动故障切换两种守护模式。读写分离集群不依赖额外的中间件,而是通过数据库接口与数据库之间的密切配合,实现读、写操作自动分离特性。DM的JDBC、DPI、DCI、ODBC、Provider 等接口都可以用来部署读写分离集群。

二、 环境搭建

1. 集群规划

    本次操作模拟将正在运行的单机模式,调整为读写分离集群。

1.1. 配置环境

image.png

1.2. 端口规划

image.png

2. 备库数据恢复

2.1. 对正常运行的主库进行热备

SQL> backup database full backupset '/dm8/full_backup';
image.png

2.2. 将备份发送至备机

[dmdba@DM1 dm8]$ scp -r full_backup DM2:/dm8
image.png

2.3. 备机进行初始化数据库并还原数据

  1. 初始化备机:
    [dmdba@DM2 bin]$ ./dminit PATH=/dm8/data extent_size=16 page_size=32 case_sensitive=y
    image.png
  2. 备机还原数据
    [dmdba@DM2 bin]$ ./dmrman CTLSTMT="RESTORE DATABASE '/dm8/data/DAMENG/dm.ini' FROM BACKUPSET '/dm8/full_backup'"
    image.png
    [dmdba@DM2 bin]$ ./dmrman CTLSTMT="RECOVER DATABASE '/dm8/data/DAMENG/dm.ini' FROM BACKUPSET '/dm8/full_backup'"
    image.png
    [dmdba@DM2 bin]$ ./dmrman CTLSTMT="RECOVER DATABASE '/dm8/data/DAMENG/dm.ini' UPDATE DB_MAGIC"
    image.png

3. 环境配置

3.1. 配置主库GRP1_DM1和备库GRP1_DM2

  1. 配置 dm.ini #主备库实例都需更改下面参数
    ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态/OGUID
    ENABLE_OFFLINE_TS = 2 #不允许备库 OFFLINE 表空间
    MAL_INI = 1 #打开 MAL 系统
    ARCH_INI = 1 #打开归档配置

  2. 配置dmmal.ini #主备库配置必须完全一致
    MAL_CHECK_INTERVAL = 5 #MAL 链路检测时间间隔
    MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间
    [MAL_INST1]
    MAL_INST_NAME = GRP1_DM1 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
    MAL_HOST = 192.168.1.10 #MAL 系统监听 TCP 连接的 IP 地址
    MAL_PORT = 5238 #MAL 系统监听 TCP 连接的端口
    MAL_INST_HOST = 192.168.1.10 #实例的对外服务 IP 地址
    MAL_INST_PORT = 5236 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
    MAL_DW_PORT = 5239 #实例对应的守护进程监听 TCP 连接的端口
    MAL_INST_DW_PORT=5237
    [MAL_INST2]
    MAL_INST_NAME = GRP1_DM2
    MAL_HOST = 192.168.1.11
    MAL_PORT = 6238
    MAL_INST_HOST = 192.168.1.11
    MAL_INST_PORT = 5236
    MAL_DW_PORT = 6239 #实例对应的守护进程监听 TCP 连接的端口
    MAL_INST_DW_PORT=6237

  3. 配置dmarch.ini#主备库归档目标实例名不一致,其他一致
    #实时归档(REALTIME)的读写分离的事务一致模式仅在数据守护配置为自动切换模式下才会生效
    [ARCHIVE_REALTIME]
    ARCH_TYPE = REALTIME #实时归档类型
    ARCH_DEST = GRP1_DM2 #实时归档目标实例名 #备库配置为:GRP1_DM1
    [ARCHIVE_LOCAL1]
    ARCH_TYPE = LOCAL #本地归档类型
    ARCH_DEST = /dm8/arch #本地归档文件存放路径
    ARCH_FILE_SIZE = 128 #单位 Mb,本地单个归档文件最大值
    ARCH_SPACE_LIMIT = 20400 #单位 Mb,0 表示无限制,范围 1024~4294967294M

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

  5. 配置dmmonitor.ini #生产环境需单独一台服务器配置。
    MON_DW_CONFIRM = 1 #确认监视器模式
    MON_LOG_PATH = /dm8/log #监视器日志文件存放路径
    MON_LOG_INTERVAL = 60 #每隔 60s 定时记录系统信息到日志文件
    MON_LOG_FILE_SIZE = 32 #每个日志文件最大 32M
    MON_LOG_SPACE_LIMIT = 0 #不限定日志文件总占用空间
    [GRP1]
    MON_INST_OGUID = 9999 #组 GRP1 的唯一 OGUID 值
    #以下配置为监视器到组 GRP1 的守护进程的连接信息,以“IP:PORT”的形式配置
    #IP 对应 dmmal.ini 中的 MAL_HOST,PORT 对应 dmmal.ini 中的 MAL_DW_PORT
    MON_DW_IP = 192.168.1.10:5239
    MON_DW_IP = 192.168.1.11:6239

4. 启动主备库实例

4.1. 启动主库到mount模式

[dmdba@DM1 bin]$ ./dmserver /dm8/data/DAMENG/dm.ini mount
image.png

4.2. 启动命令行工具 disql,登录主库设置 OGUID 值。

SQL> SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',1);
SQL>sp_set_oguid(9999);
SQL>alter database primary;
SQL> SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',0);

4.3. 启动备库到mount状态

[dmdba@DM2 bin]$ ./dmserver /dm8/data/DAMENG/dm.ini mount
image.png

4.4. 启动命令行工具 disql,登录备库设置 OGUID 值。

SQL> SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',1);
SQL>sp_set_oguid(9999);
SQL>alter database standby;
SQL> SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',0);

4.5. 启动各个主备库上的守护进程

[dmdba@DM1 bin]$ ./dmwatcher /dm8/data/DAMENG/dmwatcher.ini
image.png
[dmdba@DM2 bin]$ ./dmwatcher /dm8/data/DAMENG/dmwatcher.ini
image.png

4.6. 启动监视器

[dmdba@DM3 bin]$./dmmonitor /dm8/bin/dmmonitor.ini
image.png
    执行show可以查看集群的各个节点的状态
image.png

5. 注册数据库后台服务

5.1. 注册数据库和数据守护服务

    分别在主备两台服务器执行
主机:
[root@DM1 root]# ./dm_service_installer.sh -t dmserver -p DM1 -dm_ini /dm8/data/DAMENG/dm.ini
image.png
[root@DM1 root]# ./dm_service_installer.sh -t dmwatcher -p DMW1 -watcher_ini /dm8/data/DAMENG/dmwatcher.ini
image.png
备机:
[root@DM2 root]# ./dm_service_installer.sh -t dmserver -p DM2 -dm_ini /dm8/data/DAMENG/dm.ini
image.png
[root@DM2 root]# ./dm_service_installer.sh -t dmwatcher -p DMW2 -watcher_ini /dm8/data/DAMENG/dmwatcher.ini
image.png

5.2. 注册确认监视器服务:

[root@DM3 root]# ./dm_service_installer.sh -t dmmonitor -p DMM -monitor_ini /dm8/bin/dmmonitor.ini
image.png

三、 主备测试

1. 主备同步测试

  1. 主机建表并插入数据
    image.png
  2. 备机查询数据正常
    image.png

2. 主备切换测试

    将GRP1_DM2由备机切换为主机,执行switchover
image.png
image.png
    最终切换GRP1_DM2为主成功
image.png

四、 接口说明

    DM多种客户端接口都支持读写分离集群连接设置,具体可参考《DM8 程序员手册》。读写分离集群同样需要配置dm_svc.conf文件,并且把dm_scv.conf放到应用服务器的/etc目录下,读写分离集群(DMRWC)服务名配置如下:
TIME_ZONE=(480)
LANGUAGE=(en)
DM_RWW=(192.168.1.10:5236, 192.168.1.11:5236)
RW_SEPARATE=(1)
RW_PERCENT=(30)
LOGIN_MODE=(1)
SWITCH_TIME=(6000)
SWITCH_INTERVAL=(500)
说明:
RW_SEPARATE:取值0和1,默认0,表示不使用读写分离方式
RW_PERCENT:取值0~100,默认值25。表示分发总事务的百分之多少到主机上执行。
LOGIN_MODE:指定优先登录的服务器模式。0:优先连接 Primary 模式的库,Normal 模式次之, 最后选择 Stantby 模式;1:只连接主库;2:只连接备库;3:优先连接 Standby 模式 的库,Primary 模式次之,最后选择Normal模式;4:优先连接Normal模式的库,Primary 模式次之,最后选择 Standby 模式。默认值为 0。。

    URL字符串示例:

jdbc:dm://DM_RWW?rwSeparate=1&rwPercent=30
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服