达梦数据库(DM8)数据共享(DSC)集群故障测试与数据守护

发布于:2025-09-09 ⋅ 阅读:(20) ⋅ 点赞:(0)

1概述

DM 数据守护(Data Watch)是一种集成化的高可用、高性能数据库解决方案,可以实现异地灾备,并且在主库出现故障的时候快速实现主库切换,快速恢复数据库服务,满足用户不间断提供数据库服务的要求。
DM数据库的归档可以分为六类:本地归档、远程归档、实时归档、即时归档、异步归档和同步归档。其中,实时(Realtime)归档就是主库在事务提交时MAL系统将事务产生的Redo日志发送到备库,收到备库返回的响应才将Redo日志写入联机日志文件中;异步归档就是主库在Redo日志信息归档后,通过配置的定时器出发扫描本地归档目录获取Redo日志文件信息,通过MAL系统发动到备库进行重演,实现数据同步,与实时规定存在一定的延时,异步归档可以避开源库业务高峰期的时候进行,可减少在数据同步过程中对主库业务的影响;同步归档是在主库日志归档后,将Redo日志发送到备库,并马上响应主库,不要等待备库完成重演,因此,同步备库库一般用于对主库性能要求较高,想要避免因备库故障或异步恢复引发的Suspend状态切换,但又希望备库的数据延迟不要太大的场合。
实时主备集群就是归档日志配置了实时归档,保障数据库高可用与主备库数据一致。实时主备系统中,主库提供完整的数据库功能,备库提供只读服务。数据库中 Insert、Delete、Update 等 DML 操作以及 Create TABLE 等 DDL 操作最终都会体现为对某一个或者多个物理数据页的修改,这些变更会记录到redo日志。主库产生的Redo日志,通过实时归档机制,在写入联机Redo日志文件之前发送到备库,实时备库通过重演Redo日志与主库保持数据同步。当主库出现故障时,备库在将所有Redo日志重演结束后,就可以切换为主库对外提供数据库服务。
前面学习了主备数据守护集群的与DMDSC(DM Data Shared Cluster)集群的搭建,我们知道DSC集群的数据是保存在共享存储上的,虽然有创建定时备份当出现存储失效等故障时,数据库服务将会中断。数据守护集群由于主备库不在一个服务器和存储上,并且可以配置自动切换模式,是现在DSC集群故障的时候将实时备库切换为主库对外提供服务。DSC集群+DW集群的结构示意图如下:
在这里插入图片描述

本节基于前面搭建的DSC集群环境,演示以下四部分内容:(1)测试故障一个节点后,集群和持续提供服务;(2)基于已部署完成的DSC集群添加一个实时备机;(3)基于已部署完成的DSC集群添加一个异步备机;(4)完成DSC+DW集群主备切换。
普通的主备集群架构中只有主库对外提供服务,备库只是作为一份数据副本,也就是备份的功能,只有在主库异常的时候才能切换为主库,让集群对外提供不间断的服务。主备集群的备库服务器资源大部分时间是没有被充分利用的,读写分离集群架构就是在主备集群的基础上让集群内的备库也能持续对外提供服务分担主库压力,在读多写少的场景更明显,进一步提高了集群的并发能力。在更大并发读写压力的场景下,读写分离集群中只有一个主节点承担写请求也会达到单机的上限,DSC由于配合更高性能的共享磁盘,支持多实例同时读写,大大提高了并发能力,再通过添加实时/异步备库实现DSC+DW集群大大保证了集群的容灾能力和高可用。

2操作内容

2.1DSC环境信息

前面搭建的DSC集群的部署基本情况如下
1主1备2节点DSC集群部署规划:
IP规划:
主机名 服务ip 心跳ip 数据库名 实例名
dmdsc01 192.168.30.168 192.168.100.168 DSC DSC0
dmdsc02 192.168.30.169 192.168.100.169 DSC DSC1
端口规划:
实例名 实例端口 MAL系统端口 CSS端口 ASM端口 ASM的MAL端口 DCR检查实例端口
DSC1 5236 9236 9341 9351 7236 9741
DSC2 5236 9236 9341 9351 7236 9741
共享存储规划:
磁盘 裸设备名/用途
/dev/mapper/data_lun01 (20G) /dev/raw/raw4 (数据磁盘)
/dev/mapper/dcr_lun01 (5G) /dev/raw/raw1 (DCR磁盘)
/dev/mapper/vote_lun01 (5G) /dev/raw/raw2 (vote磁盘)
/dev/mapper/redo_lun01 (5G) /dev/raw/raw3 (redo日志磁盘)
/dev/raw/raw4 (归档日志磁盘)
本文因测试环境空间问题,所以把归档日志放在数据磁盘里面,建议使用独立磁盘/裸设备。
目录规划:(在对应服务器上创建目录owner为dmdba组为dinstall)
数据库软件安装目录 /home/dmdba/dmdbms
DSC配置文件目录 /home/dmdba/config
备份文件存放目录 /dmdata/dmbak/
DSC0本地归档目录 +DMDATA/dmarch/arch_dsc0
DSC0远程归档目录 +DMDATA/dmarch/arch_dsc1
DSC1本地归档目录 +DMDATA/dmarch/arch_dsc1
DSC1远程归档目录 +DMDATA/dmarch/arch_dsc0

2.2节点故障测试

在DSC集群正常启动的情况下,我们查询DSC相关的服务和当前运行的进程可以看到以下信息:

systemctl list-unit-files | grep Dm
ps -ef | grep dmdba

在这里插入图片描述

一共包括4个服务,DmAPService是备份相关的辅助服务;DmServiceDSC0是数据库实例服务;DmASMSvrServiceDSC0是达梦用来管理裸设备实现共享存储的软件服务;DmCSSServiceDSC1是负责收集集群状态信息,实现在故障时进行控制节点选举、节点重入、指令传达功能的服务。
为了查看集群状态信息,在dmdsc02上启动监视器:

su - dmdba
dmcssm ini_path=/home/dmdba/config/dmcssm.ini

在这里插入图片描述

2.2.1实例故障

在主节点dmdsc01上直接kill掉达梦数据库实例服务:

