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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/kongdeqian1988/article/details/38434457

企业网站用户数越来越多,同时在线人数越来越多,最大同时在线达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_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网卡可能承受不住,建议换千兆网卡


展开阅读全文

没有更多推荐了,返回首页