负载均衡session,负载均衡设备

http://www.itjxue.com  2023-01-21 17:11  来源:未知  点击次数: 

PHP实现负载均衡session共享redis缓存操作示例

本文实例讲述了PHP实现负载均衡session共享redis缓存操作。分享给大家供大家参考,具体如下:

1、首先先创建html表单页面

meta

chatset='utf-8'

center

form

action="se.php"

method="post"

table

tr

td帐号:/td

tdinput

type="text"

name="username"/td

/tr

tr

td密码:/td

tdinput

type="password"

name="pwd"/td

/tr

tr

td/td

tdinput

type="submit"

value="登录"/td

/tr

/table

/form

/center

2、创建接受表单的文件

?php

header('content-type:text/html;charset=utf-8');

set_time_limit(10);

ini_set("session.save_handler",'redis');//开启php.ini中的redis配置

ini_set("session.save_path","tcp://192.168.1.70:6379");//第一台服务器的redis

session_start();//开启session

$username

=

$_POST['username'];

$_SESSION['username']

=

$username;

echo

"scriptalert('登录成功!');location.href='from.php'/script";//登录成功后跳转到欢迎登录页面

?

3、跳转到from.php去判断第一台服务器的redis中的session是否存到了本台服务器的session中

?php

header('content-type:text/html;charset=utf-8');

set_time_limit(10);

ini_set("session.save_handler",'redis');//开启php.ini中的redis配置

ini_set("session.save_path","tcp://192.168.1.70:6379");//第一台服务器的redis

session_start();//开启session

$username

=

isset($_SESSION['username'])

?

$_SESSION['username']

:

'';//判断当前是否存在session

//$id

=

$_SESSION['PHPSESSID'];

//echo

$id;

if(empty($username)){

echo

"scriptalert('请重新登录!');location.href='index.php'/script";

}else{

echo

"欢迎".$username."登录";

}

?

这样就简单了实现了redis

session共享的功能,要测试的话需要两台服务器,建议使用linux

比较好用

linux上安装redis可参考《Linux平台安装redis及redis扩展的方法》

更多关于PHP相关内容感兴趣的读者可查看本站专题:《php缓存技术总结》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《PHP错误与异常处理方法总结》、《php面向对象程序设计入门教程》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

您可能感兴趣的文章:Nginx

安装笔记(含PHP支持、虚拟主机、反向代理负载均衡)PHP开发负载均衡指南PHP实现负载均衡下的session共用功能Thinkphp结合AJAX长轮询实现PC与APP推送详解PHP经典算法集锦【经典收藏】php

分库分表hash算法php的hash算法介绍PHP中对各种加密算法、Hash算法的速度测试对比代码PHP实现的一致性Hash算法详解【分布式算法】PHP实现负载均衡的加权轮询方法分析

iis 负载均衡 如何保存session状态

一、Inproc模式

Inproc是缺省的设置,这种模式和以前的ASP的会话状态的方法是类似的,会话的状态会被保存在ASP.NET进程中,它的优点是显而易见的:性能。进程内的数据访问自然会比夸进程的访问快。然而,这种方法Session的状态依赖于ASP.NET进程,当IIS进程崩溃或者正常重起启时,保存在进程中的状态将丢失。

二、StateServer模式

为了克服Inproc模式的缺点,ASP.NET提供了两种进程外保持会话状态的方法。

ASP.NET首先提供了提供了一个Windows服务:ASPState,这个服务启动后,ASP.NET应用程序可以将mode属性设置为 “SateServer”,来使用这个Windows服务提供的状态管理方法。

除了在web.config文件中设置mode属性为StateServer外,还必须设置运行StateServer服务器的IP地址和端口号,具体配置方法如下:

2.1 如果在IIS所在的机器运行StateServer则IP地址就是127.0.0.1,端口号通常是42424.配置如下:

mode=”StateServer”

stateConnectionString=”tcpip=127.0.0.1:42424″

2.2 找一台服务器作为Session服务器

如IP为:172.18.1.188,启动其Windows中的ASP.NET State Service(默认的端口号为42424),把启动类型改为自动;

2.3 修改Session服务器注册表中的项:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services \aspnet_state\Parameters中的AllowRemoteConnection 键的值为1,其中的Port键控制ASP.NET State Service的监听端口;修改后需要重启ASP.NET State Service才生效;

2.4 每台服务器的web.config 的stateConnectionString都指向这台服务器

使用这种模式,会话状态的存储将不依赖IIS进程的失败或者重启,会话的状态将存储在StateServer进程的内存空间中。

三、SQlServer模式

另一种会话状态模式是SQLServer模式。这种模式是将会话的状态保存在SQL Server数据库中的。使用这种模式前,必须至少有一台SQL Server服务器,并在服务器中建立需要的表和存储过程。.NET SDK提供了两个脚本来简化这个工作:InstallSqlState.sql和UnInstallSqlState.sql。这两个文件存放在下面路径中:

c:\windows\Microsoft.NET\Framework

要配置SQL Server 服务器,可以在命令行中运行SQL Server提供的命令行工具osql.exe

osql -s [server name] -u [user] -p [password]

例如:

osql -s (local) -u as -p “”-i InstallSqlState.sql

做好必要的数据库准备工作后,将web.config文件中的sessionstate元素的mode属性改为”sqlserver”,并指定 SQL连接字符串。具体如下:

mode=”SQLServer”

