1、概述
之前是没有接触过分布式、集群等等的,对此只有一些概念性的东西。在收集资料的时候看到别人写了很多洋洋洒洒的文章,各种缓存,以及分布式服务器、各种分表、各种分库(Oracle集群)、各种分布式tomcat。所以本文主要是分享一下自己在实际做的过程中的一些心得,欢迎拍砖。(算不算无知者无畏呢?)
2、概念
2.1、首先对分布式和集群做区别
分布式:注重的是解决问题的方式,多于思维模式。
集 群:注重的是解决问题的表现形式,多于物理形态。
摘自网络上一哥们的说法:
我个人理解:集群强调的是任务的同一性,分布式强调的是差异性。例如同样是负责文件传输的服务器,对终端用户而言它只知道文件传到服务器上了,不在乎后台是几台服务器,分布在那些机房。对于后台管理人员而言,同样是文件上传我可以在上海放置服务器处理上海地区的请求,北京放置服务器处理北京的请求,最终实现全部地区用户可上传文件的任务,所以从这个角度来看是分布式的。另一方面,上海的服务器可能有多台,同时处理上海来的请求,只是前端做了负载均衡,其内部运行逻辑什么的完全是另外一台的clone,有一台挂掉了对整体业务无影响,所以从这个角度看是集群。如果北京的服务器全挂了,那么北京的用户就没得玩了,从分布式的角度看对此是无能为力的,如果在此情况下我将北京的请求转到上海,实现城市间的集群概念,那么就可handle 这个问题了。不过目前好像集群的概念用的比较范了,你对用户说他的文件上传到了服务器集群也是ok的,至于内部是怎么个架构怎么个分布都无所谓了。
简单了说:
比如一套程序PROJECT有:ADD 、DEL、UPD、SELECT 四个不同的业务逻辑操作
分布式:找四台服务器a、b、c、d 。 a服务器上部署add业务,b服务器上部署DEL业务,c服务器上部署UPD业务,d服务器上部署SELECT业务,有这四台服务器共同完成这项业务逻辑。
分布式的每一个节点,都完成不同的业务,一个节点垮了,哪这个业务就不可访问了。
集 群:找四台服务器a、b、c、d。分别在四台服务器上部署PROJECT项目,接着再找一个服务器e、负责分发请求给a、b、c、d
如果一个服务器失败了,另一个服务器会接管失败的服务实体。集群提供的从一个出错的服务器恢复到另一个服务实体的功能增强了应用的可用性
分布式+集群(分布式集群):找四台服务器a、b、c、d、e、f、g、h、i服务器。
a - ADD
b - ADD
c - DEL
d - DEL
e - UPD
f - UPD
g - SELECT
H - SELECT
I - 作为分发请求给分布式集群
作为服务器和分布式的杂交体,拥有两个共同的有点,如果同一逻辑中的两台服务器中的一台出现问题,照样可以运行。
2.2、在搜集资料的过程中,看到大多数网站主要对一下四点做优化:(欢迎补充)
a.针对缓存
做大批量的缓存,以及缓存服务器(还有很多缓存服务器集群,也有很多share)
b.针对数据库
做分表分库,分表就是分数据,分库就是数据库集群(分表难道就是分布式,分库难道就是集群)
c.针对分解业务
将程序按照业务模块的不同做分布式处理。(莫非ejb的重量级就提现在这里。。。是否可以改成多量级好理解呢?)
d.针对WebServer
web server的集群处理
这四种或者单独或者组合起来做网站优化,分流等等操作。。。当然最终目的就是增加并发,加快处理速度,从而减轻服务器压力。
但是很多集群总体来说是比单机性能强,但是1+1未必等于2,1+1+1 未必都大于2
因为本人能力有限,以后再慢慢补全
--------------------------------》主要是针对集群来说《------------------------------------
2.3、集群核心
不管集群还是分布式,他们的主要表现形式就是用多台电脑来协作完成一项任务。那么怎么来保证协同工作呢? 接受任务的一个服务器怎么知道,在上一个服务器中工作的完成情况的? 所以就要有一个贯穿全局的一个标识:session或者其他能保存会话信息的object! 对集群来说 有两种策略: 1.粘性session 当一台服务器创建session的时候广播给每台服务器,每台服务器都会复制一次 2.非粘性session 当一台服务器创建session的时候只在当前服务器中生成session,其他服务器不会有 第一种负载均衡(分发请求)的时候,当集群中有一台服务器宕机,这个链接会自动请求另一台服务器来完成用户请求,因为这台服务器里面有和宕机服务器里相同的session,所以操作可以继续执行。 第二种,当及集群中有一台服务器宕机,那么之前在这个服务器上的用户会通过分发器的转发到另一台正常工作的服务器上,但是这台服务器中没有保存宕机服务器的session。所以用户操作不能继续,需要继续登录 当然还会有很多种做法: 3.做一个sessiong管理服务器,专门存储session用 4.做一台缓存服务器,不适用session作为贯穿各个服务器的标识,而是手动为每一个用户分标识 5.将session存放到用户客户端3、关于tomcat集群的简单配置说明
我做集群使用两种方式来做session共享的 1.tomcat自带的集群配置方式 2.memcache-session-manager3.1、tomcat自带的集群配置方式
我已经上传到360云盘上,有兴趣可以下载直接可以使用的例子 http://yunpan.cn/QDLsDse9wG8T2 访问密码 28fa 下面讲一下整个儿配置过程: 1、下载得到tomcat 、apachetomcat版本为6.0以上
apache版本为2.2.8
2、修改tomcat配置文件conf/server.xml A.需要修改端口,因为实在本机上操作测试,所以 tomcat一下端口都需要修改
关闭监听端口 8005
- <Server port="8005" shutdown="SHUTDOWN"> 修改为 8005
- <Connector port="8088" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
- <Connector port="11009" protocol="AJP/1.3" redirectPort="8443" />
- <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
- <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
- channelSendOptions="8" useDirtyFlag="true">
- <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.4"
- port="45564"
- frequency="500"
- dropTime="3000"/>
- <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
- address="auto"
- tcpListenAddress="192.168.0.224"
- port="4001"
- 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>
2).去掉以下文本前的注释符(#)以便让Apache在启动时自动加载代理(proxy)模块。
- LoadModule proxy_module modules/mod_proxy.so
- LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
- LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
- LoadModule proxy_connect_module modules/mod_proxy_connect.so
- LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
- LoadModule proxy_http_module modules/mod_proxy_http.so
- ProxyRequests Off
- <proxy balancer://cluster>
- BalancerMember ajp://192.168.0.224:11009 loadfactor=1 route=tomcat1
- BalancerMember ajp://192.168.0.224:12009 loadfactor=1 route=tomcat2
- ProxySet lbmethod=bytraffic
- </proxy>
- <VirtualHost *:80>
- ServerAdmin 916473113@qq.com
- ServerName localhost
- ServerAlias localhost
- ProxyPass / balancer://cluster/ stickysession=JSESSIONID|jsessionid nofailover=On
- ProxyPassReverse / balancer://cluster/
- ErrorLog "logs/httpd-vhosts-error.log"
- CustomLog "logs/httpd-vhosts-custom.log" common
- </VirtualHost>
-------------------------------------------------------------------------------------------------- ------------------------------------分割线-------------------------------------------------------- -------------------------------------------------------------------------------------------------- 在这里还有一中apache mod_jk的方式来配置 1)在httptd.conf中添加 Include conf/mod_jk.conf 2).添加mod_jk.conf文件
- #加载mod_jk Module
- LoadModule jk_module modules/mod_jk-1.2.30-httpd-2.2.3.so
- #指定 workers.properties文件路径
- JkWorkersFile conf/workers.properties
- #指定那些请求交给tomcat处理,"controller"为在workers.propertise里指定的负载分配控制器
- #请求jsp页面后,apache服务器会把请求分配给tomcat。
- JkMount /* controller
- worker.list = controller
- #========tomcat1========
- worker.tomcat1.port=11009 #ajp13 端口号,在tomcat下server.xml配置,默认8009
- worker.tomcat1.host=localhost #tomcat的主机地址,如不为本机,请填写ip地址
- worker.tomcat1.type=ajp13
- worker.tomcat1.lbfactor = 1 #server的加权比重,值越高,分得的请求越多
- #========tomcat2========
- worker.tomcat2.port=12009 #ajp13 端口号,在tomcat下server.xml配置,默认8009
- worker.tomcat2.host=192.168.0.224 #tomcat的主机地址,如不为本机,请填写ip地址
- worker.tomcat2.type=ajp13
- worker.tomcat2.lbfactor = 1 #server的加权比重,值越高,分得的请求越多
- #========controller,负载均衡控制器========
- worker.controller.type=lb
- worker.controller.balanced_workers=tomcat1,tomcat2 #指定分担请求的tomcat
- worker.controller.sticky_session=false
- worker.controller.sticky_session_force=1
3.2、使用msm(memcached - session - manager)来做session共享
memcached-session-manager安装
360网盘上传了一份,地址:http://yunpan.cn/QDLcEpBsc35su 访问密码 82d5
或者去:http://code.google.com/p/memcached-session-manager/wiki/SetupAndConfiguration
下载后安装方法:
Ctrl+R,输入cmd,打开命令行窗口,转到D:\memcached目录下。
memcached.exe -d install
memcached.exe -d start
卸载,执行下面的命令:
memcached.exe -d stop
memcached.exe -d uninstall
默认端口号:11211
修改端口的话:这个文件memcached.cmd
注意:不同的tomcat版本(tomcat6,tomcat7)所需的包不一样,需要针对tomcat版本下载对应的包.
所需要的jar包:
我360网盘上传了一份 地址:http://yunpan.cn/QDLcvnPNAGXAt 访问密码 d848
- 1、spymemcached-2.7.3.jar
- 2、memcached-session-manager-1.3.0.jar
- 3、msm-javolution-serializer-jodatime-1.3.0.jar
- 4、msm-javolution-serializer-cglib-1.3.0.jar
- 5、memcached-2.4.2.jar
- 6、javolution-5.4.3.1.jar
1.将所有jar包放入tomcat/lib目录下
修改每台tomcat的conf目录下得context.xml文件或者server.xml文件,在其中加入如下一段代码:
在host、context标签下增加
- <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
- memcachedNodes="n1:192.168.0.224:11220,n2:192.168.0.224:12345"
- failoverNodes="n1"
- requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
- transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"/>
注:以上360网盘内容2个月有效期