tomcat和memcached

1、tomcat運行環境css

        tomcat是JAVA虛擬機上的運行的一個程序,因此在安裝tomcat以前須要安裝JAVA的運行環境,tomcat是用來接收並相應用戶的請求html

JVM:將全部系統上的不一樣接口所有轉換成統一的編程接口,從而實現一次編譯處處運行前端

JRE:包含一些庫文件和啓動代碼的工具環境,包含JVMjava

JDK:完整的基本環境,包含調試工具nginx

JSP:根據客戶端的不一樣,將代碼在服務器段執行並將結果返回給客戶端
git

軟件包安裝github

            yum安裝,直接根據依賴關係安裝所須要的jsp和servlet兩個所須要的組件
web

[root@centos7 ~]# yum install -y java-1.8.0-openjdk-devel

            官方下載二進制包,直接解壓便可使用,默認在/usr/java/目錄下數據庫

2、tomcat的安裝apache

            yum安裝,光盤倉庫就有,因此直接安裝便可

[root@centos7 ~]# yum install -y tomcat

            官方下載軟件包,在官方下載,須要將全部者和全部組更改成root,其中temp,work,logs,將屬主和屬組更改成tomcat,conf目錄須要有讀寫權限,目錄下的文件須要有讀權限,

3、tomcat配置說明

各個配置文件做用相關說明

            server.xml:主配置文件,主要用來設置server,connector,service,engine,host,context等相關組件的配置

            web.xml:部署描述文件,每一個應用只有在部署後才能夠被訪問,他的部署方式通常有web.xml進行定義,其存放位置爲WEB-INF目錄中

            context.xml:每一個應用都有專用的配置文件,其存放位置爲META-INF目錄下

            tomcat-user.xml:用戶認證用戶名和密碼,啓動時裝入內存,在啓動後,在使用用戶名和密碼直接從內存中查找,不會在文件中查找即只要更改用戶名就須要從新啓動服務方可生效

            catalina.policy:當前使用-security選項啓動tomcat時,用於tomcat設置安全策略

            catalina.properties:java屬性的定義文件,用於設定類加載器路徑,以及JVM調優相關參數

            logging.properties:日誌系統相關配置

server.xml配置文件各主要組件相關說明

繪圖1.jpg

server:類,服務器進程

service:connector和engine之間創建關聯的相關組件

connector:鏈接器,用來接受用戶請求,也能夠用來構建相應報文,所支持的協議有http,https,ajp(tomcat獨有協議須要搭配httpd服務實現)

engine:引擎,用來運行jsp代碼,也能夠稱之爲容器

host:虛擬主機,用來在同一個service中構建多個可被訪問的url地址

context:在同一個host中構建多個uri目錄,默認若是不更換原有的目錄,則不須要指定就能夠被訪問

<server>
  <service>
    <connector />
    <connector />
    <engine>
      <host>
        <context />
        <context />
      </host>
      <host>
      </host>
    </engine>
    </service>
</server>

JSP應用組織結構

        index.jsp:主頁

        WEB-INF:當前應用的私有資源路徑,一般存儲web.xml和context.xml配置文件

        META-INF:做用相似於WEB-INF

        classes:類文件,當前應用所提供的類,被打包成jar格式的文件

        lib:類文件,

4、tomcat基於httpd的反向代理

這裏是基於httpd2.4版本實現的反向代理

準備工做:在配置文件中指定servername須要在hosts文件中指定對應的IP地址才能夠解析,或者DNS能夠解析

步驟1

		proxy_http_module代理配置示例:
			<VirtualHost *:80>
				ServerName      www.test.com
				ProxyRequests Off  #關閉正向正向代理
				ProxyVia        On  #修改響應報文,是否添加via報文,顯示被代理的服務器主機名
				ProxyPreserveHost On  #保留客戶端響應首部主機名報文,代理者只有一個主機,被代理者有兩個主機的時候須要添加該選項
				<Proxy *>  #受權
					Require all granted
				</Proxy>
				ProxyPass / http://www.test.com:8080/ #代理後端,/必須帶,若映射直接在後面添加便可
				ProxyPa***everse / http://www.test.com:8080/ #若被重定向,是否也代理到後端
				<Location />  #受權
					Require all granted
				</Location>
			</VirtualHost>

步驟2

        在後端tomcat上配置一臺tomcat,而且添加一個host配置便可

<Host name=" appBase="/app/web"
      unpackWARs="true" autoDeploy="true">
</Host>

5、tomcat會話基於httpd的cookie的會話粘性

步驟1

Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
<proxy balancer://tcsrvs>
    BalancerMember http://192.168.1.151:8080 route=TomcatA loadfactor=1
    BalancerMember http://192.168.1.152:8080 route=TomcatB loadfactor=2
    ProxySet lbmethod=byrequests
    ProxySet stickysession=ROUTEID
</Proxy>
<VirtualHost *:80>
    ServerName www.test.com
    ProxyVia On
    ProxyRequests Off
    ProxyPreserveHost On
    <Proxy *>
        Require all granted
    </Proxy>
    ProxyPass / balancer://tcsrvs/
    ProxyPa***everse / balancer://tcsrvs/
    <Location />
        Require all granted
    </Location>
</VirtualHost>	

