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