一、什么是DMDSC?
DMDSC 集群是一個多實例、單數據庫的系統。多個數據庫實例可以同時訪問、修改同一個數據庫的數據。用戶可以登錄集群中的任意一個數據庫實例,獲得完整的數據庫服務。數據文件、控制文件在集群系統中只有一份,不論有幾個節點,這些節點都平等地使用這些文件,這些文件保存在共享存儲上。每個節點有自己獨立的聯機日志和歸檔日志,其中聯機日志保存在共享存儲上,歸檔日志可以保存在本地存儲上也可以保存在共享存儲上。
二、實現原理
DMDSC是一個共享存儲的數據庫集群系統。多個數據庫實例同時訪問、修改同一個數據庫,因此必然帶來了全局並發問題。DMDSC集群基於單節點數據庫管理系統之上,改造了Buffer緩沖區、事務系統、封鎖系統和日志系統等,來適應共享存儲集群節點間的全局並發訪問控制要求。同時,引入緩存交換技術,提升數據在節點間的傳遞效率。
三、配置說明(測試環境,生產環境根據實際情況來看)
兩台配置相同的的機器,2G內存,20G硬盤,20G共享內存,操作系統(中標麒麟,centos7.8,操作一致)
node1:192.168.107.101
node2: 192.168.107.102
首先划分好磁盤分區,我的磁盤是sdb:
分完區之后需要寫入系統:
ACTION=="add", KERNEL=="sdb1", RUN+="/bin/raw /dev/raw/raw1 %N" # dcr 注冊信息,表
ACTION=="add", KERNEL=="sdb2", RUN+="/bin/raw /dev/raw/raw2 %N" # vote 集群信息
ACTION=="add", KERNEL=="sdb3", RUN+="/bin/raw /dev/raw/raw3 %N" # log 日志
ACTION=="add", KERNEL=="sdb4", RUN+="/bin/raw /dev/raw/raw4 %N" # data 數據
ACTION=="add", KERNEL=="raw[1-4]", OWNER="dmdba", GROUP="dinstall", MODE="660"
重啟服務,執行命令:systemctl restart systemd-udev-trigger.service
隨后即可查看磁盤大小和分區詳情
配置DMDCR_CFG.INI(配置一台即可)文件,其主要作用是:dmdcr_cfg.ini 是格式化DCR 和Voting Disk 的配置文件。配置信息包括三類:集群環境全局信息、集群組信息、以及組內節點信息。
vim dmdcr_cfg.ini(兩台都要配置一樣)
DCR_N_GRP = 3
DCR_VTD_PATH = /dev/raw/raw2
DCR_OGUID = 63635
[GRP]
DCR_GRP_TYPE = CSS
DCR_GRP_NAME = GRP_CSS
DCR_GRP_N_EP = 2
DCR_GRP_DSKCHK_CNT = 60
[GRP_CSS]
DCR_EP_NAME = CSS0
DCR_EP_HOST = 192.168.107.101
DCR_EP_PORT = 9341
[GRP_CSS]
DCR_EP_NAME = CSS1
DCR_EP_HOST = 192.168.107.102
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
DCR_EP_SHM_KEY = 93360
DCR_EP_SHM_SIZE = 10
DCR_EP_HOST = 192.168.107.101
DCR_EP_PORT = 9349
DCR_EP_ASM_LOAD_PATH = /dev/raw
[GRP_ASM]
DCR_EP_NAME = ASM1
DCR_EP_SHM_KEY = 93361
DCR_EP_SHM_SIZE = 10
DCR_EP_HOST = 192.168.107.102
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
DCR_EP_SEQNO = 0
DCR_EP_PORT = 5236
DCR_CHECK_PORT = 9741
[GRP_DSC]
DCR_EP_NAME = DSC1
DCR_EP_SEQNO = 1
DCR_EP_PORT = 5236
DCR_CHECK_PORT = 9742
配置文件修改了之后,進入數據庫安裝的bin目錄
使用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 '/dm8/config/dmdcr_cfg.ini' identified by 'abcd'
init votedisk '/dev/raw/raw2' from '/dm8/config/dmdcr_cfg.ini'
直到目前為止,共享磁盤就已經創建完成了,然后啟動node2,把共享磁盤加上去,兩節點的詳情如下
做完初始化以及磁盤共享給node2之后,配置dmasvrmal.ini文件(兩節點都需要配置),與dmdcr_cfg.ini文件路徑相同。
[dmdba@node1 ~]$ pwd
/home/dmdba
[dmdba@node1 ~]$ vim dmasvrmal.ini
然后配置dmdcr.ini(dmdcr.ini 是dmcss、dmasmsvr、dmasmtool 等工具的輸入參數。記錄了當前節點序列號以及DCR 磁盤路徑)
node1:
101:dmdcr.ini
DMDCR_PATH = /dev/raw/raw1
DMDCR_MAL_PATH =/dm8/config/dmasvrmal.ini
DMDCR_SEQNO = 0
DMDCR_ASM_RESTART_INTERVAL = 0
DMDCR_ASM_STARTUP_CMD = /dm8/bin/dmasmsvr dcr_ini=/dm8/config/dmdcr.ini
DMDCR_DB_RESTART_INTERVAL = 0
DMDCR_DB_STARTUP_CMD = /dm8/bin/dmserver path=/dm8/config/dsc0_config/dm.ini dcr_ini=/dm8/config/dmdcr.ini
node2:
DMDCR_PATH = /dev/raw/raw1
DMDCR_MAL_PATH =/dm8/config/dmasvrmal.ini
DMDCR_SEQNO = 1
DMDCR_ASM_RESTART_INTERVAL = 0
DMDCR_ASM_STARTUP_CMD = /dm8/bin/dmasmsvr dcr_ini=/dm8/config/dmdcr.ini
DMDCR_DB_RESTART_INTERVAL = 0
DMDCR_DB_STARTUP_CMD = /dm8/bin/dmserver path=/dm8/config/dsc1_config/dm.ini dcr_ini=/dm8/config/dmdcr.ini
注意參數的修改(可參考達夢官方的集群手冊文檔)
配置完了之后,可在安裝目錄啟動DMCSS、DMASM服務程序:
啟動命令:
注意關閉兩邊機器的防火牆:
正常狀態是這樣的,如下圖:
選擇一個節點(以node1為例),使用dmasmtool創建磁盤組:
首先啟動ASM
./dmasmtool DCR_INI=/dm8/config/dmdcr.ini
創建磁盤組:
create diskgroup 'DMLOG' asmdisk '/dev/raw/raw3'
create diskgroup 'DMDATA' asmdisk '/dev/raw/raw4'
磁盤組創建完畢之后,准備dminit.ini(任意一台即可)文件。也保存到/dm8/config文件夾下。
[root@node1 config]# pwd
/dm8/config
[root@node1 config]# vim dminit.ini
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] #inst_name 跟dmdcr_cfg.ini 中DB 類型group 中DCR_EP_NAME 對應
config_path = /dm8/config/dsc0_config
port_num = 5236
mal_host = 192.168.107.11
mal_port = 9340
log_path = +DMLOG/log/dsc0_log01.log
log_path = +DMLOG/log/dsc0_log02.log
[DSC1] #inst_name 跟dmdcr_cfg.ini 中DB 類型group 中DCR_EP_NAME 對應
config_path = /dm8/config/dsc1_config
port_num = 5237
mal_host = 192.168.107.12
mal_port = 9341
log_path = +DMLOG/log/dsc1_log01.log
log_path = +DMLOG/log/dsc1_log02.log
改文件配置完畢之后,既可以執行初始化(由於我已經執行過初始化命令,該處就不做展示)了。
初始化成功之后屏幕會與如下顯示:
[root@node]# ./dminit control=/home/data/dminit.ini
initdb V7.1.5.90-Build(2016.06.08-69758-debug)ENT
db version: 0x70009
file dm.key not found, use default license!
License will expire on 2020-012-23
log file path: +DMLOG/log/dsc0_log01.log
log file path: +DMLOG/log/dsc0_log02.log
log file path: +DMLOG/log/dsc1_log01.log
log file path: +DMLOG/log/dsc1_log02.log
write to dir [+DMDATA/data/dsc].
create dm database success. 2020-12-23 15:23:13
初始化完畢之后,會產生兩個文件,然后將node1節點的dsc1_config 通過scp 發送給node2。
到了這一步之后,就可以啟動數據庫服務器了:
node1在安裝目錄的bin目錄下面啟動:
./dmserver /dm8/config/dsc0_config/dm.ini dcr_ini=/dm8/config/dmdcr.ini
node2在安裝目錄的bin目錄下面啟動:
./dmserver /dm8/config/dsc1_config/dm.ini dcr_ini=/dm8/config/dmdcr.ini
正常的集群的屏幕顯示
當然,集群是否成功最關鍵的一步就是測試。
用disql登陸上去。
[dmdba@node1 bin]$ ./disql
disql V8
用戶名:
密碼:
服務器[LOCALHOST:5236]:處於普通打開狀態
登錄使用時間: 10.718(毫秒)
SQL> select * from v$dsc_ep_info;
行號 EP_NAME EP_SEQNO EP_GUID EP_TIMESTAMP EP_MODE EP_STATUS
---------- ------- ----------- -------------------- -------------------- ------------ ---------
1 DSC0 0 643863321 643868139 Control Node OK
2 DSC1 1 643838732 643843634 Normal Node OK
已用時間: 0.592(毫秒). 執行號:13.
隨后也可以創建數據表或者插入數據進行測試:
上圖即可看到,共享集群的測試環境搭建成功。