`
raymond2006k
  • 浏览: 290818 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

SNA架构的几种实现方式

阅读更多
参考资料:
Shared Nothing Architecture与PHP的童话
Shared Nothing Architecture

   以往集群架构都采用Session共享模式进行设计,而后PHP等方面提出了SNA架构,主张Session不共享。SNA架构思想,无论对企业应用还是大型互联网站,极大提高了web应用的吞吐量和性能。
   一般SNA架构以集成分布式Cache例如 memcached 的方案居多,此处姑且称为 Cache模式。


   我结合公司电信项目的情况,以及思考,总结另一种方案,供参考。
   SNA思想的关键就是每个集群内web server实例不互相共享session,Cache模式主张session数据都放到分布式缓存中,意味着,逻辑上集群内还是要共享session信息;这种考虑源于负载均衡时,同一个IP发来的两个请求,可能走到不同的 Web Server上。

   因此,只要同一IP的两个请求转发到同一个 Web  server实例,那么就可以不需要全局的 session信息缓存。
   1) 我所在的移动项目下,采用 F5硬件负载均衡器,使用IP记忆机制实现了这一点。因此,各 web server实例的session无需共享,仍然保存在自己的session内存中,节省了网络开销和Cache命中查找时间。
   F5很贵,因此对于网站一般负担不起,但可以采用软件负载来做到这一点。

   切分模式的SNA架构:
   2) IP Memory(IP记忆):负载服务器记录 客户端IP -> ServerID 的关系,模拟F5;
   3) (Dispatch by Rule)按规则转发:IP记忆需要维护一张路由table, 因此,需要消耗一定内存,以及映射关系查找的时间;
      我们将客户端的所有IP看作一个集合 IP Set,按固定规则将其平均分配集群的server实例上去,这样就可以节省路由table的开销。 关键是分配算法,可以考虑的有:
      2.1) 简单数值法: IP各节加总 = X, 假定集群实例个数为 N,编号1-N, 那么每次请求选择的目标server id = X mod N。
      2.2) hash值法: 有的系统可能想基于 userid 进行请求分配, 那么可以采用 X = hashCode(userid), serverID = X mod N;
      具体情况下, 可以灵活选择使用那个数据项判断请求分配的逻辑。这个思想参考了  memcached 的集群管理思想。
   

   4) stickySession方式。
      一般apache等采用这种方式做负载均衡。但必须结合 jvmRoute。 第一次被分配的 web server必须返回一个 jvmRoute在response中,并由 apache 送到客户端浏览器,第二次请求发起时,request信息中将包含 JSESSIONID 和 对应的 jvmRoute, apache根据次找到对应的 server,完成 stickySession机制。


结论: 切分模式的SNA架构,基于规则进行请求转发,可以省去分布式Cache的使用,更进一步的提升系统吞吐量和响应性。
  • 大小: 12.8 KB
  • 大小: 15.5 KB
分享到:
评论
17 楼 tomijerry 2009-12-12  
yunshu 写道
简单的说就是三种:
1. 集中存储session,需要部署单独的session服务器,存储方式可以是内存,可以是数据库,也可以是文件。这种的不好的地方在于要维护单独的session服务器,而且session服务器还要做互备。

2. ip记忆,F5,Foundry,A10等硬件设备做基于源ip的负载均衡转发,或者LVS等软件方式。坏处在于客户端IP地址变更,以及web服务器保存session带来的性能损耗。

3. 纯cookie方式,也可以是伪cookie或者伪session,简单的说就是加密和签名,还有注意时间戳的问题。

我曾经有两个文章涉及到一点这方面的内容,不过我是做安全的。http://www.icylife.net/yunshu/show.php?id=675和http://www.icylife.net/yunshu/show.php?id=644


那如果cookie被劫持了呢,完成可以通过sniffer来获取cookie信息,然后模拟一份完全一样的cookie信息,这种方法用加密与签名是否能解决这个问题呢
16 楼 zhouzulin 2009-05-04  
F5基于IP策略来做会导致部分失败,因为现在的客户端太复杂,好多客户端的ip地址是基于双向链路:一会是联通 一会是电信 ip经常变更
15 楼 xieke 2009-04-28  
raymond2006k 写道
参考资料:


结论: 切分模式的SNA架构,基于规则进行请求转发,可以省去分布式Cache的使用,更进一步的提升系统吞吐量和响应性。


即使用了session stick之类的切分模式,还是不能用本地cache,
如果一个用户修改了数据,本地cache随之修改  ,其他用户如果stick在另外一台服务器上访问cache ,就是脏数据了。
14 楼 neptune 2009-03-06  
SNA主要无非就是解决,Session和cache的问题
13 楼 yunshu 2009-03-06  
简单的说就是三种:
1. 集中存储session,需要部署单独的session服务器,存储方式可以是内存,可以是数据库,也可以是文件。这种的不好的地方在于要维护单独的session服务器,而且session服务器还要做互备。

2. ip记忆,F5,Foundry,A10等硬件设备做基于源ip的负载均衡转发,或者LVS等软件方式。坏处在于客户端IP地址变更,以及web服务器保存session带来的性能损耗。

3. 纯cookie方式,也可以是伪cookie或者伪session,简单的说就是加密和签名,还有注意时间戳的问题。

我曾经有两个文章涉及到一点这方面的内容,不过我是做安全的。http://www.icylife.net/yunshu/show.php?id=675和http://www.icylife.net/yunshu/show.php?id=644
12 楼 chenlb 2009-03-04  
willko 写道
我有点疑问,
1.在本机用什么方式保存session?用文件系统吗?这样效率怎样?
如果采用共享session的方法,可以保存在memcached中。php只负责存取,gc交给memcached做,这样性能是不错的。
如果用文件系统保存,php需要随机gc,而且文件系统的性能是不能和内存比的,就算是本地保存session,我也认为应该在本机安装memcached。



楼主的意思应该是, 本地内存保存session,

可以简单地理解为memcached功能的每台机由web server才担。下面的那些规则主要是解决同一个用访问同一web server
11 楼 yanhua 2009-03-03  
unsid 写道

"极大提高了web应用的吞吐量和性能。"
PHP不了解,以J2EE项目为例子,这能提升性能么?Session共享,Session是在本地的啊,访问本地对象多快啊,分布式缓存有网络延迟啊,这是为什么小规模项目用分布式缓存做SSO性能会很不好,只有项目很大,大到这点性能上的损失远远不如部署新应用带来的便利更重要的时候,用memchace才会觉得划算吧,本质上是减低耦合,增强扩展性,看不出和性能有什么关系。

很多人把性能和吞吐量认为是一回事。其实这种架构主要是提高吞吐量的。
10 楼 highriver 2009-02-25  
负载均衡可以使用上面的软硬件去实现。HA还是要考虑使用Memcached或Terracotta这样的中央服务器实现。
9 楼 highriver 2009-02-25  
HA如何实现
8 楼 lcycenter 2009-02-10  
基于IP的分发方式有它的缺陷,因为在一个session中客户IP可能会发生变化。IP发生变化的原因可能有:
1. 用户网络的出口采用了基于地址池的NAT或者是防火墙
2. 用户网络的出口可能采用双链路连接方式,配置的负载策略可能会导致IP发生变化
3. 用户可能采用多PROXY切换工具
4. ...

总而言之,用户端的情况及其复杂,使用基于IP的分发策略是一个有缺陷的SNA实现方式。
7 楼 myreligion 2009-02-09  
就提升而言,用 cookie + 伪SNA 应该更好。

对于web,大部分是匿名访问,少量是登录的。匿名情况可以全部用cookie做标示;对于登录session,在cookie内做标示并存储在数据库中一份。当请求访问到某一台server的时候,如果是匿名的按照匿名处理,如果是登录的从本地读取session(如: request.getSession(false)),如果不存在按照cookie标示从数据库读取,然后加载到内存中,供以后使用。

IP记忆还是hash算法都会损失可用性,为了性能降低高可用性很多时候是划不来的。就像google可以慢点,但是google肯定不允许宕机。
6 楼 willko 2009-02-08  
“简单数值法”和“hash值法”,感觉就是求余法啊。。。原理一样的,应该不能算两种吧,可能我钻牛角尖了。。。

memcached的分布式算法有两种,名字我起的,哈哈,别见怪

1.求余法
crc32(key) % memcached服务器数量
这种算法,当有一台服务器当机,会导致大量cache失效,这个算法太依赖服务器数量了

2.临近节点算法
假如:
服务器数量 3台
网络节点 2^32 = 12 (方便计算,假如的)

把网络节点12分配给3台memcached服务器

假如网络节点这样分配了
1-4 memcached1
5-8 memcached2
9-12 memcache3

计算键的crc32值,然后找到该值的下一个节点,这个节点就是要保存的服务器

当某台服务器当机后,只会导致本服务器区域的cache失效



谢谢,我刚知道sna,一直我都是共享session的
5 楼 willko 2009-02-08  
我有点疑问,
1.在本机用什么方式保存session?用文件系统吗?这样效率怎样?
如果采用共享session的方法,可以保存在memcached中。php只负责存取,gc交给memcached做,这样性能是不错的。
如果用文件系统保存,php需要随机gc,而且文件系统的性能是不能和内存比的,就算是本地保存session,我也认为应该在本机安装memcached。

2.分配算法,有没有比较好的方法,能平衡的分布。考虑最近n分钟内的分布情况,再影响分布。


如果我没记错的话,nginx支持ip hash负载均衡,现在nginx的wiki上不去,,不会被gfw了吧。。。

刚查了一下f5,真的好贵。。。。哈哈
4 楼 wendong007 2009-02-08  
但是如果某台WebServer宕机怎么办,如何保证HA呢
3 楼 unsid 2009-02-08  
"极大提高了web应用的吞吐量和性能。"
PHP不了解,以J2EE项目为例子,这能提升性能么?Session共享,Session是在本地的啊,访问本地对象多快啊,分布式缓存有网络延迟啊,这是为什么小规模项目用分布式缓存做SSO性能会很不好,只有项目很大,大到这点性能上的损失远远不如部署新应用带来的便利更重要的时候,用memchace才会觉得划算吧,本质上是减低耦合,增强扩展性,看不出和性能有什么关系。
2 楼 gembler 2009-02-08  
用memcached存session
touch session有什么思路?
1 楼 key232323 2009-02-08  
最近一直研究这个。

在这里学习了

相关推荐

Global site tag (gtag.js) - Google Analytics