在需要將一個 LUN (邏輯單元號)映射給多個節(jié)點、為集群提供一個共享的存儲卷時,同一個存儲 LUN 在各個主機端的 LUNID 必須是相同的。比如:
集群模式下,各個節(jié)點要協(xié)同工作,因此,各主機的時間必須一致。因此,各主機的時間必須一致。各個節(jié)點之間的時間差不能超時,一般如果超過 30s,節(jié)點很可能會重啟,所以要同步各節(jié)點的時間。例如,需要配置一個 ntp 時鐘服務器,來給 RAC 的各個節(jié)點進行時間同步?;蛘咦尮?jié)點之間進行時間同步,保證各個節(jié)點的時間同步,但是無法保證 RAC 數(shù)據(jù)庫的時間的準確性。
集群必須依賴內部的互聯(lián)網(wǎng)絡實現(xiàn)數(shù)據(jù)通訊或者心跳功能。因此,采用普通的以太網(wǎng)還是其他的高速網(wǎng)絡(比如 IB),就很有講究,當然了,還有拿串口線實現(xiàn)心跳信息傳遞。此外,采用什么樣的網(wǎng)絡參數(shù)對集群整體的性能和健壯性都大有關系。
案例:
XX 市,4 節(jié)點 Oracle 10g RAC
操作系統(tǒng)采用的是 RHEL 4,按照默認的安裝文檔,設置網(wǎng)絡參數(shù)為如下值:
net.core.rmem_default = 262144
net.core.rmem_max = 262144
執(zhí)行一個查詢語句,需要 11 分鐘,修改參數(shù):
net.core.rmem_default = 1048576
net.core.rmem_max = 1048576
再次執(zhí)行僅需 16.2 秒。
案例:
XX 市,HPC 集群,運行 LS-DYNA(通用顯示非線性有限元分析程序)。
集群存儲系統(tǒng)的環(huán)境說明:存儲系統(tǒng)的 3 個 I/O 節(jié)點通過 FC SAN 交換機連接到一個共享的存儲。
故障現(xiàn)象
集群到貨后發(fā)現(xiàn)盤陣與機器直連能通,兩個設備接 200E 交換機不通。后經(jīng)測試交換機 IOS 版本問題導致不能正常認出盤陣的光纖端口,與交換機的供貨商聯(lián)系更新了兩次 IOS,盤陣的端口能正常識別,但盤陣與機器相連還是無法找到盤陣。經(jīng)過今天的測試發(fā)現(xiàn)三臺 I/O 節(jié)點采用的 HBA 卡 firmware 版本不一致。最早接光纖交換機及與盤陣直連的的 I/O1 的 firmware 為 v4.03.02,今天又拿出來的兩臺 I/O 節(jié)點 firmware 為 v4.06.03。用后兩臺測試后盤陣、機器、交換機之間可以正常通信,到今天晚上為止沒有發(fā)現(xiàn)異常情況。從目前的情況判斷是QLE2460 firmware 為 v4.03.01 的 HBA 卡與 200E IOS V5.3.1 有沖突者不兼容導致的故障。至于新的 HBA 卡 firmware為 v4.06.03 與 200E IOS V5.3.1 連接的穩(wěn)定性如何還要做進一步測試。
診斷處理結果
I/O 1 節(jié)點 HBA 卡的 fimware 升級到 v4.06.03 后連接 200E 找不到盤陣的故障已經(jīng)得到解決。其實是一個 FCHBA 卡的固件版本不一致引起的問題。
Oracle Cluster Registry(OCR):記錄 OCR 記錄節(jié)點成員的配置信息,如 database、ASM、instance、 listener、VIP 等 CRS 資源的配置信息,可存儲于裸設備或者群集文件系統(tǒng)上。Voting disk : 即仲裁盤,保存節(jié)點的成員信息,當配置多個投票盤的時候個數(shù)必須為奇數(shù),每個節(jié)點必須同時能夠連接半數(shù)以上的投票盤才能夠存活。初次之外包含哪些節(jié)點成員、節(jié)點的添加和刪除信息。
在 Oracle RAC 中,軟件不建議安裝在共享文件系統(tǒng)上,包括 CRS_HOME 和 ORACLE_HOME,尤其是 CRS 軟件,推薦安裝在本地文件系統(tǒng)中,這樣在進行軟件升級,以及安裝 patch 和 patchset 的時候可以使用滾動升級(rolling upgrade)的方式,減少計劃當機時間。另外如果軟件安裝在共享文件系統(tǒng)也會增加單一故障點。如果使用 ASM 存儲,需要為 asm 單獨安裝 ORACLE 軟件,獨立的 ORACLE_HOME,易于管理和維護,比如當遇到 asm 的 bug 需要安裝補丁時,就不會影響 RDBMS 文件和軟件。
在一個共享存儲的集群中,當集群中 heartbeat 丟失時,如果各節(jié)點還是同時對共享存儲去進行操作,那么在這種情況下所引發(fā)的情況是災難的。ORACLE RAC 采用投票算法來解決這個問題,思想是這樣的:每個節(jié)點都有一票,考慮有 A,B,C 三個節(jié)點的集群情形,當 A 節(jié)點由于各種原因不能與 B,C 節(jié)點通信時,那么這集群分成了兩個 DOMAIN,A 節(jié)點成為一個 DOMAIN,擁有一票;B,C 節(jié)點成為一個 DOMAIN 擁有兩票,那么這種情況B,C 節(jié)點擁有對集群的控制權,從而把 A 節(jié)點踢出集群,對要是通 IO FENCING 來實現(xiàn)。如果是兩節(jié)點集群,則引入了仲裁磁盤,當兩個節(jié)點不能通信時,請求最先到達仲裁磁盤的節(jié)點擁用對集群的控制權。網(wǎng)絡問題(interconnect 斷了),時間不一致;misscount 超時 等等,才發(fā)生 brain split,而此時為保護整個集群不受有問題的節(jié)點影響,而發(fā)生 brain split。oracle 采用的是 server fencing,就是重啟有問題的節(jié)點,試圖修復問題。當然有很多問題是不能自動修復的。比如時間不一致,而又沒有 ntp;網(wǎng)線壞了。。。這些都需要人工介入修復問題。而此時的表現(xiàn)就是有問題的節(jié)點反復重啟。
從 Oracle10g 起,Oracle 提供了自己的集群軟件,叫做 Oracle Clusterware,簡稱 CRS,這個軟件是安裝 oraclerac 的前提,而上述第三方集群則成了安裝的可選項 。同時提供了另外一個新特性叫做 ASM,可以用于 RAC 下的共享磁盤設備的管理,還實現(xiàn)了數(shù)據(jù)文件的條帶化和鏡像,以提高性能和安全性 (S.A.M.E: stripe and mirroreverything ) ,不再依賴第三方存儲軟件來搭建 RAC 系統(tǒng)。尤其是 Oracle11gR2 版本不再支持裸設備,Oracle 將全力推廣 ASM,徹底放棄第三方集群組件支持。
Oracle Clusterware 使用兩種心跳設備來驗證成員的狀態(tài),保證集群的完整性。
reboottime ,發(fā)生裂腦并且一個節(jié)點被踢出后,這個節(jié)點將在 reboottime 的時間內重啟;默認是 3 秒 用下面的命令查看上述參數(shù)的實際值:
# crsctl get css misscount
# grep misscount $CRS_HOME/log/hostname/cssd/ocssd.log
在下面兩種情況發(fā)生時,css 會踢出節(jié)點來保證數(shù)據(jù)的完整:
(一) Private Network IO time > misscount,會發(fā)生 split brain 即裂腦現(xiàn)象,產生多個“子集群”(subcluster) ,這些子集群進行投票來選擇哪個存活,踢出節(jié)點的原則按照下面的原則:節(jié)點數(shù)目不一致的,節(jié)點數(shù)多的 subcluster 存活;節(jié)點數(shù)相同的,node ID 小的節(jié)點存活。
(二) VoteDisk I/O Time > disktimeout ,踢出節(jié)點原則如下:失去半數(shù)以上 vote disk 連接的節(jié)點將在 reboottime 的時間內重啟。例如有 5 個 vote disk,當由于網(wǎng)絡或者存儲原因某個節(jié)點與其中>=3 個 vote disk 連接超時時,該節(jié)點就會重啟。當一個或者兩個 vote disk 損壞時則不會影響集群的運行。
對于一個已經(jīng)有的系統(tǒng),可以用下面幾種方法來確認數(shù)據(jù)庫實例的心跳配置,包括網(wǎng)卡名稱、IP 地址、使用的網(wǎng)絡協(xié)議。
最簡單的方法,可以在數(shù)據(jù)庫后臺報警日志中得到。使用 oradebug
SQL> oradebug setmypid
Statement processed.
SQL> oradebug ipc
Information written to trace file.
SQL> oradebug tracefile_name
/oracle/admin/ORCL/udump/orcl2_ora_24208.trc
找到對應 trace 文件的這一行:socket no 7 IP 10.0.0.55 UDP 16878
從數(shù)據(jù)字典中得到:
SQL> select * from v$cluster_interconnects;
http://wiki.jikexueyuan.com/project/oraclecluster/images/11.png" alt="" />
SQL> select * from x$ksxpia;
http://wiki.jikexueyuan.com/project/oraclecluster/images/12.png" alt="" />
為了避免心跳網(wǎng)絡成為系統(tǒng)的單一故障點,簡單地我們可以使用操作系統(tǒng)綁定的網(wǎng)卡來作為 Oracle 的心跳網(wǎng)絡,以 AIX 為例,我們可以使用 etherchannel 技術,假設系統(tǒng)中有 ent0/1/2/3 四塊網(wǎng)卡,我們綁定 2 和 3 作為心跳:在 HPUX 和 Linux 對應的技術分別叫 APA 和 bonding。
UDP 私有網(wǎng)絡的調優(yōu)當使用 UDP 作為數(shù)據(jù)庫實例間 cache fusion 的通信協(xié)議時,在操作系統(tǒng)上需要調整相關參數(shù),以提高 UDP 傳輸效率,并在較大數(shù)據(jù)時避免出現(xiàn)超出 OS 限制的錯誤:
各個平臺對應查看和修改命令如下:
Solaris 查看 ndd /dev/udp udp_xmit_hiwat udp_recv_hiwat udp_max_buf ;
修改 ndd -set /dev/udp udp_xmit_hiwat 262144
ndd -set /dev/udp udp_recv_hiwat 262144
ndd -set /dev/udp udp_max_buf 2621440
AIX 查看 no -a |egrep “udp_|tcp_|sb_max”
修改 no -p -o udp_sendspace=262144
no -p -o udp_recvspace=1310720
no -p -o tcp_sendspace=262144
no -p -o tcp_recvspace=262144
no -p -o sb_max=2621440
Linux 查看 文件/etc/sysctl.conf
修改 sysctl -w net.core.rmem_max=2621440
sysctl -w net.core.wmem_max=2621440
sysctl -w net.core.rmem_default=262144
sysctl -w net.core.wmem_default=262144
HP-UX 不需要
HP TRU64 查看 /sbin/sysconfig -q udp
修改: 編輯文件/etc/sysconfigtab
inet: udp_recvspace = 65536
udp_sendspace = 65536
Windows 不需要
LOCK(鎖)是用來控制并發(fā)的數(shù)據(jù)結構,如果有兩個進程同時修改同一個數(shù)據(jù), 為了防止出現(xiàn)混亂和意外,用鎖來控制訪問數(shù)據(jù)的次序。有鎖的可以先訪問,另外一個進程要等到第一個釋放了鎖,才能擁有鎖,繼續(xù)訪問??傮w來說,RAC 里面的鎖分兩種, 一種是本地主機的進程之間的鎖,另外一種是不同主機的進程之間的鎖。本地鎖的機制有兩類,一類叫做 lock(鎖),另外一類叫做 latch 閂。
全局鎖就是指 RAC lock,就是不同主機之間的鎖,Oracle 采用了 DLM(Distributed Lock Management,分布式鎖管理)機制。在 Oracle RAC 里面,數(shù)據(jù)是全局共享的,就是說每個進程看到的數(shù)據(jù)塊都是一樣的,在不同機器間,數(shù)據(jù)塊可以傳遞。給出了 GRD目錄結構。
http://wiki.jikexueyuan.com/project/oraclecluster/images/13.png" alt="" />
可以看出 Mode、Role、n 構成了 RAC lock 的基本結構
數(shù)據(jù)一致性和并發(fā)性描述了 Oracle 如何維護多用戶數(shù)據(jù)庫環(huán)境中的數(shù)據(jù)一致性問題。在單用戶數(shù)據(jù)庫中,用戶修改數(shù)據(jù)庫中的數(shù)據(jù),不用擔心其他用戶同時修改相同的數(shù)據(jù)。但是,在多用戶數(shù)據(jù)庫中,同時執(zhí)行的多個事務中的語句可以修改同一數(shù)據(jù)。同時執(zhí)行的事務需要產生有意義的和一致性的結果。因而,在多用戶數(shù)據(jù)庫中,數(shù)據(jù)并發(fā)性和數(shù)據(jù)一致性的控制非常重要:數(shù)據(jù)并發(fā)性:每個用戶可以看到數(shù)據(jù)的一致性結果。ANSI/IOS SQL 標準(SQL 92)定義了 4 個事務隔離級別,對事務處理性能的影響也個不相同。這些隔離級別是考慮了事務并發(fā)執(zhí)行必須避免的 3 個現(xiàn)象提出的。3 個應該避免的現(xiàn)象為:
SQL92 根據(jù)這些對象定義了 4 個隔離級別,事務運行在特定的隔離級別允許特別的一些表現(xiàn)。如下表表示隔離級別阻止的讀現(xiàn)象。
http://wiki.jikexueyuan.com/project/oraclecluster/images/14.png" alt="" />