web服務器集群


概述

集群和分布式都是從集中式進化而來的。分布式和集群會相互合作的,同時的集群和分布式。在這里重點說說集群

集群是什么?

集群能提高單位時間內處理的任務數量,提升服務器性能
有多台服務器去處理任務,但是每個任務都是由一台服務器獨立完成的
集群

分布式是什么?

分布式能縮短單個任務處理的時間
跟集群一樣,也有多台服務器去處理任務,但是每個任務由多台服務器合作完成,每台服務器負責完成大任務中的一個小任務
分布式

集中式是什么?

集中式就是最傳統的那種,所有任務由一台大機完成
集中式

集群場景

可以在一台物理服務器上集群多個應用服務器,每個應用服務器獨立工作。再在前端分配一個中央控制服務器,負責把發送到這台物理服務器的請求,按照一定權重分發給各個應用服務器。

例子

以tomcat為例子,可以采用1*apache+N*tomcat的模式
apache作為門面,在前端用負載均衡把請求發給各個tomcat服務器
java集群

好處

通常集群32位的服務器來代替單個64位的服務器,這樣能盡量發揮出硬件的性能

  1. 在64位的程序中,由於指針膨脹以及內存對齊,會造成內存浪費。
  2. 在單個64位的服務器宕機的時候,所產生的快照很大,不好分析
  3. 大內存的服務器,意味着要對更大的內存區域進行垃圾收集,那么會增大GC的時間,會加長服務器的停頓

難點

由於http請求是無狀態的,那么對於會話級別的事務,如何保持用戶的狀態?
在單個服務器中,提供了session-sessionID的機制來保存用戶的狀態
那么現在有多台服務器,如何記錄用戶的狀態?
有兩個大方向:

  1. session粘性
  2. 共享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粘性,又能在服務器宕機的時候繼續提供服務

優點:

  1. 占用的內存少,因為只記錄了sessionID以及對應發送的服務器

缺點:

  1. 如果服務器宕機了,在這個服務器上的session信息都會丟失

同步session

這種方式需要在一個地方存放session的所有信息,並且能讓每個服務器節點都能訪問得到這些session
這種方式大概有三種方案:

  1. cookie同步
  2. 數據庫同步
  3. 內存數據庫同步
cookie同步

cookie同步是將session的所有信息存放在客戶端,每次請求的時候,將session也發送上來
優點:

  1. 不占用服務器內存
  2. 服務器宕機不會丟失session信息

缺點:

  1. 放在客戶端,不安全
  2. 受瀏覽器的限制,瀏覽器禁用cookie
  3. 增大流量,變相拉低響應時間
  4. session序列化和反序列都需要額外的時間
數據庫同步

將session信息存放在一個都能訪問到的數據庫
優點:

  1. 服務器宕機不會丟失session信息

缺點:

  1. 占用的內存大
  2. 增大數據庫負擔
  3. session序列化和反序列都需要額外的時間
  4. 訪問數據庫會需要額外的時間
內存數據庫同步

將session信息存放在一個都能訪問到的內存數據庫中,比如redis、memcached
優點:

  1. 服務器宕機不會丟失session信息
  2. 訪問的速度快

缺點:

  1. 占用內存大
  2. session序列化和反序列都需要額外的時間

總結

session同步最好的是第三種,內存數據庫同步
session同步的好處是不怕單個服務器宕機,但是他占用的資源、速度也比session粘性要大

缺點

  1. 節點對共享資源的競爭,如磁盤文件
  2. 節點對同一資源進行操作帶來的問題,如對同一文件進行讀寫
  3. 32位的節點受最大內存的限制
  4. 節點內資源池的閑置。如連接池,可能會出現某些節點的連接池用滿,某些節點還有可用連接。可以考慮配置同一資源池,集中式JNDI
  5. 節點內的本地緩存重復,因為每份節點都有一份本地緩存。可以考慮采用緩存數據庫統一存放緩存,如redis
  6. 浪費內存,節點越多,重復加載的類越多,jvm中的方法區內容差不多,但是每個節點都有一份。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM