DM DSC为DM共享存储集群,支持故障自动切换和故障自动重加入。特点为:高可用、高吞吐量、负载均衡
DMDSC集群得以实现的重要基础就是共享存储。DM支持的共享存储有两种:裸设备和DMASM。推荐使用后者 。
DMCSS是一款集群控制软件,专门负责监控集群中各个节点的运行状态。
根据目前的硬件发展状况来看,网络的传输速度比磁盘的读、写速度更快,因此,DMDSC集群引入了缓存交换(Buffer Swap) 技术,节点间的数据页尽可能通过网络传递,避免通过磁盘的写入、再读出方式在节点间传递数据,从而减少数据库的IO等待时间,提升系统的响应速度。
与同样使用共享存储的双机热备系统相比,DMDSC具有更快的故障处理速度。双机热备系统故障切换时,需要完整重做Redo日志,所有数据需要重新从磁盘加载;而DMDSC故障处理时,只需要重做故障节点的Redo日志,并且大部分数据页已经包含在处理节点的Buffer缓冲区中,不需要重新从磁盘加载。
DMDSC集群中包含多个数据库实例,与单节点数据库管理系统相比,DMDSC集群可以充分利用多台物理机器的处理能力,支撑更多的用户连接请求,提供更高的吞吐量。DMDSC集群不存在始终保持备用状态的节点,不会造成硬件资源的浪费。
重做日志管理:
Redo日志包含了所有物理数据页的修改内容,Insert/delete/update等DML操作、Create Table等DDL操作,最终都会转化为对物理数据页的修改,这些修改都会反映到Redo日志中。一般说来一条SQL语句,在系统内部会转化为多个相互独立的物理事务来完成,物理事务提交时产生Redo日志,并最终写入联机Redo日志文件中。
一个物理事务包含一个或者多个Redo记录(Redo Record,简称RREC),每条Redo记录都对应一个修改物理数据页的动作。根据记录内容的不同,DMDSC集群中,各个节点拥有独立的日志文件,Redo日志的LSN(日志序号)值也是顺序递增的,Redo日志只会写入当前数据库实例的联机日志文件,与集群系统中的其他数据库实例没有关系。
2.1.1 硬件环境
2.1.2 软件环境
#在虚拟机1中,新建硬盘
***必须选择立即分配所有磁盘空间,虚拟磁盘存储为单个文件
#在虚拟机2中,添加已经新建的磁盘
#修改两台虚拟机的XXX.vmx文件,添加 :
disk.locking="false"
scsi0:1.SharedBus="Virtual"
scsi1:1.SharedBus="Virtual"
#重启虚拟机,fdisk –l 查看是否添加上
2.3共享磁盘上裸设备划分
#在其中一台虚拟机上进行:
前两个分区大小为100M,第三个分区不少于2G(该分区过小可能会出现启动dmserver闪退、创建ASM磁盘组时连接失败等报错)
#查看磁盘划分 fdisk –l /dev/sdb
#在所有虚拟机中,编辑/etc/udev/rules.d/XXXXXX.rules文件,添加以下语句:
ACTION=="add", KERNEL=="sdb1", RUN+="/bin/raw /dev/raw/raw1 %N"
ACTION=="add", KERNEL=="sdb2", RUN+="/bin/raw /dev/raw/raw2 %N"
ACTION=="add", KERNEL=="sdb3", RUN+="/bin/raw /dev/raw/raw3 %N"
ACTION=="add", KERNEL=="sdb4", RUN+="/bin/raw /dev/raw/raw4 %N"
ACTION=="add", KERNEL=="raw[1-4]", OWNER="dmdba", GROUP="dmdba", MODE="777"
#完成裸设备绑定:
Linux7: udevadm trigger --action=add
Linux6: start_udev
#通知分区更改, 使kernel重新读取分区信息,从而避免重启系统
partprobe /dev/sdb
或者使用下列语句:
systemctl restart systemd-udevd.service
systemctl restart systemd-udev-trigger.service
#查看裸设备大小
blockdev --getsize64 /dev/raw/raw1
#验证磁盘信息,能看到raw1-4
ll /dev/raw/raw*
搭建目录为 /data/dsc
#切换dmdba用户
#配置dmdcr_cfg.ini(1节点配置即可)
DCR_N_GRP = 3 #集群环境包括多少个group,取值范围1~16
DCR_VTD_PATH = /dev/raw/raw2 # Voting Disk路径 第二个磁盘分区
DCR_OGUID = 63635 #消息标识,dmcssm登录dmcss消息校验用
[GRP] #集群组信息
DCR_GRP_TYPE = CSS #组类型(CSS\ASM\DB)
DCR_GRP_NAME = GRP_CSS
DCR_GRP_N_EP = 2 #组内节点个数N,最大16
DCR_GRP_DSKCHK_CNT = 60 #磁盘心跳机制,容错时间,单位秒,缺省60S,取值范围5~600
[GRP_CSS] #节点信息
DCR_EP_NAME = CSS0 #节点名,16 字节,配置文件内不可重复,同一类型节点的 EP_NAME 不能重复
DCR_EP_HOST = 192.168.17.129 #节点IP CSS中设置表示DMCSSM通过该IP连接CSS;
DCR_EP_PORT = 9341 #节点TCP监听端口
[GRP_CSS]
DCR_EP_NAME = CSS1
DCR_EP_HOST = 192.168.17.130
DCR_EP_PORT = 9343
[GRP]
DCR_GRP_TYPE = ASM
DCR_GRP_NAME = GRP_ASM
DCR_GRP_N_EP = 2
DCR_GRP_DSKCHK_CNT = 60
[GRP_ASM]
DCR_EP_NAME = ASM0 # ASM的节点名必须和 dmmal.ini 里的 MAL_INST_NAME 一致
DCR_EP_SHM_KEY = 93360 #共享内存标识,数值类型(ASM有效,初始化共享内存的标识符),应为大于0的4字节整数
DCR_EP_SHM_SIZE = 10 #共享内存大小,单位M,(ASM有效,初始化共享内存大小),取值范围10~1024
DCR_EP_HOST = 192.168.17.129 #节点IP,ASM中设置表示DB通过该IP连接ASM
DCR_EP_PORT = 9349
DCR_EP_ASM_LOAD_PATH = /dev/raw # ASM磁盘扫描路径,Linux下一般为/dev/raw,文件模拟情况,必须是全路径,不能是相对路径
[GRP_ASM]
DCR_EP_NAME = ASM1
DCR_EP_SHM_KEY = 93361
DCR_EP_SHM_SIZE = 10
DCR_EP_HOST = 192.168.17.130
DCR_EP_PORT = 9351
DCR_EP_ASM_LOAD_PATH = /dev/raw
[GRP]
DCR_GRP_TYPE = DB
DCR_GRP_NAME = GRP_DSC
DCR_GRP_N_EP = 2
DCR_GRP_DSKCHK_CNT = 60
[GRP_DSC]
DCR_EP_NAME = DSC0 # DB的节点名必须和 dm.ini 里的 INSTANCE_NAME 保持一致
DCR_EP_SEQNO = 0 #组内序号,CSS/ASM不能配置,自动分配DB可以配置,0 ~ n_ep -1,组内不能重复,如不配置则自动分配
DCR_EP_PORT = 5236 #节点TCP监听端口, DB的DCR_EP_PORT与dm.ini中的PORT_NUM不一致时,DB端口以 #DCR_EP_PORT为准。若要使用VIP功能,则不同服务器上配置的DCR_EP_PORT要相同
DCR_CHECK_PORT = 9741
[GRP_DSC]
DCR_EP_NAME = DSC1
DCR_EP_SEQNO = 1
DCR_EP_PORT = 5236
DCR_CHECK_PORT = 9742
使用 DMASMCMD 工具初始化,包含两种方法 (1节点配置即可)
方法一:启动dmasmcmd工具,输入以下命令
create dcrdisk '/dev/raw/raw1' 'dcr'
create votedisk '/dev/raw/raw2' 'vote'
create asmdisk '/dev/raw/raw3' 'LOG0'
create asmdisk '/dev/raw/raw4' 'DATA0'
init dcrdisk '/dev/raw/raw1' from '/data/dsc/dmdcr_cfg.ini' identified by '123456'
init votedisk '/dev/raw/raw2' from '/data/dsc/dmdcr_cfg.ini'
方法二:编辑脚本文件 asmcmd.txt
#将脚本上传到/data/dmdbms/dsc目录下
#执行脚本
cd /data/dmdbms/dmdbms/bin
./dmasmcmd script_file=/data/dmdbms/dsc/04_1asmcmd.txt
#编辑dmasvrmal.ini(几个节点需相同)
cd /data/dmdbms/dsc/
编辑以下内容:
[MAL_INST1]
MAL_INST_NAME = ASM0
MAL_HOST = 192.168.17.129
MAL_PORT = 7236
[MAL_INST2]
MAL_INST_NAME = ASM1
MAL_HOST = 192.168.17.130
MAL_PORT = 7237
#编辑 dmdcr.ini (几个节点均需要编辑)
DMDCR_PATH = /dev/raw/raw1
DMDCR_MAL_PATH =/data/dsc/dmasvrmal.ini #dmasmsvr 使用的 MAL 配置文件路径
DMDCR_SEQNO = 0 #不同节点序号不同
#ASM 重启参数,命令行方式启动
DMDCR_ASM_RESTART_INTERVAL = 0
DMDCR_ASM_STARTUP_CMD = /opt/dmdbms/bin/dmasmsvr/dmasmsvr dcr_ini=/data/dsc/dmdcr.ini
#DB 重启参数,命令行方式启动
DMDCR_DB_RESTART_INTERVAL = 0
DMDCR_DB_STARTUP_CMD = /opt/dmdbms/bin/dmserver path=/data/dsc/DSC01/dm.ini dcr_ini=/data/dsc/dmdcr.ini
#实例名注意
#编辑dminit.ini(1节点配置即可)
db_name = dsc
system_path = +DMDATA/data
system= +DMDATA/data/dsc/system.dbf
system_size = 128
roll = +DMDATA/data/dsc/roll.dbf
roll_size = 128
main = +DMDATA/data/dsc/main.dbf
main_size = 128
ctl_path = +DMDATA/data/dsc/dm.ctl
ctl_size = 8
log_size = 256
dcr_path = /dev/raw/raw1 #dcr 磁盘路径,目前不支持 asm,只能是裸设备
dcr_seqno = 0
auto_overwrite = 1
[DSC0]
config_path =/data/dsc/DSC01
port_num = 5236
mal_host = 192.168.17.129
mal_port = 9340
log_path = +DMLOG/log/dsc0_log01.log
log_path = +DMLOG/log/dsc0_log02.log
[DSC1]
config_path =/data/dsc/DSC02
port_num = 5237
mal_host = 192.168.17.130
mal_port = 9341
log_path = +DMLOG/log/dsc1_log01.log
log_path = +DMLOG/log/dsc1_log02.log
#各个节点启动
cd /opt/dmdbms/bin
./dmcss DCR_INI=/data/dsc/dmdcr.ini
./dmasmsvr DCR_INI=/data/dsc/dmdcr.ini
#选择一个节点,启动 dmasmtool
./dmasmtool DCR_INI=/data/dsc/dmdcr.ini
create diskgroup 'DMLOG' asmdisk '/dev/raw/raw3'
create diskgroup 'DMDATA' asmdisk '/dev/raw/raw4'
#选择一个节点进行初始化
./dminit control=/data/dsc/dminit.ini
#将目录拷贝到另外一台服务器上
scp -r DSC02/ [email protected]:/data/dsc/.
#分别启动实例
./dmserver /data/dsc/DSC01/dm.ini dcr_ini=/data/dsc/dmdcr.ini
./dmserver /data/dsc/DSC02/dm.ini dcr_ini=/data/dsc/dmdcr.ini
#注册服务
./dm_service_installer.sh -t dmcss -p RAC0 -dcr_ini /data/dsc/dmdcr.ini
./dm_service_installer.sh -t dmasmsvr -p RAC0 -dcr_ini /data/dsc/dmdcr.ini -y DmCSSServiceRAC0
./dm_service_installer.sh -t dmserver -p RAC0 -dm_ini /data/dsc/DSC01/dm.ini -dcr_ini /data/dsc/dmdcr.ini -y DmASMSvrServiceRAC0
#启动服务(注意两边需要同时启动)
./DmCSSServiceRAC0 start
./DmASMSvrServiceRAC0 start
./DmServiceRAC0 start