nginx+tomcat+memcached負載均衡

nginx+tomcat+memcached負載均衡php

負載均衡:css

  負載均衡是由多臺服務器以對稱的方式組成一個服務器集合,每臺服務器都具備等價的地位,均可以單獨對外提供服務 而無須其餘服務器的輔助。經過某種負載分擔技術,將外部發送來的請求均勻分配到對稱結構中的某一臺服務器上,而接收到請求的服務器獨立地迴應客戶的請求。 均衡負載可以平均分配客戶請求到服務器列陣,籍此提供快速獲取重要數據,解決大量併發訪問服務問題。html

  Tomcat 很受廣大程序員的喜歡,由於它運行時佔用的系統資源小,擴展性好,支持負載平衡與郵件服務等開發應用系統經常使用的功能;java

   Tomcat 是一個小型的輕量級應用服務器,在中小型系統和併發訪問用戶不是不少的場合下被廣泛使用,是開發和調試JSP 程序的首選。對於一個初學者來講,能夠這樣認爲,當在一臺機器上配置好Apache 服務器,可利用它響應對HTML 頁面的訪問請求。實際上Tomcat 部分是Apache 服務器的擴展,但它是獨立運行的,因此當你運行tomcat 時,它實際上做爲一個與Apache 獨立的進程單獨運行的。node

<T1>   <T2> linux

.   \        /  .                 nginx

.       X     . 程序員

.   /        \  .web

<M1> <M2>數據庫