ps -ef | grep dmdba
kill -9 1810
ps -ef | grep dmdba

在这里插入图片描述

查看dmdsc02上监视器输出内容,首先会看到监视器每隔10秒进行心跳检测,一共检测6次:
在这里插入图片描述

这个检测次数与配置在DCR初始化配置文件dmdcr_cfg.ini中配置的数据库集群的DCR_GRP_DSKCHK_CNT值设置有关,比如我设置的是60秒,则表示如果60秒都没有检测到某个实例正常运行的心跳,DMCSS则判定该实例异常终止,需要进行控制节点切换、故障处理等操作。
在这里插入图片描述

在检测到实例异常终止后,我们查看监视器输出内容可以看到集群做了以下工作:首先是判定DSC0为异常终止实例;然后设置DSC1为新的控制节点;最后进行故障处理,将异常停止的实例上未提交的事务进行回滚;
在这里插入图片描述

此时我们再连接集群,看看集群对外是不是可以正常提供服务:

su - dmdba
disql SYSDBA/'"输入密码"'@DMDSC

创建测试表TEST_DSC,并插入一条数据:

create table TEST_DSC
(
	FID INT,
	FDESC VARCHAR2(100)
);
insert into TEST_DSC(FID,FDESC) VALUES(1,'dsc0故障后插入的数据!');
commit;
select * from TEST_DSC;

在这里插入图片描述

上面的故障处理完成后,DSC集群便允许故障节点重入。此时,如果现在dmdsc01上启动数据库实例服务,故障节点可自行加入集群。

su - dmdba
cd /home/dmdba/dmdbms/bin
./DmServiceDSC0 start

在这里插入图片描述

在监视器输出我们可以看到以下内容:
在这里插入图片描述

首先是心跳检测发现之前异常停止的节点DSC0已经启动,接着是加载DCR磁盘和实例恢复,现在直接连接DSC0实例,查询TEST_DSC表是可以查到故障后数据库修改的内容的:

disql SYSDBA/'"输入密码"'@192.168.30.168
select * from TEST_DSC;

在这里插入图片描述

2.2.2节点宕机

在DSC集群正常的状态下,将控制节点所在dmdsc01主机直接关机,也即停止控制节点的数据库实例、DMASM、DMCSS服务。此时,可以在dmdsc01监视器看到以下信息:首先检测到数据库实例DSC0异常停机,将DSC1设置为控制节点,进行相关故障处理和事务回滚;接着是检测到dmdsc01节点的ASM服务故障,进行相关的故障处理;最后检测到DMCSS1节点异常。
在这里插入图片描述

在监视器的配置文件/home/dmdba/config/dmcssm.in中的CSSM_LOG_PATH参数配置了监视器日志文件存放位置,在这个目录找到对应的CSS日志文件,我们可以看到DMCSS集群每秒都会尝试重连DMCSS1节点:

tail -f dmcssm_20250831204650.log

在这里插入图片描述

这时我们用disql连接DSC集群,看看集群对外是不是可以正常提供服务:

su - dmdba
disql SYSDBA/'"输入密码"'@DMDSC

往TEST_DSC表插入一条数据并提交事务:

insert into TEST_DSC(FID,FDESC) VALUES(2,'dmdsc01故障后插入的数据!');
commit;
select * from TEST_DSC;

在这里插入图片描述

重启dmdsc01服务器后,由于DSC集群相关服务已经设置为了开机自启,因此,会自动加入集群,我们看监视器可以看到以下内容:首先是这是DMCSS1设置为控制节点,然后依次恢复故障节点的DMASM和数据库实例服务。
在这里插入图片描述

我们用disql连接DSC集群,看看集群对外是不是可以查到故障后插入的数据:

su - dmdba
disql SYSDBA/'"输入密码"'@DMDSC

在这里插入图片描述

同样的直接连接DSC1实例也是可以查到数据的:
在这里插入图片描述

因此,DSC集群某个节点故障后,集群是可以继续正常提供服务的,故障节点恢复后可自动进行故障恢复并可重新加入集群。

2.3添加实时备机

前面说到给DSC+DW集群可实现数据库集群的异地灾备以及共享存储设备异常后实现主库切换后对外继续提供服务。本节演示如何给DSC集群添加一个实时备机。
首先,我们需要准备一台新的服务器,IP为192.168.30.170,具体信息如下
IP规划:
主机名 服务ip 心跳ip 数据库名 实例名
dmdsc01 192.168.30.168 192.168.100.168 DSC DSC0
dmdsc02 192.168.30.169 192.168.100.169 DSC DSC1
dmdb01 192.168.30.170 192.168.100.170 dmdb dmdb
端口规划:
实例名 实例端口 MAL系统端口 CSS端口 ASM端口 ASM的MAL端口 DCR检查实例端口
DSC1 5236 9236 9341 9351 7236 9741
DSC2 5236 9236 9341 9351 7236 9741

2.3.1备机安装DM并初始化实例

按照单机部署的步骤在两台服务器上安装数据库软件,包括:系统内核参数修改、创建数据库管理用户和组、关闭操作系统资源限制、关闭透明大页和numa、添加用户环境变量、创建数据目录并授权、修改磁盘调度算法为deadline、测试磁盘IO、安装DM数据库软件。
安装好后进行初始化实例操作:

su - dmdba
dminit path=/dmdata page_size=32 extent_size=32 charset=1 log_size=2048 db_name=dmdb instance_name=dmdb SYSDBA_PWD="输入密码" SYSAUDITOR_PWD="输入密码" 

在这里插入图片描述

使用$DM_HOME/script/root/dm_service_installer.sh进行数据库服务注册,后续便可以操作系统服务的方式管理,一般用到的参数如下:

-t 服务类型:注册服务类型,支持以下服务类型:dmap、dmamon、dmserver、dmwatcher、dmmonitor、dmasmsvr、dmasmsvrm、dmcss、dmcssm。
-dm_ini INI 文件路径:指定服务所需要的 dm.ini 文件路径。
-p 服务名后缀:指定服务名后缀,生成的操作系统服务名为“服务脚本模板名,称 + 服务名后缀”。此参数只针对 dmserver、dmwatcher、dmmonitor、dmasmsvr、dmasmsvrm、dmcss、dmcssm 服务脚本生效。

