一、环境介绍
我这里使用了两台Linux服务器,一台安装Nginx、Memcached、Tomcat服务器1,另一台服务器安装Tomcat服务器2。
二、Nginx+Tomcat实现负载均衡
1、安装nginx及tomcat,如果两个Tomcat在同一个服务器时需要修改这两个Tomcat的启动端口为不一样。
2、nginx负载均衡配置,只需要配置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有没有报错。
写技术文章就是悲催,真的没多少人点赞吗