實現原理
實現讀寫分離集群的基本思路是:利用備庫提供只讀服務、無法修改數據的特性,優先將所有操作發送到備庫執行,一旦備庫執行報錯,則發送到主庫重新執行。通過備庫“試錯”這么一個步驟,自然地將只讀操作分流到備庫執行。並且,備庫“試錯”由接口層自動完成,對應用透明。讀寫分離集群不依賴額外的中間件,而是通過數據庫接口與數據庫之間的密切配合,實 現讀、寫操作自動分離特性。DM 的 JDBC、DPI、DCI、ODBC、Provider 等接口都可以用來部署讀寫分離集群。
環境准備
服務器 主庫IP:192.168.10.11 dm8數據庫 實例名 :RAC1 端口號:5236
服務器 備庫IP:192.168.10.12 dm8數據庫 實例名 :RAC2 端口號:5236
服務器 備庫IP:192.168.10.13 dm8數據庫 實例名 :RAC3 端口號:5236
數據庫啟動服務命令路徑/dm8/bin,實例配置文件路徑/dm8/data/DAMENG/
主備庫分別初始化實例
./dminit path=/dm8/data page_size=16 instance_name=RAC1
./dminit path=/dm8/data page_size=16 instance_name=RAC2
./dminit path=/dm8/data page_size=16 instance_name=RAC3
主庫備份
主庫創建實例之后,啟動數據庫並登錄
./dmserver /dm8/data/DAMENG/dm.ini
關閉數據庫,以dmrman備份數據庫
BACKUP DATABASE '/dm8/data/DAMENG/dm.ini' BACKUPSET '/dm8/data/backup';
將備份文件復制到備庫對應目錄下
scp -r /dm8/data/backup root@192.168.10.11:/dm8/data/backup
scp -r /dm8/data/backup root@192.168.10.12:/dm8/data/backup
備庫啟動dmrman執行數據庫還原
RESTORE DATABASE '/dm8/data/DAMENG/dm.ini' FROM BACKUPSET '/dm8/data/backup';
RECOVER DATABASE '/dm8/data/DAMENG/dm.ini' FROM BACKUPSET '/dm8/data/backup';
RECOVER DATABASE '/dm8/data/DAMENG/dm.ini' UPDATE DB_MAGIC;
配置 dm.ini #主備庫實例都需更改下面參數
ALTER_MODE_STATUS = 0 #不允許手工方式修改實例模式/狀態/OGUID
ENABLE_OFFLINE_TS = 2 #不允許備庫 OFFLINE 表空間
MAL_INI = 1 #打開 MAL 系統
ARCH_INI = 1 #打開歸檔配置
配置dmmal.ini #主備庫配置必須完全一致
MAL_CHECK_INTERVAL = 5 #MAL 鏈路檢測時間間隔
MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 鏈路斷開的時間
[MAL_INST1]
MAL_INST_NAME = RAC1 #實例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.10.11 #MAL 系統監聽 TCP 連接的 IP 地址
MAL_PORT = 61141 #MAL 系統監聽 TCP 連接的端口
MAL_INST_HOST = 192.168.10.11 #實例的對外服務 IP 地址
MAL_INST_PORT = 5236 #實例的對外服務端口,dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 52141 #實例對應的守護進程監聽 TCP 連接的端口
MAL_INST_DW_PORT = 33141 #實例監聽守護進程 TCP 連接的端口
[MAL_INST2]
MAL_INST_NAME = RAC2
MAL_HOST = 192.168.10.12
MAL_PORT = 61141
MAL_INST_HOST = 192.168.10.12
MAL_INST_PORT = 5236
MAL_DW_PORT = 52141
MAL_INST_DW_PORT = 33141
[MAL_INST3]
MAL_INST_NAME = RAC3
MAL_HOST = 192.168.10.13
MAL_PORT = 61141
MAL_INST_HOST = 192.168.10.13
MAL_INST_PORT = 5236
MAL_DW_PORT = 52141
MAL_INST_DW_PORT = 33141
配置dmarch.ini#主備庫歸檔目標實例名不一致,其他一致
# 實時歸檔(REALTIME)的讀寫分離的事務一致模式僅在數據守護配置為自動切換模式下才會生效
[ARCHIVE_TIMELY1 ]
ARCH_TYPE = TIMELY#即時歸檔類型
ARCH_DEST = RAC2 #即時歸檔目標實例名
[ARCHIVE_TIMELY2]
ARCH_TYPE = TIMELY #即時歸檔類型
ARCH_DEST = RAC3 #即時歸檔目標實例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地歸檔類型
ARCH_DEST = /dm8/data/DAMENG/arch #本地歸檔文件存放路徑
ARCH_FILE_SIZE = 128 #單位 Mb,本地單個歸檔文件最大值
ARCH_SPACE_LIMIT = 500000 #單位 Mb,0 表示無限制,范圍 1024~4294967294M
ARCH_WAIT_APPLY = 1 # 事務一致性
dmwatcher.ini #主備庫配置一致
[GRP1]
DW_TYPE = GLOBAL #全局守護類型
DW_MODE = MANUAL# AUTO自動切換模式
DW_ERROR_TIME = 10 #遠程守護進程故障認定時間
INST_RECOVER_TIME = 60 #主庫守護進程啟動恢復的間隔時間
INST_ERROR_TIME = 10 #本地實例故障認定時間
INST_OGUID = 453332 #守護系統唯一 OGUID 值
INST_INI = /dm8/data/DAMENG/dm.ini #dm.ini配置文件路徑
INST_AUTO_RESTART = 1 #打開實例的自動啟動功能
INST_STARTUP_CMD = /dm8/bin/dmserver #命令行方式啟動
RLOG_SEND_THRESHOLD = 0 #指定主庫發送日志到備庫的時間閥值,默認關閉
RLOG_APPLY_THRESHOLD = 0 #指定備庫重演日志的時間閥值,默認關閉
dmmonitor.ini #生產環境需單獨一台服務器配置。
MON_DW_Confirm = 1 #確認監視器模式
MON_LOG_PATH = /dm8/data/log #監視器日志文件存放路徑
MON_LOG_INTERVAL = 60 #每隔 60s 定時記錄系統信息到日志文件
MON_LOG_FILE_SIZE = 32 #每個日志文件最大 32M
MON_LOG_SPACE_LIMIT = 0 #不限定日志文件總占用空間
[GRP1]
MON_INST_OGUID = 453332 #組 GRP1 的唯一 OGUID 值
#配置為監視器到組 GRP1 的守護進程的連接信息,以―IP:PORT‖的形式配置
#IP 對應 dmmal.ini 中的 MAL_HOST,PORT 對應 dmmal.ini 中的 MAL_DW_PORT
MON_DW_IP = 192.168.10.11:52141
MON_DW_IP = 192.168.10.12:52141
MON_DW_IP = 192.168.10.13:52141
./dmserver /dm8/data/DAMENG/dm.ini mount
alter database primary;
啟動命令行工具 DIsql,登錄備庫設置 OGUID 值。
alter database standby;
啟動各個主備庫上的守護進程

接口說明
DM 多種客戶端接口都支持讀寫分離集群連接設置,詳細可參考《DM8 程序員手冊》。
讀寫分離集群(DMRWC)服務名配置:
TIME_ZONE=(480)
LANGUAGE=(en)
DM_RWW=(192.168.0.151:5236,192.168.0.152:5236,192.168.0.153:5236)
RW_SEPARATE=(1)
RW_PERCENT=(30)
LOGIN_PRIMARY=(1)
SWITCH_TIME=6000
SWITCH_INTERVAL=500
2.2 配置URL字符串:
<URL>jdbc:dm://DM_RWW?rwSeparate=1&rwPercent=30</URL>
2.3 說明
RW_SEPARATE:取值0和1,默認0,表示不使用讀寫分離方式
RW_PERCENT:取值0~100,默認值25。表示分發總事務的百分之多少到主機上執行。
LOGIN_PRIMARY表示是否僅登錄到主機,支持的選項為1(只連接主機)和0(主機不存在的情況下可連接備機)。可以不指定,若不指定,默認值為1
剛開始啟動監視器出現如下情況,查看守護日志和實例日志都沒有發現問題,最后原因是主備沒有做備份還原操作導致,重新做下備份還原,啟動ok