以root用户执行:

cd /home/dmdba/dmdbms/script/root/
./dm_service_installer.sh -t dmserver -p dmdb -dm_ini /dmdata/dmdb/dm.ini

先不用启动数据库实例服务。
虽然可以用systemctl的方式来启动和管理数据库实例服务,但是还是要养成使用DM自带的脚本进行实例启停(systemctl的方式启动的时候执行没有错误提示,并且有时候可能没有root用户权限):

su - dmdba
# cd $DM_HOME/bin
cd /home/dmdba/dmdbms/bin
# ./DmServiceXXX start|stop|restart|status
./DmServicedmdb status

2.3.2数据准备

因为DSC集群作为主库,所以需要对DSC集群的数据进行全备,这里采用脱机全备的方式进行备份,按以下顺序停止DSC集群实例:

su - dmdba
cd /home/dmdba/dmdbms/bin
# 主节点dmdsc01执行
./DmServiceDSC0 stop
# dmdsc02执行
./DmServiceDSC1 stop

监视器可以看到以下信息:
在这里插入图片描述

DSC集群中的实例服务都停止后,在dmdsc01上进行脱机全备:

# 创建备份目录
mkdir -p /dmbak/full_bak
# 授权
chown -R dmdba:dinstall /dmbak/
# 备份
cd /home/dmdba/dmdbms/bin
./dmrman dcr_ini=/home/dmdba/config/dmdcr.ini
# 进入dmrman命令行
backup database '/home/dmdba/config/dsc0/dm.ini' full backupset '/dmbak/full_bak';

在这里插入图片描述

将生成的备份文件传输到备库:

scp -r /dmbak/full_bak root@192.168.30.170:/dmbak/
# 传过去后再dmdb01(192.168.30.170)上执行
chown -R dmdba:dinstall /dmbak/

在实时备机dmdb01上的dmdb实例还原DSC集群的全备数据:

su - dmdba
# 还原数据库
cd /home/dmdba/dmdbms/bin
./dmrman CTLSTMT="RESTORE DATABASE '/dmdata/dmdb/dm.ini' FROM BACKUPSET '/dmbak/full_bak'"
# 恢复归档日志
./dmrman CTLSTMT="RECOVER DATABASE '/dmdata/dmdb/dm.ini' FROM BACKUPSET '/dmbak/full_bak'"
# 更新数据库魔数
./dmrman CTLSTMT="RECOVER DATABASE '/dmdata/dmdb/dm.ini' UPDATE DB_MAGIC"

在这里插入图片描述

2.3.3修改dm.ini参数

DSC集群的所有节点和实时备库都需要修改。其实就和主备数据守护集群的配置是一样的。
在dmdsc01:

vi /home/dmdba/config/dsc0/dm.ini

修改以下内容:

INSTANCE_NAME = DSC0 # 实例名称:不用改
MAL_INI = 1
ARCH_INI = 1
ALTER_MODE_STATUS = 0 # 不允许手工方式修改实例模式
ENABLE_OFFLINE_TS = 2 # 禁止备库offline 表空间

在dmdsc02:

vi /home/dmdba/config/dsc1/dm.ini

修改以下内容:

INSTANCE_NAME = DSC1 # 实例名称:不用改
MAL_INI = 1
ARCH_INI = 1
ALTER_MODE_STATUS = 0 # 不允许手工方式修改实例模式
ENABLE_OFFLINE_TS = 2 # 禁止备库offline 表空间

在dmdb01:

vi /dmdata/dmdb/dm.ini

修改以下内容:

INSTANCE_NAME = DMDB # 实例名称:不用改
MAL_INI = 1
ARCH_INI = 1
ALTER_MODE_STATUS = 0 # 不允许手工方式修改实例模式
ENABLE_OFFLINE_TS = 2 # 禁止备库offline 表空间

2.3.4配置MAL系统配置文件 dmmal.ini

DSC集群的所有节点和实时备库都需要修改,并且内容要一致,所以在dmdsc01修改:

vi /home/dmdba/config/dsc0/dmmal.ini

dmdsc02修改:

vi /home/dmdba/config/dsc1/dmmal.ini

dmdb01新建:

vi /dmdata/dmdb/dmmal.ini

内容如下:

MAL_CHECK_INTERVAL   = 5  
MAL_CONN_FAIL_INTERVAL  = 15  
[MAL_INST0]
  MAL_INST_NAME = DSC0 
  MAL_HOST     = 192.168.100.168 # 心跳IP
  MAL_PORT     = 9236
  MAL_INST_HOST   = 192.168.30.168  # 业务IP
  MAL_INST_PORT   = 5236 
  MAL_DW_PORT   = 7436
  MAL_INST_DW_PORT = 7536
[MAL_INST1]
  MAL_INST_NAME = DSC1 
  MAL_HOST     = 192.168.100.169 # 心跳IP
  MAL_PORT     = 9236
  MAL_INST_HOST   = 192.168.30.169  # 业务IP
  MAL_INST_PORT   = 5236 
  MAL_DW_PORT   = 7436
  MAL_INST_DW_PORT = 7536
[MAL_INST2]
  MAL_INST_NAME = DMDB # 实时备库实例名 
  MAL_HOST      = 192.168.100.170 # 心跳IP
  MAL_PORT          = 9236
  MAL_INST_HOST         = 192.168.30.170  # 业务IP
  MAL_INST_PORT         = 5236 
  MAL_DW_PORT  = 7436
  MAL_INST_DW_PORT = 7536

其他节点复制过去即可。

2.3.5配置守护进程配置文件 dmwatcher.ini

DSC集群内的两个节点和备库都要创建dmwatcher.ini。
dmdsc01新建:

vi /home/dmdba/config/dsc0/dmwatcher.ini

内容如下:

[GRP_DSC_DW] 
DW_TYPE    = GLOBAL  
DW_MODE    =MANUAL # MANUAL表示手动切换,AUTO表示自动切换
DW_ERROR_TIME     = 30  
INST_RECOVER_TIME  = 60         
INST_ERROR_TIME   = 20  
INST_OGUID         = 453331 # 这个OGID后面会重设
INST_INI           = /home/dmdba/config/dsc0/dm.ini
INST_AUTO_RESTART  = 1  # 是否自动重启数据库实例0:不自动重启(默认)1:自动重启
INST_STARTUP_CMD   = /home/dmdba/dmdbms/bin/DmServiceDSC0 start

dmdsc02新建:

vi /home/dmdba/config/dsc1/dmwatcher.ini

内容如下:

[GRP_DSC_DW] 
DW_TYPE    = GLOBAL  
DW_MODE    =MANUAL # MANUAL表示手动切换,AUTO表示自动切换
DW_ERROR_TIME     = 30  
INST_RECOVER_TIME  = 60         
INST_ERROR_TIME   = 20  
INST_OGUID         = 453331 # 这个OGID后面会重设
INST_INI           = /home/dmdba/config/dsc1/dm.ini
INST_AUTO_RESTART  = 1  # 是否自动重启数据库实例0:不自动重启(默认)1:自动重启
INST_STARTUP_CMD   = /home/dmdba/dmdbms/bin/DmServiceDSC1 start

dmdb01新建:

vi /dmdata/dmdb/dmwatcher.ini

内容如下:

[GRP_DSC_DW] 
DW_TYPE    = GLOBAL  
DW_MODE    =MANUAL # MANUAL表示手动切换,AUTO表示自动切换
DW_ERROR_TIME     = 30  
INST_RECOVER_TIME  = 60         
INST_ERROR_TIME   = 20  
INST_OGUID         = 453331 # 这个OGID后面会重设
INST_INI           = /dmdata/dmdb/dm.ini 
INST_AUTO_RESTART  = 1  # 是否自动重启数据库实例0:不自动重启(默认)1:自动重启
INST_STARTUP_CMD   = /home/dmdba/dmdbms/bin/DmServicedmdb start

2.3.6配置归档配置文件 dmarch.ini

DSC集群内的两个节点和备库都要创建dmarch.ini。其中,DSC集群内的节点需要增加实时REALTIME归档。
dmdsc01修改:

vi /home/dmdba/config/dsc0/dmarch.ini

内容如下:

ARCH_LOCAL_SHARE = 1
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = +DMDATA/dmarch/arch_dsc0
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 1024
[ARCH_REMOTE1]
ARCH_TYPE = REMOTE
ARCH_DEST = DSC1
ARCH_INCOMING_PATH = +DMDATA/dmarch/arch_dsc1
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 1024
[ARCHIVE_REALTIME1] # 实时归档用于实时主备数据守护集群
ARCH_TYPE = REALTIME # 实时归档
ARCH_DEST = DMDB # 备库实例名

上面配置了本地归档,但是归档的位置在共享磁盘上,这个目录如果要访问的话需要dmasmtool工具访问共享存储磁盘:

su - dmdba
cd /home/dmdba/dmdbms/bin/
./dmasmtool dcr_ini=/home/dmdba/config/dmdcr.ini

在这里插入图片描述

如果你不想多一步使用dmasmtool的操作的话,其实你也可以在dmdsc01和dmdsc02的dmarch.ini上多配置一个本地归档,归档的目录可以设置在本机的磁盘上。

dmdsc02修改:

vi /home/dmdba/config/dsc1/dmarch.ini

内容如下:

ARCH_LOCAL_SHARE = 1
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = +DMDATA/dmarch/arch_dsc1
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 1024
[ARCH_REMOTE1]
ARCH_TYPE = REMOTE
ARCH_DEST = DSC0
ARCH_INCOMING_PATH = +DMDATA/dmarch/arch_dsc0
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 1024
[ARCHIVE_REALTIME1] # 实时归档用于实时主备数据守护集群
ARCH_TYPE = REALTIME # 实时归档
ARCH_DEST = DMDB # 备库实例名

dmdb01新建:

vi /dmdata/dmdb/dmarch.ini

内容如下:

[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST =/dmdata/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 2048 #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT =102400 #单位 Mb,0 表示无限制,范围 1024~2147483647M
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME # 实时归档
ARCH_DEST = DSC0/DSC1 # DSC集群中的实例名

2.3.7启动实例为mount状态

使用dmdba用户修改DSC集群内所有节点以及实时备库的实例服务脚本,修改为mount启动,并依次启动DSC0、DSC1、DMDB实例服务:
dmdsc01:

cd /home/dmdba/dmdbms/bin/
vi DmServiceDSC0
# 修改 START_MODE=mount
# 保存后启动数据库实例
./DmServiceDSC0 start

在这里插入图片描述
在这里插入图片描述

dmdsc02:

cd /home/dmdba/dmdbms/bin/
vi DmServiceDSC1
# 修改 START_MODE=mount
# 保存后启动数据库实例
./DmServiceDSC1 start

在这里插入图片描述

或者可以使用前台启动的方式:

dmserver dcr_ini=/home/dmdba/config/dmdcr.ini /home/dmdba/config/dsc1/dm.ini mount

dmdb01:

cd /home/dmdba/dmdbms/bin/
vi DmServicedmdb
# 修改 START_MODE=mount
# 保存后启动数据库实例
./DmServicedmdb start

在这里插入图片描述
在这里插入图片描述

2.3.8设置OGUID并修改数据库模式

设置 OGUID和修改数据库模式,只需要DSC集群任意一个节点和实时备库执行:
dmdsc01登录disql后执行:

disql SYSDBA/'"输入密码"'@192.168.30.168
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
sp_set_oguid(453331);
alter database primary;
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);

在这里插入图片描述

备库dmdb01登录disql后执行:

disql SYSDBA/'"输入密码"'@192.168.30.170
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
sp_set_oguid(453331);
alter database standby;
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);

在这里插入图片描述

2.3.9启动守护进程

登录为dmdba 用户,到每台服务器的数据库安装目录的 bin 下执行以下命令(主备库都执行):

dmdsc01:
dmwatcher /home/dmdba/config/dsc0/dmwatcher.ini

