这又是一篇来自2015年的文章,当时因为要解决一个项目Session共享问题,需要搭建与生产环境一样的环境进行验证。同时,根据领导要求需要将生产环境做成水平扩展集群,因此也在本环境中进行验证。
其实ubuntu的安装没有什么好说的(虽然是CLI安装,但只要按照指示一步一步安装问题不大)。另外,虚拟机使用的是VirtualBox,用了“仅主机(Host-Only)适配器”的网络模式,所以在安装过程中需要配置子网ip,其他的没有什么好说的。
因为想安装一台“干净”的机器,在这个环节一个都没选直接下一步。其实真的需要时通过apt-get获取即可。10分钟后一台ubuntu裸机就可以使用了。
为了方便操作采用root登录,先通过 sudo passwd root 来设置root对应的密码
在root账号下再试试当前网络,ping了一下百度发现ping不通,但ping本机没有问题,这是因为我使用了Host-Only的方式设定了虚拟机的网络。
既然这样先修改**/etc/network/interfaces**让其自动获取ip,然后将虚拟机切换成NAT网络,让Ubuntu连上外网下载些软件再说。
将iface eth0 inet dhcp行前方的“#”去掉,并且将下方三行给注释掉即可。接着就将虚拟机网络改成NAT模式
系统重启后再ping一下百度,可以ping通了。
吐槽:这里就能够看到当时自己的稚嫩的地方,我如果在安装之前就已经设置好虚拟机的NAT网络,这一步就不用做了。又或者在宿主机上增加一个虚拟网卡作为转发网关,那么Host-Only的网络也是可以访问外网的…这里还以为自己解决了什么难题,仔仔细细地写下来,现在感觉就很羞耻ε=(´ο`*)))唉
既然能够连接互联网,那么通过apt-get来下载所需软件吧。
通过apt-get install apahce2直接下载安装
通过apt-get install memcached下载安装memcached
为了后面方便也安装一个Unzip用来对zip文件进行解压,apt-get install unzip
Windows与Linux之间文件传输直接从网上下载了一个pscp工具通过命令行执行数据传输。将pscp.exe文件放在C:/windows/system32文件夹里面就可以在cmd里面使用了。
在Oracle官网下载1.6版本的JDK,先通过chmod修改操作权限后,再执行bin文件的安装
安装完成后在**/etc/profile**配置自己jdk的环境变量。
Tomcat解压后先配置一个来试运行项目,待运行成功后再将其复制两个出来做成三Tomcat的水平集群即可。
使用vim编辑apache2.conf文件,vim /etc/apache2/apache2.conf
将ServerRoot解封,并添加ServerName作为访问路径的前缀,最终是通过域名来访问的。
将Ubuntu中提供的端口关闭,这个我们不需要。
设置文件目录访问路径,以后测试用到的web工程都放在**/home/timss/tomcat/tomcat_webapps/ROOT/memcacheTest**文件夹里面,当然这个文件夹现在没有,稍后将会添加。
将需要使用到的mod开启,这个需要在命令行中启动
a2enmod slotmem_shm
a2enmod slotmem_plain
a2enmod lbmethod_bytraffic
a2enmod proxy
a2enmod proxy_balancer
a2enmod proxy_http
a2enmod proxy_ajp
mod启动完成后可以进去/etc/apache2/mods-enabled中确认一下看mod是否都开启了
最后在sites-available 建立配置文件timss.conf
Listen:是监听那个端口
ServerName:是网络主机的名称
ServerAlias:是网络别名,这个是以后访问的域名后缀
DocumentRoot:是访问文件目录
DirectoryIndex:配置首页
除此之外,其他的都是负载均衡相关配置。由于Apache使用的是粘性Session复制方法,按照官方的说法Apahce会将Session指定到一台机器上面进行保存,但是会存在Tomcat宕机后Session丢失的风险。而现在我们将这个Session指定到Memcached里保存基本上规避了Session丢失的风险了。此外,以后若要添加多一台服务器,直接可以在这里添加负载成员(BalancerMember)就可以,其他配置可以不用动了。
最后,还需要为Apache创建一个sites-enabled的超链接,因为Apache启动时将读取sites-enabled里面的超链接,之后再通过超链接访问sites-available中指定文件,所以这里先加一个超链接。
至此Apache已全部配置完毕。
使用vim /etc/memcached.conf对配置文件进行修改
这里只需修改最大内存数量即可。
将集群配置需要的jar包上传到指定位置
在${TOMCAT_HOME}目录下创建一个tomcat_webapps文件夹,并且在里面也创建一个ROOT文件夹
进入${TOMCAT_HOME}/tomcat7_8080/bin目录中并用./startup.sh启动tomcat,启动完成后通过本地ip访问,看是否成功
验证成功后先关掉tomcat,进入${TOMCAT_HOME}/conf目录下配置context.xml文件
由于要做Session复制所以要在Context标签中加上distributable属性,如果这里不加也可以在项目的web.xml里面加上< distributable/>标签的。接下来还要写上这个
这个是Memcached的Tomcat配置信息,而这里面又分两种配置,一个是基于kryo的序列化,而另外一个是基于javolution的序列化。经过测试两种方式都是可以执行的,但是kryo效率明显比javolution的要高,所以这里就选择用kryo的配置。
其中memcachedNodes里面配置的是memcached的ip和端口,由于memcached支持分布式部署的,所以这里可以填写多个,用逗号隔开就可以了。若部署多个的话在这里还要加多一个属性failoverNodes=“n1”,让Tomcat知道应该将缓存的内容不放在那个memcached服务器。
之后就轮到server.xml配置,先在Engine标签中添加一个jvmRoute的属性,里面指定的是Apache的节点名称。
然后将Cluster的标签解开
由于是测试用的,所以集群就用Tomcat提供的最简单的就可以了。下面找到Host标签并在里面配置alias和context
Tomcat启动的时候不直接读取自身的webapps文件夹中的内容,而是读${TOMCAT_HOME}/tomcat_webapps/ROOT里面的,这样就可以多个Tomcat读取同一份文件,也只需要发布一次即可。
Tomcat配置完之后先别急着启动,先配置一下网络别名vim /etc/hosts
添加Apache访问的域名mctest.com
上传测试用的web项目
上传后解压并测试启动
项目启动后若需要使用宿主机通过域名访问,则需要修改宿主机的hosts文件,路径为C:\windows\system32\drivers\etc\hosts
之后可以在宿主机通过域名访问试试
看到这个画面证明已经能够正常访问了,接下来就将tomcat7_8080的内容复制两份并修改端口,这时就需要修改对应服务端口来区分,譬如server.xml中shutdown的端口
容器端口
如果tomcat中需要使用ajp服务那对应的ajp端口也需要修改
除了端口需要修改外,Engine标签内容在扩展容器中可以删除
完成上述的配置后,分别启动三个Tomcat容器,通过域名访问可以看到以下页面
若将8080端口的tomcat关闭掉,再次刷新可以看到
SessionID后缀发生了改变,从原来的tm改为了ts这就证明服务已经切换到另一台tomcat容器里面了。若将三个集群节点都关闭,重新刷新页面则会发生无法访问的情况。
在无法访问的状态下重新将tomcat7_8080的容器开启,可以看到
虽然三个Tomcat节点都曾经关闭过,但由于Session已经缓存到Memcached中了因此会话还是会保留的,只要服务恢复使用用户并不需要重新登录。
Apache提供两种Session复制的方式,一种是粘性Session复制,另一种是非粘性Session复制。
粘性Session复制,是将所有的Session复制到指定的一台Tomcat服务器中,这种方式的复制效率高而且简单,但是当指定的Tomcat服务器宕机之后,所有的Session将会失去。
非粘性Session复制,采用广播的方式,将Session复制到每一台Tomcat服务器中,每一次Session发生变动都会重新序列化,并将网络中的每台Tomcat服务器的Session进行覆盖。这种方式虽然保险,但是资源浪费极大。