设为首页 收藏本站
查看: 1082|回复: 0

[经验分享] Memcache高可用共享session,容纳100万人同时在线

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-11-18 13:01:33 | 显示全部楼层 |阅读模式
  企业网站用户数越来越多,同时在线人数越来越多,最大同时在线达100万之多,由于session文件是小文件存储,设想每个用户大概2K左右数据,NFS频繁读取导致IO成为瓶颈,虽然可以更改配置以分级目录的形式保持session但还是没有达到最优设计,但如果把session放在内存中,内存存取快速,就再也不用担心海量用户的压力了!
  以下设计了以memcache为内存管理系统来设计的高可用,高负载,高性能的中央存储区之session共享
  


DSC0000.jpg


  


  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_MAXDELTA  60*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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-140722-1-1.html 上篇帖子: Memcache高可用共享session,容纳100万人同时在线 . 下篇帖子: Memcache 中模拟 namespace
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表