运维|Nginx+Tomcat+Memcached实现负载均衡及Session共享

一、环境介绍

我这里使用了两台Linux服务器,一台安装Nginx、Memcached、Tomcat服务器1,另一台服务器安装Tomcat服务器2。

二、Nginx+Tomcat实现负载均衡

1、安装nginx及tomcat,如果两个Tomcat在同一个服务器时需要修改这两个Tomcat的启动端口为不一样。

2、nginx负载均衡配置,只需要配置nginx.conf配置文件即可。

nginx.conf配置

1)当用户请求vrlisty.com或www.vrlisty.com(1)时,则交由名称为netitcast的Nginx集群来处理(2)。

2)找到对应的服务器集群名称,最终的请求会被转发到集群的服务器列表进行处理。

3、关于nginx负载均衡的策略,有以下几种方式:

1)ip_hash

根据客户端地址,同一个ip地址分配给同一台后端服务器处理,这样可以解决session的问题。但是如果该后端服务器宕掉,则session会失效。

缺点:局域网内的用户使用的是同一个公网IP,这对于ip_hash来说,会被认为是同一个客户端,因此总是会将这个公网ip的请求交给同一个后端服务器来处理,因此起不到负载均衡的作用。

2)轮询

每一个请求,按照时间顺序,逐一分配给后端不同的服务器。

缺点:需要对后端服务器做session共享。

3)权重

每个请求,根据后端服务器的权重值来转发。权重越大,表明该服务器处理能力相对越高。主要用于后端服务器性能不同的情况。上面的配置使用的就是权重。

三、Memcached+Tomcat实现session共享

1、使用Memcached缓存来存储session信息,后端服务器都可以从该缓存中读写session。

2、Tomcat配置文件主要是conf文件里的context.xml文件,还有/lib的jar包。

Context文件是配合memcached进行session同步,在之间添加配置就可以。如果只部署一台memcached那memcachedNodes只要写一个。如果你安装了多台memcached,那么需要把安装多台memca的地址都写上,用空格分开即可。

memcachedNodes="n1:IP地址:端口"  #这个ip是安装memca的服务器的ip sticky="false" sessionBackupAsync="false" lockingMode="auto" requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"/>

添加tomcat8的jar包。

memcached-session-manager依赖于memcached-session-manager-${version}.jar,如果使用的是tomcat8,则还需要下载memcached-session-manager-tc8-2.1.1.jar,并且它还依赖memcached-${version}.jar进行memcacher的访问。在启动Tomcat之前,需要将这些jar放在$CATALINA_HOME/lib/目录下。如果使用第三方序列化方法,如Kryo,还需要在Web工程中引入相关的第三方库,Kryo序列化所依赖的库,包括kryo-${version}.jar、kryo-serializers-${version}.jar和msm-kryo-serializer-${version}.jar。

asm-3.2.jar kryo-1.04.jar kryo-serializers-0.11.jar memcached-session-manager-2.1.1.jar memcached-session-manager-tc8-2.1.1.jar minlog-1.2.jar msm-kryo-serializer-2.1.1.jar reflectasm-1.01.jar spymemcached-2.7.3.jar

3、共享的实体需要序列化(Serializable)。

序列化是指将对象以字符串形式在网络上传输、存储、读取的过程。比如我们在加上负载均衡之后要使得用户登录信息实现session共享,那么该用户信息一定要序列号。切记!!

public class AuthorInfoSession implements Serializable{...}

四、启动

1)启动Memcached

#cd /usr/local/bin //进入到该目录 # ./memcached -d -m 900 -u root -l 192.168.100.186 -p 11211 -c 256 -P /tmp/memcached.pid 

启动参数说明:

-d   选项是启动一个守护进程, -m  是分配给Memcache使用的内存数量,单位是MB,默认64MB -M  return error on memory exhausted (rather than removing items) -u  是运行Memcache的用户,如果当前为root 的话,需要使用此参数指定用户。 -l   是监听的服务器IP地址,默认为所有网卡。 -p  是设置Memcache的TCP监听的端口,最好是1024以上的端口 -c  选项是最大运行的并发连接数,默认是1024 -P  是设置保存Memcache的pid文件 -f  chunk size growth factor (default: 1.25) -I   Override the size of each slab page. Adjusts max item size(1.4.2版本新增)

也可以启动多个守护进程,但是端口不能重复。

停止Memcache进程:

kill 'cat /tmp/memcached.pid'

2)启动Nginx

nginx -c /etc/nginx/nginx.conf

3)启动Tomcat1和Tomcat2

到此,我们利用Nginx已经实现了负载均衡的Tomcat集群。我们不断的刷新,发现访问Tomcat2的概率大概是Tomcat1的2倍,这是因为我们在Nginx中配置的两台Tomcat的权重起的作用。

五、常见问题(持续添加)

1、各自的tomcat在各自的memcached上寻找各自sessionid值,而且总变。

可能是你安装了多个memcached,并且没有在memcachedNodes把多个安装memca的服务器id配置上。

也有可能是你的lib包有问题,不过lib包有问题tomcat会报错,这样也会导致session同步会失败,你可以看看你的tomcat有没有报错。


写技术文章就是悲催,真的没多少人点赞吗

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云计算教程系列

如何在Ubuntu 18.04上安装Apache Tomcat 9

Apache Tomcat是一个Web服务器和servlet容器,用于为Java应用程序提供服务。Tomcat是Apache Software Foundati...

81030
来自专栏CaiRui

memcached服务

介绍 它是一套数据缓存系统或软件 用于动态应用系统中缓存数据库的数据,减少数据库的访问压力,达到提升性能的效果,实际应用环境中多用于数据库的cache的应用。它...

40680
来自专栏hbbliyong

centos 安装sbt

1.yum install sbt 2.如果不行,则 curl https://bintray.com/sbt/rpm/rpm > bintray-sbt-rp...

60570
来自专栏云计算教程系列

如何在Ubuntu 18.04上安装Redis

Redis是一个内存中的键值存储器,以其灵活性,性能和广泛的语言支持而闻名。它通常用作数据库,缓存和消息代理,并支持各种数据结构。

59520
来自专栏云计算教程系列

如何使用Apache驱动Django

Django是一个功能强大的Web框架,可以帮助您快速启动Python应用程序或网站。Django包含一个简化的开发服务器,用于在本地测试您的代码。但是其也需要...

35350
来自专栏安全运维

Windows MySQL服务配置、重置密码

20000
来自专栏乐享123

Tcpdump Commands

17050
来自专栏月牙寂

用fpm来做rpm打包

第一时间获取文章,可以关注本人公众号 月牙寂道长 yueyajidaozhang

33280
来自专栏喵了个咪的博客空间

[喵咪BELK实战(2)] elasticsearch+kibana搭建

[喵咪BELK实战(2)] elasticsearch+kibana搭建 ? 前言 上一节我们介绍了日志系统和BELK之后就要到激动人心的安装环境了,实践出真知...

37870
来自专栏FreeBuf

如何阻止微软强制更新你的操作系统

不管Windows 7和Windows 8.1操作系统用户是否想要保留原来的操作系统,微软已经开始帮助Windows 7和Windows 8.1用户更新到Win...

20890

扫码关注云+社区

领取腾讯云代金券