DB2 HADR環境下,應用的改變

zchbaby2000發表於2016-03-26
最近根據專案的需求,搭建了
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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章