服务器集群结构
整个架构的核心思想就是每个功能节点都不是单一节点,都存在一个备份节点,当主节点挂掉,备份节点可继续使用,以保证系统的整体可用性。
通过Keepalived使一个虚拟IP 192.168.1.160同时指向两个机器,任何一个机器挂掉,都不影响使用该ip继续访问另外一台机器的Nginx。
每个Nginx负载两个tomcat,每个tomcat使用两个memcached。
环境:
所有环境使用vmware虚拟机测试
ubuntu:12.04
jdk:1.8
tomcat:apache-tomcat-7.0.68(tomcat版本不能超过7.0.68,memcached插件暂不支持更高版本的tomcat)
nginx:nginx-1.9.9
memcached:1.4.31
keepalived:1.2.23
先安装一个虚拟机做为虚拟机1(IP:192.168.1.107),在虚拟机1上安装全部所需软件后,由虚拟机1复制出虚拟机2(IP:192.168.1.108)。
以下配置都是最简配置,仅验证架构的可行性,没有考虑性能优化。
安装memcached
先装memcached依赖 lievent官网:http://libevent.org/
tar zxvf libevent-2.0.22-stable.tar.gz
cd libevent-2.0.22-stable/
sudo ./configure –prefix=/usr/local
sudo make
sudo make install
编译安装memcached服务官网:http://memcached.org/downloads
tar zxvf memcached-1.4.31.tar.gz
cd memcached-1.4.31/
sudo ./configure–prefix=/usr/local/memcached –with-libevent=/usr/local
sudo make
sudo make install
启动
sudo /usr/local/memcached/bin/memcached -d-m 64 -u root -p 11111
测试,在其他机器上执行如下
telnet 192.168.1.107 11111
连接成功,表示安装没问题
安装jdk:
下载地址:
http://www.Oracle.com/technetwork/Java/javase/downloads/index.html
安装
sudo tar zxvf jdk-8u101-Linux-x64.tar.gz
安装成功后,修改环境变量
sudo nano /etc/profile
在文件的最后添加如下信息:
#这里是你安装的JDK所在的位置
export JAVA_HOME=/home/test/server/jdk1.8.0_101
export PATH= JAVAHOME/bin: PATH
exportCLASSPATH=.: JAVAHOME/lib/dt.jar: JAVA_HOME/lib/tools.jar
使配置生效
source /etc/profile
测试
java -version
输出如下表示jdk安装正确
Java version “1.8.0_101”
Java(TM) SE Runtime Environment (build1.8.0_101-b13)
Java HotSpot(TM) 64-Bit Server VM (build25.101-b13, mixed mode)
安装tomcat
下载地址:
http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.68/bin/
安装
sudo tar zxvf apache-tomcat-7.0.68.tar.gz
修改apache-tomcat-7.0.68/bin/ catalina.sh
sudo nano catalina.sh
在注释结束后的第一行添加下面内容
JAVA_HOME=/home/test/server/jdk1.8.0_101
#下面一行在手动启动tomcat时不添加也没问题
#但在开机自启时如果没有这一行,日志有中文乱码的问题
JAVA_OPTS=”-Dfile.encoding=UTF-8-Duser.country=CN -Duser.language=zh”
启动tomcat
sudo ./startup.sh
浏览器中测试:http://192.168.1.107:8080
显示正常的tomcat首页则tomcat启动正常
Session测试
此处测试不使用memcached时的session情况
测试jsp页面代码如下:
- <%
- String sessionId = session.getId();
- System.out.println(”每个Tomcat日志输出相同的sessionId,sessionId =” + sessionId);
- String userName = (String)session.getAttribute(”name”);
- if (userName == null ||userName.equals(“”)) {
- session.setAttribute(”name”,sessionId);
- } else {
- out.println(”name=”+ userName);
- }
- %>
<%
String sessionId = session.getId();
System.out.println("每个Tomcat日志输出相同的sessionId,sessionId =" + sessionId);
String userName = (String)session.getAttribute("name");
if (userName == null ||userName.equals("")) {
session.setAttribute("name",sessionId);
} else {
out.println("name="+ userName);
}
%>
测试地址:http://192.168.1.107:8080/sessiontest/sessiontest.jsp
查看tomcat日志输出:
配置tomcat使用memcached保存session
下载需要的jar包放到tomcat/lib目录,jar包版本需保持一致,相关jar包已打包。
下载地址:http://download.csdn.net/detail/patch/9621603
asm-5.0.4.jar
kryo-3.0.3.jar
kryo-serializers-0.34.jar
memcached-session-manager-1.9.2.jar
memcached-session-manager-tc7-1.9.2.jar
minlog-1.3.0.jar
msm-kryo-serializer-1.9.2.jar
objenesis-1.2.jar
reflectasm-1.11.1.jar
spymemcached-2.10.3.jar
修改tomcat/conf/context.xml文件,增加如下内容:
<ManagerclassName=”de.javakaffee.web.msm.MemcachedBackupSessionManager”
memcachedNodes=”n1:192.168.1.107:11111 n2:192.168.1.108:11111”
sticky=”false”
sessionBackupAsync=”false”
requestUriIgnorePattern=”.*\.(ico|png|gif|jpg|css|js)$”
transcoderFactoryClass=”de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory”
/>
此时每次访问可能都会报一个找不到n2的异常,这是因为暂时只有一台测试机器,两台机器都配置完成后就不会出现该问题。
重启tomcat,通过浏览器访问测试页面
测试地址:http://192.168.1.107:8080/sessiontest/sessiontest.jsp
查看tomcat日志输出:
安装nginx
下载地址:
http://nginx.org/download/
安装
sudo tar zxvf nginx-1.9.9.tar.gz
cd nginx-1.9.9/
sudo ./configure –without-http_rewrite_module–without-http_gzip_module
sudo make
sudo make install
安装成功之后,nginx放置在/usr/local/nginx目录下,主要的配置文件为conf目录下的nginx.conf,
nginx的启动文件在sbin目录下的nginx文件。
启动Nginx
sudo /usr/local/nginx/sbin/nginx
测试:http://192.168.1.107/,显示nginx界面则表示安装成功
修改nginx配置文件,添加如下内容,修改位置见下图
重启nginx
sudo ./nginx -s reload
测试:http://192.168.1.107/sessiontest/sessiontest.jsp
安装keepalived
虚拟IP准备
sudoifconfig eth0:0 192.168.1.160 netmask 255.255.255.0
通过以上方式修改的虚拟ip在机器重启后会丢失,可通过修改/etc/network/interfaces文件进行设置,修改后内容如下:
auto lo
iface loinet loopback
auto eth0
iface eth0inet dhcp
auto eth0:0
ifaceeth0:0 inet static
address192.168.1.160
netmask255.255.255.0
修改后重新启动网络:
sudo/etc/init.d/networking restart
更新依赖包
sudoapt-get install openssl
sudoapt-get install libssl-dev
安装keepalived
下载地址:http://keepalived.org/
tar -zxvf keepalived-1.2.23.tar.gz
cd keepalived-1.2.23/
sudo ./configure–prefix=/usr/local/keepalived
sudo make && sudo make install
新建文件/etc/keepalived/keepalived.conf,内容如下:
- vrrp_script chk_nginx {
- script ”/etc/keepalived/check_nginx.sh”
- interval 2
- weight 2
- }
- global_defs {
- notification_email {
- }
- }
- vrrp_instance VI_1 {
- state MASTER
- interface eth0
- virtual_router_id 52
- mcast_src_ip 192.168.1.107
- priority 20
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 123456
- }
- track_script {
- chk_nginx
- }
- virtual_ipaddress {
- 192.168.1.160
- }
- }
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
weight 2
}
global_defs {
notification_email {
}
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 52
mcast_src_ip 192.168.1.107
priority 20
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
track_script {
chk_nginx
}
virtual_ipaddress {
192.168.1.160
}
}
新建文件/etc/keepalived/check_nginx.sh,内容如下:
#!/bin/bash
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall -TERM keepalived
fi
因为是脚本文件,修改文件属性,使文件具有可执行属性
sudo chmod +x/etc/keepalived/check_nginx.sh
启动keepalived
sudo /usr/local/keepalived/sbin/keepalived
测试
停掉nginx看三个keepalived进程是否还存在
sudo killall -TERM nginx
可以看到三个keepalived进程也自动停止。
通过浏览器访问测试页面
测试地址:http://192.168.1.160/sessiontest/sessiontest.jsp
设置所有安装软件开机自动启动
sudo nano /etc/rc.local
修改后内容如下:
sudo /usr/local/memcached/bin/memcached -d-m 8 -u root -p 11111
sudo/home/test/server/apache-tomcat-7.0.68/bin/startup.sh
sudo /usr/local/nginx/sbin/nginx
sudo /usr/local/keepalived/sbin/keepalived
exit 0
至此,单个机器的配置完成。
复制虚拟机1文件做为虚拟机2。
修改虚拟机2上的keepalived文件,只修改三个位置
sudo nano /etc/keepalived/keepalived.conf
通过浏览器访问测试页面
测试地址:http://192.168.1.160/sessiontest/sessiontest.jsp
至此全部配置完成,关闭任何一个nginx、tomcat、memcached,都不影响正常访问