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

达梦数据库踩坑系统之即时归档

IT小Chen 2023-12-14
1180

环境说明:

    版本:达梦 8.1.3.26
    架构:达梦守护集群

    问题说明:

    由于服务器资源有限,将monitor监控器部署在了备库服务器上,DM8数据守护架构归档模式支持多种类型,实时归档、即时归档等,搭建数据库时,考虑到实时归档需要单独维护KEEP_RLOG_PKG部分,猜想出问题的概率可能会更大一些,所以选择了即时归档,数据库使用一段时间,有一天突然发现主备服务器之间心跳网卡故障了,守护集群发生了组分裂(或称为脑裂):

      show global info
      2023-10-12 15:22:33
      #================================================================================#
      GROUP OGUID MON_CONFIRM MODE MPP_FLAG
      GRP1             123456      FALSE           AUTO            FALSE     
      <<DATABASE GLOBAL INFO:>>
      DW_IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
      192.16.12.11        33333        2023-10-12 15:22:33  GLOBAL    VALID     OPEN     CJC01             OK        1     1     OPEN        PRIMARY   DSC_OPEN       TIMELY    VALID    
      ERROR DATABASE:
      DW_IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
      192.16.12.12        33333        2023-10-12 15:21:30  GLOBAL    SPLIT     STARTUP        CJC02             OK        1     1    MOUNT       PRIMARY   DSC_OPEN       TIMELY    VALID    
      #================================================================================#

      其中备库WCTLSTAT为SPLIT,WSTATUS为STARTUP,ISTATUS为MOUNT,IMODE为PRIMARY,出现了双主的情况。

      影响范围:

      1.主备同步中断。

      测试通过dm_svc.conf服务名进行连接数据库,LOGIN_MODE=(1)只连接主库,多次测试可以连接到正常的PRIMARY,理论上对应用访问数据库没影响。

      修复:

      待心跳网络恢复后,备库没有自动恢复,沟通原厂技术,此类问题只能通过重建备库来解决。

      问题原因:

      timely即时归档模式下,数据先写到本地,再发送备库,如果在发送期间心跳网络故障,主、备库之间无法通信,由于本次案例的监控器在备库,监控器可以正常和备库通信,无法和主库通信,会判断主库故障,发生主、备切换,但由于主从数据不一致,所以备库角色虽然切换为PRIMARY,但状态只能到MOUNT,无法OPEN,从而发生了SPLIT。

      解决方案:

      如何避免类似问题再次发生。

        1.监控器放在独立的服务器,不能主、备数据库部署在一起。
        2.归档模式从即时归档更改为实时归档。

        实时归档说明:

        与本地归档写入保存在磁盘中的日志文件不同,实时归档(Realtime)将主库产生的 Redo 日志通过 MAL 系统传递到备库,实时归档是实时主备和 MPP 主备的实现基础。实时归档只在主库生效,一个主库可以配置 1~8 个实时备库。

        实时归档的执行流程是,主库在 Redo 日志(RLOG_PKG)写入联机日志文件前,将 Redo 日志发送到备库,备库收到 Redo 日志(RLOG_PKG)后标记为 KEEP_RLOG_PKG,将原 KEEP_RLOG_PKG 加入日志重演任务系统,并马上响应主库(高性能模式),不需要等待 Redo 日志重演结束后再响应主库。主库收到备库的响应消息,确认备库已经收到 Redo 日志后,再将 Redo 日志写入联机日志文件中。

        什么是KEEP_RLOG_PKG呢,有什么作用?

        KEEP_RLOG_PKG 介绍

        主库的 RLOG_PKG 日志通过实时归档机制发送到备库后,备库将最新收到的 RLOG_PKG 保存在内存中,不马上启动重演,这个 RLOG_PKG 我们称之为 KEEP_RLOG_PKG。

        引入 KEEP_RLOG_PKG 的主要目的是,避免下述场景中,主库故障重启后不必要的主备切换,减少用户干预。

        场景说明(实时主备或 MPP 主备):

        1.用户登录主库 A 执行

          CREATE TABLE TX(C1 INT);
          INSERT INTO TX VALUES(1);
          COMMIT;

          其中 COMMIT 操作将触发实时归档,发送 RLOG_PKG 到备库 B。

          2.备库 B 收到 RLOG_PKG,响应主库 A,并启动日志重演。

          3.主库 A 在 RLOG_PKG 写入联机日志文件之前故障。

          4.主库 A 重新启动后,由于 RLOG_PKG 没有写入联机日志文件,之前插入 TX 表的数据丢失;但此时备库 B 已经重演日志成功,TX 表中已经插入一行数据。

          上述场景中,主备库数据不再保持一致,必须将备库 B 切换为主库,并重新从 B 同步数据到 A。

          如果配置的是手动切换模式,则必须要有用户干预,进行备库接管后,才能恢复数据库服务。

          引入 KEEP_RLOG_PKG 后,备库 B 收到主库 A 发送的 RLOG_PKG,并不会马上启动日志重演,主库 A 重启后,守护进程 A 检测到备库 B 存在 KEEP_RLOG_PKG,通知备库 B 丢弃 KEEP_RLOG_PKG 后,直接 Open 主库 A,就可以继续提供数据库服务。

          并且,这些操作是由守护进程自动完成,不需要用户干预。

          如果备库自动接管、或者用户发起备库接管命令,那么备库的 KEEP_RLOG_PKG 将会启动重演,不管主库是否已经将 KEEP_RLOG_PKG 对应的 Redo 日志写入联机日志文件中,备库接管时的 APPLY_LSN 一定是大于等于主库的 FILE_LSN。

          当故障主库重启后,仍然可以作为备库,自动重新加入数据守护系统。

          注意

          即时归档在RLOG_PKG写入主库联机Redo日志文件后,再发送RLOG_PKG到备库,因此即时备库没有KEEP_RLOG_PKG。

          归档类型

          测试实时归档下心跳网卡中断场景,实验如下:

          归档模式更改为REALTIME

          监控器在备库上

            ip a
            3: enp0s8: <BRCJCDCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
            link/ether 08:00:27:d1:e6:01 brd ff:ff:ff:ff:ff:ff
            inet 192.16.12.12/24 brd 192.16.12.255 scope global noprefixroute enp0s8


            [root@cjc-db-04 root]# ifdown enp0s8
            Device 'enp0s8' successfully disconnected.

            备库确认监控器信息

            主、备库WSTATUS状态为ERROR,备库IMODE还是STANDBY,没有切换为PRIMARY,没有发生SPLIT。

              #================================================================================#
              [monitor]         2023-10-12 15:19:08: Clean request of dmwatcher processer CJC02 success
              [monitor] 2023-10-12 15:19:08: Switchover instance CJC01 success


              [monitor] 2023-10-12 15:19:09: Dmwatcher process CJC01 status switching [OPEN-->RECOVERY]
              WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
              2023-10-12 15:19:09 RECOVERY OK CJC01 OPEN PRIMARY VALID 11 49962 49962


              [monitor] 2023-10-12 15:19:11: Dmwatcher process CJC01 status switching [RECOVERY-->OPEN]
              WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
              2023-10-12 15:19:11 OPEN OK CJC01 OPEN PRIMARY VALID 11 49963 49963


              [monitor] 2023-10-12 15:21:52: Received message timeout from(CJC01)
              WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
              2023-10-12 15:21:30 ERROR OK CJC01 OPEN PRIMARY VALID 11 50009 50009


              [monitor] 2023-10-12 15:21:52: Received message timeout from(CJC02)
              WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
              2023-10-12 15:21:30 ERROR OK CJC02 OPEN STANDBY VALID 11 50009 50009


                show global info
                2023-10-12 15:24:06
                #================================================================================#
                GROUP OGUID MON_CONFIRM MODE MPP_FLAG
                GRP1 123456 TRUE AUTO FALSE


                ERROR DATABASE:


                <<DATABASE GLOBAL INFO:>>
                DW_IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
                192.16.12.11 33333 2023-10-12 15:21:30 GLOBAL VALID ERROR CJC01 OK 1 1 OPEN PRIMARY DSC_OPEN REALTIME VALID


                DW_IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
                192.16.12.12        33333        2023-10-12 15:21:30  GLOBAL    VALID     ERROR          CJC02             OK        1     1     OPEN        STANDBY   DSC_OPEN       REALTIME  VALID    
                #================================================================================#

                监控器信息

                主库变为SUSPEND状态,因为监控器在备库服务器上。   

                  [monitor]         2023-10-12 15:21:51: Dmwatcher process CJC01 status switching [OPEN-->STARTUP] 
                  WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
                  2023-10-12 15:21:51 STARTUP OK CJC01 SUSPEND PRIMARY VALID 11 50009 50016




                  [monitor] 2023-10-12 15:21:51: Dmwatcher process CJC01 status switching [STARTUP-->MON CONFIRM]
                  WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
                  2023-10-12 15:21:51 MON CONFIRM OK CJC01 SUSPEND PRIMARY VALID 11 50009 50016




                  [monitor] 2023-10-12 15:21:52: [!!! Instance CJC02 dmwatcher's DW_MODE is configured as AUTO, but this dmmonitor is not in CONFIRM mode, cannot takeover instance CJC02 automatically !!!]




                  [monitor] 2023-10-12 15:21:52: Received message timeout from(CJC02)
                  WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
                  2023-10-12 15:21:30 ERROR OK CJC02 OPEN STANDBY VALID 11 50009 50009   
                    show global info
                    2023-10-12 15:22:33
                    #================================================================================#
                    GROUP OGUID MON_CONFIRM MODE MPP_FLAG
                    GRP1 123456 FALSE AUTO FALSE


                    <<DATABASE GLOBAL INFO:>>
                    DW_IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
                    192.16.12.11 33333 2023-10-12 15:22:33 GLOBAL VALID MON CONFIRM CJC01 OK 1 1 SUSPEND PRIMARY DSC_OPEN REALTIME VALID


                    ERROR DATABASE:
                    DW_IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
                    192.16.12.12 33333 2023-10-12 15:21:30 GLOBAL VALID ERROR CJC02 OK 1 1 OPEN STANDBY DSC_OPEN REALTIME VALID
                    #================================================================================#

                    主库是SUSPEND 状态

                      SQL> select name,status$,mode$ from v$instance;
                      LINEID name status$ mode$
                      ---------- ---- ------- -------
                      1 CJC01 SUSPEND PRIMARY


                      used time: 157.881(ms). Execute id is 600.

                      备库

                        [dmdba@cjc-db-04 ~]$ disql SYSDBA/***:port
                        SQL> select name,status$,mode$ from v$instance;
                        LINEID name status$ mode$
                        ---------- ---- ------- -------
                        1 CJC02 OPEN STANDBY


                        used time: 4.023(ms). Execute id is 2000.

                        恢复备库心跳网卡

                          [root@cjc-db-04 root]# ifup enp0s8
                          Connection successfully activated (D-Bus active path: org/freedesktop/NetworkManager/ActiveConnection/11)

                          主、备库自动恢复,无需人为干预

                            #================================================================================#
                            [monitor] 2023-10-12 15:26:20: Dmwatcher process CJC02 status switching [NONE-->OPEN]
                            WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
                            2023-10-12 15:26:20 OPEN OK CJC02 OPEN STANDBY VALID 11 50009 50009




                            [monitor] 2023-10-12 15:26:20: Dmwatcher process CJC01 status switching [NONE-->MON CONFIRM]
                            WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
                            2023-10-12 15:26:20 MON CONFIRM OK CJC01 SUSPEND PRIMARY VALID 11 50009 50018




                            [monitor] 2023-10-12 15:26:20: Dmwatcher process CJC01 status switching [MON CONFIRM-->FAILOVER]
                            WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
                            2023-10-12 15:26:20 FAILOVER OK CJC01 SUSPEND PRIMARY VALID 11 50009 50018




                            [monitor] 2023-10-12 15:26:23: Dmwatcher process CJC01 status switching [FAILOVER-->OPEN]
                            WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
                            2023-10-12 15:26:22 OPEN OK CJC01 OPEN PRIMARY VALID 11 50018 50018




                            [monitor] 2023-10-12 15:26:23: Dmwatcher process CJC01 status switching [OPEN-->RECOVERY]
                            WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
                            2023-10-12 15:26:22 RECOVERY OK CJC01 OPEN PRIMARY VALID 11 50018 50018




                            [monitor] 2023-10-12 15:26:27: Dmwatcher process CJC01 status switching [RECOVERY-->OPEN]
                            WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
                            2023-10-12 15:26:27 OPEN OK CJC01 OPEN PRIMARY VALID 11 50019 50019
                              show global info
                              2023-10-12 15:26:38
                              #================================================================================#
                              GROUP OGUID MON_CONFIRM MODE MPP_FLAG
                              GRP1 123456 TRUE AUTO FALSE


                              <<DATABASE GLOBAL INFO:>>
                              DW_IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
                              192.16.12.11 33333 2023-10-12 15:26:37 GLOBAL VALID OPEN CJC01 OK 1 1 OPEN PRIMARY DSC_OPEN REALTIME VALID


                              DW_IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
                              192.16.12.12        33333        2023-10-12 15:26:37  GLOBAL    VALID     OPEN           CJC02             OK        1     1     OPEN        STANDBY   DSC_OPEN       REALTIME  VALID    
                              #================================================================================#

                              参考:

                                https://eco.dameng.com/document/dm/zh-cn/pm/data-watch-overview.html
                                https://eco.dameng.com/document/dm/zh-cn/pm/data-watch-overview.html

                                ###chenjuchao 20231213###

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

                                评论