在給客戶部署兩套主備集群的時候,出現一件讓我非常頭疼的問題。
第一套集群在政務外網,第二套集群在互聯網。
部署第一套集群的時候,啟動達夢守護進程報錯(段錯誤(核心已轉儲)),主備節點都報錯,檢查dm.ini 、 dmarch.ini 、 dmmal.ini和dmwatcher.ini,都沒發現有任何錯誤。這個時候我們猜測,會不會是安裝包的問題,我們用的安裝包如下:dm8_20210915_HWarm_centos7_64_ent_8.1.2.70.iso
這是最新的安裝包,我之前沒用這個安裝包部署過集群,猜測可能是安裝包中有bug。正好,在客戶的第二套集群上試一下,看看會不會出現同樣的問題。
吭哧吭哧部署完后,發現互聯網上的那套集群,一切正常,這下傻眼了,檢查了下集群配置,政務外網的和互聯網的集群配置一模一樣,那為什么政務外網那套集群會報錯呢?
接下來開始正式排查問題。
一、查看報錯信息
這是啟動守護進程時報的錯,從報錯信息上看不出什么問題,后來也查看了watcher的日志,也沒發現什么問題,最后只能生成core文件,查看core文件中的報錯信息。
二、生成core文件
集群出現問題,core文件一般會自動生成,可以直接查找對應的core文件,也可以指定core文件生成路徑。
1、直接查找core文件
因為我們是在啟動dmwatcher的時候報錯,所以可以直接通過守護進程的關鍵字進行查找。
1)、find查找
find / -name *dmwatcher*
查到的內容如下:
2)、拷貝出來
如果覺得直接在這里查看不方便,可以拷貝最新的core到指定目錄,最好把名字重命名一下,默認的名稱太長了。
cp拷貝出來拷貝最新的,一般最下面的比較新:
cp /var/lib/systemd/coredump/core.dmwatcher.1001.88045ab03b7c437bb3b6ebbc53218cb6.16566.1631948801000000000000.lz4 /home/dmdba/
3)、Lz4解壓
lz4 core.dmwatcher.1001.88045ab03b7c437bb3b6ebbc53218cb6.16566.1631948801000000000000.lz4
4)、重命名
mv core.dmwatcher.1001.88045ab03b7c437bb3b6ebbc53218cb6.16566.1631948801000000000000 core.16566
5)、查看core
[root@localhost dmdba]# cd dmdbms/bin
[root@localhost bin]# gdb /home/dmdba/core.16566
輸入bt
6)、猜測
core報錯說“連接已存在”,猜測可能是ip和端口沖突導致的。
ps -ef|grem dmserver
ps -ef|grem dmwatcher
用上面兩個命令沒查到有重復的進程,咨詢了下客戶,客戶說當前部署的ip沒有部署過其他集群。
集群是ip+端口組合相同才會沖突,所以猜測肯定是有哪里占用這個ip了,但是一時半會查不出來,不過沒關系,我們可以調整集群的端口。
2、指定core文件生成位置
用root執行下面語句即可。
echo "/home/dmdba/dmdbms/bin/corefile-%e" > /proc/sys/kernel/core_pattern
指定好后再啟動守護進程,報錯進行就生成core了。
三、驗證
為了以放萬一,我把實例名、端口和OGUID全改了。
1、主庫
1)、dm.ini
說明:原來實例名稱為GRP1_RT_01,數據庫實例監聽端口為32141。
#實例名,建議使用―組名_守護環境_序號‖的命名方式,總長度不能超過 16
INSTANCE_NAME = GRP2_RT_01
PORT_NUM = 32241 #數據庫實例監聽端口
DW_INACTIVE_INTERVAL = 60 #接收守護進程消息超時時間
ALTER_MODE_STATUS = 0 #不允許手工方式修改實例模式/狀態/OGUID
ENABLE_OFFLINE_TS = 2 #不允許備庫 OFFLINE 表空間
MAL_INI = 1 #打開 MAL 系統
ARCH_INI = 1 #打開歸檔配置
RLOG_SEND_APPLY_MON = 64 #統計最近 64 次的日志發送信息
2)、dmarch.ini
說明:原來實時歸檔目標實例名為GRP1_RT_02。
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME #實時歸檔類型
ARCH_DEST = GRP2_RT_02 #實時歸檔目標實例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地歸檔類型
ARCH_DEST = /home/dmdba/arch #本地歸檔文件存放路徑
ARCH_FILE_SIZE = 1024 #單位 Mb,本地單個歸檔文件最大值
ARCH_SPACE_LIMIT = 51210 #單位 Mb,0 表示無限制,范圍 1024~2147483647M
3)、dmmal.ini
注意:原來實例名為GRP1_RT_01,系統監聽 TCP 連接的端口為61141和61142,實例的對外服務端口為32141和32142,實例本地的守護進程監聽 TCP 連接的端口為52141和52142。
MAL_CHECK_INTERVAL = 5 #MAL 鏈路檢測時間間隔
MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 鏈路斷開的時間
[MAL_INST1]
MAL_INST_NAME = GRP2_RT_01 #實例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.135.13 #MAL 系統監聽 TCP 連接的 IP 地址
MAL_PORT = 61241 #MAL 系統監聽 TCP 連接的端口
MAL_INST_HOST = 172.16.40.13 #實例的對外服務 IP 地址
MAL_INST_PORT = 32241 #實例的對外服務端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 52241 #實例本地的守護進程監聽 TCP 連接的端口
MAL_INST_DW_PORT = 33241 #實例監聽守護進程 TCP 連接的端口
[MAL_INST2]
MAL_INST_NAME = GRP2_RT_02
MAL_HOST = 192.168.135.14
MAL_PORT = 61242
MAL_INST_HOST = 172.16.40.14
MAL_INST_PORT = 32242
MAL_DW_PORT = 52242
MAL_INST_DW_PORT = 33242
4)、dmwatcher.ini
注意:原來OGUID為453331。
[GRP1]
DW_TYPE = GLOBAL #全局守護類型
DW_MODE = AUTO #自動切換模式
DW_ERROR_TIME = 10 #遠程守護進程故障認定時間
INST_RECOVER_TIME = 60 #主庫守護進程啟動恢復的間隔時間
INST_ERROR_TIME = 10 #本地實例故障認定時間
INST_OGUID = 453332 #守護系統唯一 OGUID 值
INST_INI = /home/dmdba/data/DAMENG/dm.ini #dm.ini 配置文件路徑
INST_AUTO_RESTART = 1 #打開實例的自動啟動功能
INST_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver #命令行方式啟動
RLOG_SEND_THRESHOLD = 0 #指定主庫發送日志到備庫的時間閾值,默認關閉
RLOG_APPLY_THRESHOLD = 0 #指定備庫重演日志的時間閾值,默認關閉
2、備庫
1)、dm.ini
#實例名,建議使用―組名_守護環境_序號‖的命名方式,總長度不能超過 16
INSTANCE_NAME = GRP2_RT_02
PORT_NUM = 32242 #數據庫實例監聽端口
DW_INACTIVE_INTERVAL = 60 #接收守護進程消息超時時間
ALTER_MODE_STATUS = 0 #不允許手工方式修改實例模式/狀態/OGUID
ENABLE_OFFLINE_TS = 2 #不允許備庫 OFFLINE 表空間
MAL_INI = 1 #打開 MAL 系統
ARCH_INI = 1 #打開歸檔配置
RLOG_SEND_APPLY_MON = 64 #統計最近 64 次的日志重演信息
2)、dmarch.ini
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME #實時歸檔類型
ARCH_DEST = GRP2_RT_01 #實時歸檔目標實例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地歸檔類型
ARCH_DEST = /home/dmdba/arch #本地歸檔文件路徑
ARCH_FILE_SIZE = 1024 #單位 Mb,本地單個歸檔文件最大值
ARCH_SPACE_LIMIT = 51210 #單位 Mb,0 表示無限制,范圍 1024~2147483647M
3)、dmmal.ini
MAL_CHECK_INTERVAL = 5 #MAL 鏈路檢測時間間隔
MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 鏈路斷開的時間
[MAL_INST1]
MAL_INST_NAME = GRP2_RT_01 #實例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.135.13 #MAL 系統監聽 TCP 連接的 IP 地址
MAL_PORT = 61241 #MAL 系統監聽 TCP 連接的端口
MAL_INST_HOST = 172.16.40.13 #實例的對外服務 IP 地址
MAL_INST_PORT = 32241 #實例的對外服務端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 52241 #實例本地的守護進程監聽 TCP 連接的端口
MAL_INST_DW_PORT = 33241 #實例監聽守護進程 TCP 連接的端口
[MAL_INST2]
MAL_INST_NAME = GRP2_RT_02
MAL_HOST = 192.168.135.14
MAL_PORT = 61242
MAL_INST_HOST = 172.16.40.14
MAL_INST_PORT = 32242
MAL_DW_PORT = 52242
MAL_INST_DW_PORT = 33242
4)、dmwatcher.ini
[GRP1]
DW_TYPE = GLOBAL #全局守護類型
DW_MODE = AUTO #自動切換模式
DW_ERROR_TIME = 10 #遠程守護進程故障認定時間
INST_RECOVER_TIME = 60 #主庫守護進程啟動恢復的間隔時間
INST_ERROR_TIME = 10 #本地實例故障認定時間
INST_OGUID = 453332 #守護系統唯一 OGUID 值
INST_INI = /home/dmdba/data/DAMENG/dm.ini #dm.ini 配置文件路徑
INST_AUTO_RESTART = 1 #打開實例的自動啟動功能
INST_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver #命令行方式啟動
RLOG_APPLY_THRESHOLD = 0 #指定備庫重演日志的時間閾值,默認關閉
3、監視器
注意:原來OGUID為453331。
原來的 MON_DW_IP = 172.16.40.13:52141
原來的 MON_DW_IP = 172.16.40.14:52142
MON_DW_CONFIRM = 1 #確認監視器模式
MON_LOG_PATH = /home/dmdba/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 = 172.16.40.13:52241
MON_DW_IP = 172.16.40.14:52242
四、結論
修改端口后,集群正常了。應該是ip+端口組合被占用了,換個端口就好了。
在安裝監視器的時候又踩了一個坑,在備庫上安裝個監視器沒有問題,但是當把監視器移到第三台機器上,啟動監視器后,會自動kill守護進程。檢查發現是第三台機器服務器數據庫版本過低導致的。可以升級數據庫,或者就把監視器放在備庫。
更多資訊請上達夢技術社區了解: https://eco.dameng.com