可能遇到报错:
在这里插入图片描述

后面发现控制文件dm.ctl没有改过,然后重新查看守护进程的配置文件发现是INST_INI配错了!
在这里插入图片描述

可能遇到报错:
在这里插入图片描述

在dmwatcher.ini增加DCR_INI项:
在这里插入图片描述

成功启动后:
在这里插入图片描述

dmdsc02:

dmwatcher /home/dmdba/config/dsc1/dmwatcher.ini

在这里插入图片描述

dmdb01:

dmwatcher /dmdata/dmdb/dmwatcher.ini

在这里插入图片描述

2.3.10启动监视器

在备库dmdb01上配置监视器,新建配置文件:

su - dmdba
vi /dmdata/dmdb/dmmonitor.ini

内容如下:

MON_DW_CONFIRM    = 0 #普通监视器模式
MON_LOG_PATH    = /home/dmdba/dmdbms/log  #监视器日志文件存放路径
MON_LOG_INTERVAL  = 60 #每隔 60 s 定时记录系统信息到日志文件
MON_LOG_FILE_SIZE   = 200 #每个日志文件最大 32 MB
MON_LOG_SPACE_LIMIT  = 1024  #不限定日志文件总占用空间
[GRP_DSC_DW] # 组名,要和/dmdata/dmdb/dmwatcher.ini中的一致
 MON_INST_OGUID    = 453331 #组 GRP_DW 的唯一 OGUID 值
#以下配置为监视器到组 GRP_DW 的守护进程的连接信息,以“IP:PORT”的形式配置
#IP 对应 dmmal.ini 中的 MAL_HOST,PORT 对应 dmmal.ini 中的 MAL_DW_PORT
 MON_DW_IP     = 192.168.100.168:7436/192.168.100.169:7436 # 主库dsc集群
 MON_DW_IP     = 192.168.100.170:7436 # 备库

在备库dmdb01上前台启动监视器:

su - dmdba
dmmonitor /dmdata/dmdb/dmmonitor.ini

在这里插入图片描述

单独连接各实例可以看到:
dmdsc01:
在这里插入图片描述

dmdsc02
在这里插入图片描述

dmdb01:
在这里插入图片描述

至此,DSC+实时备机DW集群已完成搭建,上面是前台启动的方式,如果要开机自启以及后台运行的话需要注册为服务:
使用 root 用户,到数据库安装目录的/home/dmdba/dmdbms/script/root/下:
在dmdsc0、dmdsc01、dmdba01上将数据守护进程注册为服务:

# 改一下每一台机器上的配置文件信息
./dm_service_installer.sh -t dmwatcher -watcher_ini /dmdata/dmdb/dmwatcher.ini -p DSC_DW

2.3.11验证主备集群同步状态

在disql连接DSC集群,创建测试表并插入数据后,观察备库实例dmdb能否查到对应数据。
使用disql连接dsc1:

disql SYSDBA/'"输入密码"'@DMDSC

创建测试表TEST_DESC并插入数据:

create table TEST_DSC_REAL
(
	FID INT,
	FDESC VARCHAR2(100)
);
insert into TEST_DSC_REAL(FID,FDESC) VALUES(1,'在DSC集群插入一条数据!');
commit;
select * from TEST_DSC_REAL;

在这里插入图片描述

用disql连接备库,可以看到查到DSC集群刚刚插入的数据,说明数据可以同步。

disql SYSDBA/'"输入密码"'@192.168.30.170

在这里插入图片描述

2.4添加异步备机

本节演示如何给DSC集群添加一个异步备机,异步备机其实和实时主备的操作流程是一致,区别其实就是在DSC集群的每一个实例的dm.ini中打开定时器TIMER_INI开关,新增配置文件dmtimer.ini,在归档配置文件dmarch.ini中增加异步归档配置,在dmmal.ini中增加异步备库的mal配置,由定时器定时触发源库发送归档日志到异步备库进行重演。
首先,我们需要准备一台新的服务器,IP为192.168.30.170,具体信息如下
IP规划:
主机名 服务ip 心跳ip 数据库名 实例名
dmdsc01 192.168.30.168 192.168.100.168 DSC DSC0
dmdsc02 192.168.30.169 192.168.100.169 DSC DSC1
dmdb02 192.168.30.171 192.168.100.171 dmdb dmdb
端口规划:
实例名 实例端口 MAL系统端口 CSS端口 ASM端口 ASM的MAL端口 DCR检查实例端口
DSC1 5236 9236 9341 9351 7236 9741
DSC2 5236 9236 9341 9351 7236 9741

2.4.1备机安装DM并初始化实例

安装好数据库后进行初始化实例操作:

su - dmdba
dminit path=/dmdata page_size=32 extent_size=32 charset=1 log_size=2048 db_name=dmdb instance_name=dmdb SYSDBA_PWD="输入密码" SYSAUDITOR_PWD="输入密码" 

使用$DM_HOME/script/root/dm_service_installer.sh进行数据库服务注册,以root用户执行:

cd /home/dmdba/dmdbms/script/root/
./dm_service_installer.sh -t dmserver -p dmdb -dm_ini /dmdata/dmdb/dm.ini

2.4.2数据准备

对DSC集群的数据进行全备,这里采用脱机全备的方式进行备份,按以下顺序停止DSC集群实例:

su - dmdba
cd /home/dmdba/dmdbms/bin
# 主节点dmdsc01执行
./DmServiceDSC0 stop
# dmdsc02执行
./DmServiceDSC1 stop

DSC集群中的实例服务都停止后,在dmdsc01上进行脱机全备:

