nginx+tomcat+redis实现session共享
Redis与Memcached的区别:
内存利用率:使用简单的key-value存储的话,Memcached的内存利用率更高,而如果Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcached。
性能对比:由于Redis只使用单核,而Memcached可以使用多核,所以平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起Memcached,还是稍有逊色。
Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用
Redis支持数据的备份,即master-slave模式的数据备份。
Redis不仅仅支持简单的key-Value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
部署准备:
Nginx192.168.1.11
Tomcat1 192.168.1.12
Tomcat2 192.168.1.13
Redis192.168.1.14
以下环境都必须要关闭防火墙和SElinux安全机制
service iptables stop
setenforce 0
1.安装部署nginx
yum -y install zlib-devel pcre-devel openssl-devel //安装依赖包
tar xf nginx-1.6.2.tar.gz
tar xf nginx-1.6.2.tar.gz
cd nginx-1.6.2
./configure && make && make install
cd
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
修改配置文件以实现对tomcat负载均衡
vim /usr/local/nginx/conf/nginx.conf
在原配置基础上添加以下红色部分:
upstream backend {
server 192.168.1.12:8080 weight=1 max_fails=1 fail_timeout=10s;
server 192.168.1.13:8080 weight=1 max_fails=1 fail_timeout=10s;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
proxy_pass http://backend;
}
保存退出,使用nginx –t 检查配置是否正确,确认无误启动nginx
nginx
Nginx部署完毕
2.安装部署tomcat1
为了避免系统的open-jdk环境与新安装jdk环境冲突,我们需要卸载open-jdk (可以不做,直接使用系统自带的JAVA环境也没有影响)
rpm -e java-1.7.0-openjdk-1.7.0.45-2.4.3.3.el6.x86_64 --nodeps
rpm -e java-1.6.0-openjdk-1.6.0.0-1.66.1.13.0.el6.x86_64 --nodeps
rpm -e java-1.7.0-openjdk-devel-1.7.0.45-2.4.3.3.el6.x86_64 --nodeps
rpm -e java-1.6.0-openjdk-devel-1.6.0.0-1.66.1.13.0.el6.x86_64 --nodeps
(1)解压jdk
tar xf jdk-7u65-linux-x64.gz
mv jdk1.7.0_65 /usr/local/java
(2)配置环境变量
vim /etc/profile.d/java.sh #添加以下内容
export JAVA_HOME=/usr/local/java #设置java的根目录
export PATH=$PATH:$JAVA_HOME/bin
(3)生效脚本
source /etc/profile.d/java.sh
安装
tar xf apache-tomcat-7.0.54.tar.gz
mv apache-tomcat-7.0.54 /usr/local/tomcat
将tomcat需要调用redis的jar包放入tomcat/lib
cp tomcat-redis-session-manage-tomcat7.jar tomcat-juli.jar commons-logging-1.1.3.jar commons-pool2-2.2.jar jedis-2.5.2.jar /usr/local/tomcat/lib
修改context.xml文件以支持调用redis
vim /usr/local/tomcat/conf/context.xml
在Context段中加入以下内容
<Context>
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="192.168.1.14" //redis的IP地址
port="6379" //redis的端口
database="0"
maxInactiveInterval="60" />
</Context>
修改server.xml文件以支持调取创建的测试页
vim /usr/local/tomcat/conf/server.xml
在126行加入以下内容:
126 <Context docBase="/web/webapp" path="" reloadable="false" >
127 </Context>
创建测试页:
mkdir -p /web/webapp
cd /web/webapp/
vim index.jsp
Session ID:<%= session.getId() %><BR>
SessionPort:<%= request.getServerPort() %>
<% out.println("This tomcat server 192.168.1.12");%>
启动tomcat
/usr/local/tomcat7/bin/startup.sh
[root@centos5 nginx]# netstat -anpt |grep 8080
tcp 0 0 :::8080 :::* LISTEN 48726/java
3.tomcat2的安装部署
与tomcat1相同,唯一区别就是为区分测试效果tomcat2的测试页面为:
mkdir -p /web/webapp
cd /web/webapp/
vim index.jsp
Session ID:<%= session.getId() %><BR>
SessionPort:<%= request.getServerPort() %>
<% out.println("This tomcat server 192.168.1.13");%>
4.安装部署redis
tar xf redis-3.2.5.tar.gz
cd redis-3.2.5
make
这里如果报错,tclsh8.5: not found 发现少了tcl 报错
解决方法:下载,安装tcl
#wget http://downloads.sourceforge.net/tcl/tcl8.5.9-src.tar.gz
#cd /tcl8.5.9-src/unix
#./configure
#make
#make install
接着make就没报错了
mkdir -p /usr/local/redis/bin
mkdir -p /usr/local/redis/etc
mkdir -p /usr/local/redis/var
cd src/
src目录下这些文件作用如下
redis-server:Redis服务器的daemon启动程序
redis-cli:Redis命令行操作工具.你也可以用telnet根据其纯文本协议来操作
redis-benchmark:Redis性能测试工具,测试Redis在你的系统及你的配置下的读写性能.
redis-stat:Redis状态检测工具,可以检测Redis当前状态参数及延迟状况
cp redis-benchmark redis-check-aof redis-cli redis-server /usr/local/redis/bin/
cp ../redis.conf /usr/local/redis/etc
vim /usr/local/redis/etc/redis.conf
修改配置文件
daemonize no 改为 daemonize yes //是否把redis-server启动在后台,默认是“否”。若改成yes,会生成一个pid文件
bind 127.0.0.1 改为 bind 0.0.0.0 //任意主机都可访问
其他的看需要修改
关闭redis:
killall -9 redis-server
启动redis:
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
查看是否启动:
netstat -anpt |grep redis
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 46390/redis-server
监控redis共享session:
redis-cli -p 6379 monitor
5.测试
在客户端访问http://192.168.1.11,刷新后会轮流出现以下页面:
测试页面IP地址发生变化,而session ID不变
可以查看redis主机监控,会出现以下页面:
至此nginx+2 tomcat+redis实现session共享成功
使用keepalived来实现redis主从高可用
接上面的实验,下面使用keepalived来实现redis主从高可用
部署准备
添加一台Redis2服务器
Nginx192.168.1.11
Tomcat1 192.168.1.12
Tomcat2 192.168.1.13
Redis1192.168.1.14
Redis2192.168.1.15
关闭防火墙和SElinux安全机制
service iptables stop
setenforce 0
部署redis
在Redis2上安装部署redis2
安装过程与redis1相同
修改redis2上的redis.conf
vim /usr/local/redis/etc/redis.conf
daemonize no 改为 daemonize yes
bind 127.0.0.1 改为 bind 0.0.0.0
slaveof 192.168.1.14 6379 //去掉此行注释,并改为redis1的ip地址和端口号
然后启动redis2
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
测试redis1与redis2数据是否能够同步
在redis1上写入数据:
[root@localhost ~]# /usr/local/redis/bin/redis-cli -h 192.168.1.14
192.168.1.14:6379> set name zhangsan
OK
192.168.1.14:6379> get name
"zhangsan"
在redis2上查看:
[root@localhost src]# /usr/local/redis/bin/redis-cli -h 192.168.1.15
192.168.1.15:6379> get name
"zhangsan"
此时两台redis服务器之间数据能够同步
安装keepalived
在redis1上安装keepalived
直接使用yum方式安装即可:
yum -y install keepalived
chkconfig keepalived --add
chkconfig keepalived on
修改配置文件:
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script redis {
script /opt/chk_redis.sh
interval 2
weight -10
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
redis
}
virtual_ipaddress {
192.168.1.10
}
}
在redis2上安装keepalived
yum -y install keepalived
chkconfig keepalived --add
chkconfig keepalived on
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script redis {
script /opt/chk_redis.sh
interval 2
weight -10
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
redis
}
virtual_ipaddress {
192.168.1.10
}
}
分别在redis1、redis2上部署redis健康检测脚本
两台redis做相同操作:
vim /opt/chk_redis.sh
#!/bin/bash
# check redis server st="/usr/local/nginx/sbin/nginx"
REDIS="/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf"
redispid=$(ps -C redis-server --no-header |wc -l)
if [ $redispid -eq 0 ];then
$REDIS
sleep 3
redispid=$(ps -C redis-server --no-header |wc -l)
if [ $redispid -eq 0 ];then
/etc/init.d/keepalived stop
echo "Keepalived stopped ,please check your redis !"|tee -a /var/log/messages
fi
fi
启动keepalived:
service keepalived start
分别修改tomcat1、tomcat2的context.xml以支持VIP
在两台tomcat上做相同操作:
vim /usr/local/tomcat/conf/context.xml
host="192.168.1.14" 改为 host="192.168.1.10"
重启tomcat服务:
/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh
测试
关闭redis1的keepalived、redis服务(注意一定要先关闭keepalived,否则redis会再次重启,影响测试效果)
/etc/init.d/keepalived stop
killall -9 redis-server
然后使用客户端访问http://192.168.1.1,出现以下页面:
至此nginx + 2tomcat + 2redis(主从)部署完毕