天天看點

SNA -- Shared Nothing Architecture研究

      現在我們的項目使用者session都存放在每個web server中ThreadLocal還儲存,如果是多個伺服器部署的web app的話,需要每台伺服器同步共享Session。

<?xml version="1.0"?>  

<jboss-web>  

<replication-config>  

<replication-trigger>SET_AND_NON_PRIMITIVE_GET</replication-trigger>  

<replication-granularity>SESSION</replication-granularity>  

<replication-field-batch-mode>true</replication-field-batch-mode>  

</replication-config>  

</jboss-web>

         最近那就了一下SNA發現這種方式确實是一種很好解決session在web contianer中共享的方式。     

      Shared Nothing Architecture(無分享架構)是一個分布式的架構,每個節點都是獨立的。典型的SNA系統會集中存儲狀态的資訊,如:資料庫中,記憶體cache中;不在節點上儲存狀态的資訊。

       對于server叢集,若将session等狀态儲存在各個節點上,那麼各個節點的session複制會極大的影響性能;若采用SNA,保持每個節點的無狀态性,不再使用session來保持全局的狀态,而是将session直接放在資料庫中,在資料庫前再加一層分布式Cache(推薦使用memcached),這樣将可極大的提高性能,當改變session中的對象時,同步到cache和資料庫。

      對Web Servers做叢集時如果将session等狀态保持在各個節點上,這樣狀态的複制就很成問題,是以SNA告訴你在節點上不要儲存狀态,session這種東西可以存在資料庫或記憶體緩存中嘛,然後cookie或URL中帶一個加密string用來查詢session狀态就可以完美解決session狀态了。

      但顯然這給資料庫增加了壓力,但是資料庫的處理能力比Web Servers做session複制要好多了。況且我們在資料庫前加一memcached将大量的資料庫Reads的工作做了,而資料庫隻用處理數量不多的Writes工作,這大大提高了系統的性能。每個Web Server節點裡不用cache,而是外部分布式memcached或session server,這同時避免了cache-coherence問題。

           對于大型的網際網路應用的話,未來一定要通過無session狀态化,session中心化的方式解決,通過memcached方式存儲session,并設定memcached的過期時間,這樣可以降低應用的耦合度,增強了擴充性,提高伺服器處理的吞吐量。