在上一个实验当中,可以实现会话保持了
当其中一个tomcat服务器坏了,由于nginx负载均衡服务器在tomcat1和tomcat2之间实现了轮询
如果用户1在tomcat1服务器上存储的数据,但是当tomcat1这个服务器挂了
客户就会去访问tomcat2的服务器,但是自己的数据在tomcat1上面
这个时候就要用到memcache这个存储节点,它属于交叉存储
tomcat1和tomcat2上面都有memcache存储(把数据缓存在内存当中)
分别为memcache1和memcache2
这两个存储节点属于存储节点
当tomcat1挂了之后,客户1就会去访问tomcat2对应的memcache
这时候会把用户放在memcache1的数据全部放到memcache2上面
如果tomcat服务器都好着,memcache不会同步数据过,一旦坏了立刻同步数据过来
这就是memcache-session交叉存储的好处
1.什么是会话保持?
会话保持是指在负载均衡器上的一种机制,可以识别客户端与服务器之间交互过程的关连性,在作负载均衡的同时还保证一系列相关连的访问请求都会分配到一台机器上。用人话来表述就是:在一次会话过程中发起的多个请求都会落到同一台机器上。
2.会话(session)与连接(connection)之间的区别
在讨论负载均衡的时候,如果我们不细加讨论的话,很容易将会话与连接混淆。
(1)连接:我们都知道TCP/IP协议中经常提到的:”三次握手,四次挥手“的问题。自然也知道客户端和服务器端是经过三次握手以后,建立了连接(connection)。当它们建立了连接以后,那么客户端就可以向服务端发送多次的请求。如果客户端和服务器端需要断开连接,那么就需要经过四次的挥手过程才能够断开连接。
(2)会话:如果用户需要登录,那么可以理解为经过三次握手以后,客户端与服务器端建立的就是会话(session)。如果用户不需要登录,那么可以理解为经过三次握手以后,客户端与服务器端建立的就是连接(connection)。
连接(会话)删除:一般来说,所有的厂商都会对负载均衡服务器的最大并发连接数有限制。每一个连接都是有时间限制的。如果在规定的时间内某个连接不再有请求,那么这个连接就会被清除掉。删除了连接以后,客户端的请求将无法继续发往同一个后端的服务器,这时候就需要遵循负载均衡器的流量分发策略。换句话说,所谓的会话保持机制,就是将客户端与服务器之间建立的多个连接,都发送到相同的服务器进行处理。如果在客户端和服务器之间部署了负载均衡设备,那么可能出现的一种情况就是这多个连接可能会被转发到不同的服务器进行处理。
3.什么是session?
Session 是另一种记录客户状态的机制,不同的是 Cookie 保存在客户端浏览器中,而 Session 保存在服务器上
客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,这就是 Session
客户端浏览器再次访问时只需要从该 Session 中查找该客户的状态就可以了
session共享原理及实现共享
http协议是无状态的,即你连续访问某个网页100次和访问1次对服务器来说是没有区别对待的,因为它记不住你
session被用于表示一个持续的连接状态,在网站访问中一般指代客户端浏览器的进程从开启到结束的过程。
session其实就是网站分析的访问(visits)度量,表示一个访问的过程。
session的常见实现形式是会话cookie(session cookie),即未设置过期时间的cookie,这个cookie的默认生命周期为浏览器会话期间
只要关闭浏览器窗口,cookie就消失了。实现机制是当用户发起一个请求的时候,服务器会检查该请求中是否包含sessionid
如果未包含,则系统会创造一个名为JSESSIONID的输出 cookie返回给浏览器(只放入内存,并不存在硬盘中)
并将其以HashTable的形式写到服务器的内存里面;当已经包含sessionid是,服务端会检查找到与该session相匹配的信息
如果存在则直接使用该sessionid,若不存在则重新生成新的 session。
这里需要注意的是session始终是有服务端创建的,并非浏览器自己生成的。
但是浏览器的cookie被禁止后session就需要用get方法的URL重写的机制或使用POST方法提交隐藏表单的形式来实现。
session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。
4.具体实现过程如下
- (1)查看server1和server2的tomcat服务是否开启,8080端口
- (2)在server2上面:
yum install memcached -y 安装缓存的服务
- (3)server1上面:
查看tomcat下当前的jar包
cd /usr/local/tomcat/bin
- (4)从真机上面拷贝memcache-session到server1和server2这两个tomcat服务器上面
- (5)在server1上面
将拷贝过来的jar目录下面所有jar包移到当前目录
删除多余的包
- (6)在server2上面:
cd /usr/local/tomcat/lib
- (7)在server1上面:
cd /usr/local/tomcat/
ls
cd conf/
ls
vim server.xml编辑tomcat的配置文件,解释了三个端口
vim content.xml
cd ..
cd webapps/
cd ROOT/
ls
cd WEB-INF/
vim web.xml
vim content.xml
加入实现session共享的内容
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.25.0.1:11211,n2:172.25.0.2:11211"
failoverNodes="n1"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
- (8)在server2上面:
vim content.xml
加入
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.25.0.1:11211,n2:172.25.0.2:11211"
failoverNodes="n1"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
- (9)在server1上面;
netstat -antlupe
cd /usr/local/tomcat/bin/
./startup.sh开启tomcat服务
- (10)在server2上面:
/etc/init.d/memcached status
/etc/init.d/memcached start开启memcache服务
cd /usr/local/tomcat/bin/
./shutdown.sh
./startup.sh开启tomcat服务
netstat -antlupe
- (11)测试:看有没有实现数据共享(通过memcache)
在浏览器里面输入172.25.12.1/test.jsp,注册信息这个属于动态处理
开始注册信息(多注册几个),一直是tomcat1服务器接受请求
然后关闭server2的tomcat服务
输入172.25.12.1/test.jsp
开始注册信息(多注册几个),发现同一个用户注册所有的数据会同步过来
如果两个都好着,不会同步,一旦一个宕机,数据会利马同步到另外一个上面
在server1上面:
如果两个tomcat都好着,数据只会存入好着的存储当中,不会同步到另外一个