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

【企业级】达梦数据库主备(DW)集群标准化部署方案

呆呆的私房菜 2024-09-10
532


    Whoami:5年+金融、政府、医疗领域工作经验的DBA
    Certificate:OCP、PCP
    Skill:Oracle、Mysql、PostgreSQL
    Platform:CSDN、墨天伦、公众号(呆呆的私房菜)
    复制


    阅读本文可以了解达梦数据库主备形态下的标准化部署,包括主从原理剖析、数据库安装和参数优化等相关内容。


    01

    主备集群概述
    • 达梦数据库的主备守护集群(DataWatch)是一种高可用、高性能的数据库解决方案,它通过实现异地容灾来保障数据库的持续可用性。

    • 其核心原理是将主库产生的Redo日志传输到备库,备库接收并重新应用这些日志,以实现与主库的数据同步。这种机制主要由主库、备库、Redo日志、Redo日志传输、Redo日志重演、守护进程和监视器等组件构成。

    • dmmonitor监视器:

    • 1. 监控dmwatcher发送的消息,如主备库状态变化、故障切换中数据库模式、状态变化的完整过程;

    • 2. 接收用户输入的管理命令,如启停dmwatcher监控功能、执行主备切换和备库故障接管等操作;

    • 3. 发起故障自动接管命令,主库故障时选择复合接管条件的备库,并通知备库接管服务。

    • dmwatcher守护进程:

    • 1. 负责监控数据库状态,必要时重启数据库服务;dmwatcher与数据库实例建立通信后,数据库实例会定时发送信息到dmwatcher;

    • 2. 守护进程更新本地记录的实例信息后,同时记录该时间戳。当检测到实例进程id已经不存在或超过一段时间没有收到实例信息,则会认为实例故障。如果配置了自动重启,则实例会被重启拉起。


    02

    主备集群同步原理
    • 先来了解一下达梦的数据库模式:

    模式说明
    normal
    提供正常的数据库服务,操作没有限制。生成正常的本地归档,但不发送realtime、timely和async归档
    primary提供正常的数据库服务,操作极少有限制,部分模式功能受限(不支持修改表空间文件名、不支持需改arch_ini参数);正常生成本地归档、支持realtime、timely和async归档;对临时表空间以外的所有数据库对象的修改操作都强制生成redo日志
    standby可以执行数据库备份、查询等只读数据库操作;正常生成本地归档、正常发送async归档redo日志,但realtime、timely归档均强制失效;时间触发器和事件触发器均失效
    • 再来了解一下达梦的日志归档模式:

    模式说明
    本地归档模式

    写入online redo后,再写入本地归档日志

    写入失败时,系统会等待用户释放磁盘空间,若磁盘空间损坏导致失败,系统会强制halt

    实时归档模式

    写入online redo后,发送到备库;

    写入失败时,会suspend数据库,保持归档不变,等待守护进程干预

    即时归档模式

    写入online redo后,发送到备库

    写入失败时,会suspend数据库并设置归档为无效状态,等待守护进程干预


    异步归档模式

    定时启动归档线程;异常时不做处理,等待下次触发继续发送

    收到后立即响应

    同步归档模式

    写入归档日志后,发送到备库

    写入失败时,接设置归档状态为无效,不会suspend数据库

    • 实时归档是实现主备库数据同步的基础,实时主备同步实现原理如下:

    • 1. 主库生成 online redo log,当触发日志写文件操作后,日志线程将 rlog_pkg 发送到备库;

    • 2. 备库接收到后进行合法性校验(检查日志是否连续,备库状态是否open等),如果不合法则返回错误,合法则作为 keep_rlog_pkg 的 redo log 加入 aaply 任务队列进行 redo 重演,并响应主库日志接收成功;当有多个备库时,主库需要收到所有备库的响应信息才继续后续操作。


    • 实时主备系统具备数据实时同步、主备切换、自动故障转移、自动数据同步、备库接管、备库强制接管等优势。


    03

    达梦 1主1备实时数据同步标准化部署


    • 1. 部署规划(IP规划 + 端口规划):

    主机名服务IP
    心跳IP
    数据库名
    实例名
    dmdb01192.168.56.11
    10.0.0.11dmdbdw1
    dmdb02
    192.168.56.2210.0.0.22dmdb
    dw2
    实例名实例端口
    MAL监听端口实例本地守护进程监听端口
    实例监听守护进程监听端口
    dw15236
    7336
    7436
    7536
    dw25236
    7336
    7436
    7536
    • 2. 操作系统配置

      所有节点执行
      cat >> etc/sysctl.conf <<EOF
      fs.file-max = 6815744
      fs.aio-max-nr = 1048576
      kernel.shmmni = 4096
      kernel.sem = 250 32000 100 128
      net.ipv4.ip_local_port_range = 9000 65500
      net.core.rmem_default = 4194304
      net.core.rmem_max = 4194304
      net.core.wmem_default = 262144
      net.core.wmem_max = 1048576
      vm.dirty_ratio = 80
      vm.dirty_expire_centisecs = 500
      vm.dirty_writeback_centisecs = 100
      kernel.core_pattern = dmdata/core.%e_%p_%t
      vm.swappiness=10
      vm.dirty_background_ratio = 0
      vm.min_free_kbytes = 512000
      EOF
      sysctp -p


      # 配置资源限制
      cat >> etc/security/limits.conf <<EOF
      dmdba soft nice 0
      dmdba hard nice 0
      dmdba soft as unlimited
      dmdba hard as unlimited
      dmdba soft fsize unlimited
      dmdba hard fsize unlimited
      dmdba soft nproc 65536
      dmdba hard nproc 65536
      dmdba soft nofile 65536
      dmdba hard nofile 65536
      dmdba soft core unlimited
      dmdba hard core unlimited
      dmdba soft data unlimited
      dmdba hard data unlimited
      EOF


      # 关闭透明大页
      vi etc/default/grub
      GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet numa=off transparent_hugepage=never"
      grub2-mkconfig -o etc/grub2.cfg
      reboot now


      # 禁用swap分区
      vi etc/fstab
      # 注释swap分区配置
      swapoff
      复制
      • 3. 用户、目录和环境变量配置

        所有节点执行
        groupadd dinstall -g 1001
        useradd  -g dinstall -m -d /home/dmdba -s /bin/bash -u 1001 dmdba
        echo 'dmdba#2024' | passwd --stdin dmdba


        mkdir -p /dmdbms /dmdata /dmbackup
        chown dmdba.dinstall -R dmdbms dmdata dmbackup
        mount /dev/sdb dmdbms
        mount /dev/sdc /dmdata
        mount /dev/sdd /dmbackup


        cat >> /home/dmdba/.bash_profile <<EOF
        export DM_HOME=/dmdbms
        export PATH=\$PATH:\$DM_HOME/bin
        export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:\$DM_HOME/bin
        EOF
        复制
        • 4. 数据库软件安装

          所有节点执行
          # 上传介质到/tmp
          mount -o /tmp/dm8_20240712_x86_rh7_64.iso /mnt


          # 安装数据库
          su - dmdba
          cd mnt
          ./DMInstall.bin -i
          选择安装程序的语言 c/C 为中文,e/E 为英文。
          提示是否安装 key 文件,输入 N 跳过。
          选择时区,21 即东 8 区。
          选择安装类型,默认典型安装(包含所有内容)。
          选择软件安装目录,默认/home/dmdba/dmdbms,输入/dmdbms设置软件安装目录
          确认安装
          安装完成提示使用root执行脚本:
          /dmdbms/script/root/root_installer.sh
          复制
          • 5. 初始化数据库并启动实例

            所有节点执行
            dminit path=/dmdata page_size=32 extent_size=32 charset=1 log_size=2048 db_name=dmdb instance_name=dmdb SYSDBA_PWD="dameng#2024" SYSAUDITOR_PWD="dameng#2024"
            dmserver dmdata/dmdb/dm.ini
            # 系统出现system is ready后输入 exit 停止数据库
            复制
            • 6. 脱机备份主数据库

              主节点执行
              # 检查damp服务是否已经启动
              ps -ef | grep dmap
              # 如果没有启动,需要手动启动
              DmAPService start


              # 启动 dmrman 备份工具
              dmrman use_ap=2
              backup database '/dmdata/dmdb/dm.ini' backupset '/home/dmdba/bak';
              复制
              • 7. 执行备份还原备库

                # 将备份文件/home/dmdba/bak 文件拷贝到备库服务器上
                dmrman
                restore database '/dmdata/dmdb/dm.ini' from backupset '/home/dmdba/bak';
                recover database '/dmdata/dmdb/dm.ini' from backupset '/home/dmdba/bak';
                recover database '/dmdata/dmdb/dm.ini' update db_magic;
                复制
                • 8. 修改 dm.ini 配置参数

                  主库修改参数如下:
                  vi dmdata/dmdb/dm.ini
                  INSTANCE_NAME = dw1
                  MAL_INI = 1
                  ARCH_INI = 1
                  ALTER_MODE_STATUS = 0
                  ENABLE_OFFLINE_TS = 2
                  RLOG_APPEND_LOGIC = 1


                  备库修改参数如下:
                  INSTANCE_NAME = dw2
                  MAL_INI = 1
                  ARCH_INI = 1
                  ALTER_MODE_STATUS = 0
                  ENABLE_OFFLINE_TS = 2
                  RLOG_APPEND_LOGIC = 1
                  复制
                  • 9. 配置归档配置文件 dmarch.ini

                    主库执行:
                    cat > dmdata/dmdb/dmarch.ini <<EOF
                    [ARCHIVE_REALTIME1]
                    ARCH_TYPE = REALTIME
                    ARCH_DEST = dw2
                    [ARCHIVE_LOCAL1]
                    ARCH_TYPE = LOCAL
                    ARCH_DEST = dmdata/arch
                    ARCH_FILE_SIZE = 2048
                    ARCH_SPACE_LIMIT = 102400
                    EOF


                    备库执行
                    cat > /dmdata/dmdb/dmarch.ini <<EOF
                    [ARCHIVE_REALTIME1]
                    ARCH_TYPE = REALTIME
                    ARCH_DEST = dw1
                    [ARCHIVE_LOCAL1]
                    ARCH_TYPE = LOCAL
                    ARCH_DEST = /dmdata/arch
                    ARCH_FILE_SIZE = 2048
                    ARCH_SPACE_LIMIT = 102400
                    EOF
                    复制
                    • 10. 配置MAL系统配置文件 dmmal.ini

                      主备节点执行:
                      cat > /dmdata/dmdb/dmmal.ini <<EOF
                      MAL_CHECK_INTERVAL = 5
                      MAL_CONN_FAIL_INTERVAL = 15
                      [MAL_INST1]
                      MAL_INST_NAME = dw1
                        MAL_HOST     = 10.0.0.11  
                      MAL_PORT = 7336
                        MAL_INST_HOST   = 192.168.56.11  
                      MAL_INST_PORT = 5236
                      MAL_DW_PORT = 7436
                      MAL_INST_DW_PORT = 7536
                      [MAL_INST2]
                      MAL_INST_NAME = dw2
                        MAL_HOST      = 10.0.0.22  
                      MAL_PORT = 7336
                      MAL_INST_HOST = 192.168.56.22
                      MAL_INST_PORT = 5236
                      MAL_DW_PORT = 7436
                        MAL_INST_DW_PORT = 7536
                      EOF
                      复制
                      • 11. 配置守护进程配置文件 dmwatcher.ini

                        主备节点执行:
                        cat > /dmdata/dmdb/dmmal.ini <<EOF
                        [GRP_DW]
                        DW_TYPE = GLOBAL
                        DW_MODE = MANUAL
                        DW_ERROR_TIME = 30
                        INST_RECOVER_TIME = 60
                        INST_ERROR_TIME = 20
                        INST_OGUID = 453331
                        INST_INI = /dmdata/dmdb/dm.ini
                        INST_AUTO_RESTART = 1
                        INST_STARTUP_CMD   = /home/dmdba/dmdbms/bin/DmServiceDW start
                        EOF
                        复制
                        • 12. 注册服务

                          注册守护进程服务(主备库都执行):
                          cd /dmdata/script/root
                          ./dm_service_installer.sh -t dmwatcher -p DW -watcher_ini /dmdata/dmdb/dmwatcher.ini


                          注册数据库实例服务(主备库都执行):
                          ./dm_service_installer.sh -t dmserver -p DW -dm_ini /dmdata/dmdb/dm.ini
                          复制
                          • 13. 启动集群

                            主备库执行:
                            dmserver /dmdata/dmdb/dm.ini mount


                            # 在新的终端使用 disql 工具连接数据库
                            ./disql SYSDBA/'"dameng#2024"'


                            # 主备库都修改 oguid,执行以下命令:
                            sp_set_oguid(453331);


                            # 主库dmdb01上修改数据库模式为 primary,执行以下命令:
                            alter database primary;


                            # 备库dmdb02上修改数据库模式为 standby,执行以下命令:
                            alter database standby;


                            # 启动守护进程(主备库执行)
                            dmwatcher /dmdata/dmdb/dmwatcher.ini
                            # 守护进程启动成功后,会将mount的实例open起来
                            复制
                            • 14. 配置并启动监视器

                              可以在任意的主备节点上配置,生产系统最好独立一台主机部署,注意需要安装有DM数据库软件,并且与主备心跳网络端口开放
                              cat >> /dmdata/dmdb/dmmonitor.ini <<EOF
                              MON_DW_CONFIRM = 0
                              MON_LOG_PATH = /home/dmdba/dmdbms/log
                              MON_LOG_INTERVAL = 60
                              MON_LOG_FILE_SIZE = 200
                              MON_LOG_SPACE_LIMIT = 1024
                              [GRP_DW]
                               MON_INST_OGUID    = 453331
                               MON_DW_IP     = 10.0.0.11:7436
                               MON_DW_IP     = 10.0.0.22:7436
                              EOF


                              dmmonitor /dmdata/dmdb/dmmonitor.ini
                              复制
                              • 15. 配置sql日志

                                主备节点执行
                                cat >> /dmdata/dmdb/sqllog.ini <<EOF
                                BUF_TOTAL_SIZE = 10240
                                BUF_SIZE = 1024
                                BUF_KEEP_CNT = 6
                                [SLOG_ALL]
                                FILE_PATH = ../log
                                PART_STOR = 1
                                SWITCH_MODE = 2
                                SWITCH_LIMIT = 512
                                ASYNC_FLUSH = 1
                                FILE_NUM = 5
                                ITEMS = 0
                                SQL_TRACE_MASK = 2:3:25
                                MIN_EXEC_TIME = 1500
                                USER_MODE = 0
                                USERS = 
                                EOF
                                复制
                                • 16. 验证主备节点同步状态

                                  # 主库执行写入
                                  disql SYSDBA/'"dameng#2024"'@192.168.56.11:5236
                                  create table test(id int);
                                  insert into test values (1);
                                  commit;


                                  # 备库检查写入,确认数据是否同步
                                  disql SYSDBA/'"dameng#2024"'@192.168.56.22:5236
                                  select * from test;


                                  复制
                                  • 17. 执行主备参数优化

                                    disql SYSDBA/'"dameng#2024"'@localhost:5236 \`Para_Optimization.sql
                                    复制
                                    • 18. 主备库重启

                                      # 关闭主库守护进程:
                                      systemctl stop DmWatcherServiceDW
                                      # 关闭备库守护进程:
                                      systemctl stop DmWatcherServiceDW
                                      # 关闭主库实例:
                                      systemctl stop DmServiceDW
                                      # 关闭备库实例:
                                      systemctl stop DmServiceDW


                                      # 启动主库实例:
                                      systemctl start DmServiceDW
                                      # 启动备库实例:
                                      systemctl start DmServiceDW
                                      # 启动主库守护进程:
                                      systemctl start DmWatcherServiceDW
                                      # 启动备库守护进程:
                                      systemctl start DmWatcherServiceDW
                                      复制
                                      • 19. 备份策略配置

                                      • 1. 全量备份:每周六凌晨2点

                                      • 2. 增量备份:除周六外每天凌晨2点

                                      • 3. 删除备份:每天凌晨3点

                                        disql SYSDBA/'"dameng#2024"'@localhost:5236
                                        -- 创建作业系统表
                                        SP_INIT_JOB_SYS(1);


                                        -- 全量备份(每周六凌晨2点)
                                        call SP_CREATE_JOB('bakfull',1,0,'',0,0,'',0,'');
                                        call SP_JOB_CONFIG_START('bakfull');
                                        call SP_ADD_JOB_STEP('bakfull''bak1'6'/dmbackup'0000, NULL, 0);
                                        call SP_ADD_JOB_SCHEDULE('bakfull''std1'121640'23:00:00', NULL, '2024-09-01 20:00:00', NULL, '');
                                        call SP_ADD_JOB_SCHEDULE('bakfull', 'once', 1, 0, 0, 0, 0, NULL, NULL, sysdate+1/1440, NULL, '');
                                        call SP_JOB_CONFIG_COMMIT('bakfull');


                                        -- 增量备份(除周六外每天凌晨2点)
                                        call SP_CREATE_JOB('bakincr',1,0,'',0,0,'',0,'');
                                        call SP_JOB_CONFIG_START('bakincr');
                                        call SP_ADD_JOB_STEP('bakincr''bak2'6'/dmbackup'0000, NULL, 0);
                                        call SP_ADD_JOB_SCHEDULE('bakincr''std2'121630'23:00:00', NULL, '2024-09-01 20:01:00', NULL, '');
                                        call SP_JOB_CONFIG_COMMIT('bakincr');


                                        -- 删除备份(每天凌晨3点)
                                        call SP_CREATE_JOB('delbak',1,0,'',0,0,'',0,'');
                                        call SP_JOB_CONFIG_START('delbak');
                                        call SP_ADD_JOB_STEP('delbak','bak1',0'SF_BAKSET_BACKUP_DIR_ADD(''DISK'',''/dmbackup'');
                                        call sp_db_bakset_remove_batch(''DISK'',now()-14);'1200, NULL, 0);
                                        call SP_ADD_JOB_SCHEDULE('delbak''del01'11100'23:30:00', NULL, '2024-09-01 20:03:00', NULL, '');
                                        call SP_JOB_CONFIG_COMMIT('delbak')
                                        复制
                                        • 20. 配置自动收集统计信息任务

                                        • 每周六凌晨1点开始收集

                                          disql SYSDBA/'"dameng#2024"'@localhost:5236
                                          call SP_CREATE_JOB('statistics',1,0,'',0,0,'',0,'');
                                          call SP_JOB_CONFIG_START('statistics');
                                          call SP_ADD_JOB_STEP('statistics', 'statistics1', 0, 'begin
                                          for rs in (select ''sf_set_SESSION_para_value(''''HAGR_HASH_SIZE'''',(select cast(
                                          case when max(table_rowcount(owner,table_name))<=(select max_value from v$dm_ini
                                          where para_Name=''''HAGR_HASH_SIZE'''') and max(table_rowcount(owner,table_name))>=(
                                          select min_value from v$dm_ini where para_Name=''''HAGR_HASH_SIZE'''') then
                                          max(table_rowcount(owner,table_name)) when max(table_rowcount(owner,table_name))<(
                                          select min_value from v$dm_ini where para_Name=''''HAGR_HASH_SIZE'''') then
                                          (select min_value from v$dm_ini where para_Name=''''HAGR_HASH_SIZE'''') else
                                          (select max_value from v$dm_ini where para_Name=''''HAGR_HASH_SIZE'''') end as bigint)
                                          from dba_tables where owner=''''''||NAME||''''''));''
                                          sql1,''DBMS_STATS.GATHER_SCHEMA_STATS(''''''||NAME||'''''',100,TRUE,''''FOR ALL COLUMNS SIZE AUTO'''');''
                                          sql2
                                          from SYS.SYSOBJECTS where TYPE$=''SCH'' ) loop
                                          execute immediate rs.sql1;
                                          execute immediate rs.sql2;
                                          end loop;
                                          end;', 0, 0, 0, 0, NULL, 0);
                                          call SP_ADD_JOB_SCHEDULE('statistics''statistics1'121640'01:00:00'NULL'2024-09-06 20:10:37'NULL'');
                                          call SP_JOB_CONFIG_COMMIT('statistics')
                                          复制
                                          • 21. 客户端连接集群

                                            # 修改配置之后,需要重启客户端程序生效
                                            vi /etc/dm_svc.conf
                                            # 全局配置区
                                            DMDW=(192.168.56.11:5236,192.168.56.22:5236)
                                            TIME_ZONE=(+480)
                                            LOGIN_ENCRYPT=(0)
                                            DIRECT=(Y)
                                            [DMDW]
                                            LOGIN_MODE=(1)


                                            # 客户端程序连接数据库时,需要指定IP端口处替换为服务名,如jdbc的url为:
                                            jdbc:dm://DMDW
                                            复制


                                            本文内容就到这啦,阅读完本篇,相信你已经掌握对达梦数据库的主备形态的标准化部署了吧!我们下篇再见!

                                            点击上方公众号,关注我吧!

                                            文章转载自呆呆的私房菜,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                            评论