DB2 HADR環境下,應用的改變
最近根據專案的需求,搭建了
DB2 HADR (一個primary,2個standby), with a virtual ip
Dprop
搭建按部就班的進行,每個server上都有兩個網路卡,其中一個是HADR使用的,另個一個是對外服務使用
先載入了資料,然後構建HADR,設定dprop,最後部署資料庫維護指令碼。
關於和應用結合的技術方面的實現,做一個小的總結
在DB2 HADR環境下,對於WAS, 和backend 程式,需要做一點改動,這樣當primary和principal standby切換的時候,WAS和backend不用改,實現自動切換。
WAS和backend和資料庫連線使用的是一個DB2 HADR的virtual ip,virtual ip是存在primary server上面的浮動ip,當principal standby變成primary 的時候,浮動ip就會自動切換
primary和principal standby servers在同一個城市,實現的是資料庫的HA(高可用性),基於非常好的網路情況,同步方式是SYNC來確保資料的不會丟失,還有一個DR server在另外一個城市,對於DR,只能採用superasync的方式
從primary到DR的網路傳輸是4 MB每秒,測試表明,在系統業務量的高峰期,DR會在10分鐘內完成日誌的重做,這種程度的資料丟失是符合客戶的要求的。
對於HA的兩個server,要求全自動切換
對於DR server,需要手工切換
這個全自動切換涉及三個方面的內容
1. DB2 Database以及相關的DB2 SQL Replication(和其他專案的資料庫關聯來pull, push data),這就要求在HADR切換的時候,dprop也需要自動切換
對於這個問題,是透過修改下面的兩個指令碼來實現的,加上dprop啟停指令碼的呼叫就可以了,但是因為多個dprop,需要進行一點邏輯判斷,判斷是哪個例項的哪個資料庫,然後呼叫哪個指令碼
/usr/sbin/rsct/sapolicies/db2/hadrV105_stop.ksh
/usr/sbin/rsct/sapolicies/db2/hadrV105_start.ksh
可能並不是所有的HADR的指令碼的位置都是上面這樣的,可以透過類似下面的命令進行檢視
lsrsrc IBM.Application StartCommand StopCommand MonitorCommand
2. 對於WAS部分的datasource的設定,在原來的基礎上,要加上一個custome property: Seamless failover
這樣當principal standby變成primary的時候,一個正在進行的應用連線會等待,然後連線會自動切換到新的primary db2 database,繼續執行。
3. 對於後臺的一些應用,關於資料庫的連線資訊是放在一個property file中的,現在需要兩個property file了
其中一個property file,設定的是virtual ip的資訊和enableSeamlessFailover=true等方面的資訊
Java程式碼讀取這個資訊放到一個Properties物件中,在建立資料庫連線的時候,採用下面的方式
另外一個property file就是包括了DR資料庫的資訊,這樣如果HA的兩個伺服器都down了以後,手工改動crontab的呼叫。
另外注意的一點是,WAS的DR和DB2的DR是對應的,就是說,當DB2使用到DR的時候,WAS及時沒有出現問題,也會使用DR
考慮到使用DR的機會還是非常小的,這點客戶可以忍受。
DB2 HADR (一個primary,2個standby), with a virtual ip
Dprop
搭建按部就班的進行,每個server上都有兩個網路卡,其中一個是HADR使用的,另個一個是對外服務使用
先載入了資料,然後構建HADR,設定dprop,最後部署資料庫維護指令碼。
關於和應用結合的技術方面的實現,做一個小的總結
在DB2 HADR環境下,對於WAS, 和backend 程式,需要做一點改動,這樣當primary和principal standby切換的時候,WAS和backend不用改,實現自動切換。
WAS和backend和資料庫連線使用的是一個DB2 HADR的virtual ip,virtual ip是存在primary server上面的浮動ip,當principal standby變成primary 的時候,浮動ip就會自動切換
primary和principal standby servers在同一個城市,實現的是資料庫的HA(高可用性),基於非常好的網路情況,同步方式是SYNC來確保資料的不會丟失,還有一個DR server在另外一個城市,對於DR,只能採用superasync的方式
從primary到DR的網路傳輸是4 MB每秒,測試表明,在系統業務量的高峰期,DR會在10分鐘內完成日誌的重做,這種程度的資料丟失是符合客戶的要求的。
對於HA的兩個server,要求全自動切換
對於DR server,需要手工切換
這個全自動切換涉及三個方面的內容
1. DB2 Database以及相關的DB2 SQL Replication(和其他專案的資料庫關聯來pull, push data),這就要求在HADR切換的時候,dprop也需要自動切換
對於這個問題,是透過修改下面的兩個指令碼來實現的,加上dprop啟停指令碼的呼叫就可以了,但是因為多個dprop,需要進行一點邏輯判斷,判斷是哪個例項的哪個資料庫,然後呼叫哪個指令碼
/usr/sbin/rsct/sapolicies/db2/hadrV105_stop.ksh
/usr/sbin/rsct/sapolicies/db2/hadrV105_start.ksh
可能並不是所有的HADR的指令碼的位置都是上面這樣的,可以透過類似下面的命令進行檢視
lsrsrc IBM.Application StartCommand StopCommand MonitorCommand
2. 對於WAS部分的datasource的設定,在原來的基礎上,要加上一個custome property: Seamless failover
這樣當principal standby變成primary的時候,一個正在進行的應用連線會等待,然後連線會自動切換到新的primary db2 database,繼續執行。
3. 對於後臺的一些應用,關於資料庫的連線資訊是放在一個property file中的,現在需要兩個property file了
其中一個property file,設定的是virtual ip的資訊和enableSeamlessFailover=true等方面的資訊
### JCC Properties read through -Ddb2.jcc.propertiesFile=./conn.properties #db2.jcc.traceFile=./jcc.trace db2.jcc.outputDirectory=. ### Connection level properties used by ### DriverManager.getConnection(url, conProperties); user=db2psc password=password portNumber=50000 deferPrepares=false retrieveMessagesFromServerOnGetMessage=true clientApplicationInformation=hadrrosProg clientProgramName=mixedwl clientWorkstation=node03 defaultIsolationLevel=2 driverType=4 ### Properties for the Automatic Client Reroute #enableSysplexWLB=true #enableConnectionConcentrator=true enableSeamlessFailover=true clientRerouteAlternateServerName=192.168.142.100,192.168.142.100 clientRerouteAlternatePortNumber=50000,50000 enableClientAffinitiesList=1 maxRetriesForClientReroute=4 retryIntervalForClientReroute=120 ### properties read by the application such as server, port, ### dbName, taskprefix, autoCommit, fetchsize server=192.168.142.100 port=50000 dbName=hadb |
Java程式碼讀取這個資訊放到一個Properties物件中,在建立資料庫連線的時候,採用下面的方式
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.Properties; public class Test1 { /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { String propFile = "C:\\Users\\IBM_ADMIN\\IBM\\rationalsdp\\ds1\\hadr\\src\\hadr.properties"; Properties connProp = new Properties(); FileInputStream dsPropFile = null; try { dsPropFile = new FileInputStream(propFile); } catch (FileNotFoundException fe) { System.out.println(fe.getMessage()); throw fe; } connProp.load(dsPropFile); String server = connProp.getProperty("server"); String port = connProp.getProperty("port"); String dbName = connProp.getProperty("dbName"); String url = "jdbc:db2://" + server + ":" + port + "/" + dbName; Connection bladeConn = null; PreparedStatement pstmt = null; try { bladeConn = DriverManager.getConnection(url, connProp); bladeConn.setAutoCommit(false); pstmt = bladeConn.prepareStatement("insert into t values(?,?)"); for (int i = 0; i < 100000000; i++) { pstmt.setInt(1, i); pstmt.setInt(2, i); pstmt.addBatch(); boolean retry=false; do { retry=false; try { if (i % 50 == 0) { pstmt.executeBatch(); bladeConn.commit(); System.out.println(i); } }catch(SQLException se) { //deal with client reroute exception int errorcode = se.getErrorCode(); System.out.println("SQLException: " + se); System.out.println("SQLCode: " + errorcode); if(bladeConn != null){ try{ bladeConn.rollback(); }catch(Exception e) { e.printStackTrace(); } } //endif if((errorcode == -30108) || (errorcode == -4498)){ System.out.println("connection is re-established, re-executing the failed transaction."); retry = true; } } } while(retry); } System.out.print("Batch execution completed."); } catch (Exception ex) { ex.printStackTrace(); System.exit(-1); } finally { try { pstmt.close(); bladeConn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } |
另外一個property file就是包括了DR資料庫的資訊,這樣如果HA的兩個伺服器都down了以後,手工改動crontab的呼叫。
另外注意的一點是,WAS的DR和DB2的DR是對應的,就是說,當DB2使用到DR的時候,WAS及時沒有出現問題,也會使用DR
考慮到使用DR的機會還是非常小的,這點客戶可以忍受。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/725820/viewspace-2064494/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- db2 hadr 限制DB2
- XML 在 ASP 環境下的應用(轉)XML
- DB2環境變數管理方法集TODB2變數
- unix下環境變數 .變數
- DB2 HADR效能分析DB2
- DB2 HADR的heartbeat檢測DB2
- RAC環境下的SEQUENCE對應用的影響
- Linux 應用程式處理當前執行環境的環境變數(轉)Linux變數
- Linux環境變數詳解與應用Linux變數
- 雲端計算環境下的BGP協議應用協議
- db2 hadr_spool_limitDB2MIT
- DB2 HADR搭建過程DB2
- DB2 HADR對效能的影響DB2
- 分散式儲存在雲環境下的應用和部署分散式
- C語言putenv()函式:改變或增加環境變數C語言函式變數
- centos下配置java環境變數CentOSJava變數
- centos下加入mysql環境變數CentOSMySql變數
- Linux下Java環境變數的配置LinuxJava變數
- Windows下Java環境變數的配置(詳)WindowsJava變數
- 設定DB2環境DB2
- Linux下將PHP新增到環境變數,將Mysql加入環境變數。LinuxPHP變數MySql
- DB2 HADR相關引數1DB2
- 在linux環境下安裝JDK並配置環境變數LinuxJDK變數
- Tomcat的下載及環境變數配置Tomcat變數
- Mac下配置環境變數的兩種方式Mac變數
- linux下的PS1環境變數Linux變數
- linux下的java環境變數設定LinuxJava變數
- 修改linux下mysql環境變數LinuxMySql變數
- 使用SetEnvironmentVariable調整應用程式環境變數中的path設定變數
- 在solaris環境下,根據java程式的不同,設定不同的環境變數Java變數
- 不要忽視BI的應用環境
- Windows環境下的Nginx環境搭建WindowsNginx
- 什麼是環境變數?python設定環境變數有什麼用?變數Python
- DB2資料庫的備份測試--備份環境變數配置DB2資料庫變數
- Windows下JAVA環境變數的設定祥解WindowsJava變數
- JDK下載安裝和環境變數的配置JDK變數
- 環境變數變數
- GO語言linux下環境變數GoLinux變數