概述 集群和分散式都是從集中式 進化 而來的。分散式和集群會相互合作的,同時的集群和分散式。在這裡重點說說集群 集群是什麼? 集群能提高單位時間內處理的任務數量,提升伺服器性能 有多台伺服器去處理任務,但是 每個任務都是由一臺伺服器獨立完成的 分散式是什麼? 分散式能縮短單個任務處理的時間 跟集群一 ...
概述
集群和分散式都是從集中式進化而來的。分散式和集群會相互合作的,同時的集群和分散式。在這裡重點說說集群
集群是什麼?
集群能提高單位時間內處理的任務數量,提升伺服器性能
有多台伺服器去處理任務,但是每個任務都是由一臺伺服器獨立完成的
分散式是什麼?
分散式能縮短單個任務處理的時間
跟集群一樣,也有多台伺服器去處理任務,但是每個任務由多台伺服器合作完成,每台伺服器負責完成大任務中的一個小任務
集中式是什麼?
集中式就是最傳統的那種,所有任務由一臺大機完成
集群場景
可以在一臺物理伺服器上集群多個應用伺服器,每個應用伺服器獨立工作。再在前端分配一個中央控制伺服器,負責把發送到這台物理伺服器的請求,按照一定權重分發給各個應用伺服器。
例子
以tomcat為例子,可以採用1*apache+N*tomcat的模式
apache作為門面,在前端用負載均衡把請求發給各個tomcat伺服器
好處
通常集群32位的伺服器來代替單個64位的伺服器,這樣能儘量發揮出硬體的性能
- 在64位的程式中,由於指針膨脹以及記憶體對齊,會造成記憶體浪費。
- 在單個64位的伺服器宕機的時候,所產生的快照很大,不好分析
- 大記憶體的伺服器,意味著要對更大的記憶體區域進行垃圾收集,那麼會增大GC的時間,會加長伺服器的停頓
難點
由於http請求是無狀態的,那麼對於會話級別的事務,如何保持用戶的狀態?
在單個伺服器中,提供了session-sessionID的機制來保存用戶的狀態
那麼現在有多台伺服器,如何記錄用戶的狀態?
有兩個大方向:
- session粘性
- 共用session
session粘性
這種方式也成為親和式集群,給session創造粘性,意思是讓用戶每次都訪問的同一個應用伺服器
這樣就要在前端伺服器apache中記錄下,用戶首次訪問的是哪個tomcat,將用戶後面發送的請求都發送到這個tomcat上去
這樣帶來的後果是,各個伺服器負載不均衡,因為只在用戶首次訪問的時候,採用了負載均衡分發,但是這個影響也不會那麼明顯
worker.controller.sticky_session=true|false
worker.controller.sticky_session_force=true|false
這是在apache對於session粘性的配置
worker.controller.sticky_session,為true會開啟session粘性機制,為false關閉
worker.controller.sticky_session_force,為true意味著即使這個伺服器宕機了,也仍然發送到這個伺服器,為false則會選擇發送其他到其他伺服器
建議選擇前者為true,後者為false。這樣既能達到session粘性,又能在伺服器宕機的時候繼續提供服務
優點:
- 占用的記憶體少,因為只記錄了sessionID以及對應發送的伺服器
缺點:
- 如果伺服器宕機了,在這個伺服器上的session信息都會丟失
同步session
這種方式需要在一個地方存放session的所有信息,並且能讓每個伺服器節點都能訪問得到這些session
這種方式大概有三種方案:
- cookie同步
- 資料庫同步
- 記憶體資料庫同步
cookie同步
cookie同步是將session的所有信息存放在客戶端,每次請求的時候,將session也發送上來
優點:
- 不占用伺服器記憶體
- 伺服器宕機不會丟失session信息
缺點:
- 放在客戶端,不安全
- 受瀏覽器的限制,瀏覽器禁用cookie
- 增大流量,變相拉低響應時間
- session序列化和反序列都需要額外的時間
資料庫同步
將session信息存放在一個都能訪問到的資料庫
優點:
- 伺服器宕機不會丟失session信息
缺點:
- 占用的記憶體大
- 增大資料庫負擔
- session序列化和反序列都需要額外的時間
- 訪問資料庫會需要額外的時間
記憶體資料庫同步
將session信息存放在一個都能訪問到的記憶體資料庫中,比如redis、memcached
優點:
- 伺服器宕機不會丟失session信息
- 訪問的速度快
缺點:
- 占用記憶體大
- session序列化和反序列都需要額外的時間
總結
session同步最好的是第三種,記憶體資料庫同步
session同步的好處是不怕單個伺服器宕機,但是他占用的資源、速度也比session粘性要大
缺點
- 節點對共用資源的競爭,如磁碟文件
- 節點對同一資源進行操作帶來的問題,如對同一文件進行讀寫
- 32位的節點受最大記憶體的限制
- 節點內資源池的閑置。如連接池,可能會出現某些節點的連接池用滿,某些節點還有可用連接。可以考慮配置同一資源池,集中式JNDI
- 節點內的本地緩存重覆,因為每份節點都有一份本地緩存。可以考慮採用緩存資料庫統一存放緩存,如redis
- 浪費記憶體,節點越多,重覆載入的類越多,jvm中的方法區內容差不多,但是每個節點都有一份。