步驟2配置兩臺tomcat,並將默認的頁面中增長一個context,並指向應該指定的虛擬主機,不然會出現不能綁定客戶端的現象

<Host name="www.test.com" appBase="/app/web"
      unpackWARs="true" autoDeploy="true">
</Host>

6、tomcat會話集羣

繪圖1.jpg

        tomcat根據廣播的形式,將客戶端的cookie信息共享個在同一個組播域中的每一臺tomcat服務器,可是這種方法不適合於太大的網絡拓撲,廣播域越大,所佔的網絡IO和磁盤IO也就越大,而且在實現該會話集羣時,建議不要講會話粘性關閉,由於開啓會話粘性,cookie同步只會是一個方向的同步,而沒有會話粘性,則會隨機方向的同步

實現:

步驟1:在nginx反向代理服務器上設置,只要是請求.jsp文件的所有負載均衡而且代理到後端服務器上

upstream webjsp {
        server 192.168.1.151:8080;
        server 192.168.1.152:8080;
        ip_hash;
}
server {
        listen 80;
        server_name www.test.com;
        index  index.jsp index.html;
                root /web/;
        location ~* \.(jsp|do)$ {
                index index.jsp;
                proxy_pass http://.com:8080;
        }
        location / {
                root /app/ROOT/;
        }
}

步驟2:在兩臺tomcat上都須要配置的配置

server.xml配置文件中的配置

Engine 後面配置
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
                 channelSendOptions="8">

          <Manager className="org.apache.catalina.ha.session.DeltaManager"
                   expireSessionsOnShutdown="false"
                   notifyListenersOnReplication="true"/>

          <Channel className="org.apache.catalina.tribes.group.GroupChannel">
            <Membership className="org.apache.catalina.tribes.membership.McastService"
                        address="228.0.0.5"   #組播地址,多臺服務器須要一致
                        port="45564"             #監聽端口
                        frequency="500"      #多久發送一次心跳,單位毫秒
                        dropTime="3000"/>   #超時時間
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="192.168.1.152"  #本地IP地址
                      port="4000"   #端口
                      autoBind="100"   #多久自動綁定一次
                      selectorTimeout="5000"   #超時時長,單位毫秒
                      maxThreads="6"/>   #最大線程數,這裏須要根據組播域中的成員而定,由於每個成員之間都要通信,因此不能少於組播成員

            <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
              <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
            </Sender>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
          </Channel>

          <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
                 filter=""/>
          <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

          <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
                    tempDir="/tmp/war-temp/"
                    deployDir="/tmp/war-deploy/"
                    watchDir="/tmp/war-listen/"
                    watchEnabled="false"/>

          <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener" />
          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener" />
        </Cluster>

還須要添加的配置,

         1.須要在應用專用web.xml中添加<distributable />,不是在默認的web.xml

2.須要在serser.xml配置文件中Engine中添加 jvmRoute

3.須要保證集羣節點同步,

4.還能夠作會話綁定便可,目的是實現一個用戶會話始終是從一個服務器中同步其餘服務器,而不是從各個方向同步

6、memcached介紹

        web應用的數據所有都是存儲到RDBMS數據庫中,而隨着業務的增加,查詢等各項速度都會急速降低,memcached是將數據緩存到內存中,減小用戶對數據庫的訪問次數,從而減小數據庫的訪問壓力

memcached的特徵

    1.協議簡單

    2.基於libevent的事件處理

    3.內置內存存儲方式,因此意味着數據會有丟失的風險

    4.memcached不互相通信的分佈式,memcached不能相互通信,故不能進行數據同步,每一臺memcached都是獨立的存在

memcached須要依賴於前端的應用應用程序服務器,須要前端的應用程序支持

優勢:可以提升訪問速度,加速用戶訪問,通常適用於對數據不是特別要求準確和不是特別注重安全的數據

缺點:訪問數據不許確,在緩存命中率較低時,不會增長訪問速度反而會下降訪問速度,由於每次一在訪問數據庫以前都須要本身去memcached緩存服務器中查看是否有緩存。

應用程序經過添加memcached緩存工做過程

應用服務器首先去memcached緩存服務器中查看是否有緩存,如有,直接相應客戶端,若無,則應用服務器本身去數據庫中查看結果,而後在將本次查到的數據緩存到memcached緩存服務器中,在下次訪問才能夠提升速度

7、會話服務器

配置拓撲圖

image.png

須要鏈接tomcat到memcached則須要相對應的鏈接器,倉庫默認沒有,須要第三方軟件https://github.com/magro/memcached-session-manager下載相對應的版本

使用sticky sessions + kryo則下載如下所有包到 java放jar文件的目錄下

 msm-kryo-serializer, kryo-serializers-0.34+, kryo-3.x, minlog, reflectasm, asm-5.x, objenesis-2.x

在tomcat的server.xml配置文件中添加如下配置段

<Context path="" docBase="ROOT" reloadable="true">
  <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="n1:web1.lin.com:11211,n2:web2.lin.com:11211"  #指定後端的memcached服務器
    failoverNodes="n1"  #指定備用
    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"  #指定哪些數據不被緩存
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"  #轉碼工廠類
    />
</Context>

memcached服務器只須要開啓服務便可

查看緩存命令memdump --server='192.168.1.153:11211' 

相關文章
相關標籤/搜索