Tomcat-1 (T1) 將 session 存儲在 memcached-2 (T2)上。只有當 M2 不可用時,T1 纔將 session 存儲在 memcached-1 上(M1 是 T1 failoverNode)。使用這種配置的好處是,當 T1 和 M1 同時崩潰時也不會丟失 session 會話,避免單點故障。

  Memcached 是一個高性能的分佈式內存對象緩存系統,用於動態Web應用以減輕數據庫負載。它經過在內存中緩存數據和對象來減小讀取數據庫的次數,從而提供動態、數據庫驅動網站的速度。Memcached基於一個存儲鍵/值對的hashmap。

  實驗一:

  如下步驟在 ip:20 與 ip:80 上實施:

  tomcat 安裝

  sh jdk-6u26-linux-x64.bin

  mv jdk1.6.0_26/ /usr/local/jdk

  vi /etc/profile

  export JAVA_HOME=/usr/local/jdk

  export CLASSPATH=:$JAVA_HOME/lib

  export PATH=$PATH:$JAVA_HOME/bin

  source /etc/profile

  安裝tomcat

  tar zxf apache-tomcat-7.0.8.tar.gz -C /usr/local

  mv /usr/local/apache-tomcat-7.0.8 /usr/local/tomcat

  兩臺機子都得要安裝java和tomcat。可是要做爲nginx服務器的那個必需要安裝nginx,而另外一臺不須要。假設nginx安裝在:ip:20上。ip:80沒有安裝。

  在安裝了nginx 的機子上

  IP:192.18.0.20

  IP :192.168.0.80

  此時若是隻有一臺機子承擔負重,那麼

  (1)首先你須要添加用戶 useradd www

      (2)你須要編輯文件: vi /usr/local/nginx/conf/nginx.conf

  user www www;

  worker_processes 4;

  error_log logs/error.log;

  events {

  use epoll;

  worker_connections 1024;

  }

  http {

  include mime.types;

  default_type application/octet-stream;

  sendfil  on;

  tcp_nopush on;

  keepalive_timeout 65;

  gzip on;

  server {

  listen 80;

  server_name localhost;

  location / {

  root html;

  index index.html index.htm;

  }

  error_page 500 502 503 504 /50x.html;

  location = /50x.html {

  root html;

  }

  location ~ \.php$ {

  root html;

  fastcgi_pass 127.0.0.1:9000;

  fastcgi_index index.php;

  include fastcgi.conf;

  }

  location /status {

  stub_status on;

  access_log off;

  }

  location ~\.jsp$

  {

  proxy_pass http://192.168.0.20:8080; //全部的jsp頁面交給tomcat處理,動靜分離,這樣你訪問的時候就不用親自去輸入8080端口了,由於nginx是訪問的靜態的,tomcat訪問的是動態的。

  }

  }

  }

  (3)配置完成後,

  nginx -t (查看語句是否正確)

  nginx -s reload (啓動nginx)

        啓動tomcat服務

  /usr/local/tomcat/bin/startup.sh(開啓服務shutdown是關閉服務)

  你能夠測試啦:

  測試頁面是vi /usr/local/tomcat/webapps/ROOT/test.jsp

  The time on desktop 20 is:<%= new java.util.Date() %>

  http://192.168.0.20/test.jsp

  不斷刷新會出現變化的時間,假若你把tomcat關閉了,那麼你 http://192.168.0.20則默認訪問的是nginx 的訪問頁面,要是你將nginx關閉了,httpd是開着的話,那麼你默認訪問的是/var/www/html下的訪問頁面。

  實驗二:

  (1)爲了實現負載均衡,你須要用兩臺服務器作實驗,

  此時你在兩臺主機上配置了java和tomcat。

  (2) 編輯文件: vi /usr/local/nginx/conf/nginx.conf

  location ~\.jsp$

  {

  proxy_pass http://tomcat;

  }//(此處應該在上面,在location的位置。不然報錯的)

  upstream tomcat

  {

  server 192.168.0.20:8080;

  server 192.168.0.80:8080;

  }

  此時,進行測試:注意兩個主機上的文件應該是一致的。都得有test.jsp

  訪問網頁進行測試: http://192.168.0.20/test.jsp

  此時你刷新,會有不斷的兩個服務器建進行切換,當一臺主機的tomcat關閉的時候,只會留在一臺機子上

  實驗三:

   當一個客戶端訪問多個同一個網址時,怎麼樣避免一個客戶訪問一個網站的時候只在一個服務器上進行,不進行切換,節省資源。也就是說就像淘寶一天訪問量數 億的,一個客戶可能要訪問好多頁面,如何我這一個客戶訪問的只是一臺服務器,再也不進行服務器間的切換,避免資源浪費。此時你須要設置以下:

  首先你須要從新編譯源碼:nginx 由於以前編譯的時候你沒有加載sticky模塊。

  注: nginx-sticky-module 爲 nginx 的第三方模塊,使 nginx 支持 sticky 模式,所謂sticky 模式就是指同一個用戶的訪問請求都被髮送到同一個 tomcat 實例上處理。

  (1)

  cd ~

  下載nginx-sticky-module-1.0.tar.gz

  tar zxf nginx-sticky-module-1.0.tar.gz

  cd nginx-1.0.6

  make clean從新編譯

   ./configure --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --with-http_ssl_module -add-module=/root/nginx-sticky-module-1.0/

  make && make install

  (2)編輯文件: vi /usr/local/nginx/conf/nginx.conf

  location ~\.jsp$

  {

  proxy_pass http://tomcat;

  }//(此處應該在上面,在location的位置。不然報錯的)

  upstream tomcat

  { sticky;

  server 192.168.0.20:8080;

  server 192.168.0.80:8080;

  }

  (3)

  測試: nginx -t

  nginx

  訪問網頁進行測試: http://192.168.0.20/test.jsp

  假設此時兩臺主機的tomcat都是開着的。那麼訪問無論你如何刷新都會自定位在一臺服務器上,假設定位到ip:20時,你關掉20上的tomcat,此時會自動切換到80上面去的。

  實驗四:假設你在訪問一臺服務器時,忽然一臺服務器崩潰了,客戶可不會理解你。你丟了別人的數據後果很嚴重的,因此,假設你在一臺服務器上訪問的數據,忽然崩了另外一臺應該接管着

  步驟一:在IP :20上作

  cd /usr/local/tomcat/lib

  mget *

  yum install memcached

  /etc/init.d/memcached start

  在IP:80上也應改那麼作

  cd /usr/local/tomcat/lib

  mget *

  yum install memcached

  /etc/init.d/memcached start

  netstat -antlp | grep :11211(memcache的端口)

  (2) 在ip:20

  vi /usr/local/tomcat/conf/context.xml

  vi /usr/local/tomcat/conf/context.xml

  <Context>

  ……

  <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"

  memcachedNodes="n1:192.168.0.20:11211,n2:192.168.0.80:11211"

  failoverNodes="n1"

  #在 node2 上此項設置爲「n2」

  requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"

  transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"

  />

  </Context>

  在ip:80

  vi /usr/local/tomcat/conf/context.xml

  vi /usr/local/tomcat/conf/context.xml

  <Context>

  ……

  <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"

  memcachedNodes="n1:192.168.0.20:11211,n2:192.168.0.80:11211"

  failoverNodes="n2"

  requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"

  transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"

  />

  </Context>

  分別在兩臺機子上啓動tomcat

  /usr/local/tomcat/bin/startup.sh

  啓動 tomcat

  (/usr/local/tomcat/bin/shutdown.sh 關閉 tomcat)

  (3)在兩臺主機上均要編輯文件:

  /usr/local/tomcat/webapps/ROOT/test.jsp

  <%@ page contentType="text/html; charset=GBK" %>

  <%@ page import="java.util.*" %>

  <html><head><title>Cluster App Test</title></head>

  <body>

  Server Info:

  <%

  out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>

  <%

  out.println("<br> ID " + session.getId()+"<br>");

  String dataName = request.getParameter("dataName");

  if (dataName != null && dataName.length() > 0) {

  String dataValue = request.getParameter("dataValue");

  session.setAttribute(dataName, dataValue);

  }

  out.print("<b>Session list</b>");

  Enumeration e = session.getAttributeNames();

  while (e.hasMoreElements()) {

  String name = (String)e.nextElement();

  String value = session.getAttribute(name).toString();

  out.println( name + " = " + value+"<br>");

  System.out.println( name + " = " + value);

  }

  %>

  <form action="test.jsp" method="POST">

  name:<input type=text size=20 name="dataName">

  <br>

  key:<input type=text size=20 name="dataValue">

  <br>

  <input type=submit>

  </form>

  </body>

  </html>

  測試:訪問http://192.168.0.20(裝有nginx的主機,nginx也能夠安裝在另外一臺主機上)/test.jsp,不一樣的主機訪問時會調度到不一樣的 tomcat 實例上處理 來自同一主機的請求會交給同一個 tomcat 實例處理,此時你 down 掉當前正在響應的 tomcat 實 例,nginx 會自動把用戶的請求調度到另外一個 tomcat 實例上,同時 session 也沒有丟掉。 

                                                                                                                                                                                                                                                                                               ——leeypp@gmail.com  

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息