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

《运维|Nginx+Tomcat+Memcached实现负载均衡及Session共享》 服务最好成双成对

一、环境介绍

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

二、Nginx+Tomcat实现负载均衡

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

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

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

《运维|Nginx+Tomcat+Memcached实现负载均衡及Session共享》 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有没有报错。

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

点赞