rm -rf /dmbak/full_bak/*
# 备份
cd /home/dmdba/dmdbms/bin
./dmrman dcr_ini=/home/dmdba/config/dmdcr.ini
# 进入dmrman命令行
backup database '/home/dmdba/config/dsc0/dm.ini' full backupset '/dmbak/full_bak';

在这里插入图片描述

将生成的备份文件传输到备库dmdb02:

scp -r /dmbak/full_bak root@192.168.30.171:/dmbak/
# 传过去后再dmdb01(192.168.30.171)上执行
chown -R dmdba:dinstall /dmbak/

在异步备机dmdb02上的dmdb实例还原DSC集群的全备数据:

su - dmdba
# 还原数据库
cd /home/dmdba/dmdbms/bin
./dmrman CTLSTMT="RESTORE DATABASE '/dmdata/dmdb/dm.ini' FROM BACKUPSET '/dmbak/full_bak'"
# 恢复归档日志
./dmrman CTLSTMT="RECOVER DATABASE '/dmdata/dmdb/dm.ini' FROM BACKUPSET '/dmbak/full_bak'"
# 更新数据库魔数
./dmrman CTLSTMT="RECOVER DATABASE '/dmdata/dmdb/dm.ini' UPDATE DB_MAGIC"

在这里插入图片描述

2.4.3修改dm.ini参数

DSC集群的所有节点和异步备库都需要修改。和主备数据守护集群的配置是一样的。
在dmdsc01:

vi /home/dmdba/config/dsc0/dm.ini

修改以下内容:

INSTANCE_NAME = DSC0 # 实例名称:不用改
MAL_INI = 1
ARCH_INI = 1
ALTER_MODE_STATUS = 0 # 不允许手工方式修改实例模式
ENABLE_OFFLINE_TS = 2 # 禁止备库offline 表空间
TIMER_INI = 1 # 定时器配置开关

在dmdsc02:

vi /home/dmdba/config/dsc1/dm.ini

修改以下内容:

INSTANCE_NAME = DSC1 # 实例名称:不用改
MAL_INI = 1
ARCH_INI = 1
ALTER_MODE_STATUS = 0 # 不允许手工方式修改实例模式
ENABLE_OFFLINE_TS = 2 # 禁止备库offline 表空间
TIMER_INI = 1 # 定时器配置开关

在dmdb02:

vi /dmdata/dmdb/dm.ini

修改以下内容:

INSTANCE_NAME = DMDB # 实例名称:不用改
MAL_INI = 1
ARCH_INI = 1
ALTER_MODE_STATUS = 0 # 不允许手工方式修改实例模式
ENABLE_OFFLINE_TS = 2 # 禁止备库offline 表空间

2.4.4配置MAL系统配置文件 dmmal.ini

DSC集群的所有节点和异步备库内容要一致,所以在dmdsc01修改:

vi /home/dmdba/config/dsc0/dmmal.ini

dmdsc02修改:

vi /home/dmdba/config/dsc1/dmmal.ini

dmdb02新建:

vi /dmdata/dmdb/dmmal.ini

内容如下:

MAL_CHECK_INTERVAL   = 5  
MAL_CONN_FAIL_INTERVAL  = 15  
[MAL_INST0]
  MAL_INST_NAME = DSC0 
  MAL_HOST     = 192.168.100.168 # 心跳IP
  MAL_PORT     = 9236
  MAL_INST_HOST   = 192.168.30.168  # 业务IP
  MAL_INST_PORT   = 5236 
  MAL_DW_PORT   = 7436
  MAL_INST_DW_PORT = 7536
[MAL_INST1]
  MAL_INST_NAME = DSC1 
  MAL_HOST     = 192.168.100.169 # 心跳IP
  MAL_PORT     = 9236
  MAL_INST_HOST   = 192.168.30.169  # 业务IP
  MAL_INST_PORT   = 5236 
  MAL_DW_PORT   = 7436
  MAL_INST_DW_PORT = 7536
[MAL_INST2]
  MAL_INST_NAME = DMDB # 异步备库实例名 
  MAL_HOST      = 192.168.100.171 # 心跳IP
  MAL_PORT          = 9236
  MAL_INST_HOST         = 192.168.30.171  # 业务IP
  MAL_INST_PORT         = 5236 
  MAL_DW_PORT  = 7436
  MAL_INST_DW_PORT = 7536

2.4.5配置守护进程配置文件 dmwatcher.ini

DSC集群内的两个节点和备库都要创建dmwatcher.ini,文件内容与实时备库配置区别在于异步备库需要将守护进程的DW_TYPE设为 LOCAL(本地归档),DW_MODE(自动切换主库)为 MANUAL(手动切换)。
dmdsc01新建:

vi /home/dmdba/config/dsc0/dmwatcher.ini
内容如下:
[GRP_DSC_DW] 
DW_TYPE    = LOCAL  # 表示仅监控当前节点实例的运行状态
# GLOBAL(全局守护)监控整个守护组(如DSC集群的主备节点),参与主备切换决策
DW_MODE    =MANUAL # MANUAL表示手动切换,AUTO表示自动切换
DW_ERROR_TIME     = 30  
INST_RECOVER_TIME  = 60         
INST_ERROR_TIME   = 20  
INST_OGUID         = 453331 # 这个OGID后面会重设
INST_INI           = /home/dmdba/config/dsc0/dm.ini
INST_AUTO_RESTART  = 1  # 是否自动重启数据库实例0:不自动重启(默认)1:自动重启
INST_STARTUP_CMD   = /home/dmdba/dmdbms/bin/DmServiceDSC0 start

dmdsc02新建:

vi /home/dmdba/config/dsc1/dmwatcher.ini

内容如下:

[GRP_DSC_DW] 
DW_TYPE    = LOCAL  # 表示仅监控当前节点实例的运行状态
DW_MODE    =MANUAL # MANUAL表示手动切换,AUTO表示自动切换
DW_ERROR_TIME     = 30  
INST_RECOVER_TIME  = 60         
INST_ERROR_TIME   = 20  
INST_OGUID         = 453331 # 这个OGID后面会重设
INST_INI           = /home/dmdba/config/dsc1/dm.ini
INST_AUTO_RESTART  = 1  # 是否自动重启数据库实例0:不自动重启(默认)1:自动重启
INST_STARTUP_CMD   = /home/dmdba/dmdbms/bin/DmServiceDSC1 start

dmdb02新建:

vi /dmdata/dmdb/dmwatcher.ini

内容如下:

[GRP_DSC_DW] 
DW_TYPE    = LOCAL  # 表示仅监控当前节点实例的运行状态
DW_MODE    =MANUAL # MANUAL表示手动切换,AUTO表示自动切换
DW_ERROR_TIME     = 30  
INST_RECOVER_TIME  = 60         
INST_ERROR_TIME   = 20  
INST_OGUID         = 453331 # 这个OGID后面会重设
INST_INI           = /dmdata/dmdb/dm.ini 
INST_AUTO_RESTART  = 1  # 是否自动重启数据库实例0:不自动重启(默认)1:自动重启
INST_STARTUP_CMD   = /home/dmdba/dmdbms/bin/DmServicedmdb start

2.4.6配置归档配置文件 dmarch.ini

DSC集群内的两个节点和备库都要创建dmarch.ini。其中,DSC集群内的节点需要增加异步ASYNC归档。
dmdsc01修改:

vi /home/dmdba/config/dsc0/dmarch.ini

内容如下:

ARCH_LOCAL_SHARE = 1
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = +DMDATA/dmarch/arch_dsc0
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 1024
[ARCH_REMOTE1]
ARCH_TYPE = REMOTE
ARCH_DEST = DSC1
ARCH_INCOMING_PATH = +DMDATA/dmarch/arch_dsc1
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 1024
[ARCHIVE_ASYNC]  # 增加异步归档配置
ARCH_TYPE = ASYNC  # 归档类型为异步
ARCH_DEST = DMDB
ARCH_TIMER_NAME = ASYNC_TIMER  # 定时器名称

dmdsc02修改:

vi /home/dmdba/config/dsc1/dmarch.ini

内容如下:

ARCH_LOCAL_SHARE = 1
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = +DMDATA/dmarch/arch_dsc1
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 1024
[ARCH_REMOTE1]
ARCH_TYPE = REMOTE
ARCH_DEST = DSC0
ARCH_INCOMING_PATH = +DMDATA/dmarch/arch_dsc0
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 1024
[ARCHIVE_ASYNC]  # 增加异步归档配置
ARCH_TYPE = ASYNC  # 归档类型为异步
ARCH_DEST = DMDB
ARCH_TIMER_NAME = ASYNC_TIMER  # 定时器名称

dmdb02新建:

vi /dmdata/dmdb/dmarch.ini

内容如下:只配置本地归档

[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST =/dmdata/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 2048 #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT =102400 #单位 Mb,0 表示无限制,范围 1024~2147483647M

2.4.7配置定时器dmtimer.ini

定时器只需要在主库配置,如果是DSC集群则在DSC集群中的每一个节点都要配置dmtimer.ini。
dmdsc01新建:

vi /home/dmdba/config/dsc0/dmtimer.ini

dmdsc02新建:

vi /home/dmdba/config/dsc1/dmtimer.ini

内容如下:配置一个每隔1分钟执行一次的定时器

[ASYNC_TIMER]  #定时器名称,跟主库dmarch.ini一致
TYPE = 2 # 2 表示按日执行
FREQ_MONTH_WEEK_INTERVAL = 1 # 间隔月或周数。与上面的不同调度类型有关
FREQ_SUB_INTERVAL = 0  # 当 TYPE=1 或 2 时,这个值无效,系统不会做检查
FREQ_MINUTE_INTERVAL = 1 # 间隔分钟数
START_TIME = 00:00:00 # 定时器开始时间
END_TIME = 00:00:00 # 定时器结束时间
DURING_START_DATE = 2025-01-01 00:00:00  # 开始日期
DURING_END_DATE = 2026-12-31 23:59:59 # 结束日期
NO_END_DATE_FLAG = 1 # 是否多次执行
IS_VALID=1  #定时器有效标记
DESCRIBE = ASYNC_TIMER #定时器描述

如果后续有修改的话需要重启守护进程。
用日历语法:配置一个从START_TIME时间开始计算每60秒触发一次的定时器

[ASYNC_TIMER] 
TYPE= 10
FREQ_MONTH_WEEK_INTERVAL= 
FREQ_SUB_INTERVAL= 
FREQ_MINUTE_INTERVAL= 
REPEAT_INTERVAL= FREQ=SECONDLY;INTERVAL=60
START_TIME= 00:00:00
END_TIME= 
DURING_START_DATE= 2021-12-15 10:00:00
DURING_END_DATE= 2029-12-20 10:00:00
NO_END_DATE_FLAG= 1
DESCRIBE= ASYNC_TIMER
IS_VALID= 1

2.4.8启动实例为mount状态

使用dmdba用户修改DSC集群内所有节点以及异步备库的实例服务脚本,修改为mount启动,并依次启动DSC0、DSC1、DMDB实例服务:
dmdsc01:

cd /home/dmdba/dmdbms/bin/
vi DmServiceDSC0
# 修改 START_MODE=mount
# 保存后启动数据库实例
./DmServiceDSC0 start

在这里插入图片描述

dmdsc02:

cd /home/dmdba/dmdbms/bin/
vi DmServiceDSC1
# 修改 START_MODE=mount
# 保存后启动数据库实例
./DmServiceDSC1 start

或者可以使用前台启动的方式:

dmserver dcr_ini=/home/dmdba/config/dmdcr.ini /home/dmdba/config/dsc1/dm.ini mount

dmdb01:

cd /home/dmdba/dmdbms/bin/
vi DmServicedmdb
# 修改 START_MODE=mount
# 保存后启动数据库实例
./DmServicedmdb start

在这里插入图片描述

连接每个实例都可以看到数据库状态主库配置状态:
在这里插入图片描述

2.4.9设置OGUID并修改数据库模式

设置 OGUID和修改数据库模式,只需要DSC集群任意一个节点和异步备库执行:
dmdsc01登录disql后执行:

disql SYSDBA/'"输入密码"'@192.168.30.168
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
sp_set_oguid(453331);
alter database primary;
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);

备库dmdb02登录disql后执行:

disql SYSDBA/'"输入密码"'@192.168.30.170
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
sp_set_oguid(453331);
alter database standby;
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);

2.4.10启动守护进程

登录为dmdba 用户,到每台服务器的数据库安装目录的 bin 下执行以下命令(主备库都执行):
dmdsc01:

dmwatcher /home/dmdba/config/dsc0/dmwatcher.ini

dmdsc02:

dmwatcher /home/dmdba/config/dsc1/dmwatcher.ini

dmdb02:

dmwatcher /dmdata/dmdb/dmwatcher.ini

2.4.11启动监视器

在备库dmdb02上配置监视器,新建配置文件:
su - dmdba

vi /dmdata/dmdb/dmmonitor.ini

内容如下:

MON_DW_CONFIRM    = 0 #普通监视器模式
MON_LOG_PATH    = /home/dmdba/dmdbms/log  #监视器日志文件存放路径
MON_LOG_INTERVAL  = 60 #每隔 60 s 定时记录系统信息到日志文件
MON_LOG_FILE_SIZE   = 200 #每个日志文件最大 32 MB
MON_LOG_SPACE_LIMIT  = 1024  #不限定日志文件总占用空间
[GRP_DSC_DW] # 组名,要和/dmdata/dmdb/dmwatcher.ini中的一致
 MON_INST_OGUID    = 453331 #组 GRP_DW 的唯一 OGUID 值
#以下配置为监视器到组 GRP_DW 的守护进程的连接信息,以“IP:PORT”的形式配置
#IP 对应 dmmal.ini 中的 MAL_HOST,PORT 对应 dmmal.ini 中的 MAL_DW_PORT
 MON_DW_IP     = 192.168.100.168:7436/192.168.100.169:7436 # 主库dsc集群
 MON_DW_IP     = 192.168.100.171:7436 # 备库

在备库dmdb01上前台启动监视器:

su - dmdba
dmmonitor /dmdata/dmdb/dmmonitor.ini

单独连接各实例可以看到:
dmdsc01:
在这里插入图片描述

dmdsc02:
在这里插入图片描述

异步备库dmdb02:
在这里插入图片描述

至此,DSC+异步备机DW集群已完成搭建,上面是前台启动的方式,如果要开机自启以及后台运行的话需要注册为服务:
使用 root 用户,到数据库安装目录的/home/dmdba/dmdbms/script/root/下:
在dmdsc0和dmdsc01上将数据守护进程注册为服务:

# 改一下每一台机器上的配置文件信息
./dm_service_installer.sh -t dmwatcher -watcher_ini /dmdata/dmdb/dmwatcher.ini -p DSC_DW

2.4.12验证主备集群同步状态

在disql连接DSC集群,创建测试表并插入数据后,观察异步备库实例dmdb能否查到对应数据。
使用disql连接dsc1:

disql SYSDBA/'"输入密码"'@DMDSC

创建测试表TEST_DSC_ASYNC并插入数据:

create table TEST_DSC_ASYNC
(
	FID INT,
	FDESC VARCHAR2(100)
);
insert into TEST_DSC_ASYNC(FID,FDESC) VALUES(1,sysdate);
insert into TEST_DSC_ASYNC(FID,FDESC) VALUES(2,'在DSC集群插入一条数据!');
commit;
select * from TEST_DSC_ASYNC;

在这里插入图片描述

用disql连接备库,可以看到可以看到一分钟以后才能查到DSC集群插入的数据,说明数据可以同步,并且是按定时器设置的频率异步同步的。

disql SYSDBA/'"输入密码"'@192.168.30.171
select sysdate from dual;
select * from TEST_DSC_ASYNC;
select sysdate from dual;
select * from TEST_DSC_ASYNC;

在这里插入图片描述

经过多次测试发现,备库查到数据的时机并不都是严格按照定时器设置的时间间隔的,这取决于联机日志的归档时间,定时器只是触发将扫描本地归档日志目录获取Redo日志发送到备库。

2.5DSC+DW集群主备切换

在数据守护集群中,由于异步归档存在一定是延时,在切换时无法保证切换时主备库的数据一致性,可能存在数据丢失,因此异步备库不支持主备切换、备库接管等操作。
这里演示,DSC+实时备库环境下的主备切换:
登录DSC集群查看集群状态:

# 在dmdsc01和dmdsc02任一节点执行
dmcssm ini_path=/home/dmdba/config/dmcssm.ini

在这里插入图片描述

启动备库dmdm01的监视器:

dmmonitor /dmdata/dmdb/dmmonitor.ini

在这里插入图片描述
在这里插入图片描述

在集群正常的情况下,查看哪些备库是支持切换为主库的:

choose switchover

可以看到支持切换为主库的是唯一的一个实时备机:DMDB
在这里插入图片描述

执行以下命令将DMDB切换为整个DSC+DW集群(GRP_DSC_DW)

switchover GRP_DSC_DW.DMDB

在这里插入图片描述

查询集群状态:
在这里插入图片描述
在这里插入图片描述

集群切换成功后,现在DMDB成为了主库,使用disql连接DMDB实例,并插入数据:
使用disql连接dsc1:

disql SYSDBA/'"输入密码"'@192.168.30.170

插入一条测试数据:

insert into TEST_DSC_REAL(FID,FDESC) VALUES(2,'主库切换后插入一条数据!');
commit;
select * from TEST_DSC_REAL;

在这里插入图片描述

连接DSC集群:

disql SYSDBA/'"输入密码"'@DMDSC

可以查到新增的数据:
在这里插入图片描述

另外补充说一下,实时归档有两种细分模式。分别是事务一致模式和高性能模式,可以通过 dmarch.ini中的ARCH_WAIT_APPLY配置项来设置。
事务一致模式:ARCH_WAIT_APPLY=1,备库收到主库发送的Redo日志,并重演完成后再响应主库,主库接收到响应后,再响应用户的提交请求。
高性能模式:ARCH_WAIT_APPLY=0,备库收到主库发送的Redo日志后,马上响应主库,再启动日志重演。这样主库完成用户提交请求和备库完成日志重演可能存在延时,不能严格保证事务一致性。
数据同步对于事物一致性要求高的场景,比如读写分离集群可以配置ARCH_WAIT_APPLY=1,实时归档模式默认ARCH_WAIT_APPLY=0。

达梦社区地址:https://eco.dameng.com/


网站公告

今日签到

点亮在社区的每一天
去签到