有關(guān)oracle高可靠性的一些討論和想法
http://skyhorse.blogbus.com/logs/2004/03/106569.html有關(guān)RAC的工作日志:
12月16日到12月23日做RAC的試驗(yàn)。12月24日把服務(wù)器交給QYC做DataGuard.
QYC做完DataGuard試驗(yàn)之后,1月4日我重新開始做RAC的試驗(yàn)。
當(dāng)初說是要做XX集團(tuán)的雙機(jī)熱備,因?yàn)槲覒?yīng)用oracle的時(shí)間非常短,對oracle并不熟悉,所以我這段時(shí)間就搜集了
一些相關(guān)的信息和資料,以供大家參考。
XX集團(tuán)的應(yīng)用我分析了一下,應(yīng)該是不要求24*7連續(xù)工作的,只要能夠及時(shí)恢復(fù)訪問即可,而且數(shù)據(jù)量不是太大
。
而且我原來讓XX方面做了NAT, 我們在這里就可以進(jìn)行遠(yuǎn)端的控制,控制到XX集團(tuán)內(nèi)部的Intranet的個(gè)別服務(wù)器。
我在網(wǎng)上所能搜到的信息是高可用性解決方案分為4種,
一種是oracle提供的被用方法,Standby (=9i DataGuard)
一種是AR (高級復(fù)制Advanced Replication,在以前版本叫快照snapshot)
一種是oracle 并行服務(wù)器8i的OPS (9i RAC,Real Application Cluster)
一種是第三方HA解決方案 (如Rose HA,故障切換時(shí)間是幾分鐘)
oracle公司的牛人著的里也是
把這4種方法做為高可用方案的組成。
這幾種方案從原理上來講都很容易理解,但是實(shí)際上有相當(dāng)多的細(xì)節(jié)和問題。
另外還有一種是大家都不太熟悉的是oracle 的 failsafe。
failsafe 采用的是SHARE NOTHING結(jié)構(gòu),即采用若干臺服務(wù)器組成集群,共同連接到一個(gè)共享磁盤系統(tǒng),
在同一時(shí)刻,只有一臺服務(wù)器能夠訪問共享磁盤,能夠?qū)ν馓峁┓⻊?wù).這與第3方HA方案的概念基本一樣。
但是 failsafe系統(tǒng)局限于WINDOWS(winnt,win2k...)平臺,必須配合MSCS(microsoft cluster server).
我在網(wǎng)上找到現(xiàn)成的雙機(jī)熱備的文檔 就是講在 oracle8i上如何做standby. 其保證了始終有一臺備用的
數(shù)據(jù)庫能夠在很短時(shí)間內(nèi)通過人工,恢復(fù)正常的訪問,并保證數(shù)據(jù)一致。這是不要求24*7連續(xù)工作時(shí)所考慮的方
案。
我們所能做試驗(yàn)的就是前三種方案,因?yàn)槿耸钟邢蓿跃妥隽?i的DataGuard 和RAC 兩種方案的試驗(yàn)。
高級復(fù)制據(jù)說lwd在很久以前做過。我打電話問oracle公司,他說AR對數(shù)據(jù)庫的性能影響太大。
高級復(fù)制也分為兩種情況
1.主動(dòng)/被動(dòng)策略: node1處于主動(dòng)模式,數(shù)據(jù)庫可讀寫,node2處于被動(dòng)模式,數(shù)據(jù)庫只讀。
2.主動(dòng)/主動(dòng)策略: node1和node2 都處于主動(dòng)模式,數(shù)據(jù)庫都可讀寫。這種對數(shù)據(jù)庫的性能影響特別大。
在講述DataGuard和RAC這兩種方案之前,我先補(bǔ)充一點(diǎn)關(guān)于oracle Client 如何能夠不修改本機(jī)配置就能
訪問兩臺oracles數(shù)據(jù)庫的方法。
也就是修改本機(jī)的tnsname.ora
一個(gè)通常的tnsname.ora 如下:
RACDB =
(DESCRIPTION =
(LOAD_BALANCE = off)
(failover = on)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 211.68.29.61)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 211.68.29.62)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = racdb)
)
)
在 ADDRESS_LIST 中 寫了兩個(gè)地址,client 通過oracle net 在訪問時(shí),如果訪問不通第一個(gè)ip,就會訪問第2個(gè)
ip.
這個(gè)特性是早就有了的。load_balance 特性也是有的。但是在兩臺數(shù)據(jù)庫內(nèi)容不一致的情況下是沒有任何意義的
。
不過,在oracle9i 的官方pdf中,load_balance 特性是不推薦使用的。
RAC 的試驗(yàn)我昨天已經(jīng)做成了,雖然遇到了一些不大不小的Bug和不穩(wěn)定現(xiàn)象。
環(huán)境是oracle9.2.0.1.0 , 2* RedHatAdvanceServer 2.1 和一個(gè)磁盤陣列, 采用的是裸設(shè)備。
RAC 是share everything 模式,兩個(gè)數(shù)據(jù)庫實(shí)例同時(shí)共享同一套數(shù)據(jù)文件,控制文件,日志文件。
客戶端可以同時(shí)訪問這兩臺數(shù)據(jù)庫得到的數(shù)據(jù)都是一致的,它的重點(diǎn)是高性能,可擴(kuò)展性。但是可靠性是不如Data
Guard的。
因?yàn)槭紫仍谖锢砩鲜沁B接在一起的,是沒法容災(zāi)的。
其次,instance1 死掉的話,可能可能影響instance2。
(Oracle 公司的電話支持說的, 以及網(wǎng)上的論壇中有相關(guān)的例子,一個(gè)實(shí)例down機(jī)拖累另一臺不能正常工作,
我在做RAC試驗(yàn)的時(shí)候,也出現(xiàn)了node1 重起,造成node2也重起的個(gè)別現(xiàn)象)
當(dāng)然了,與單機(jī)的oracle相比,可用性肯定是高的。
另外網(wǎng)上我所能找得到的RAC成功案例(論壇oracle版主之類實(shí)施),無一例外都是oracle經(jīng)過認(rèn)證的服務(wù)器硬件和
軟件.
例如HP,DELL PowerEdge服務(wù)器。DELL/EMC fiber-channel storage array 等等。
另外,因?yàn)闆]有多余交換機(jī),4塊網(wǎng)卡中的進(jìn)行內(nèi)部通信用的兩塊網(wǎng)卡我采用的是直接級聯(lián)
(新聚思公司的oracle支持說這樣不穩(wěn)定,但是為什么不穩(wěn)定也沒有說原因)
有關(guān)共享文件系統(tǒng)的一些問題:
采用裸設(shè)備無法進(jìn)行日常管理,也沒有辦法進(jìn)行文件系統(tǒng)級的備份。
開始我第一次在Mandrake8.1的時(shí)候,對陣列進(jìn)行分區(qū),而fdisk在linux下只能分16個(gè)分區(qū),我只好采用
lvm(logical volume manager,支持256個(gè))對裸設(shè)備進(jìn)行管理。后來在dbca創(chuàng)建數(shù)據(jù)庫的最后階段無法創(chuàng)建,只
好作罷。
第二次用RedHat AS2.1,oracle網(wǎng)站新推出了針對ocfs,我將其2003-1-3 更新的有關(guān)ocfs的所有rpm包(只適用
于AS2.1)安裝上,但是卻發(fā)現(xiàn)無法正常加載ocfs module, 我查了好久,估計(jì)這與我們所用的世紀(jì)曙光硬件有關(guān)
,
采用的AMD雙Athlon MP 1800+ 以及相關(guān)主機(jī)硬件,RedHat AS 2.1 無法正常認(rèn)出,從而造成ocfs modules也無法
正常加載,因?yàn)閛cfs modules與kernel是相關(guān)的。或許換成intel 的雙cpu, 或換成單cpu ,然后重裝系統(tǒng)就可以
解決。
因?yàn)閞hAS2.1的內(nèi)核不支持 lvm, 需要重新編譯內(nèi)核才能支持,我只好 將磁盤陣列分成2個(gè)drive,分別進(jìn)行了
分區(qū),跳過了fdisk分區(qū)數(shù)量限制,給oracle提供了足夠多的裸分區(qū)。
當(dāng)初做方案時(shí)買的vertris 的冷備份軟件(大概10萬元)是只能在oracle停機(jī)時(shí)通過smb來copy 文件進(jìn)行備份到磁
帶里的。
而裸設(shè)備是沒有辦法copy 的。
客戶端在tnsname.ora配好address_list后,
當(dāng)nodeA 停機(jī)時(shí),是可以不用修改配置訪問到nodeB 的。
但是這也分很多種情況
nodeA down,
listenerA down,
InstanceA down,
InstanceA in indeterminate state,
session die等等。
并非每種情況都能實(shí)現(xiàn)自動(dòng)轉(zhuǎn)到node2上。
第三方HA軟件是靠自己的agent軟件檢測模塊按照自己的故障判斷標(biāo)準(zhǔn)進(jìn)行強(qiáng)制轉(zhuǎn)換的。第一臺肯定不會被訪問到
,
在幾分鐘之后所有的訪問都會訪問到第二臺剛剛起來的數(shù)據(jù)庫上。
oracle 要想實(shí)現(xiàn)與第三方HA軟件一樣的功能,只能與microsoft cluster server一起 在windows平臺
上實(shí)現(xiàn)failover.
除此之外,oracle本身的幾種High Available 方案是不提供與此類似的自動(dòng)failover功能的。
RAC提供并行;
standby/dataguard提供熱備份服務(wù)器(需要人工維護(hù)切換);
AR 可以基本實(shí)時(shí)提供兩臺數(shù)據(jù)一致的數(shù)據(jù)庫,但是數(shù)據(jù)庫性能受影響。而且客戶端能否在各種各樣的情況下都自
動(dòng)
切換到第二臺數(shù)據(jù)庫上我也不知道。(例如listener running, instance down時(shí)無法切換到第二臺)
主數(shù)據(jù)庫發(fā)生災(zāi)難,無法訪問的情況下應(yīng)該是能夠切換的,但是有些情況下,只需要修改
tnsname.ora或者停掉node1的listener即可。
以前曾經(jīng)有人在職成網(wǎng)做過 RoseHA+oracle817+Turbolinux的集成方案, 據(jù)說效果也非常差。我所看到我們這里
的人去職成網(wǎng)
進(jìn)行維護(hù)N多次。(N非常大) 所以在集成方案中如果用到了oracle數(shù)據(jù)庫,就準(zhǔn)備好有人長期進(jìn)行維護(hù),主數(shù)據(jù)庫
在萬一情況下發(fā)生災(zāi)難,只要有一臺熱的備用數(shù)據(jù)庫能夠在比較短(電話通知之后1天之內(nèi))的時(shí)間內(nèi)繼續(xù)投入使用
就達(dá)到了可用性的目的,不至于主數(shù)據(jù)庫損壞,重新進(jìn)行安裝恢復(fù)占用星期級的時(shí)間。
要想達(dá)到failover自動(dòng)切換,無需人的參予是一種理想化狀態(tài),在unix平臺上無法實(shí)現(xiàn),windows平臺上的oracle
failover
我不太清楚,應(yīng)該是能實(shí)現(xiàn)這個(gè)想法的。
standby備用數(shù)據(jù)庫 是在oracle7.x才開始提供的一項(xiàng)功能,到了oracle8i才能提供read only模式,
到了9i 才使日志應(yīng)用等實(shí)現(xiàn)了自動(dòng)化,但是這個(gè)自動(dòng)化不是故障切換自動(dòng)化,而是只為了實(shí)現(xiàn)熱備份數(shù)據(jù)庫的功
能完善而
增加的一些自動(dòng)化。 歸根到底,oracle公司開發(fā)這么久,還沒有開發(fā)完善這些高可用方案,只是一直處于完善階
段。
RAC的并行提供服務(wù)我從一些oracle技術(shù)支持那里聽來的說法也是最好一臺用來做讀寫,另一臺專門提供只讀操作
的查詢,
不然仍然影響性能。用來做我們這種failover應(yīng)用的倒不多。
很容易理解的一些稍微復(fù)雜的原理,要想在實(shí)際中應(yīng)用是需要大量時(shí)間的,里面所涉及到的眾多細(xì)節(jié)如日志增量
等等很麻煩。
就連oracle9.0.0.1在linux下的OUI(oracle univesal installer)
安裝程序在它認(rèn)證的linux上運(yùn)行也是一堆Bug.
也就是它的jre有毛病,所以我當(dāng)初在mandrake8.1上創(chuàng)建數(shù)據(jù)庫出現(xiàn)了問題,無法進(jìn)行下去。
特定的環(huán)境,特定的問題,很多都是沒有解釋的。這是網(wǎng)上的一個(gè)DBA的原話。
網(wǎng)上也有oracle81700升級到81740就出故障的案例。
使用DataGuard(standby) 是不能實(shí)現(xiàn)故障的自動(dòng)切換的,因?yàn)閾?jù)oracle公司的人說無從判斷究竟算什么樣的故障
才開始進(jìn)行轉(zhuǎn)移,
這個(gè)已經(jīng)超出oracle軟件本身的范圍了。或許可以通過自己編寫程序來按照自己的標(biāo)準(zhǔn)來進(jìn)行判斷和轉(zhuǎn)移。
但是DataGuard做到了始終有一臺數(shù)據(jù)庫與主數(shù)據(jù)庫保持一致。在加上客戶端的tnsname.ora的addresslist在一定
程度上
是可以實(shí)現(xiàn)部分的故障切換的。
備數(shù)據(jù)庫平時(shí)只能處于read only或 recovery manage 模式。
read only 不能應(yīng)用主數(shù)據(jù)庫傳來的重作日志,recovery manage 可以進(jìn)行數(shù)據(jù)恢復(fù),但是不能被客戶端訪問。
備用數(shù)據(jù)庫經(jīng)常處于修復(fù)狀態(tài),因此不能被終端用戶使用,這從管理角度是一種浪費(fèi)(所以8i開始提供了read
only模式)。
我的想法是
1. 主數(shù)據(jù)庫發(fā)生災(zāi)難,被迫關(guān)閉,XX方面打電話通知過來,我們通過遠(yuǎn)程由人工激活備用的數(shù)據(jù)庫即可。也就是
敲幾行sql命令即可。
完全可以寫成腳本,隨便找一個(gè)人執(zhí)行一下即可。
2. 備數(shù)據(jù)庫白天處于read only 模式,可供webserver(也就是客戶端)查詢,晚上12點(diǎn)到1點(diǎn)通過cron
運(yùn)行在recover managed模式,
將白天主數(shù)據(jù)庫的更改應(yīng)用到備數(shù)據(jù)庫上。
3. 通過cron將備數(shù)據(jù)庫白天處于 primary 模式,可讀可寫,晚上通過腳本改回standby模式,并且應(yīng)用主數(shù)據(jù)庫
的更新。
這樣當(dāng)主數(shù)據(jù)庫down機(jī),客戶端會立刻連到第二臺數(shù)據(jù)庫上,同時(shí)也能夠進(jìn)行讀寫。數(shù)據(jù)分歧只有一天,并且達(dá)
到了無人
切換狀態(tài)。
這3種方法,第1種是最好的。
第2種是可行的,是oracle官方認(rèn)可的,有數(shù)據(jù)分歧,和只讀的局限性。
第3種有數(shù)據(jù)分歧并且有或大或小的細(xì)節(jié)問題沒有考慮,只是我的一個(gè)臨時(shí)想法。
在RAC 和 DataGuard 這兩種方案中,
RAC對硬件和操作系統(tǒng)要求都比較高,維護(hù)也非常復(fù)雜,我們買的vertas 備份軟件也沒有辦法使用冷備的文件。
對人員的素質(zhì)要求也很高。
隨便舉個(gè)例子,RedHat AS 2.1 如果認(rèn)不出SCSI driver,就沒法做了。因?yàn)閛racle9.2i只能用這個(gè)操作系統(tǒng)。
( webmail沒有用mandrake8.1而是用mandrake8.2就是這個(gè)原因)
不確定因素太多。
在做系統(tǒng)集成方案和買硬件時(shí)都要仔細(xì)考慮,買什么樣的服務(wù)器,陣列,網(wǎng)卡,幾個(gè)交換機(jī),linuxAS21能否裝上
等等。
而不是隨便寫個(gè)雙機(jī)熱備,買兩個(gè)服務(wù)器,一個(gè)交換機(jī)就行了。
不過這個(gè)方案可以用在我們自己的機(jī)房里,提供高性能的oracle數(shù)據(jù)庫服務(wù)。(但是需要比較多的時(shí)間來準(zhǔn)備和調(diào)
試)。
我現(xiàn)在只能做到把oracle92i裝起來,具體平時(shí)的管理還要靠有數(shù)據(jù)庫使用經(jīng)驗(yàn)的其他同事來做。
安裝文檔我放在附件里了。