eglid 发表于 2015-11-18 13:01:33

Memcache高可用共享session,容纳100万人同时在线

  企业网站用户数越来越多,同时在线人数越来越多,最大同时在线达100万之多,由于session文件是小文件存储,设想每个用户大概2K左右数据,NFS频繁读取导致IO成为瓶颈,虽然可以更改配置以分级目录的形式保持session但还是没有达到最优设计,但如果把session放在内存中,内存存取快速,就再也不用担心海量用户的压力了!
  以下设计了以memcache为内存管理系统来设计的高可用,高负载,高性能的中央存储区之session共享
  





  


  memcache版本采用repcached
  下载地址:http://sourceforge.net/projects/repcached/files/
  它是一个单master单 slave的方案,但它的 master/slave都是可读写的,而且可以相互同步,如果 master 宕机, slave侦测到连接断了,它会自动
listen而成为 master;但当master重新修复后只能以slave方式启动,表明master与slave之间相互不抢占!
  如果 slave坏掉, master也会侦测到连接断,它就会重新 listen等待新的 slave加入。
  安装测试
  


  VIP:192.168.3.10
  master:192.168.3.11
  slave:192.168.3.12
  


  关于VIP(keepalived+lvs)的安装方法请查询相关资料
  安装PHP省略,自行查找相关资料
  修改php.ini配置文件如下两行:
  session.save_handler = memcache
  session.save_path = "tcp://192.168.3.10:11211"#此处是VIP地址
  


  安装memcache,由于memcache依赖libevent库,无阻塞socket通信
  安装libevent
  # wget -c http://soft.vpser.net/lib/libevent/libevent-2.0.13-stable.tar.gz

# tar zxvf libevent-2.0.13-stable.tar.gz

# cd libevent-2.0.13-stable/

# ./configure --prefix=/usr/local/libevent

# make&& make install
  

# echo "/usr/local/libevent/lib/" >> /etc/ld.so.conf

# ln -s /usr/local/libevent/lib/libevent-2.0.so.5/lib/libevent-2.0.so.5

# ldconfig
  


  安装repcached
  # wget http://nchc.dl.sourceforge.net/project/repcached/repcached/2.2.1-1.2.8/memcached-1.2.8-repcached-2.2.1.tar.gz
  # tar zxvf memcached-1.2.8-repcached-2.2.1.tar.gz
  # cd memcached-1.2.8-repcached-2.2.1
  # ./configure --prefix=/usr/local/repcached --enable-replication   
  # --enable-64bit 在64位系统下./configure
-h 查看配置帮助
  
  # make && make install
  # ln /usr/local/repcached/bin/memcached
/usr/bin/memcached#硬链接
  ###安装完毕#####
  repcached深度兼容memcache协议
  

在 Memcached中可以保存的item数据量是没有限制的,只要内存足够 。
Memcached以单进程多线程方式运行,32位中最大使用内存为2G,这个由于内核限制,在64位中取决于物理内存限制,
在32位中要使用更多内存,可以分多个端口开启多个Memcached进程
最大30天的数据过期时间,设置为永久的也会在这个时间过期,常量REALTIME_MAXDELTA60*60*24*30控制
最大键长为250字节,大于该长度无法存储,常量KEY_MAX_LENGTH 250控制
单个item最大数据是1MB,超过1MB数据不予存储返回false,常量POWER_BLOCK 1048576进行控制,
它是默认的slab大小 最大同时连接数是200,通过 conn_init()中的freetotal进行控制,最大软连接数是1024,
通过 settings.maxconns=1024 进行控制 ,需要说明的一点是memcache处理请求是以队列形式处理的
跟空间占用相关的参数:settings.factor=1.25, settings.chunk_size=48, 影响slab的数据占用和步长比
memcached是一种无阻塞的socket通信方式服务,基于libevent库,由于无阻塞通信,对内存读写速度非常之快。
memcached分服务器端和客户端,可以配置多个服务器端和客户端,应用于分布式的服务非常广泛。
memcached作为小规模的数据分布式平台是十分有效果的。
memcached是键值一一对应,key默认最大不能超过128个字 节,value默认大小是1M,也就是一个slabs,如果要存2M的值(连续的),不能用两个slabs,因为两个slabs不是连续的,无法在内存中 存储,故需要修改slabs的大小,多个key和value进行存储时,即使这个slabs没有利用完,那么也不会存放别的数据。
memcache假定设置64m内存占用,当内存已满时采用LRU算法(最近最少使用)进行剔除旧数据然后存储新数据


  
  ####################################################################
  


  memcache
如果分配2G内存,以每个用户2K数据计算,512*2048≈100万人在线,由于memcache自身也点用一定内存,
  实际2G内存可能只有80%利用1.6G,如果分配2G内存,基本可以保持100万人在线,session存在memcache的另一个好处是
  不用担心过期session过多的删除问题,memcache自动过期,自动LRU剔除
  启动master
(192.168.3.11)
  #
memcached -u root -p 11211 -m 2048 -d -c 1024###memcached -h 查看参数文档
  启动slave (192.168.3.12)
  #
memcached -u root -p 11211 -m 2048 -d -c 1024-x 192.168.3.11 -X 11212


  ###
-x master主机IP,-X是与master复制端口相匹配11212(重点),11212端口是master启动侦听slave通信的默认端口
  


  测试读取
  telnet
192.168.1.11 11211 ##telnet 方式连接
  set key 0 0 3


  aaa
  STORED


  get key

VALUE key 0 3

aaa

END


  ####master 成功
  telnet 192.168.1.12 11211
  get
key

VALUE key 0 3

aaa

END


  ####slave数据同步成功
  ###可停止master试试,slave会自动升级为master
  ####PHP测试
  <?php
  $m=new memcache();
  $m->connect('192.168.1.10',11211); ##此处连接VIP地址
  $m->set('key1','value',0,3600);
  $m->set('key2',array(1,2,3),0,3600);
  ####################################
  memcache默认连接1秒超时,设置过大失去缓存意义,数据最大1M也是基于此点考虑,当内存使用超过1G后数据太大导致超时无法命中继而导致缓存刺穿压到后方的DB
  memcache只能存储字符串与数组,字符串直接存储,数组自动序列化后存储
  文件,图片,视频需要打成二进制后再存储, 资源连接不能保存,如mysqli连接,fopen指针
  #######################################
  $data=$m->get('key1');
  echo $data;
  ?>
  以上设计了100万人同时在线高速方案(新浪微博),可防止单点故障,缓存刺穿,由于大数据流通普通的100M网卡可能承受不住,建议换千兆网卡
  
  



版权声明:本文为博主原创文章,未经博主允许不得转载。
页: [1]
查看完整版本: Memcache高可用共享session,容纳100万人同时在线