sqlConnectionString=”data source=127.0.0.1;userid=sa;password=;Trusted_Connection=yes”

使用SQLServer模式处了可以使Session的状态不依赖于IIS服务器之外,还可以利用SQL Server的集群,使状态存储不依赖于单个的SQL Server,这样就可以为应用程序提供极大的可靠性。

使用了DNS的负载均衡后,session怎么解决?急用,谢谢各位大侠,不使用cookies

我们可以通过DNS来实现负载均衡的功能。

Enable round robin 启用循环

为了减轻某台服务器的负载,我们可以在网络中安装多台服务器。例如,原来网络中只有一台X235 的WEB服务器,其主机名为,IP地址为192.168.1.100。为了减轻这台WEB服务器的负载,我们可以在网络中安装多台X235来提供WEB服务,并保证每台WEB服务器的内容都是一致的。如果可以实现让客户端分别访问不同的WEB服务器,这样就达到了分担负载的目的。那么如何让客户端分别向不同的WEB服务器访问呢?这就要用到DNS服务所提供的round robin功能。

我们可以按如下步骤操作:

在Windows200中打开管理工具中的DNS管理器。

在DNS管理其中,用鼠标右键点击该DNS服务器图标,在弹出的菜单中选择Property属性菜单。

在弹出的窗口中,选择Advanced选项卡。确保Enable round robin选项是处于被选中的状态。

点击OK关闭该窗口。

当设定好Round roubin后,接下来需要在DNS的区域(Zone)中添加主机记录:

打开管理工具中的DNS管理器。

用鼠标右键点击将要创建记录的区域,在弹出的菜单中选择New host新建主机记录。然后依照向导提示输入必要的信息。

主机名 IP地址

www 192.168.1.200

www 192.168.1.201

www 192.168.1.202

当输入完所有主机的主机名与IP的对应关系后,你将看到类似于下图的窗口。

在这里我们注意到,添加的三条主机记录是同一个主机名对应着不同的IP。这些不同的IP即为网络中安装的多台WEB服务器的实际IP,他们对应着同一个主机名。

这样当客户端们在浏览器的地址栏中输入:去访问WEB服务器时,就会向DNS服务器发出名称解析请求。当DNS服务器收到第一个客户端的请求时,会把第一个IP 192.168.1.200响应给客户端,当第二个客户端要求解析时,服务器把第二个IP192.168.1.201响应给客户端,以此类推。通过这样的循环分配IP地址,就可以让不同的客户器访问不同的服务器,从而达到分担服务器的负载的功能。

Enable netmask ordering 启用子网优先

如果公司的网络是由多个子网构成的,为了使用户能够更有效地访问服务器中的资源,例如WEB服务器上的资源,我们可以在每个子网中都安装一台WEB服务器,这些WEB服务器保存的数据是完全一样的并且都使用同一个主机名,例如:。那么如何让用户在其浏览器的地址栏中输入主机名时,访问的是本子网的WEB服务器,而不是其他子网的web服务器呢?我们可以通过设置Enable netmask ordering 启用子网优先来实现这一功能。

想实现Enable netmask ordering 启用子网优先,我们可以按以下步骤操作:

打开管理工具中的DNS管理器。

在DNS管理其中,用鼠标右键点击该DNS服务器图标,在弹出的菜单中选择Properties属性菜单。

在弹出的窗口中,选择Advanced选项卡。确保Enable subnet ordering选项是处于被选中的状态。

点击OK关闭该窗口。

当设定好subnet ordering后,接下来需要在区域中添加主机记录:

打开管理工具中的DNS管理器。

用鼠标右键单击将要创建记录的区域,在弹出的菜单中选择New host新建主机记录。然后依照向导提示输入必要的信息。

例如:

主机名 IP地址

www 192.168.1.200

www 202.96.1.201

www 64.35.1.202

当输入完所有主机的主机名与IP的对应关系后,你将看到类似于下图的窗口。

这样我们在DNS服务器中添加了三条主机记录:同一个主机名对应着不同的IP。这些不同的IP即为不同子网中安装的WEB服务器的实际IP地址,他们对应着同一个主机名。

这样当用户在其浏览器的地址栏中输入:去访问该WEB服务器时,该客户端就会向DNS服务器发出名称解析请求。作为DNS服务器收到客户端的查询请求后,将比较客户端的IP地址,与它所请求的主机名所对应的IP地址中的哪一个在同一子网中,然后将这个IP (与客户端在同一子网中的IP地址) 响应给客户端。这样就可以实现客户端访问的总是本子网中的服务器, 把服务器的访问负载分摊到了各个子网的服务器中,并且减少了跨子网的网络流量。

负载均衡时session如何共享

创建一个session,重新cookie,并将其发送给浏览器持久保存,并把这个cookie放到ServletContext中

1234567// 把session的id取出来,自己生成一个持久cookie用来替换以前的会话cookieCookie cookie = new Cookie("JSESSIONID", session.getId());// 设置cookie存活周期cookie.setMaxAge(60 * 60);//把这个cookie放到ServletContext中,让其他会话也能获得这次会话的持久cookiesc.setAttribute("cookie", cookie);response.addCookie(cookie);

其他机器访问时,只要也获得了这个cookie,应该能实现session共享了

1234//其他session只需获得这个cookie就行了;Cookie cookie = (Cookie) sc.getAttribute("cookie"); response.addCookie(cookie);

(责任编辑:IT教学网)

更多

推荐Windows服务器文章