<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 42,comments - 83,trackbacks - 0
            幾乎所有使用weblogic的大一點的企業環境中,都會使用到cluster, 使用cluster勢必要采用proxy, proxy有很多,apache, iis及weblogic提供的HttpClusterServlet。plugin的配置參數有很多,可參考下面的鏈接,http://e-docs.bea.com/wls/docs92/plugins/plugin_params.html#wp1157622。這篇文章中,我們主要看看DynamicServerList 內部實現是什么樣子的。

            首先我們來看一下DynamicServerList 的具體解釋,默認值是enable的,
            When set to OFF, the plug-in ignores the dynamic cluster list used for load balancing requests proxied from the plug-in and only uses the static list specified with the WebLogicCluster parameter. Normally this parameter should remain set to ON. There are some implications for setting this parameter to OFF:
             1:If one or more servers in the static list fails, the plug-in could waste time trying to connect to a dead server, resulting in decreased performance. 
             2:If you add a new server to the cluster, the plug-in cannot proxy requests to the new server unless you redefine this parameter. WebLogic Server automatically adds new servers to the dynamic server list when they become part of the cluster. 
             
             從上面的描述可以看出,DynamicServerList 用于使proxy實時獲取后端cluster中的server列表(比如cluster中的member增加、刪除,member狀態的變化(startup、shutdown)),這樣proxy在load balance request的時候可以避免去try dead server。同時可以將請求dispatch到cluster中的新增member上(比如預定義的cluster中有server1, server2,某時刻發現后端server load比較高,新增加一個server3,這時候,如果DynamicServerList 為on,你就不需要重新定義WeblogicCluster,當然也不需要重起plugin)。順便提一下,DynamicServerList為on的時候,http.conf或HttpClusterServlet對應的web.xml中的WeblogicCluster無需定義所有的cluster member,指定任意一個即可。
    WebLogicCluster 10.130.2.41:7021,10.130.2.42:7021,10.130.2.43:7021
    WebLogicCluster 10.130.2.41:7021
    上面兩種寫法是等效的,但DynamicServerList若為off,則必須采用上面的寫法。

            下面我們來看看proxy是如何感知后端cluster狀態的變化,從而及時更新自己手里的server list以便提高dispatch request的速度。
            1:plugin端(以HttpClusterServlet為例)
                在plugin處理client端請求的時候,它在將請求dispatch到后端server的時候,會在http header中加上一個名為X_WEBLOGIC_REQUEST_CLUSTERINFO的internal header, 如下:
    HttpClusterServlet.java
    1 protected void addRequestHeaders(HttpServletRequest request, PrintStream headerOut, Object o1, Object o2) {
    2     super.addRequestHeaders(request, headerOut, o1, o2);
    3     
    4     headerOut.print(ServletResponseImpl.X_WEBLOGIC_REQUEST_CLUSTERINFO + ": true");
    5     headerOut.print(EOL);
    6 }

           2: managed server端
           managed server在處理完http request后,回寫response到proxy端的時候,檢查當前managed server是否位于一個cluster中及request的header中是否包含X_WEBLOGIC_REQUEST_CLUSTERINFO。如果上述條件成立,再去檢查當前cluster的hash,如果cluster的hash發生變化(對比當前cluster的hash和proxy傳遞過來的hash),則將cluster member的信息通知給proxy,這個通知也是通過http header來實現,不同的是header名為:X_WEBLOGIC_CLUSTER_LIST及X_WEBLOGIC_CLUSTER_HASH,如下:
    ServletResponseImpl.java
     1   /*package*/ final void writeHeaders() throws IOException {
     2         
     3     HttpServer httper = getHttpServer();
     4     if (httper != null) {
     5       boolean isPlugin = false;
     6       ServerMBean serverMBean = ManagementService.getRuntimeAccess(
     7               WebAppConfigManager.KERNEL_ID).getServer();
     8       if (serverMBean.getCluster() != null &&
     9           request.getHeader(X_WEBLOGIC_REQUEST_CLUSTERINFO) != null) {
    10         
    11         String hash = request.getHeader(X_WEBLOGIC_CLUSTER_HASH);
    12         String oldHash = hash == null ? "" : hash;
                //MemberControllerImpl is a singlton instance and it's hash is changed when cluster changs
    13         String currentHash = MembershipControllerImpl.getInstance().getHash();
    14         String passedHash = headers.getHeader(X_WEBLOGIC_CLUSTER_HASH);
    15         if (currentHash != null && !currentHash.equals(oldHash)) {
    16           String[] servers =
    17           MembershipControllerImpl.getInstance().getClusterList(
    18               request.getConnection().getChannel());
    19                         
    20             headers.setHeader(X_WEBLOGIC_CLUSTER_HASH, currentHash);
    21             headers.setHeader(X_WEBLOGIC_CLUSTER_LIST, sb.toString());//sb presents servers list string
    22           }
    23         }
    24        } 
    25     }
        
            3:proxy端,
            回到proxy端,proxy讀取managed server的response,將response寫回到客戶端。在讀取response的時候,它同時會解析inter header的信息。如果發現DynamicServerList為true,而且response的header中包含X_WEBLOGIC_CLUSTER_LIST、X_WEBLOGIC_CLUSTER_HASH等信息,它會據此更新request info,如下:
    HttpClusterServlet.java
     1   public void addResponseHeaders(HttpServletResponse response, String name, String value, Object o) {
     2     RequestInfo ri = (RequestInfo) o;
     3     if (ri.needToUpdateDynamicList() &&
     4         name.equals(ServletResponseImpl.X_WEBLOGIC_CLUSTER_LIST)) {
     5       ri.setDynamicList(value);      
     6       return;
     7     }
     8     if (ri.needToUpdateDynamicList() &&
     9         name.equals(ServletResponseImpl.X_WEBLOGIC_CLUSTER_HASH)) {
    10       ri.setDynamicHash(value);
    11       return;
    12     }
    13         
    14   }
            而requestInfo是一個請求范圍的變量,更新它其實無法更新到proxy中的server list。server list的更新發生在一個request結束的時候,就HttpServletRequest.service()的finally塊中。在finally塊中,檢查requestInfo中的dynamicServerList存在,如果存在則說明后端cluster發生了變化(否則managed server不會發送X_WEBLOGIC_CLUSTER_LIST信息到proxy端),那么它會將自己手里的serverlist, server hash信息設置為后端返回的值,如下:
     1      finally
     2      {
     3          String dynamicList = ri.getDynamicList();
     4           if (dynamicList != null) {
     5             ServerList servers = new ServerList(dynamicList, false);
     6             if (!useDynamicList) {
     7                         
     8             } else {
     9               servers.setHash(ri.getDynamicHash());
    10               if (verbose) trace("Updating dynamic server list: " + dynamicList);
    11               srvrList = servers;
    12               servers.addToKnownServersList(allKnownServers);
    13             }
    14      }

           至此,DynamicServerList 的實現流程基本能看明白了吧。而對于static server list,不建議大家使用,否則proxy的分發性能會在cluster不穩定的時候發生下降。 但在cluster本身partition掉的時候,static server list會顯得更好。也就是說cluster出現問題了,cluster中的member不能看到所有其他的members(甚至只能看到自己),比如cluster中有4個server, A\B\C\D,如果某一時刻請求被dispatch到A上,而此時如果A只能看到B(即在A的眼中,只有它自己和B可以提供服務),這時候A會將只包含A\B的cluster server list返回給proxy,那么proxy在分發后續請求的時候,只會在A\B上做load balance(C\D不會接受到請求,雖然他們還在running),直到cluster恢復正常或發生變化。而這種情況下,如果static server list的話,A\B\C\D都會接受到proxy分發過來的請求。當然這只是種非正常情況,出現這種情況的時候,我們首要任務應該是解決cluster partition的問題,而不是依賴于static server list。


    posted on 2008-11-13 13:48 走走停停又三年 閱讀(2617) 評論(6)  編輯  收藏 所屬分類: Weblogic

    FeedBack:
    # re: 淺析weblogic10 plugin中的DynamicServerList
    2009-02-25 16:54 | wellpha
    請教一下怎么解決你上面說的cluster partition的問題,我配置的httpClusterServlet中返回的server list總是只有一個服務器,但實際上我3個都是啟動的。  回復  更多評論
      
    # re: 淺析weblogic10 plugin中的DynamicServerList
    2009-02-25 16:58 | 走走停停又三年
    檢查一個server log,看看是multi cast有問題,還是managed server本身出了問題。通常情況下,如果server正常,log中你可以看到join cluster之類的文字  回復  更多評論
      
    # re: 淺析weblogic10 plugin中的DynamicServerList
    2009-02-26 15:06 | wellpha
    謝謝你的答復,我用的是weblogic server 10.3,cluster的通訊方式選的是unicast,這樣就一直只能看到一個server。而我改成multicast的方式就沒問題,能發現所有的服務器。不知道unicast有什么需要特別配置的地方?  回復  更多評論
      
    # re: 淺析weblogic10 plugin中的DynamicServerList
    2009-02-26 16:46 | fjin
    應該是unicast channel有問題,你重新配置一個channel試試,別用defaul channel。  回復  更多評論
      
    # re: 淺析weblogic10 plugin中的DynamicServerList
    2009-02-26 16:51 | wellpha
    問題已經解決了,是我的unicast channel沒配置好,需要指定listen address  回復  更多評論
      
    # re: 淺析weblogic10 plugin中的DynamicServerList
    2009-06-05 10:23 | flyisland
    不錯的文章,把整個過程講清楚了。

    昨天剛剛解決了一個weblogic cluster plugin(apache) 分發失敗的問題,從proxy log大致看出了這個流程,再看到你的文章,就更加清晰了。  回復  更多評論
      
    主站蜘蛛池模板: 亚洲黄色在线播放| 曰批免费视频播放免费| 中文字幕免费在线看线人动作大片 | 777爽死你无码免费看一二区| 黄页免费的网站勿入免费直接进入| 亚洲av无码潮喷在线观看| 国产综合激情在线亚洲第一页| 成人免费无码视频在线网站| 亚洲精品成人无码中文毛片不卡| 日韩毛片在线免费观看| 337p日本欧洲亚洲大胆裸体艺术| 亚洲中文无码a∨在线观看| 精品亚洲av无码一区二区柚蜜| 国产免费资源高清小视频在线观看| 久久水蜜桃亚洲av无码精品麻豆| 一区二区三区免费看| 中文字幕亚洲一区| 老汉精品免费AV在线播放| 亚洲国产精品成人精品小说 | 一区二区三区观看免费中文视频在线播放| 国内精品久久久久久久亚洲| 国产免费无码AV片在线观看不卡| 免费一级做a爰片性色毛片| 色婷婷综合缴情综免费观看| 亚洲欧洲国产精品香蕉网| 一区二区三区免费精品视频| 亚洲成Av人片乱码色午夜| 一本一道dvd在线观看免费视频| 亚洲无人区一区二区三区| 色猫咪免费人成网站在线观看| 亚洲AV无码乱码在线观看代蜜桃| 免费高清av一区二区三区| 亚洲乱码在线观看| 国产一级做a爱免费视频| 成全在线观看免费观看大全 | 亚洲性天天干天天摸| 中文在线免费看视频| 亚洲精品视频免费看| 亚洲人成免费网站| 美女被羞羞网站免费下载| 亚洲av无码无在线观看红杏|