企业网站用户数越来越多,同时在线人数越来越多,最大同时在线达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协议
1,在 Memcached中可以保存的item数据量是没有限制的,只要内存足够 。
2,Memcached以单进程多线程方式运行,32位中最大使用内存为2G,这个由于内核限制,在64位中取决于物理内存限制,
3,在32位中要使用更多内存,可以分多个端口开启多个Memcached进程
4,最大30天的数据过期时间,设置为永久的也会在这个时间过期,常量REALTIME_MAXDELTA 60*60*24*30控制
5,最大键长为250字节,大于该长度无法存储,常量KEY_MAX_LENGTH 250控制
6,单个item最大数据是1MB,超过1MB数据不予存储返回false,常量POWER_BLOCK 1048576进行控制,
7,它是默认的slab大小 最大同时连接数是200,通过 conn_init()中的freetotal进行控制,最大软连接数是1024,
8,通过 settings.maxconns=1024 进行控制 ,需要说明的一点是memcache处理请求是以队列形式处理的
9,跟空间占用相关的参数:settings.factor=1.25, settings.chunk_size=48, 影响slab的数据占用和步长比
10,memcached是一种无阻塞的socket通信方式服务,基于libevent库,由于无阻塞通信,对内存读写速度非常之快。
11,memcached分服务器端和客户端,可以配置多个服务器端和客户端,应用于分布式的服务非常广泛。
12,memcached作为小规模的数据分布式平台是十分有效果的。
13,memcached是键值一一对应,key默认最大不能超过128个字 节,value默认大小是1M,也就是一个slabs,如果要存2M的值(连续的),不能用两个slabs,因为两个slabs不是连续的,无法在内存中 存储,故需要修改slabs的大小,多个key和value进行存储时,即使这个slabs没有利用完,那么也不会存放别的数据。
14,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网卡可能承受不住,建议换千兆网卡
以下设计了以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协议
1,在 Memcached中可以保存的item数据量是没有限制的,只要内存足够 。
2,Memcached以单进程多线程方式运行,32位中最大使用内存为2G,这个由于内核限制,在64位中取决于物理内存限制,
3,在32位中要使用更多内存,可以分多个端口开启多个Memcached进程
4,最大30天的数据过期时间,设置为永久的也会在这个时间过期,常量REALTIME_MAXDELTA 60*60*24*30控制
5,最大键长为250字节,大于该长度无法存储,常量KEY_MAX_LENGTH 250控制
6,单个item最大数据是1MB,超过1MB数据不予存储返回false,常量POWER_BLOCK 1048576进行控制,
7,它是默认的slab大小 最大同时连接数是200,通过 conn_init()中的freetotal进行控制,最大软连接数是1024,
8,通过 settings.maxconns=1024 进行控制 ,需要说明的一点是memcache处理请求是以队列形式处理的
9,跟空间占用相关的参数:settings.factor=1.25, settings.chunk_size=48, 影响slab的数据占用和步长比
10,memcached是一种无阻塞的socket通信方式服务,基于libevent库,由于无阻塞通信,对内存读写速度非常之快。
11,memcached分服务器端和客户端,可以配置多个服务器端和客户端,应用于分布式的服务非常广泛。
12,memcached作为小规模的数据分布式平台是十分有效果的。
13,memcached是键值一一对应,key默认最大不能超过128个字 节,value默认大小是1M,也就是一个slabs,如果要存2M的值(连续的),不能用两个slabs,因为两个slabs不是连续的,无法在内存中 存储,故需要修改slabs的大小,多个key和value进行存储时,即使这个slabs没有利用完,那么也不会存放别的数据。
14,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网卡可能承受不住,建议换千兆网卡
编辑回复